Cleanup of winbind client side code.
authorTim Potter <tpot@samba.org>
Mon, 31 Mar 2003 04:36:01 +0000 (04:36 +0000)
committerTim Potter <tpot@samba.org>
Mon, 31 Mar 2003 04:36:01 +0000 (04:36 +0000)
Mostly this consists of untangling the existing code and moving it in
to operating system specific files.  The winbind client code for all
supported operating systems is now in nsswitch/winbind_nss_OSNAME.[ch]
to make things a bit clearer.
(This used to be commit 93ea047a16a292b23a1d8736ce9bc4098ba142ba)

13 files changed:
source3/Makefile.in
source3/configure.in
source3/include/includes.h
source3/nsswitch/wb_client.c
source3/nsswitch/winbind_nss.h [moved from source3/nsswitch/nss.h with 52% similarity]
source3/nsswitch/winbind_nss_config.h
source3/nsswitch/winbind_nss_hpux.h [moved from source3/nsswitch/hp_nss_dbdefs.h with 75% similarity]
source3/nsswitch/winbind_nss_irix.c [new file with mode: 0644]
source3/nsswitch/winbind_nss_irix.h [moved from source3/nsswitch/hp_nss_common.h with 54% similarity]
source3/nsswitch/winbind_nss_linux.c [moved from source3/nsswitch/winbind_nss.c with 58% similarity]
source3/nsswitch/winbind_nss_linux.h [new file with mode: 0644]
source3/nsswitch/winbind_nss_solaris.c
source3/nsswitch/winbind_nss_solaris.h [new file with mode: 0644]

index f712d9969325748f00c92c91a9d206335929adfc..75a8db30c2360f637710891357187266b09d19f1 100644 (file)
@@ -589,7 +589,7 @@ WINBINDD_OBJ = \
 
 WBINFO_OBJ = nsswitch/wbinfo.o libsmb/smbencrypt.o libsmb/smbdes.o $(POPT_LIB_OBJ)
 
-WINBIND_NSS_OBJ = nsswitch/winbind_nss.o nsswitch/wb_common.o @WINBIND_NSS_EXTRA_OBJS@
+WINBIND_NSS_OBJ = nsswitch/wb_common.o @WINBIND_NSS_EXTRA_OBJS@
 
 WINBIND_NSS_PICOBJS = $(WINBIND_NSS_OBJ:.o=.po)
 
@@ -1328,4 +1328,3 @@ check: check-programs
 
 # These are called by the test suite
 check-programs: bin/t_strcmp
-
index e16836dd830f0f6aa41c7d92f26809a70b9cb0af..0e5733ca5c99e90b9b4e3cda27e0a74fb4b09148 100644 (file)
@@ -3166,12 +3166,18 @@ AC_MSG_CHECKING(whether to build winbind)
 # Initially, the value of $host_os decides whether winbind is supported
 
 case "$host_os" in
-       *linux*|*irix*)
+       *linux*)
                HAVE_WINBIND=yes
+               WINBIND_NSS_EXTRA_OBJS="nsswitch/winbind_nss_linux.o"
+               ;;
+       *irix*)
+               HAVE_WINBIND=yes
+               WINBIND_NSS_EXTRA_OBJS="nsswitch/winbind_nss_irix.o"
                ;;
        *solaris*)
                HAVE_WINBIND=yes
-               WINBIND_NSS_EXTRA_OBJS="nsswitch/winbind_nss_solaris.o"
+               WINBIND_NSS_EXTRA_OBJS="nsswitch/winbind_nss_solaris.o \
+                   nsswitch/winbind_nss_linux.o"
                WINBIND_NSS_EXTRA_LIBS="-lsocket"
                ;;
        *hpux11*)
