2 Solaris NSS wrapper for winbind
5 Based on Luke Howard's ldap_nss module for Solaris
10 #include <sys/param.h>
16 #include <sys/syslog.h>
18 #include "winbind_nss_config.h"
20 #if defined(HAVE_NSS_COMMON_H) || defined(HPUX)
25 #define NSS_DEBUG(str) syslog(LOG_DEBUG, "nss_winbind: %s", str);
27 #define NSS_DEBUG(str) ;
30 #define NSS_ARGS(args) ((nss_XbyY_args_t *)args)
32 #define make_pwent_str(dest, src) \
34 if((dest = get_static(buffer, buflen, strlen(src)+1)) == NULL) \
37 NSS_DEBUG("ERANGE error"); \
38 return NSS_STATUS_TRYAGAIN; \
43 static NSS_STATUS
_nss_winbind_setpwent_solwrap (nss_backend_t
* be
, void* args
)
45 NSS_DEBUG("_nss_winbind_setpwent_solwrap");
46 return _nss_winbind_setpwent();
50 _nss_winbind_endpwent_solwrap (nss_backend_t
* be
, void *args
)
52 NSS_DEBUG("_nss_winbind_endpwent_solwrap");
53 return _nss_winbind_endpwent();
57 _nss_winbind_getpwent_solwrap (nss_backend_t
* be
, void *args
)
60 char* buffer
= NSS_ARGS(args
)->buf
.buffer
;
61 int buflen
= NSS_ARGS(args
)->buf
.buflen
;
62 struct passwd
* result
= (struct passwd
*) NSS_ARGS(args
)->buf
.result
;
63 int* errnop
= &NSS_ARGS(args
)->erange
;
66 ret
= _nss_winbind_getpwent_r(result
, buffer
,
69 if(ret
== NSS_STATUS_SUCCESS
)
71 snprintf(logmsg
, 79, "_nss_winbind_getpwent_solwrap: Returning user: %s\n",
74 NSS_ARGS(args
)->returnval
= (void*) result
;
76 snprintf(logmsg
, 79, "_nss_winbind_getpwent_solwrap: Returning error: %d.\n",ret
);
84 _nss_winbind_getpwnam_solwrap (nss_backend_t
* be
, void* args
)
87 struct passwd
* result
= (struct passwd
*) NSS_ARGS(args
)->buf
.result
;
89 NSS_DEBUG("_nss_winbind_getpwnam_solwrap");
91 ret
= _nss_winbind_getpwnam_r (NSS_ARGS(args
)->key
.name
,
93 NSS_ARGS(args
)->buf
.buffer
,
94 NSS_ARGS(args
)->buf
.buflen
,
95 &NSS_ARGS(args
)->erange
);
96 if(ret
== NSS_STATUS_SUCCESS
)
97 NSS_ARGS(args
)->returnval
= (void*) result
;
103 _nss_winbind_getpwuid_solwrap(nss_backend_t
* be
, void* args
)
106 struct passwd
* result
= (struct passwd
*) NSS_ARGS(args
)->buf
.result
;
108 NSS_DEBUG("_nss_winbind_getpwuid_solwrap");
109 ret
= _nss_winbind_getpwuid_r (NSS_ARGS(args
)->key
.uid
,
111 NSS_ARGS(args
)->buf
.buffer
,
112 NSS_ARGS(args
)->buf
.buflen
,
113 &NSS_ARGS(args
)->erange
);
114 if(ret
== NSS_STATUS_SUCCESS
)
115 NSS_ARGS(args
)->returnval
= (void*) result
;
120 static NSS_STATUS
_nss_winbind_passwd_destr (nss_backend_t
* be
, void *args
)
123 NSS_DEBUG("_nss_winbind_passwd_destr");
124 return NSS_STATUS_SUCCESS
;
127 static nss_backend_op_t passwd_ops
[] =
129 _nss_winbind_passwd_destr
,
130 _nss_winbind_endpwent_solwrap
, /* NSS_DBOP_ENDENT */
131 _nss_winbind_setpwent_solwrap
, /* NSS_DBOP_SETENT */
132 _nss_winbind_getpwent_solwrap
, /* NSS_DBOP_GETENT */
133 _nss_winbind_getpwnam_solwrap
, /* NSS_DBOP_PASSWD_BYNAME */
134 _nss_winbind_getpwuid_solwrap
/* NSS_DBOP_PASSWD_BYUID */
138 _nss_winbind_passwd_constr (const char* db_name
,
139 const char* src_name
,
140 const char* cfg_args
)
144 if(!(be
= (nss_backend_t
*) malloc(sizeof(nss_backend_t
))) )
147 be
->ops
= passwd_ops
;
148 be
->n_ops
= sizeof(passwd_ops
) / sizeof(nss_backend_op_t
);
150 NSS_DEBUG("Initialized nss_winbind passwd backend");
154 /*****************************************************************
155 GROUP database backend
156 *****************************************************************/
158 static NSS_STATUS
_nss_winbind_setgrent_solwrap (nss_backend_t
* be
, void* args
)
160 NSS_DEBUG("_nss_winbind_setgrent_solwrap");
161 return _nss_winbind_setgrent();
165 _nss_winbind_endgrent_solwrap (nss_backend_t
* be
, void *args
)
167 NSS_DEBUG("_nss_winbind_endgrent_solwrap");
168 return _nss_winbind_endgrent();
172 _nss_winbind_getgrent_solwrap(nss_backend_t
* be
, void* args
)
175 char* buffer
= NSS_ARGS(args
)->buf
.buffer
;
176 int buflen
= NSS_ARGS(args
)->buf
.buflen
;
177 struct group
* result
= (struct group
*) NSS_ARGS(args
)->buf
.result
;
178 int* errnop
= &NSS_ARGS(args
)->erange
;
181 ret
= _nss_winbind_getgrent_r(result
, buffer
,
184 if(ret
== NSS_STATUS_SUCCESS
)
186 snprintf(logmsg
, 79, "_nss_winbind_getgrent_solwrap: Returning group: %s\n", result
->gr_name
);
188 NSS_ARGS(args
)->returnval
= (void*) result
;
190 snprintf(logmsg
, 79, "_nss_winbind_getgrent_solwrap: Returning error: %d.\n", ret
);
199 _nss_winbind_getgrnam_solwrap(nss_backend_t
* be
, void* args
)
202 struct group
* result
= (struct group
*) NSS_ARGS(args
)->buf
.result
;
204 NSS_DEBUG("_nss_winbind_getgrnam_solwrap");
205 ret
= _nss_winbind_getgrnam_r(NSS_ARGS(args
)->key
.name
,
207 NSS_ARGS(args
)->buf
.buffer
,
208 NSS_ARGS(args
)->buf
.buflen
,
209 &NSS_ARGS(args
)->erange
);
211 if(ret
== NSS_STATUS_SUCCESS
)
212 NSS_ARGS(args
)->returnval
= (void*) result
;
218 _nss_winbind_getgrgid_solwrap(nss_backend_t
* be
, void* args
)
221 struct group
* result
= (struct group
*) NSS_ARGS(args
)->buf
.result
;
223 NSS_DEBUG("_nss_winbind_getgrgid_solwrap");
224 ret
= _nss_winbind_getgrgid_r (NSS_ARGS(args
)->key
.gid
,
226 NSS_ARGS(args
)->buf
.buffer
,
227 NSS_ARGS(args
)->buf
.buflen
,
228 &NSS_ARGS(args
)->erange
);
230 if(ret
== NSS_STATUS_SUCCESS
)
231 NSS_ARGS(args
)->returnval
= (void*) result
;
237 _nss_winbind_getgroupsbymember_solwrap(nss_backend_t
* be
, void* args
)
239 NSS_DEBUG("_nss_winbind_getgroupsbymember");
240 return NSS_STATUS_NOTFOUND
;
244 _nss_winbind_group_destr (nss_backend_t
* be
, void* args
)
247 NSS_DEBUG("_nss_winbind_group_destr");
248 return NSS_STATUS_SUCCESS
;
251 static nss_backend_op_t group_ops
[] =
253 _nss_winbind_group_destr
,
254 _nss_winbind_endgrent_solwrap
,
255 _nss_winbind_setgrent_solwrap
,
256 _nss_winbind_getgrent_solwrap
,
257 _nss_winbind_getgrnam_solwrap
,
258 _nss_winbind_getgrgid_solwrap
,
259 _nss_winbind_getgroupsbymember_solwrap
263 _nss_winbind_group_constr (const char* db_name
,
264 const char* src_name
,
265 const char* cfg_args
)
269 if(!(be
= (nss_backend_t
*) malloc(sizeof(nss_backend_t
))) )
273 be
->n_ops
= sizeof(group_ops
) / sizeof(nss_backend_op_t
);
275 NSS_DEBUG("Initialized nss_winbind group backend");