2 Solaris NSS wrapper for winbind
5 Based on Luke Howard's ldap_nss module for Solaris
10 #include <sys/param.h>
15 #include "winbind_nss_config.h"
17 #if defined(HAVE_NSS_COMMON_H) || defined(HPUX)
22 #define NSS_DEBUG(str) syslog(LOG_DEBUG, "nss_winbind: %s", str);
24 #define NSS_DEBUG(str) ;
27 #define NSS_ARGS(args) ((nss_XbyY_args_t *)args)
29 #define make_pwent_str(dest, src) \
31 if((dest = get_static(buffer, buflen, strlen(src)+1)) == NULL) \
34 NSS_DEBUG("ERANGE error"); \
35 return NSS_STATUS_TRYAGAIN; \
40 static NSS_STATUS
_nss_winbind_setpwent_solwrap (nss_backend_t
* be
, void* args
)
42 NSS_DEBUG("_nss_winbind_setpwent_solwrap");
43 return _nss_winbind_setpwent();
47 _nss_winbind_endpwent_solwrap (nss_backend_t
* be
, void *args
)
49 NSS_DEBUG("_nss_winbind_endpwent_solwrap");
50 return _nss_winbind_endpwent();
54 _nss_winbind_getpwent_solwrap (nss_backend_t
* be
, void *args
)
57 char* buffer
= NSS_ARGS(args
)->buf
.buffer
;
58 int buflen
= NSS_ARGS(args
)->buf
.buflen
;
59 struct passwd
* result
= (struct passwd
*) NSS_ARGS(args
)->buf
.result
;
60 int* errnop
= &NSS_ARGS(args
)->erange
;
63 ret
= _nss_winbind_getpwent_r(result
, buffer
,
66 if(ret
== NSS_STATUS_SUCCESS
)
68 snprintf(logmsg
, 79, "_nss_winbind_getpwent_solwrap: Returning user: %s\n",
71 NSS_ARGS(args
)->returnval
= (void*) result
;
73 snprintf(logmsg
, 79, "_nss_winbind_getpwent_solwrap: Returning error: %d.\n",ret
);
81 _nss_winbind_getpwnam_solwrap (nss_backend_t
* be
, void* args
)
84 struct passwd
* result
= (struct passwd
*) NSS_ARGS(args
)->buf
.result
;
86 NSS_DEBUG("_nss_winbind_getpwnam_solwrap");
88 ret
= _nss_winbind_getpwnam_r (NSS_ARGS(args
)->key
.name
,
90 NSS_ARGS(args
)->buf
.buffer
,
91 NSS_ARGS(args
)->buf
.buflen
,
92 &NSS_ARGS(args
)->erange
);
93 if(ret
== NSS_STATUS_SUCCESS
)
94 NSS_ARGS(args
)->returnval
= (void*) result
;
100 _nss_winbind_getpwuid_solwrap(nss_backend_t
* be
, void* args
)
103 struct passwd
* result
= (struct passwd
*) NSS_ARGS(args
)->buf
.result
;
105 NSS_DEBUG("_nss_winbind_getpwuid_solwrap");
106 ret
= _nss_winbind_getpwuid_r (NSS_ARGS(args
)->key
.uid
,
108 NSS_ARGS(args
)->buf
.buffer
,
109 NSS_ARGS(args
)->buf
.buflen
,
110 &NSS_ARGS(args
)->erange
);
111 if(ret
== NSS_STATUS_SUCCESS
)
112 NSS_ARGS(args
)->returnval
= (void*) result
;
117 static NSS_STATUS
_nss_winbind_passwd_destr (nss_backend_t
* be
, void *args
)
120 NSS_DEBUG("_nss_winbind_passwd_destr");
121 return NSS_STATUS_SUCCESS
;
124 static nss_backend_op_t passwd_ops
[] =
126 _nss_winbind_passwd_destr
,
127 _nss_winbind_endpwent_solwrap
, /* NSS_DBOP_ENDENT */
128 _nss_winbind_setpwent_solwrap
, /* NSS_DBOP_SETENT */
129 _nss_winbind_getpwent_solwrap
, /* NSS_DBOP_GETENT */
130 _nss_winbind_getpwnam_solwrap
, /* NSS_DBOP_PASSWD_BYNAME */
131 _nss_winbind_getpwuid_solwrap
/* NSS_DBOP_PASSWD_BYUID */
135 _nss_winbind_passwd_constr (const char* db_name
,
136 const char* src_name
,
137 const char* cfg_args
)
141 if(!(be
= (nss_backend_t
*) malloc(sizeof(nss_backend_t
))) )
144 be
->ops
= passwd_ops
;
145 be
->n_ops
= sizeof(passwd_ops
) / sizeof(nss_backend_op_t
);
147 NSS_DEBUG("Initialized nss_winbind passwd backend");
151 /*****************************************************************
152 GROUP database backend
153 *****************************************************************/
155 static NSS_STATUS
_nss_winbind_setgrent_solwrap (nss_backend_t
* be
, void* args
)
157 NSS_DEBUG("_nss_winbind_setgrent_solwrap");
158 return _nss_winbind_setgrent();
162 _nss_winbind_endgrent_solwrap (nss_backend_t
* be
, void *args
)
164 NSS_DEBUG("_nss_winbind_endgrent_solwrap");
165 return _nss_winbind_endgrent();
169 _nss_winbind_getgrent_solwrap(nss_backend_t
* be
, void* args
)
172 char* buffer
= NSS_ARGS(args
)->buf
.buffer
;
173 int buflen
= NSS_ARGS(args
)->buf
.buflen
;
174 struct group
* result
= (struct group
*) NSS_ARGS(args
)->buf
.result
;
175 int* errnop
= &NSS_ARGS(args
)->erange
;
178 ret
= _nss_winbind_getgrent_r(result
, buffer
,
181 if(ret
== NSS_STATUS_SUCCESS
)
183 snprintf(logmsg
, 79, "_nss_winbind_getgrent_solwrap: Returning group: %s\n", result
->gr_name
);
185 NSS_ARGS(args
)->returnval
= (void*) result
;
187 snprintf(logmsg
, 79, "_nss_winbind_getgrent_solwrap: Returning error: %d.\n", ret
);
196 _nss_winbind_getgrnam_solwrap(nss_backend_t
* be
, void* args
)
199 struct group
* result
= (struct group
*) NSS_ARGS(args
)->buf
.result
;
201 NSS_DEBUG("_nss_winbind_getgrnam_solwrap");
202 ret
= _nss_winbind_getgrnam_r(NSS_ARGS(args
)->key
.name
,
204 NSS_ARGS(args
)->buf
.buffer
,
205 NSS_ARGS(args
)->buf
.buflen
,
206 &NSS_ARGS(args
)->erange
);
208 if(ret
== NSS_STATUS_SUCCESS
)
209 NSS_ARGS(args
)->returnval
= (void*) result
;
215 _nss_winbind_getgrgid_solwrap(nss_backend_t
* be
, void* args
)
218 struct group
* result
= (struct group
*) NSS_ARGS(args
)->buf
.result
;
220 NSS_DEBUG("_nss_winbind_getgrgid_solwrap");
221 ret
= _nss_winbind_getgrgid_r (NSS_ARGS(args
)->key
.gid
,
223 NSS_ARGS(args
)->buf
.buffer
,
224 NSS_ARGS(args
)->buf
.buflen
,
225 &NSS_ARGS(args
)->erange
);
227 if(ret
== NSS_STATUS_SUCCESS
)
228 NSS_ARGS(args
)->returnval
= (void*) result
;
234 _nss_winbind_getgroupsbymember_solwrap(nss_backend_t
* be
, void* args
)
236 NSS_DEBUG("_nss_winbind_getgroupsbymember");
237 return NSS_STATUS_NOTFOUND
;
241 _nss_winbind_group_destr (nss_backend_t
* be
, void* args
)
244 NSS_DEBUG("_nss_winbind_group_destr");
245 return NSS_STATUS_SUCCESS
;
248 static nss_backend_op_t group_ops
[] =
250 _nss_winbind_group_destr
,
251 _nss_winbind_endgrent_solwrap
,
252 _nss_winbind_setgrent_solwrap
,
253 _nss_winbind_getgrent_solwrap
,
254 _nss_winbind_getgrnam_solwrap
,
255 _nss_winbind_getgrgid_solwrap
,
256 _nss_winbind_getgroupsbymember_solwrap
260 _nss_winbind_group_constr (const char* db_name
,
261 const char* src_name
,
262 const char* cfg_args
)
266 if(!(be
= (nss_backend_t
*) malloc(sizeof(nss_backend_t
))) )
270 be
->n_ops
= sizeof(group_ops
) / sizeof(nss_backend_op_t
);
272 NSS_DEBUG("Initialized nss_winbind group backend");
276 #endif /* defined(HAVE_NSS_COMMON_H) || defined(HPUX) */