index e8e0751cab25e3d483e6ec0eda3f8c627b4a886c..3656a8454ea2aaf6fc12ef6cbcbf5cedabfe15a8 100644 (file)
@@ -847,7 +847,7 @@ struct functable {
 #define UNI_XDIGIT   0x8
 #define UNI_SPACE    0x10
 
-#include "nsswitch/nss.h"
+#include "nsswitch/winbind_nss.h"
 
 /* forward declaration from printing.h to get around 
    header file dependencies */
index 62c9686960d20db268688dde7dd6bcf7cbbb10af..996d15180dc057640897636799b2f72a54e79653 100644 (file)
@@ -23,7 +23,7 @@
 */
 
 #include "includes.h"
-#include "nsswitch/nss.h"
+#include "nsswitch/winbind_nss.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_WINBIND
similarity index 52%
rename from source3/nsswitch/nss.h
rename to source3/nsswitch/winbind_nss.h
index d83a5e237ed32505311bf40d04917633575f4980..5416ae211e3d479e5b15f96b5cf4f49fc1ff755a 100644 (file)
@@ -1,10 +1,8 @@
-#ifndef _NSSWITCH_NSS_H
-#define _NSSWITCH_NSS_H
 /* 
    Unix SMB/CIFS implementation.
 
-   a common place to work out how to define NSS_STATUS on various
-   platforms
+   A common place to work out how to define NSS_STATUS on various
+   platforms.
 
    Copyright (C) Tim Potter 2000
    
    Boston, MA  02111-1307, USA.   
 */
 
-#ifdef HAVE_NSS_COMMON_H
-
-/* Sun Solaris */
+#ifndef _NSSWITCH_NSS_H
+#define _NSSWITCH_NSS_H
 
-#include <nss_common.h>
-#include <nss_dbdefs.h>
-#include <nsswitch.h>
+#ifdef HAVE_NSS_COMMON_H
 
-typedef nss_status_t NSS_STATUS;
+/* 
+ * Sun Solaris 
+ */
 
-#define NSS_STATUS_SUCCESS     NSS_SUCCESS
-#define NSS_STATUS_NOTFOUND    NSS_NOTFOUND
-#define NSS_STATUS_UNAVAIL     NSS_UNAVAIL
-#define NSS_STATUS_TRYAGAIN    NSS_TRYAGAIN
+#include "nsswitch/winbind_nss_solaris.h"
 
 #elif HAVE_NSS_H
 
-/* GNU */
+/*
+ * Linux (glibc)
+ */
 
 #include <nss.h>
-
 typedef enum nss_status NSS_STATUS;
 
 #elif HAVE_NS_API_H
 
-/* SGI IRIX */
-
-/* following required to prevent warnings of double definition
- * of datum from ns_api.h
-*/
-#ifdef DATUM
-#define _DATUM_DEFINED
-#endif
-
-#include <ns_api.h>
-
-typedef enum
-{
-  NSS_STATUS_SUCCESS=NS_SUCCESS,
-  NSS_STATUS_NOTFOUND=NS_NOTFOUND,
-  NSS_STATUS_UNAVAIL=NS_UNAVAIL,
-  NSS_STATUS_TRYAGAIN=NS_TRYAGAIN
-} NSS_STATUS;
+/*
+ * SGI IRIX 
+ */
 
-#define NSD_MEM_STATIC 0
-#define NSD_MEM_VOLATILE 1
-#define NSD_MEM_DYNAMIC 2
+#include "nsswitch/winbind_nss_irix.h"
 
 #elif defined(HPUX) && defined(HAVE_NSSWITCH_H)
-/* HP-UX 11 */
 
-#include "nsswitch/hp_nss_common.h"
-#include "nsswitch/hp_nss_dbdefs.h"
-#include <nsswitch.h>
-
-#ifndef _HAVE_TYPEDEF_NSS_STATUS
-#define _HAVE_TYPEDEF_NSS_STATUS
-typedef nss_status_t NSS_STATUS;
+/* HP-UX 11 */
 
-#define NSS_STATUS_SUCCESS     NSS_SUCCESS
-#define NSS_STATUS_NOTFOUND    NSS_NOTFOUND
-#define NSS_STATUS_UNAVAIL     NSS_UNAVAIL
-#define NSS_STATUS_TRYAGAIN    NSS_TRYAGAIN
-#endif /* HPUX */
+#include "nsswitch/winbind_nss_hpux.h"
 
 #else /* Nothing's defined. Neither gnu nor sun nor hp */
 
index 2faaa30d1b68cfabd29e2bcc3f22316b78956161..77d1dbe26e031d855471d6ad472758c8a318a0c4 100644 (file)
 #include <sys/stat.h>
 #include <errno.h>
 #include <pwd.h>
-#include "nsswitch/nss.h"
-
-/* Declarations for functions in winbind_nss.c
-   needed in winbind_nss_solaris.c (solaris wrapper to nss) */
-
-NSS_STATUS _nss_winbind_setpwent(void);
-NSS_STATUS _nss_winbind_endpwent(void);
-NSS_STATUS _nss_winbind_getpwent_r(struct passwd* result, char* buffer,
-                                  size_t buflen, int* errnop);
-NSS_STATUS _nss_winbind_getpwuid_r(uid_t, struct passwd*, char* buffer,
-                                  size_t buflen, int* errnop);
-NSS_STATUS _nss_winbind_getpwnam_r(const char* name, struct passwd* result,
-                                  char* buffer, size_t buflen, int* errnop);
-
-NSS_STATUS _nss_winbind_setgrent(void);
-NSS_STATUS _nss_winbind_endgrent(void);
-NSS_STATUS _nss_winbind_getgrent_r(struct group* result, char* buffer,
-                                  size_t buflen, int* errnop);
-NSS_STATUS _nss_winbind_getgrnam_r(const char *name,
-                                  struct group *result, char *buffer,
-                                  size_t buflen, int *errnop);
-NSS_STATUS _nss_winbind_getgrgid_r(gid_t gid,
-                                  struct group *result, char *buffer,
-                                  size_t buflen, int *errnop);
+#include "nsswitch/winbind_nss.h"
 
 /* I'm trying really hard not to include anything from smb.h with the
    result of some silly looking redeclaration of structures. */
similarity index 75%
rename from source3/nsswitch/hp_nss_dbdefs.h
rename to source3/nsswitch/winbind_nss_hpux.h
index bd24772e339fb77eaeefc0b3a8dd853546d7ee12..1f2bade972142b9090bc1e77e0479a3347f724d1 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef _HP_NSS_DBDEFS_H
-#define _HP_NSS_DBDEFS_H
-
 /*
    Unix SMB/CIFS implementation.
  
    Boston, MA  02111-1307, USA.
 */
 
+#ifndef _WINBIND_NSS_HPUX_H
+#define _WINBIND_NSS_HPUX_H
+
+#include <nsswitch.h>
+
+#ifndef _HAVE_TYPEDEF_NSS_STATUS
+#define _HAVE_TYPEDEF_NSS_STATUS
+typedef nss_status_t NSS_STATUS;
+
+#define NSS_STATUS_SUCCESS     NSS_SUCCESS
+#define NSS_STATUS_NOTFOUND    NSS_NOTFOUND
+#define NSS_STATUS_UNAVAIL     NSS_UNAVAIL
+#define NSS_STATUS_TRYAGAIN    NSS_TRYAGAIN
+
+#ifdef HAVE_SYNCH_H
+#include <synch.h>
+#endif
+#ifdef HAVE_PTHREAD_H
+#include <pthread.h>
+#endif
+typedef enum {
+       NSS_SUCCESS,
+       NSS_NOTFOUND,
+       NSS_UNAVAIL,
+       NSS_TRYAGAIN
+} nss_status_t;
+struct nss_backend;
+typedef nss_status_t (*nss_backend_op_t)(struct nss_backend *, void *args);
+struct nss_backend {
+       nss_backend_op_t *ops;
+       int n_ops;
+};
+typedef struct nss_backend nss_backend_t;
+typedef int nss_dbop_t;
+
 #include <errno.h>
 #include <netdb.h>
 #include <limits.h>
@@ -102,4 +138,4 @@ typedef struct nss_XbyY_args {
        nss_status_t status;
 } nss_XbyY_args_t;
  
-#endif /* _NSS_DBDEFS_H */
+#endif /* _WINBIND_NSS_HPUX_H */
diff --git a/source3/nsswitch/winbind_nss_irix.c b/source3/nsswitch/winbind_nss_irix.c
new file mode 100644 (file)
index 0000000..3a9d6c0
--- /dev/null
@@ -0,0 +1,515 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   Windows NT Domain nsswitch module
+
+   Copyright (C) Tim Potter 2000
+   
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the
+   Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA  02111-1307, USA.   
+*/
+
+#include "winbind_client.h"
+
+#ifdef HAVE_NS_API_H
+#undef VOLATILE
+#include <ns_daemon.h>
+#endif
+
+/* Maximum number of users to pass back over the unix domain socket
+   per call. This is not a static limit on the total number of users 
+   or groups returned in total. */
+
+#define MAX_GETPWENT_USERS 250
+#define MAX_GETGRENT_USERS 250
+
+/* Prototypes from wb_common.c */
+
+extern int winbindd_fd;
+
+#ifdef HAVE_NS_API_H
+
+/* IRIX version */
+
+static int send_next_request(nsd_file_t *, struct winbindd_request *);
+static int do_list(int state, nsd_file_t *rq);
+
+static nsd_file_t *current_rq = NULL;
+static int current_winbind_xid = 0;
+static int next_winbind_xid = 0;
+
+typedef struct winbind_xid {
+       int                     xid;
+       nsd_file_t              *rq;
+       struct winbindd_request *request;
+       struct winbind_xid      *next;
+} winbind_xid_t;
+
+static winbind_xid_t *winbind_xids = (winbind_xid_t *)0;
+
+static int
+winbind_xid_new(int xid, nsd_file_t *rq, struct winbindd_request *request)
+{
+       winbind_xid_t *new;
+
+       nsd_logprintf(NSD_LOG_LOW,
+               "entering winbind_xid_new xid = %d rq = 0x%x, request = 0x%x\n",
+               xid, rq, request);
+       new = (winbind_xid_t *)nsd_calloc(1,sizeof(winbind_xid_t));
+       if (!new) {
+               nsd_logprintf(NSD_LOG_RESOURCE,"winbind_xid_new: failed malloc\n");
+               return NSD_ERROR;
+       }
+
+       new->xid = xid;
+       new->rq = rq;
+       new->request = request;
+       new->next = winbind_xids;
+       winbind_xids = new;
+
+       return NSD_CONTINUE;
+}
+
+/*
+** This routine will look down the xid list and return the request
+** associated with an xid.  We remove the record if it is found.
+*/
+nsd_file_t *
+winbind_xid_lookup(int xid, struct winbindd_request **requestp)
+{
+        winbind_xid_t **last, *dx;
+        nsd_file_t *result=0;
+
+        for (last = &winbind_xids, dx = winbind_xids; dx && (dx->xid != xid);
+            last = &dx->next, dx = dx->next);
+        if (dx) {
+                *last = dx->next;
+                result = dx->rq;
+               *requestp = dx->request;
+                SAFE_FREE(dx);
+        }
+       nsd_logprintf(NSD_LOG_LOW,
+               "entering winbind_xid_lookup xid = %d rq = 0x%x, request = 0x%x\n",
+               xid, result, dx->request);
+
+        return result;
+}
+
+static int
+winbind_startnext_timeout(nsd_file_t **rqp, nsd_times_t *to)
+{
+       nsd_file_t *rq;
+       struct winbindd_request *request;
+
+       nsd_logprintf(NSD_LOG_MIN, "timeout (winbind startnext)\n");
+       rq = to->t_file;
+       *rqp = rq;
+       nsd_timeout_remove(rq);
+       request = to->t_clientdata;
+       return(send_next_request(rq, request));
+}
+
+static void
+dequeue_request()
+{
+       nsd_file_t *rq;
+       struct winbindd_request *request;
+
+       /*
+        * Check for queued requests
+        */
+       if (winbind_xids) {
+           nsd_logprintf(NSD_LOG_MIN, "timeout (winbind) unqueue xid %d\n",
+                       current_winbind_xid);
+           rq = winbind_xid_lookup(current_winbind_xid++, &request);
+           /* cause a timeout on the queued request so we can send it */
+           nsd_timeout_new(rq,1,winbind_startnext_timeout,request);
+       }
+}
+
+static int
+do_request(nsd_file_t *rq, struct winbindd_request *request)
+{
+       if (winbind_xids == NULL) {
+               /*
+                * No outstanding requests.
+                * Send off the request to winbindd
+                */
+               nsd_logprintf(NSD_LOG_MIN, "lookup (winbind) sending request\n");
+               return(send_next_request(rq, request));
+       } else {
+               /*
+                * Just queue it up for now - previous callout or timout
+                * will start it up
+                */
+               nsd_logprintf(NSD_LOG_MIN,
+                       "lookup (winbind): queue request xid = %d\n",
+                       next_winbind_xid);
+               return(winbind_xid_new(next_winbind_xid++, rq, request));
+       }
+}
+
+static int 
+winbind_callback(nsd_file_t **rqp, int fd)
+{
+       struct winbindd_response response;
+       struct winbindd_pw *pw = &response.data.pw;
+       struct winbindd_gr *gr = &response.data.gr;
+       nsd_file_t *rq;
+       NSS_STATUS status;
+       fstring result;
+       char *members;
+       int i, maxlen;
+
+       dequeue_request();
+
+       nsd_logprintf(NSD_LOG_MIN, "entering callback (winbind)\n");
+
+       rq = current_rq;
+       *rqp = rq;
+
+       nsd_timeout_remove(rq);
+       nsd_callback_remove(fd);
+
+       ZERO_STRUCT(response);
+       status = winbindd_get_response(&response);
+
+       if (status != NSS_STATUS_SUCCESS) {
+               /* free any extra data area in response structure */
+               free_response(&response);
+               nsd_logprintf(NSD_LOG_MIN, 
+                       "callback (winbind) returning not found, status = %d\n",
+                       status);
+               rq->f_status = NS_NOTFOUND;
+               return NSD_NEXT;
+       }
+
+       maxlen = sizeof(result) - 1;
+
+       switch ((int)rq->f_cmd_data) {
+           case WINBINDD_WINS_BYNAME:
+           case WINBINDD_WINS_BYIP:
+               snprintf(result,maxlen,"%s\n",response.data.winsresp);
+               break;
+           case WINBINDD_GETPWUID:
+           case WINBINDD_GETPWNAM:
+               snprintf(result,maxlen,"%s:%s:%d:%d:%s:%s:%s\n",
+                       pw->pw_name,
+                       pw->pw_passwd,
+                       pw->pw_uid,
+                       pw->pw_gid,
+                       pw->pw_gecos,
+                       pw->pw_dir,
+                       pw->pw_shell);
+               break;
+           case WINBINDD_GETGRNAM:
+           case WINBINDD_GETGRGID:
+               if (gr->num_gr_mem && response.extra_data)
+                       members = response.extra_data;
+               else
+                       members = "";
+               snprintf(result,maxlen,"%s:%s:%d:%s\n",
+                       gr->gr_name, gr->gr_passwd, gr->gr_gid, members);
+               break;
+           case WINBINDD_SETGRENT:
+           case WINBINDD_SETPWENT:
+               nsd_logprintf(NSD_LOG_MIN, "callback (winbind) - SETPWENT/SETGRENT\n");
+               free_response(&response);
+               return(do_list(1,rq));
+           case WINBINDD_GETGRENT:
+           case WINBINDD_GETGRLST:
+               nsd_logprintf(NSD_LOG_MIN, 
+                       "callback (winbind) - %d GETGRENT responses\n",
+                       response.data.num_entries);
+               if (response.data.num_entries) {
+                   gr = (struct winbindd_gr *)response.extra_data;
+                   if (! gr ) {
+                       nsd_logprintf(NSD_LOG_MIN, "     no extra_data\n");
+                       free_response(&response);
+                       return NSD_ERROR;
+                   }
+                   members = (char *)response.extra_data + 
+                               (response.data.num_entries * sizeof(struct winbindd_gr));
+                   for (i = 0; i < response.data.num_entries; i++) {
+                       snprintf(result,maxlen,"%s:%s:%d:%s\n",
+                               gr->gr_name, gr->gr_passwd, gr->gr_gid, 
+                               &members[gr->gr_mem_ofs]);
+                       nsd_logprintf(NSD_LOG_MIN, "     GETGRENT %s\n",result);
+                       nsd_append_element(rq,NS_SUCCESS,result,strlen(result));
+                       gr++;
+                   }
+               }
+               i = response.data.num_entries;
+               free_response(&response);
+               if (i < MAX_GETPWENT_USERS)
+                   return(do_list(2,rq));
+               else
+                   return(do_list(1,rq));
+           case WINBINDD_GETPWENT:
+               nsd_logprintf(NSD_LOG_MIN, 
+                       "callback (winbind) - %d GETPWENT responses\n",
+                       response.data.num_entries);
+               if (response.data.num_entries) {
+                   pw = (struct winbindd_pw *)response.extra_data;
+                   if (! pw ) {
+                       nsd_logprintf(NSD_LOG_MIN, "     no extra_data\n");
+                       free_response(&response);
+                       return NSD_ERROR;
+                   }
+                   for (i = 0; i < response.data.num_entries; i++) {
+                       snprintf(result,maxlen,"%s:%s:%d:%d:%s:%s:%s",
+                               pw->pw_name,
+                               pw->pw_passwd,
+                               pw->pw_uid,
+                               pw->pw_gid,
+                               pw->pw_gecos,
+                               pw->pw_dir,
+                               pw->pw_shell);
+                       nsd_logprintf(NSD_LOG_MIN, "     GETPWENT %s\n",result);
+                       nsd_append_element(rq,NS_SUCCESS,result,strlen(result));
+                       pw++;
+                   }
+               }
+               i = response.data.num_entries;
+               free_response(&response);
+               if (i < MAX_GETPWENT_USERS)
+                   return(do_list(2,rq));
+               else
+                   return(do_list(1,rq));
+           case WINBINDD_ENDGRENT:
+           case WINBINDD_ENDPWENT:
+               nsd_logprintf(NSD_LOG_MIN, "callback (winbind) - ENDPWENT/ENDGRENT\n");
+               nsd_append_element(rq,NS_SUCCESS,"\n",1);
+               free_response(&response);
+               return NSD_NEXT;
+           default:
+               free_response(&response);
+               nsd_logprintf(NSD_LOG_MIN, "callback (winbind) - no valid command\n");
+               return NSD_NEXT;
+       }
+       nsd_logprintf(NSD_LOG_MIN, "callback (winbind) %s\n", result);
+       /* free any extra data area in response structure */
+       free_response(&response);
+       nsd_set_result(rq,NS_SUCCESS,result,strlen(result),VOLATILE);
+       return NSD_OK;
+}
+
+static int 
+winbind_timeout(nsd_file_t **rqp, nsd_times_t *to)
+{
+       nsd_file_t *rq;
+
+       dequeue_request();
+
+       nsd_logprintf(NSD_LOG_MIN, "timeout (winbind)\n");
+
+       rq = to->t_file;
+       *rqp = rq;
+
+       /* Remove the callback and timeout */
+       nsd_callback_remove(winbindd_fd);
+       nsd_timeout_remove(rq);
+
+       rq->f_status = NS_NOTFOUND;
+       return NSD_NEXT;
+}
+
+static int
+send_next_request(nsd_file_t *rq, struct winbindd_request *request)
+{
+       NSS_STATUS status;
+       long timeout;
+
+       timeout = 1000;
+
+       nsd_logprintf(NSD_LOG_MIN, "send_next_request (winbind) %d to = %d\n",
+                       rq->f_cmd_data, timeout);
+       status = winbindd_send_request((int)rq->f_cmd_data,request);
+       SAFE_FREE(request);
+
+       if (status != NSS_STATUS_SUCCESS) {
+               nsd_logprintf(NSD_LOG_MIN, 
+                       "send_next_request (winbind) error status = %d\n",status);
+               rq->f_status = status;
+               return NSD_NEXT;
+       }
+
+       current_rq = rq;
+
+       /*
+        * Set up callback and timeouts
+        */
+       nsd_logprintf(NSD_LOG_MIN, "send_next_request (winbind) fd = %d\n",winbindd_fd);
+       nsd_callback_new(winbindd_fd,winbind_callback,NSD_READ);
+       nsd_timeout_new(rq,timeout,winbind_timeout,(void *)0);
+       return NSD_CONTINUE;
+}
+
+int init(void)
+{
+       nsd_logprintf(NSD_LOG_MIN, "entering init (winbind)\n");
+       return(NSD_OK);
+}
+
+int lookup(nsd_file_t *rq)
+{
+       char *map;
+       char *key;
+       struct winbindd_request *request;
+
+       nsd_logprintf(NSD_LOG_MIN, "entering lookup (winbind)\n");
+       if (! rq)
+               return NSD_ERROR;
+
+       map = nsd_attr_fetch_string(rq->f_attrs, "table", (char*)0);
+       key = nsd_attr_fetch_string(rq->f_attrs, "key", (char*)0);
+       if (! map || ! key) {
+               nsd_logprintf(NSD_LOG_MIN, "lookup (winbind) table or key not defined\n");
+               rq->f_status = NS_BADREQ;
+               return NSD_ERROR;
+       }
+
+       nsd_logprintf(NSD_LOG_MIN, "lookup (winbind %s)\n",map);
+
+       request = (struct winbindd_request *)nsd_calloc(1,sizeof(struct winbindd_request));
+       if (! request) {
+               nsd_logprintf(NSD_LOG_RESOURCE,
+                       "lookup (winbind): failed malloc\n");
+               return NSD_ERROR;
+       }
+
+       if (strcasecmp(map,"passwd.byuid") == 0) {
+           request->data.uid = atoi(key);
+           rq->f_cmd_data = (void *)WINBINDD_GETPWUID;
+       } else if (strcasecmp(map,"passwd.byname") == 0) {
+           strncpy(request->data.username, key, 
+               sizeof(request->data.username) - 1);
+           request->data.username[sizeof(request->data.username) - 1] = '\0';
+           rq->f_cmd_data = (void *)WINBINDD_GETPWNAM; 
+       } else if (strcasecmp(map,"group.byname") == 0) {
+           strncpy(request->data.groupname, key, 
+               sizeof(request->data.groupname) - 1);
+           request->data.groupname[sizeof(request->data.groupname) - 1] = '\0';
+           rq->f_cmd_data = (void *)WINBINDD_GETGRNAM; 
+       } else if (strcasecmp(map,"group.bygid") == 0) {
+           request->data.gid = atoi(key);
+           rq->f_cmd_data = (void *)WINBINDD_GETGRGID;
+       } else if (strcasecmp(map,"hosts.byname") == 0) {
+           strncpy(request->data.winsreq, key, sizeof(request->data.winsreq) - 1);
+           request->data.winsreq[sizeof(request->data.winsreq) - 1] = '\0';
+           rq->f_cmd_data = (void *)WINBINDD_WINS_BYNAME;
+       } else if (strcasecmp(map,"hosts.byaddr") == 0) {
+           strncpy(request->data.winsreq, key, sizeof(request->data.winsreq) - 1);
+           request->data.winsreq[sizeof(request->data.winsreq) - 1] = '\0';
+           rq->f_cmd_data = (void *)WINBINDD_WINS_BYIP;
+       } else {
+               /*
+                * Don't understand this map - just return not found
+                */
+               nsd_logprintf(NSD_LOG_MIN, "lookup (winbind) unknown table\n");
+               SAFE_FREE(request);
+               rq->f_status = NS_NOTFOUND;
+               return NSD_NEXT;
+       }
+
+       return(do_request(rq, request));
+}
+
+int list(nsd_file_t *rq)
+{
+       char *map;
+
+       nsd_logprintf(NSD_LOG_MIN, "entering list (winbind)\n");
+       if (! rq)
+               return NSD_ERROR;
+
+       map = nsd_attr_fetch_string(rq->f_attrs, "table", (char*)0);
+       if (! map ) {
+               nsd_logprintf(NSD_LOG_MIN, "list (winbind) table not defined\n");
+               rq->f_status = NS_BADREQ;
+               return NSD_ERROR;
+       }
+
+       nsd_logprintf(NSD_LOG_MIN, "list (winbind %s)\n",map);
+
+       return (do_list(0,rq));
+}
+
+static int
+do_list(int state, nsd_file_t *rq)
+{
+       char *map;
+       struct winbindd_request *request;
+
+       nsd_logprintf(NSD_LOG_MIN, "entering do_list (winbind) state = %d\n",state);
+
+       map = nsd_attr_fetch_string(rq->f_attrs, "table", (char*)0);
+       request = (struct winbindd_request *)nsd_calloc(1,sizeof(struct winbindd_request));
+       if (! request) {
+               nsd_logprintf(NSD_LOG_RESOURCE,
+                       "do_list (winbind): failed malloc\n");
+               return NSD_ERROR;
+       }
+
+       if (strcasecmp(map,"passwd.byname") == 0) {
+           switch (state) {
+               case 0:
+                   rq->f_cmd_data = (void *)WINBINDD_SETPWENT;
+                   break;
+               case 1:
+                   request->data.num_entries = MAX_GETPWENT_USERS;
+                   rq->f_cmd_data = (void *)WINBINDD_GETPWENT;
+                   break;
+               case 2:
+                   rq->f_cmd_data = (void *)WINBINDD_ENDPWENT;
+                   break;
+               default:
+                   nsd_logprintf(NSD_LOG_MIN, "do_list (winbind) unknown state\n");
+                   SAFE_FREE(request);
+                   rq->f_status = NS_NOTFOUND;
+                   return NSD_NEXT;
+           }
+       } else if (strcasecmp(map,"group.byname") == 0) {
+           switch (state) {
+               case 0:
+                   rq->f_cmd_data = (void *)WINBINDD_SETGRENT;
+                   break;
+               case 1:
+                   request->data.num_entries = MAX_GETGRENT_USERS;
+                   rq->f_cmd_data = (void *)WINBINDD_GETGRENT;
+                   break;
+               case 2:
+                   rq->f_cmd_data = (void *)WINBINDD_ENDGRENT;
+                   break;
+               default:
+                   nsd_logprintf(NSD_LOG_MIN, "do_list (winbind) unknown state\n");
+                   SAFE_FREE(request);
+                   rq->f_status = NS_NOTFOUND;
+                   return NSD_NEXT;
+           }
+       } else {
+               /*
+                * Don't understand this map - just return not found
+                */
+               nsd_logprintf(NSD_LOG_MIN, "do_list (winbind) unknown table\n");
+               SAFE_FREE(request);
+               rq->f_status = NS_NOTFOUND;
+               return NSD_NEXT;
+       }
+
+       return(do_request(rq, request));
+}
+
+#endif /* HAVE_NS_API_H */
similarity index 54%
rename from source3/nsswitch/hp_nss_common.h
rename to source3/nsswitch/winbind_nss_irix.h
index 5bd5374182ee811e09f51769ceb5fa0bbd85c630..7878abb981a7d1ad99a36abba0db337ad40a4538 100644 (file)
@@ -1,51 +1,48 @@
-#ifndef _HP_NSS_COMMON_H
-#define _HP_NSS_COMMON_H
-/*
+/* 
    Unix SMB/CIFS implementation.
-   Donated by HP to enable Winbindd to build on HPUX 11.x.
-   Copyright (C) Jeremy Allison 2002.
+
+   Winbind daemon for ntdom nss module
+
+   Copyright (C) Tim Potter 2000
+   
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Library General Public
    License as published by the Free Software Foundation; either
    version 2 of the License, or (at your option) any later version.
+   
    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Library General Public License for more details.
+   
    You should have received a copy of the GNU Library General Public
    License along with this library; if not, write to the
    Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA  02111-1307, USA.
+   Boston, MA  02111-1307, USA.   
 */
-#ifdef HAVE_SYNCH_H
-#include <synch.h>
-#endif
-#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
+
+#ifndef _WINBIND_NSS_IRIX_H
+#define _WINBIND_NSS_IRIX_H
+
+/* following required to prevent warnings of double definition
+ * of datum from ns_api.h
+*/
+#ifdef DATUM
+#define _DATUM_DEFINED
 #endif
-typedef enum {
-       NSS_SUCCESS,
-       NSS_NOTFOUND,
-       NSS_UNAVAIL,
-       NSS_TRYAGAIN
-} nss_status_t;
-struct nss_backend;
-typedef nss_status_t (*nss_backend_op_t)(struct nss_backend *, void *args);
-struct nss_backend {
-       nss_backend_op_t *ops;
-       int n_ops;
-};
-typedef struct nss_backend nss_backend_t;
-typedef int nss_dbop_t;
-
-#endif /* _HP_NSS_COMMON_H */
+
+#include <ns_api.h>
+
+typedef enum
+{
+  NSS_STATUS_SUCCESS=NS_SUCCESS,
+  NSS_STATUS_NOTFOUND=NS_NOTFOUND,
+  NSS_STATUS_UNAVAIL=NS_UNAVAIL,
+  NSS_STATUS_TRYAGAIN=NS_TRYAGAIN
+} NSS_STATUS;
+
+#define NSD_MEM_STATIC 0
+#define NSD_MEM_VOLATILE 1
+#define NSD_MEM_DYNAMIC 2
+
+#endif /* _WINBIND_NSS_IRIX_H */
similarity index 58%
rename from source3/nsswitch/winbind_nss.c
rename to source3/nsswitch/winbind_nss_linux.c
index 0b4c0ce1d087786d97dc4b6f6a7378ff1b29a544..125bc8ccdaf9b6e9f3aff8f854e21bdad1d3c465 100644 (file)
 
 #include "winbind_client.h"
 
-#ifdef HAVE_NS_API_H
-#undef VOLATILE
-
-#include <ns_daemon.h>
-#endif
+/* Maximum number of users to pass back over the unix domain socket
+   per call. This is not a static limit on the total number of users 
+   or groups returned in total. */
 
 #define MAX_GETPWENT_USERS 250
 #define MAX_GETGRENT_USERS 250
 
 extern int winbindd_fd;
 
-
-#ifdef HAVE_NS_API_H
-/* IRIX version */
-
-static int send_next_request(nsd_file_t *, struct winbindd_request *);
-static int do_list(int state, nsd_file_t *rq);
-
-static nsd_file_t *current_rq = NULL;
-static int current_winbind_xid = 0;
-static int next_winbind_xid = 0;
-
-typedef struct winbind_xid {
-       int                     xid;
-       nsd_file_t              *rq;
-       struct winbindd_request *request;
-       struct winbind_xid      *next;
-} winbind_xid_t;
-
-static winbind_xid_t *winbind_xids = (winbind_xid_t *)0;
-
-static int
-winbind_xid_new(int xid, nsd_file_t *rq, struct winbindd_request *request)
-{
-       winbind_xid_t *new;
-
-       nsd_logprintf(NSD_LOG_LOW,
-               "entering winbind_xid_new xid = %d rq = 0x%x, request = 0x%x\n",
-               xid, rq, request);
-       new = (winbind_xid_t *)nsd_calloc(1,sizeof(winbind_xid_t));
-       if (!new) {
-               nsd_logprintf(NSD_LOG_RESOURCE,"winbind_xid_new: failed malloc\n");
-               return NSD_ERROR;
-       }
-
-       new->xid = xid;
-       new->rq = rq;
-       new->request = request;
-       new->next = winbind_xids;
-       winbind_xids = new;
-
-       return NSD_CONTINUE;
-}
-
-/*
-** This routine will look down the xid list and return the request
-** associated with an xid.  We remove the record if it is found.
-*/
-nsd_file_t *
-winbind_xid_lookup(int xid, struct winbindd_request **requestp)
-{
-        winbind_xid_t **last, *dx;
-        nsd_file_t *result=0;
-
-        for (last = &winbind_xids, dx = winbind_xids; dx && (dx->xid != xid);
-            last = &dx->next, dx = dx->next);
-        if (dx) {
-                *last = dx->next;
-                result = dx->rq;
-               *requestp = dx->request;
-                SAFE_FREE(dx);
-        }
-       nsd_logprintf(NSD_LOG_LOW,
-               "entering winbind_xid_lookup xid = %d rq = 0x%x, request = 0x%x\n",
-               xid, result, dx->request);
-
-        return result;
-}
-
-static int
-winbind_startnext_timeout(nsd_file_t **rqp, nsd_times_t *to)
-{
-       nsd_file_t *rq;
-       struct winbindd_request *request;
-
-       nsd_logprintf(NSD_LOG_MIN, "timeout (winbind startnext)\n");
-       rq = to->t_file;
-       *rqp = rq;
-       nsd_timeout_remove(rq);
-       request = to->t_clientdata;
-       return(send_next_request(rq, request));
-}
-
-static void
-dequeue_request()
-{
-       nsd_file_t *rq;
-       struct winbindd_request *request;
-
-       /*
-        * Check for queued requests
-        */
-       if (winbind_xids) {
-           nsd_logprintf(NSD_LOG_MIN, "timeout (winbind) unqueue xid %d\n",
-                       current_winbind_xid);
-           rq = winbind_xid_lookup(current_winbind_xid++, &request);
-           /* cause a timeout on the queued request so we can send it */
-           nsd_timeout_new(rq,1,winbind_startnext_timeout,request);
-       }
-}
-
-static int
-do_request(nsd_file_t *rq, struct winbindd_request *request)
-{
-       if (winbind_xids == NULL) {
-               /*
-                * No outstanding requests.
-                * Send off the request to winbindd
-                */
-               nsd_logprintf(NSD_LOG_MIN, "lookup (winbind) sending request\n");
-               return(send_next_request(rq, request));
-       } else {
-               /*
-                * Just queue it up for now - previous callout or timout
-                * will start it up
-                */
-               nsd_logprintf(NSD_LOG_MIN,
-                       "lookup (winbind): queue request xid = %d\n",
-                       next_winbind_xid);
-               return(winbind_xid_new(next_winbind_xid++, rq, request));
-       }
-}
-
-static int 
-winbind_callback(nsd_file_t **rqp, int fd)
-{
-       struct winbindd_response response;
-       struct winbindd_pw *pw = &response.data.pw;
-       struct winbindd_gr *gr = &response.data.gr;
-       nsd_file_t *rq;
-       NSS_STATUS status;
-       fstring result;
-       char *members;
-       int i, maxlen;
-
-       dequeue_request();
-
-       nsd_logprintf(NSD_LOG_MIN, "entering callback (winbind)\n");
-
-       rq = current_rq;
-       *rqp = rq;
-
-       nsd_timeout_remove(rq);
-       nsd_callback_remove(fd);
-
-       ZERO_STRUCT(response);
-       status = winbindd_get_response(&response);
-
-       if (status != NSS_STATUS_SUCCESS) {
-               /* free any extra data area in response structure */
-               free_response(&response);
-               nsd_logprintf(NSD_LOG_MIN, 
-                       "callback (winbind) returning not found, status = %d\n",
-                       status);
-               rq->f_status = NS_NOTFOUND;
-               return NSD_NEXT;
-       }
-
-       maxlen = sizeof(result) - 1;
-
-       switch ((int)rq->f_cmd_data) {
-           case WINBINDD_WINS_BYNAME:
-           case WINBINDD_WINS_BYIP:
-               snprintf(result,maxlen,"%s\n",response.data.winsresp);
-               break;
-           case WINBINDD_GETPWUID:
-           case WINBINDD_GETPWNAM:
-               snprintf(result,maxlen,"%s:%s:%d:%d:%s:%s:%s\n",
-                       pw->pw_name,
-                       pw->pw_passwd,
-                       pw->pw_uid,
-                       pw->pw_gid,
-                       pw->pw_gecos,
-                       pw->pw_dir,
-                       pw->pw_shell);
-               break;
-           case WINBINDD_GETGRNAM:
-           case WINBINDD_GETGRGID:
-               if (gr->num_gr_mem && response.extra_data)
-                       members = response.extra_data;
-               else
-                       members = "";
-               snprintf(result,maxlen,"%s:%s:%d:%s\n",
-                       gr->gr_name, gr->gr_passwd, gr->gr_gid, members);
-               break;
-           case WINBINDD_SETGRENT:
-           case WINBINDD_SETPWENT:
-               nsd_logprintf(NSD_LOG_MIN, "callback (winbind) - SETPWENT/SETGRENT\n");
-               free_response(&response);
-               return(do_list(1,rq));
-           case WINBINDD_GETGRENT:
-           case WINBINDD_GETGRLST:
-               nsd_logprintf(NSD_LOG_MIN, 
-                       "callback (winbind) - %d GETGRENT responses\n",
-                       response.data.num_entries);
-               if (response.data.num_entries) {
-                   gr = (struct winbindd_gr *)response.extra_data;
-                   if (! gr ) {
-                       nsd_logprintf(NSD_LOG_MIN, "     no extra_data\n");
-                       free_response(&response);
-                       return NSD_ERROR;
-                   }
-                   members = (char *)response.extra_data + 
-                               (response.data.num_entries * sizeof(struct winbindd_gr));
-                   for (i = 0; i < response.data.num_entries; i++) {
-                       snprintf(result,maxlen,"%s:%s:%d:%s\n",
-                               gr->gr_name, gr->gr_passwd, gr->gr_gid, 
-                               &members[gr->gr_mem_ofs]);
-                       nsd_logprintf(NSD_LOG_MIN, "     GETGRENT %s\n",result);
-                       nsd_append_element(rq,NS_SUCCESS,result,strlen(result));
-                       gr++;
-                   }
-               }
-               i = response.data.num_entries;
-               free_response(&response);
-               if (i < MAX_GETPWENT_USERS)
-                   return(do_list(2,rq));
-               else
-                   return(do_list(1,rq));
-           case WINBINDD_GETPWENT:
-               nsd_logprintf(NSD_LOG_MIN, 
-                       "callback (winbind) - %d GETPWENT responses\n",
-                       response.data.num_entries);
-               if (response.data.num_entries) {
-                   pw = (struct winbindd_pw *)response.extra_data;
-                   if (! pw ) {
-                       nsd_logprintf(NSD_LOG_MIN, "     no extra_data\n");
-                       free_response(&response);
-                       return NSD_ERROR;
-                   }
-                   for (i = 0; i < response.data.num_entries; i++) {
-                       snprintf(result,maxlen,"%s:%s:%d:%d:%s:%s:%s",
-                               pw->pw_name,
-                               pw->pw_passwd,
-                               pw->pw_uid,
-                               pw->pw_gid,
-                               pw->pw_gecos,
-                               pw->pw_dir,
-                               pw->pw_shell);
-                       nsd_logprintf(NSD_LOG_MIN, "     GETPWENT %s\n",result);
-                       nsd_append_element(rq,NS_SUCCESS,result,strlen(result));
-                       pw++;
-                   }
-               }
-               i = response.data.num_entries;
-               free_response(&response);
-               if (i < MAX_GETPWENT_USERS)
-                   return(do_list(2,rq));
-               else
-                   return(do_list(1,rq));
-           case WINBINDD_ENDGRENT:
-           case WINBINDD_ENDPWENT:
-               nsd_logprintf(NSD_LOG_MIN, "callback (winbind) - ENDPWENT/ENDGRENT\n");
-               nsd_append_element(rq,NS_SUCCESS,"\n",1);
-               free_response(&response);
-               return NSD_NEXT;
-           default:
-               free_response(&response);
-               nsd_logprintf(NSD_LOG_MIN, "callback (winbind) - no valid command\n");
-               return NSD_NEXT;
-       }
-       nsd_logprintf(NSD_LOG_MIN, "callback (winbind) %s\n", result);
-       /* free any extra data area in response structure */
-       free_response(&response);
-       nsd_set_result(rq,NS_SUCCESS,result,strlen(result),VOLATILE);
-       return NSD_OK;
-}
-
-static int 
-winbind_timeout(nsd_file_t **rqp, nsd_times_t *to)
-{
-       nsd_file_t *rq;
-
-       dequeue_request();
-
-       nsd_logprintf(NSD_LOG_MIN, "timeout (winbind)\n");
-
-       rq = to->t_file;
-       *rqp = rq;
-
-       /* Remove the callback and timeout */
-       nsd_callback_remove(winbindd_fd);
-       nsd_timeout_remove(rq);
-
-       rq->f_status = NS_NOTFOUND;
-       return NSD_NEXT;
-}
-
-static int
-send_next_request(nsd_file_t *rq, struct winbindd_request *request)
-{
-       NSS_STATUS status;
-       long timeout;
-
-       timeout = 1000;
-
-       nsd_logprintf(NSD_LOG_MIN, "send_next_request (winbind) %d to = %d\n",
-                       rq->f_cmd_data, timeout);
-       status = winbindd_send_request((int)rq->f_cmd_data,request);
-       SAFE_FREE(request);
-
-       if (status != NSS_STATUS_SUCCESS) {
-               nsd_logprintf(NSD_LOG_MIN, 
-                       "send_next_request (winbind) error status = %d\n",status);
-               rq->f_status = status;
-               return NSD_NEXT;
-       }
-
-       current_rq = rq;
-
-       /*
-        * Set up callback and timeouts
-        */
-       nsd_logprintf(NSD_LOG_MIN, "send_next_request (winbind) fd = %d\n",winbindd_fd);
-       nsd_callback_new(winbindd_fd,winbind_callback,NSD_READ);
-       nsd_timeout_new(rq,timeout,winbind_timeout,(void *)0);
-       return NSD_CONTINUE;
-}
-
-int init(void)
-{
-       nsd_logprintf(NSD_LOG_MIN, "entering init (winbind)\n");
-       return(NSD_OK);
-}
-
-int lookup(nsd_file_t *rq)
-{
-       char *map;
-       char *key;
-       struct winbindd_request *request;
-
-       nsd_logprintf(NSD_LOG_MIN, "entering lookup (winbind)\n");
-       if (! rq)
-               return NSD_ERROR;
-
-       map = nsd_attr_fetch_string(rq->f_attrs, "table", (char*)0);
-       key = nsd_attr_fetch_string(rq->f_attrs, "key", (char*)0);
-       if (! map || ! key) {
-               nsd_logprintf(NSD_LOG_MIN, "lookup (winbind) table or key not defined\n");
-               rq->f_status = NS_BADREQ;
-               return NSD_ERROR;
-       }
-
-       nsd_logprintf(NSD_LOG_MIN, "lookup (winbind %s)\n",map);
-
-       request = (struct winbindd_request *)nsd_calloc(1,sizeof(struct winbindd_request));
-       if (! request) {
-               nsd_logprintf(NSD_LOG_RESOURCE,
-                       "lookup (winbind): failed malloc\n");
-               return NSD_ERROR;
-       }
-
-       if (strcasecmp(map,"passwd.byuid") == 0) {
-           request->data.uid = atoi(key);
-           rq->f_cmd_data = (void *)WINBINDD_GETPWUID;
-       } else if (strcasecmp(map,"passwd.byname") == 0) {
-           strncpy(request->data.username, key, 
-               sizeof(request->data.username) - 1);
-           request->data.username[sizeof(request->data.username) - 1] = '\0';
-           rq->f_cmd_data = (void *)WINBINDD_GETPWNAM; 
-       } else if (strcasecmp(map,"group.byname") == 0) {
-           strncpy(request->data.groupname, key, 
-               sizeof(request->data.groupname) - 1);
-           request->data.groupname[sizeof(request->data.groupname) - 1] = '\0';
-           rq->f_cmd_data = (void *)WINBINDD_GETGRNAM; 
-       } else if (strcasecmp(map,"group.bygid") == 0) {
-           request->data.gid = atoi(key);
-           rq->f_cmd_data = (void *)WINBINDD_GETGRGID;
-       } else if (strcasecmp(map,"hosts.byname") == 0) {
-           strncpy(request->data.winsreq, key, sizeof(request->data.winsreq) - 1);
-           request->data.winsreq[sizeof(request->data.winsreq) - 1] = '\0';
-           rq->f_cmd_data = (void *)WINBINDD_WINS_BYNAME;
-       } else if (strcasecmp(map,"hosts.byaddr") == 0) {
-           strncpy(request->data.winsreq, key, sizeof(request->data.winsreq) - 1);
-           request->data.winsreq[sizeof(request->data.winsreq) - 1] = '\0';
-           rq->f_cmd_data = (void *)WINBINDD_WINS_BYIP;
-       } else {
-               /*
-                * Don't understand this map - just return not found
-                */
-               nsd_logprintf(NSD_LOG_MIN, "lookup (winbind) unknown table\n");
-               SAFE_FREE(request);
-               rq->f_status = NS_NOTFOUND;
-               return NSD_NEXT;
-       }
-
-       return(do_request(rq, request));
-}
-
-int list(nsd_file_t *rq)
-{
-       char *map;
-
-       nsd_logprintf(NSD_LOG_MIN, "entering list (winbind)\n");
-       if (! rq)
-               return NSD_ERROR;
-
-       map = nsd_attr_fetch_string(rq->f_attrs, "table", (char*)0);
-       if (! map ) {
-               nsd_logprintf(NSD_LOG_MIN, "list (winbind) table not defined\n");
-               rq->f_status = NS_BADREQ;
-               return NSD_ERROR;
-       }
-
-       nsd_logprintf(NSD_LOG_MIN, "list (winbind %s)\n",map);
-
-       return (do_list(0,rq));
-}
-
-static int
-do_list(int state, nsd_file_t *rq)
-{
-       char *map;
-       struct winbindd_request *request;
-
-       nsd_logprintf(NSD_LOG_MIN, "entering do_list (winbind) state = %d\n",state);
-
-       map = nsd_attr_fetch_string(rq->f_attrs, "table", (char*)0);
-       request = (struct winbindd_request *)nsd_calloc(1,sizeof(struct winbindd_request));
-       if (! request) {
-               nsd_logprintf(NSD_LOG_RESOURCE,
-                       "do_list (winbind): failed malloc\n");
-               return NSD_ERROR;
-       }
-
-       if (strcasecmp(map,"passwd.byname") == 0) {
-           switch (state) {
-               case 0:
-                   rq->f_cmd_data = (void *)WINBINDD_SETPWENT;
-                   break;
-               case 1:
-                   request->data.num_entries = MAX_GETPWENT_USERS;
-                   rq->f_cmd_data = (void *)WINBINDD_GETPWENT;
-                   break;
-               case 2:
-                   rq->f_cmd_data = (void *)WINBINDD_ENDPWENT;
-                   break;
-               default:
-                   nsd_logprintf(NSD_LOG_MIN, "do_list (winbind) unknown state\n");
-                   SAFE_FREE(request);
-                   rq->f_status = NS_NOTFOUND;
-                   return NSD_NEXT;
-           }
-       } else if (strcasecmp(map,"group.byname") == 0) {
-           switch (state) {
-               case 0:
-                   rq->f_cmd_data = (void *)WINBINDD_SETGRENT;
-                   break;
-               case 1:
-                   request->data.num_entries = MAX_GETGRENT_USERS;
-                   rq->f_cmd_data = (void *)WINBINDD_GETGRENT;
-                   break;
-               case 2:
-                   rq->f_cmd_data = (void *)WINBINDD_ENDGRENT;
-                   break;
-               default:
-                   nsd_logprintf(NSD_LOG_MIN, "do_list (winbind) unknown state\n");
-                   SAFE_FREE(request);
-                   rq->f_status = NS_NOTFOUND;
-                   return NSD_NEXT;
-           }
-       } else {
-               /*
-                * Don't understand this map - just return not found
-                */
-               nsd_logprintf(NSD_LOG_MIN, "do_list (winbind) unknown table\n");
-               SAFE_FREE(request);
-               rq->f_status = NS_NOTFOUND;
-               return NSD_NEXT;
-       }
-
-       return(do_request(rq, request));
-}
-
-#else
-
 /* Allocate some space from the nss static buffer.  The buffer and buflen
    are the pointers passed in by the C library to the _nss_ntdom_*
    functions. */
@@ -1337,5 +860,3 @@ _nss_winbind_initgroups_dyn(char *user, gid_t group, long int *start,
  done:
        return ret;
 }
-
-#endif
diff --git a/source3/nsswitch/winbind_nss_linux.h b/source3/nsswitch/winbind_nss_linux.h
new file mode 100644 (file)
index 0000000..1c7e830
--- /dev/null
@@ -0,0 +1,35 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   Winbind daemon for ntdom nss module
+
+   Copyright (C) Tim Potter 2000
+   
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the
+   Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA  02111-1307, USA.   
+*/
+
+#ifndef _WINBIND_NSS_LINUX_H
+#define _WINBIND_NSS_LINUX_H
+
+#if HAVE_NSS_H
+
+#include <nss.h>
+
+typedef enum nss_status NSS_STATUS;
+
+#endif /* HAVE_NSS_H */
+
+#endif /* _WINBIND_NSS_LINUX_H */
index f3bd05b77a64464b1bae472c877a441a7f8397a4..6671090e6a6635939cb9c74db63762f984e10c86 100644 (file)
@@ -297,5 +297,3 @@ _nss_winbind_group_constr (const char* db_name,
 }
 
 #endif /* SUN_NSS */
-
-
diff --git a/source3/nsswitch/winbind_nss_solaris.h b/source3/nsswitch/winbind_nss_solaris.h
new file mode 100644 (file)
index 0000000..567de41
--- /dev/null
@@ -0,0 +1,61 @@
+/* 
+   Unix SMB/CIFS implementation.
+
+   Winbind daemon for ntdom nss module
+
+   Copyright (C) Tim Potter 2000
+   
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+   
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+   
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the
+   Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA  02111-1307, USA.   
+*/
+
+#ifndef _WINBIND_NSS_SOLARIS_H
+#define _WINBIND_NSS_SOLARIS_H
+
+#include <nss_common.h>
+#include <nss_dbdefs.h>
+#include <nsswitch.h>
+
+typedef nss_status_t NSS_STATUS;
+
+#define NSS_STATUS_SUCCESS     NSS_SUCCESS
+#define NSS_STATUS_NOTFOUND    NSS_NOTFOUND
+#define NSS_STATUS_UNAVAIL     NSS_UNAVAIL
+#define NSS_STATUS_TRYAGAIN    NSS_TRYAGAIN
+
+/* The solaris winbind is implemented as a wrapper around the linux
+   version. */
+
+NSS_STATUS _nss_winbind_setpwent(void);
+NSS_STATUS _nss_winbind_endpwent(void);
+NSS_STATUS _nss_winbind_getpwent_r(struct passwd* result, char* buffer,
+                                  size_t buflen, int* errnop);
+NSS_STATUS _nss_winbind_getpwuid_r(uid_t, struct passwd*, char* buffer,
+                                  size_t buflen, int* errnop);
+NSS_STATUS _nss_winbind_getpwnam_r(const char* name, struct passwd* result,
+                                  char* buffer, size_t buflen, int* errnop);
+
+NSS_STATUS _nss_winbind_setgrent(void);
+NSS_STATUS _nss_winbind_endgrent(void);
+NSS_STATUS _nss_winbind_getgrent_r(struct group* result, char* buffer,
+                                  size_t buflen, int* errnop);
+NSS_STATUS _nss_winbind_getgrnam_r(const char *name,
+                                  struct group *result, char *buffer,
+                                  size_t buflen, int *errnop);
+NSS_STATUS _nss_winbind_getgrgid_r(gid_t gid,
+                                  struct group *result, char *buffer,
+                                  size_t buflen, int *errnop);
+
+#endif /* _WINBIND_NSS_SOLARIS_H */