diff options
-rw-r--r-- | source4/lib/socket/socket.c | 3 | ||||
-rw-r--r-- | source4/lib/socket/socket_unix.c | 32 |
2 files changed, 26 insertions, 9 deletions
diff --git a/source4/lib/socket/socket.c b/source4/lib/socket/socket.c index ddc2097f42..86e2f05962 100644 --- a/source4/lib/socket/socket.c +++ b/source4/lib/socket/socket.c @@ -159,7 +159,8 @@ NTSTATUS socket_recv(struct socket_context *sock, void *buf, size_t wantlen, size_t *nread, uint32_t flags) { if (sock->state != SOCKET_STATE_CLIENT_CONNECTED && - sock->state != SOCKET_STATE_SERVER_CONNECTED) { + sock->state != SOCKET_STATE_SERVER_CONNECTED && + sock->type != SOCKET_TYPE_DGRAM) { return NT_STATUS_INVALID_PARAMETER; } diff --git a/source4/lib/socket/socket_unix.c b/source4/lib/socket/socket_unix.c index 614229aaac..3f265f7214 100644 --- a/source4/lib/socket/socket_unix.c +++ b/source4/lib/socket/socket_unix.c @@ -38,9 +38,22 @@ static NTSTATUS unixdom_error(int ernum) static NTSTATUS unixdom_init(struct socket_context *sock) { - sock->fd = socket(PF_UNIX, SOCK_STREAM, 0); + int type; + + switch (sock->type) { + case SOCKET_TYPE_STREAM: + type = SOCK_STREAM; + break; + case SOCKET_TYPE_DGRAM: + type = SOCK_DGRAM; + break; + default: + return NT_STATUS_INVALID_PARAMETER; + } + + sock->fd = socket(PF_UNIX, type, 0); if (sock->fd == -1) { - return NT_STATUS_INSUFFICIENT_RESOURCES; + return map_nt_error_from_unix(errno); } sock->private_data = NULL; @@ -126,9 +139,11 @@ static NTSTATUS unixdom_listen(struct socket_context *sock, return unixdom_error(errno); } - ret = listen(sock->fd, queue_size); - if (ret == -1) { - return unixdom_error(errno); + if (sock->type == SOCKET_TYPE_STREAM) { + ret = listen(sock->fd, queue_size); + if (ret == -1) { + return unixdom_error(errno); + } } if (!(flags & SOCKET_FLAG_BLOCK)) { @@ -151,6 +166,10 @@ static NTSTATUS unixdom_accept(struct socket_context *sock, socklen_t cli_addr_len = sizeof(cli_addr); int new_fd; + if (sock->type != SOCKET_TYPE_STREAM) { + return NT_STATUS_INVALID_PARAMETER; + } + new_fd = accept(sock->fd, (struct sockaddr *)&cli_addr, &cli_addr_len); if (new_fd == -1) { return unixdom_error(errno); @@ -290,8 +309,5 @@ static const struct socket_ops unixdom_ops = { const struct socket_ops *socket_unixdom_ops(enum socket_type type) { - if (type != SOCKET_TYPE_STREAM) { - return NULL; - } return &unixdom_ops; } |