]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
added solaris wrapper from tng
authorAndrew Tridgell <tridge@samba.org>
Wed, 25 Apr 2001 06:45:27 +0000 (06:45 +0000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 25 Apr 2001 06:45:27 +0000 (06:45 +0000)
source/nsswitch/winbind_nss_solaris.c [new file with mode: 0644]

diff --git a/source/nsswitch/winbind_nss_solaris.c b/source/nsswitch/winbind_nss_solaris.c
new file mode 100644 (file)
index 0000000..de8a63b
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+  Solaris NSS wrapper for winbind 
+  - Shirish Kalele 2000
+
+  Based on Luke Howard's ldap_nss module for Solaris 
+  */
+
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <string.h>
+#include <pwd.h>
+#include <syslog.h>
+#include <sys/syslog.h>
+#include "includes.h"
+#include "winbind_nss_config.h"
+
+#ifdef HAVE_NSS_COMMON_H 
+
+#undef NSS_DEBUG
+
+#ifdef NSS_DEBUG
+#define NSS_DEBUG(str) syslog(LOG_DEBUG, "nss_winbind: %s", str);
+#else
+#define NSS_DEBUG(str) ;
+#endif
+
+#define NSS_ARGS(args) ((nss_XbyY_args_t *)args)
+
+#define make_pwent_str(dest, src)                                      \
+{                                                                      \
+  if((dest = get_static(buffer, buflen, strlen(src)+1)) == NULL)       \
+    {                                                                  \
+      *errnop = ERANGE;                                                        \
+      NSS_DEBUG("ERANGE error");                                       \
+      return NSS_STATUS_TRYAGAIN;                                      \
+    }                                                                  \
+  strcpy(dest, src);                                                   \
+}
+
+static NSS_STATUS _nss_winbind_setpwent_solwrap (nss_backend_t* be, void* args)
+{
+       NSS_DEBUG("_nss_winbind_setpwent_solwrap");
+       return _nss_winbind_setpwent();
+}
+
+static NSS_STATUS
+_nss_winbind_endpwent_solwrap (nss_backend_t * be, void *args)
+{
+       NSS_DEBUG("_nss_winbind_endpwent_solwrap");
+       return _nss_winbind_endpwent();
+}
+
+static NSS_STATUS
+_nss_winbind_getpwent_solwrap (nss_backend_t* be, void *args)
+{
+       NSS_STATUS ret;
+       char* buffer = NSS_ARGS(args)->buf.buffer;
+       int buflen = NSS_ARGS(args)->buf.buflen;
+       struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
+       int* errnop = &NSS_ARGS(args)->erange;
+       char logmsg[80];
+
+       ret = _nss_winbind_getpwent_r(result, buffer, 
+                                     buflen, errnop);
+
+       if(ret == NSS_STATUS_SUCCESS)
+               {
+                       snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning user: %s\n",
+                                result->pw_name);
+                       NSS_DEBUG(logmsg);
+                       NSS_ARGS(args)->returnval = (void*) result;
+               } else {
+                       snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning error: %d.\n",ret);
+                       NSS_DEBUG(logmsg);
+               }
+    
+       return ret;
+}
+
+static NSS_STATUS
+_nss_winbind_getpwnam_solwrap (nss_backend_t* be, void* args)
+{
+       NSS_STATUS ret;
+       struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
+
+       NSS_DEBUG("_nss_winbind_getpwnam_solwrap");
+
+       ret = _nss_winbind_getpwnam_r (NSS_ARGS(args)->key.name,
+                                               result,
+                                               NSS_ARGS(args)->buf.buffer,
+                                               NSS_ARGS(args)->buf.buflen,
+                                               &NSS_ARGS(args)->erange);
+       if(ret == NSS_STATUS_SUCCESS)
+               NSS_ARGS(args)->returnval = (void*) result;
+  
+       return ret;
+}
+
+static NSS_STATUS
+_nss_winbind_getpwuid_solwrap(nss_backend_t* be, void* args)
+{
+       NSS_STATUS ret;
+       struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
+  
+       NSS_DEBUG("_nss_winbind_getpwuid_solwrap");
+       ret = _nss_winbind_getpwuid_r (NSS_ARGS(args)->key.uid,
+                                      result,
+                                      NSS_ARGS(args)->buf.buffer,
+                                      NSS_ARGS(args)->buf.buflen,
+                                      &NSS_ARGS(args)->erange);
+       if(ret == NSS_STATUS_SUCCESS)
+               NSS_ARGS(args)->returnval = (void*) result;
+  
+       return ret;
+}
+
+static NSS_STATUS _nss_winbind_passwd_destr (nss_backend_t * be, void *args)
+{
+       free(be);
+       NSS_DEBUG("_nss_winbind_passwd_destr");
+       return NSS_STATUS_SUCCESS;
+}
+
+static nss_backend_op_t passwd_ops[] =
+{
+       _nss_winbind_passwd_destr,
+       _nss_winbind_endpwent_solwrap,          /* NSS_DBOP_ENDENT */
+       _nss_winbind_setpwent_solwrap,          /* NSS_DBOP_SETENT */
+       _nss_winbind_getpwent_solwrap,          /* NSS_DBOP_GETENT */
+       _nss_winbind_getpwnam_solwrap,          /* NSS_DBOP_PASSWD_BYNAME */
+       _nss_winbind_getpwuid_solwrap           /* NSS_DBOP_PASSWD_BYUID */
+};
+
+nss_backend_t*
+_nss_winbind_passwd_constr (const char* db_name,
+                           const char* src_name,
+                           const char* cfg_args)
+{
+       nss_backend_t *be;
+  
+       if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
+               return NULL;
+
+       be->ops = passwd_ops;
+       be->n_ops = sizeof(passwd_ops) / sizeof(nss_backend_op_t);
+
+       NSS_DEBUG("Initialized nss_winbind passwd backend");
+       return be;
+}
+
+/*****************************************************************
+ GROUP database backend
+ *****************************************************************/
+
+static NSS_STATUS _nss_winbind_setgrent_solwrap (nss_backend_t* be, void* args)
+{
+       NSS_DEBUG("_nss_winbind_setgrent_solwrap");
+       return _nss_winbind_setgrent();
+}
+
+static NSS_STATUS
+_nss_winbind_endgrent_solwrap (nss_backend_t * be, void *args)
+{
+       NSS_DEBUG("_nss_winbind_endgrent_solwrap");
+       return _nss_winbind_endgrent();
+}
+
+static NSS_STATUS
+_nss_winbind_getgrent_solwrap(nss_backend_t* be, void* args)
+{
+       NSS_STATUS ret;
+       char* buffer = NSS_ARGS(args)->buf.buffer;
+       int buflen = NSS_ARGS(args)->buf.buflen;
+       struct group* result = (struct group*) NSS_ARGS(args)->buf.result;
+       int* errnop = &NSS_ARGS(args)->erange;
+       char logmsg[80];
+
+       ret = _nss_winbind_getgrent_r(result, buffer, 
+                                     buflen, errnop);
+
+       if(ret == NSS_STATUS_SUCCESS)
+               {
+                       snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning group: %s\n", result->gr_name);
+                       NSS_DEBUG(logmsg);
+                       NSS_ARGS(args)->returnval = (void*) result;
+               } else {
+                       snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning error: %d.\n", ret);
+                       NSS_DEBUG(logmsg);
+               }
+
+       return ret;
+       
+}
+
+static NSS_STATUS
+_nss_winbind_getgrnam_solwrap(nss_backend_t* be, void* args)
+{
+       NSS_STATUS ret;
+       struct group* result = (struct group*) NSS_ARGS(args)->buf.result;
+
+       NSS_DEBUG("_nss_winbind_getgrnam_solwrap");
+       ret = _nss_winbind_getgrnam_r(NSS_ARGS(args)->key.name,
+                                     result,
+                                     NSS_ARGS(args)->buf.buffer,
+                                     NSS_ARGS(args)->buf.buflen,
+                                     &NSS_ARGS(args)->erange);
+
+       if(ret == NSS_STATUS_SUCCESS)
+               NSS_ARGS(args)->returnval = (void*) result;
+  
+       return ret;
+}
+  
+static NSS_STATUS
+_nss_winbind_getgrgid_solwrap(nss_backend_t* be, void* args)
+{
+       NSS_STATUS ret;
+       struct group* result = (struct group*) NSS_ARGS(args)->buf.result;
+
+       NSS_DEBUG("_nss_winbind_getgrgid_solwrap");
+       ret = _nss_winbind_getgrgid_r (NSS_ARGS(args)->key.gid,
+                                      result,
+                                      NSS_ARGS(args)->buf.buffer,
+                                      NSS_ARGS(args)->buf.buflen,
+                                      &NSS_ARGS(args)->erange);
+
+       if(ret == NSS_STATUS_SUCCESS)
+               NSS_ARGS(args)->returnval = (void*) result;
+
+       return ret;
+}
+
+static NSS_STATUS
+_nss_winbind_getgroupsbymember_solwrap(nss_backend_t* be, void* args)
+{
+       NSS_DEBUG("_nss_winbind_getgroupsbymember");
+       return NSS_STATUS_NOTFOUND;
+}
+
+static NSS_STATUS
+_nss_winbind_group_destr (nss_backend_t* be, void* args)
+{
+       free(be);
+       NSS_DEBUG("_nss_winbind_group_destr");
+       return NSS_STATUS_SUCCESS;
+}
+
+static nss_backend_op_t group_ops[] = 
+{
+       _nss_winbind_group_destr,
+       _nss_winbind_endgrent_solwrap,
+       _nss_winbind_setgrent_solwrap,
+       _nss_winbind_getgrent_solwrap,
+       _nss_winbind_getgrnam_solwrap,
+       _nss_winbind_getgrgid_solwrap,
+       _nss_winbind_getgroupsbymember_solwrap
+}; 
+
+nss_backend_t*
+_nss_winbind_group_constr (const char* db_name,
+                          const char* src_name,
+                          const char* cfg_args)
+{
+       nss_backend_t* be;
+
+       if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
+               return NULL;
+
+       be->ops = group_ops;
+       be->n_ops = sizeof(group_ops) / sizeof(nss_backend_op_t);
+  
+       NSS_DEBUG("Initialized nss_winbind group backend");
+       return be;
+}
+
+#endif /* SUN_NSS */
+
+