Merge from TNG.
authorTim Potter <tpot@samba.org>
Fri, 30 Jun 2000 06:48:47 +0000 (06:48 +0000)
committerTim Potter <tpot@samba.org>
Fri, 30 Jun 2000 06:48:47 +0000 (06:48 +0000)
(This used to be commit b46fc0ed040ff24bb4e348904fdb0e9788364837)

source3/nsswitch/common.c
source3/nsswitch/winbindd_nss.h

index f93c0e0d1162495b52084adb5fd3a8d310baee6f..b144890a581207534a03b8d990ddb156b58557c0 100644 (file)
@@ -59,224 +59,229 @@ void init_request(struct winbindd_request *req,int rq_type)
 
 void close_sock(void)
 {
-    if (established_socket != -1) {
-           close(established_socket);
-           established_socket = -1;
-    }
+       if (established_socket != -1) {
+               close(established_socket);
+               established_socket = -1;
+       }
 }
 
 /* Connect to winbindd socket */
 
 static int open_pipe_sock(void)
 {
-    struct sockaddr_un sunaddr;
-    static pid_t our_pid;
-    struct stat st;
-    pstring path;
-
-    if (our_pid != getpid()) {
-        if (established_socket != -1) {
-            close(established_socket);
-        }
-        established_socket = -1;
-        our_pid = getpid();
-    }
-
-    if (established_socket != -1) {
-        return established_socket;
-    }
-
-    /* Check permissions on unix socket directory */
-
-    if (lstat(WINBINDD_SOCKET_DIR, &st) == -1) {
-        return -1;
-    }
-
-    if (!S_ISDIR(st.st_mode) || (st.st_uid != 0)) {
-        return -1;
-    }
-
-    /* Connect to socket */
-
-    strncpy(path, WINBINDD_SOCKET_DIR, sizeof(path) - 1);
-    path[sizeof(path) - 1] = '\0';
-
-    strncat(path, "/", sizeof(path) - 1);
-    path[sizeof(path) - 1] = '\0';
-
-    strncat(path, WINBINDD_SOCKET_NAME, sizeof(path) - 1);
-    path[sizeof(path) - 1] = '\0';
-
-    ZERO_STRUCT(sunaddr);
-    sunaddr.sun_family = AF_UNIX;
-    strncpy(sunaddr.sun_path, path, sizeof(sunaddr.sun_path) - 1);
-
-    /* If socket file doesn't exist, don't bother trying to connect with
-       retry.  This is an attempt to make the system usable when the
-       winbindd daemon is not running. */
-
-    if (lstat(path, &st) == -1) {
-        return -1;
-    }
-
-    /* Check permissions on unix socket file */
-    
-    if (!S_ISSOCK(st.st_mode) || (st.st_uid != 0)) {
-        return -1;
-    }
-
-    /* Connect to socket */
-
-    if ((established_socket = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
-        return -1;
-    }
+       struct sockaddr_un sunaddr;
+       static pid_t our_pid;
+       struct stat st;
+       pstring path;
+       
+       if (our_pid != getpid()) {
+               if (established_socket != -1) {
+                       close(established_socket);
+               }
+               established_socket = -1;
+               our_pid = getpid();
+       }
+       
+       if (established_socket != -1) {
+               return established_socket;
+       }
+       
+       /* Check permissions on unix socket directory */
+       
+       if (lstat(WINBINDD_SOCKET_DIR, &st) == -1) {
+               return -1;
+       }
+       
+       if (!S_ISDIR(st.st_mode) || (st.st_uid != 0)) {
+               return -1;
+       }
+       
+       /* Connect to socket */
+       
+       strncpy(path, WINBINDD_SOCKET_DIR, sizeof(path) - 1);
+       path[sizeof(path) - 1] = '\0';
+       
+       strncat(path, "/", sizeof(path) - 1);
+       path[sizeof(path) - 1] = '\0';
+       
+       strncat(path, WINBINDD_SOCKET_NAME, sizeof(path) - 1);
+       path[sizeof(path) - 1] = '\0';
+       
+       ZERO_STRUCT(sunaddr);
+       sunaddr.sun_family = AF_UNIX;
+       strncpy(sunaddr.sun_path, path, sizeof(sunaddr.sun_path) - 1);
+       
+       /* If socket file doesn't exist, don't bother trying to connect
+          with retry.  This is an attempt to make the system usable when
+          the winbindd daemon is not running. */
 
-    if (connect(established_socket, (struct sockaddr *)&sunaddr, 
-                sizeof(sunaddr)) == -1) {
-        close_sock();
-        return -1;
-    }
+       if (lstat(path, &st) == -1) {
+               return -1;
+       }
+       
+       /* Check permissions on unix socket file */
+       
+       if (!S_ISSOCK(st.st_mode) || (st.st_uid != 0)) {
+               return -1;
+       }
+       
+       /* Connect to socket */
+       
+       if ((established_socket = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
+               return -1;
+       }
+       
+       if (connect(established_socket, (struct sockaddr *)&sunaddr, 
+                   sizeof(sunaddr)) == -1) {
+               close_sock();
+               return -1;
+       }
         
-    return established_socket;
+       return established_socket;
 }
 
 /* Write data to winbindd socket with timeout */
 
 int write_sock(void *buffer, int count)
 {
-    int result, nwritten;
-
-    /* Open connection to winbind daemon */
-
+       int result, nwritten;
+       
+       /* Open connection to winbind daemon */
+       
  restart:
-
-    if (open_pipe_sock() == -1) {
-        return -1;
-    }
-
-    /* Write data to socket */
-
-    nwritten = 0;
-
-    while(nwritten < count) {
-        struct timeval tv;
-        fd_set r_fds;
-        int selret;
-
-        /* Catch pipe close on other end by checking if a read() call would 
-           not block by calling select(). */
-
-        FD_ZERO(&r_fds);
-        FD_SET(established_socket, &r_fds);
-        ZERO_STRUCT(tv);
-
-        if ((selret = select(established_socket + 1, &r_fds, NULL, NULL, 
-                             &tv)) == -1) {
-            close_sock();
-            return -1;                         /* Select error */
-        }
-
-        /* Write should be OK if fd not available for reading */
-
-        if (!FD_ISSET(established_socket, &r_fds)) {
-
-            /* Do the write */
-
-            result = write(established_socket, (char *)buffer + nwritten, 
-                           count - nwritten);
-
-            if ((result == -1) || (result == 0)) {
-
-                /* Write failed */
-            
-                close_sock();
-                return -1;
-            }
-
-            nwritten += result;
-
-        } else {
-
-            /* Pipe has closed on remote end */
-
-            close_sock();
-            goto restart;
-        }
-    }
-    
-    return nwritten;
+       
+       if (open_pipe_sock() == -1) {
+               return -1;
+       }
+       
+       /* Write data to socket */
+       
+       nwritten = 0;
+       
+       while(nwritten < count) {
+               struct timeval tv;
+               fd_set r_fds;
+               int selret;
+               
+               /* Catch pipe close on other end by checking if a read()
+                  call would not block by calling select(). */
+
+               FD_ZERO(&r_fds);
+               FD_SET(established_socket, &r_fds);
+               ZERO_STRUCT(tv);
+               
+               if ((selret = select(established_socket + 1, &r_fds, 
+                                    NULL, NULL, &tv)) == -1) {
+                       close_sock();
+                       return -1;                   /* Select error */
+               }
+               
+               /* Write should be OK if fd not available for reading */
+               
+               if (!FD_ISSET(established_socket, &r_fds)) {
+                       
+                       /* Do the write */
+                       
+                       result = write(established_socket,
+                                      (char *)buffer + nwritten, 
+                                      count - nwritten);
+                       
+                       if ((result == -1) || (result == 0)) {
+                               
+                               /* Write failed */
+                               
+                               close_sock();
+                               return -1;
+                       }
+                       
+                       nwritten += result;
+                       
+               } else {
+                       
+                       /* Pipe has closed on remote end */
+                       
+                       close_sock();
+                       goto restart;
+               }
+       }
+       
+       return nwritten;
 }
 
 /* Read data from winbindd socket with timeout */
 
 static int read_sock(void *buffer, int count)
 {
-    int result, nread;
-
-    /* Read data from socket */
-
-    nread = 0;
-
-    while(nread < count) {
-
-        result = read(established_socket, (char *)buffer + nread, 
-                      count - nread);
-        
-        if ((result == -1) || (result == 0)) {
-
-            /* Read failed.  I think the only useful thing we can do here 
-               is just return -1 and fail since the transaction has failed
-               half way through. */
-            
-            close_sock();
-            return -1;
-        }
-        
-        nread += result;
-    }
+       int result = 0, nread = 0;
 
-    return result;
+       /* Read data from socket */
+       
+       while(nread < count) {
+               
+               result = read(established_socket, (char *)buffer + nread, 
+                             count - nread);
+               
+               if ((result == -1) || (result == 0)) {
+                       
+                       /* Read failed.  I think the only useful thing we
+                          can do here is just return -1 and fail since the
+                          transaction has failed half way through. */
+                       
+                       close_sock();
+                       return -1;
+               }
+               
+               nread += result;
+       }
+       
+       return result;
 }
 
 /* Read reply */
 
 int read_reply(struct winbindd_response *response)
 {
-    int result1, result2 = 0;
-
-    if (!response) {
-        return -1;
-    }
-
-    /* Read fixed length response */
-
-    if ((result1 = read_sock(response, sizeof(struct winbindd_response)))
-         == -1) {
-
-        return -1;
-    }
-
-    /* Read variable length response */
-
-    if (response->length > sizeof(struct winbindd_response)) {
-        int extra_data_len = response->length - 
-            sizeof(struct winbindd_response);
-
-        /* Mallocate memory for extra data */
-
-        if (!(response->extra_data = malloc(extra_data_len))) {
-            return -1;
-        }
+       int result1, result2 = 0;
 
-        if ((result2 = read_sock(response->extra_data, extra_data_len))
-            == -1) {
-            return -1;
-        }
-    }
+       if (!response) {
+               return -1;
+       }
+       
+       /* Read fixed length response */
+       
+       if ((result1 = read_sock(response, sizeof(struct winbindd_response)))
+           == -1) {
+               
+               return -1;
+       }
+       
+       /* We actually send the pointer value of the extra_data field from
+          the server.  This has no meaning in the client's address space
+          so we clear it out. */
 
-    /* Return total amount of data read */
+       response->extra_data = NULL;
 
-    return result1 + result2;
+       /* Read variable length response */
+       
+       if (response->length > sizeof(struct winbindd_response)) {
+               int extra_data_len = response->length - 
+                       sizeof(struct winbindd_response);
+               
+               /* Mallocate memory for extra data */
+               
+               if (!(response->extra_data = malloc(extra_data_len))) {
+                       return -1;
+               }
+               
+               if ((result2 = read_sock(response->extra_data, extra_data_len))
+                   == -1) {
+                       return -1;
+               }
+       }
+       
+       /* Return total amount of data read */
+       
+       return result1 + result2;
 }
 
 /* Free a response structure */
@@ -287,6 +292,7 @@ void free_response(struct winbindd_response *response)
 
        if (response && response->extra_data) {
                free(response->extra_data);
+               response->extra_data = NULL;
        }
 }
 
@@ -305,8 +311,15 @@ enum nss_status generic_request(int req_type,
                return NSS_STATUS_NOTFOUND;
        }
 
-       if (!response) response = &lresponse;
-       if (!request) request = &lrequest;
+       if (!response) {
+               ZERO_STRUCT(lresponse);
+               response = &lresponse;
+       }
+
+       if (!request) {
+               ZERO_STRUCT(lrequest);
+               request = &lrequest;
+       }
        
        /* Fill in request and send down pipe */
        init_request(request, req_type);
index 82f55661e996632f62e138b0f16ed94ac244d83d..a70c533ad2a6e39b1d60c1a33984db720c052938 100644 (file)
@@ -104,6 +104,7 @@ struct winbindd_request {
                 } chauthtok;         /* pam_winbind passwd module */
                fstring sid;         /* lookupsid, sid_to_[ug]id */
                fstring name;        /* lookupname */
+               uint32 num_entries;  /* getpwent, getgrent */
        } data;
         fstring domain;      /* {set,get,end}{pw,gr}ent() */
 };
@@ -128,7 +129,7 @@ struct winbindd_response {
        
        union {
                
-               /* getpwnam, getpwuid, getpwent */
+               /* getpwnam, getpwuid */
                
                struct winbindd_pw {
                        fstring pw_name;
@@ -141,7 +142,7 @@ struct winbindd_response {
                        int pwent_ndx;
                } pw;
 
-               /* getgrnam, getgrgid, getgrent */
+               /* getgrnam, getgrgid */
 
                struct winbindd_gr {
                        fstring gr_name;
@@ -151,6 +152,7 @@ struct winbindd_response {
                        int grent_ndx;
                } gr;
 
+               uint32 num_entries; /* getpwent, getgrent */
                fstring sid;        /* lookupname, [ug]id_to_sid */
                struct {
                        fstring name;       /* lookupsid */