2 Solaris NSS wrapper for winbind
5 Based on Luke Howard's ldap_nss module for Solaris
10 #include <sys/param.h>
14 #include <sys/syslog.h>
16 #include "winbind_nss_config.h"
18 #ifdef HAVE_NSS_COMMON_H
23 #define NSS_DEBUG(str) syslog(LOG_DEBUG, "nss_winbind: %s", str);
25 #define NSS_DEBUG(str) ;
28 #define NSS_ARGS(args) ((nss_XbyY_args_t *)args)
30 #define make_pwent_str(dest, src) \
32 if((dest = get_static(buffer, buflen, strlen(src)+1)) == NULL) \
35 NSS_DEBUG("ERANGE error"); \
36 return NSS_STATUS_TRYAGAIN; \
41 static NSS_STATUS _nss_winbind_setpwent_solwrap (nss_backend_t* be, void* args)
43 NSS_DEBUG("_nss_winbind_setpwent_solwrap");
44 return _nss_winbind_setpwent();
48 _nss_winbind_endpwent_solwrap (nss_backend_t * be, void *args)
50 NSS_DEBUG("_nss_winbind_endpwent_solwrap");
51 return _nss_winbind_endpwent();
55 _nss_winbind_getpwent_solwrap (nss_backend_t* be, void *args)
58 char* buffer = NSS_ARGS(args)->buf.buffer;
59 int buflen = NSS_ARGS(args)->buf.buflen;
60 struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
61 int* errnop = &NSS_ARGS(args)->erange;
64 ret = _nss_winbind_getpwent_r(result, buffer,
67 if(ret == NSS_STATUS_SUCCESS)
69 snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning user: %s\n",
72 NSS_ARGS(args)->returnval = (void*) result;
74 snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning error: %d.\n",ret);
82 _nss_winbind_getpwnam_solwrap (nss_backend_t* be, void* args)
85 struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
87 NSS_DEBUG("_nss_winbind_getpwnam_solwrap");
89 ret = _nss_winbind_getpwnam_r (NSS_ARGS(args)->key.name,
91 NSS_ARGS(args)->buf.buffer,
92 NSS_ARGS(args)->buf.buflen,
93 &NSS_ARGS(args)->erange);
94 if(ret == NSS_STATUS_SUCCESS)
95 NSS_ARGS(args)->returnval = (void*) result;
101 _nss_winbind_getpwuid_solwrap(nss_backend_t* be, void* args)
104 struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
106 NSS_DEBUG("_nss_winbind_getpwuid_solwrap");
107 ret = _nss_winbind_getpwuid_r (NSS_ARGS(args)->key.uid,
109 NSS_ARGS(args)->buf.buffer,
110 NSS_ARGS(args)->buf.buflen,
111 &NSS_ARGS(args)->erange);
112 if(ret == NSS_STATUS_SUCCESS)
113 NSS_ARGS(args)->returnval = (void*) result;
118 static NSS_STATUS _nss_winbind_passwd_destr (nss_backend_t * be, void *args)
121 NSS_DEBUG("_nss_winbind_passwd_destr");
122 return NSS_STATUS_SUCCESS;
125 static nss_backend_op_t passwd_ops[] =
127 _nss_winbind_passwd_destr,
128 _nss_winbind_endpwent_solwrap, /* NSS_DBOP_ENDENT */
129 _nss_winbind_setpwent_solwrap, /* NSS_DBOP_SETENT */
130 _nss_winbind_getpwent_solwrap, /* NSS_DBOP_GETENT */
131 _nss_winbind_getpwnam_solwrap, /* NSS_DBOP_PASSWD_BYNAME */
132 _nss_winbind_getpwuid_solwrap /* NSS_DBOP_PASSWD_BYUID */
136 _nss_winbind_passwd_constr (const char* db_name,
137 const char* src_name,
138 const char* cfg_args)
142 if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
145 be->ops = passwd_ops;
146 be->n_ops = sizeof(passwd_ops) / sizeof(nss_backend_op_t);
148 NSS_DEBUG("Initialized nss_winbind passwd backend");
152 /*****************************************************************
153 GROUP database backend
154 *****************************************************************/
156 static NSS_STATUS _nss_winbind_setgrent_solwrap (nss_backend_t* be, void* args)
158 NSS_DEBUG("_nss_winbind_setgrent_solwrap");
159 return _nss_winbind_setgrent();
163 _nss_winbind_endgrent_solwrap (nss_backend_t * be, void *args)
165 NSS_DEBUG("_nss_winbind_endgrent_solwrap");
166 return _nss_winbind_endgrent();
170 _nss_winbind_getgrent_solwrap(nss_backend_t* be, void* args)
173 char* buffer = NSS_ARGS(args)->buf.buffer;
174 int buflen = NSS_ARGS(args)->buf.buflen;
175 struct group* result = (struct group*) NSS_ARGS(args)->buf.result;
176 int* errnop = &NSS_ARGS(args)->erange;
179 ret = _nss_winbind_getgrent_r(result, buffer,
182 if(ret == NSS_STATUS_SUCCESS)
184 snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning group: %s\n", result->gr_name);
186 NSS_ARGS(args)->returnval = (void*) result;
188 snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning error: %d.\n", ret);
197 _nss_winbind_getgrnam_solwrap(nss_backend_t* be, void* args)
200 struct group* result = (struct group*) NSS_ARGS(args)->buf.result;
202 NSS_DEBUG("_nss_winbind_getgrnam_solwrap");
203 ret = _nss_winbind_getgrnam_r(NSS_ARGS(args)->key.name,
205 NSS_ARGS(args)->buf.buffer,
206 NSS_ARGS(args)->buf.buflen,
207 &NSS_ARGS(args)->erange);
209 if(ret == NSS_STATUS_SUCCESS)
210 NSS_ARGS(args)->returnval = (void*) result;
216 _nss_winbind_getgrgid_solwrap(nss_backend_t* be, void* args)
219 struct group* result = (struct group*) NSS_ARGS(args)->buf.result;
221 NSS_DEBUG("_nss_winbind_getgrgid_solwrap");
222 ret = _nss_winbind_getgrgid_r (NSS_ARGS(args)->key.gid,
224 NSS_ARGS(args)->buf.buffer,
225 NSS_ARGS(args)->buf.buflen,
226 &NSS_ARGS(args)->erange);
228 if(ret == NSS_STATUS_SUCCESS)
229 NSS_ARGS(args)->returnval = (void*) result;
235 _nss_winbind_getgroupsbymember_solwrap(nss_backend_t* be, void* args)
237 NSS_DEBUG("_nss_winbind_getgroupsbymember");
238 return NSS_STATUS_NOTFOUND;
242 _nss_winbind_group_destr (nss_backend_t* be, void* args)
245 NSS_DEBUG("_nss_winbind_group_destr");
246 return NSS_STATUS_SUCCESS;
249 static nss_backend_op_t group_ops[] =
251 _nss_winbind_group_destr,
252 _nss_winbind_endgrent_solwrap,
253 _nss_winbind_setgrent_solwrap,
254 _nss_winbind_getgrent_solwrap,
255 _nss_winbind_getgrnam_solwrap,
256 _nss_winbind_getgrgid_solwrap,
257 _nss_winbind_getgroupsbymember_solwrap
261 _nss_winbind_group_constr (const char* db_name,
262 const char* src_name,
263 const char* cfg_args)
267 if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
271 be->n_ops = sizeof(group_ops) / sizeof(nss_backend_op_t);
273 NSS_DEBUG("Initialized nss_winbind group backend");