r6562: added support for datagram unix domain sockets in the socket library
authorAndrew Tridgell <tridge@samba.org>
Sun, 1 May 2005 18:49:43 +0000 (18:49 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:16:25 +0000 (13:16 -0500)
source/lib/socket/socket.c
source/lib/socket/socket_unix.c

index ddc2097f426ca3e78ebbd2e57f43f9d4c1caf197..86e2f059623729754dc561165069679215bb8083 100644 (file)
@@ -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;
        }
 
index 614229aaac313f260b2772d08c7911ba75a3b512..3f265f72145996b656d981e91ad430e158fd3250 100644 (file)
@@ -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;
 }