CUPS-PRINTER_CLASS patch from Michael Sweet
[Samba.git] / source / nsswitch / winbind_nss_solaris.c
blob8bf1487f5a932e89447295389c48ddd4e38002aa
1 /*
2 Solaris NSS wrapper for winbind
3 - Shirish Kalele 2000
5 Based on Luke Howard's ldap_nss module for Solaris
6 */
8 #include <stdlib.h>
9 #include <sys/types.h>
10 #include <sys/param.h>
11 #include <string.h>
12 #include <pwd.h>
13 #include "includes.h"
14 #include <syslog.h>
15 #if !defined(HPUX)
16 #include <sys/syslog.h>
17 #endif /*hpux*/
18 #include "winbind_nss_config.h"
20 #if defined(HAVE_NSS_COMMON_H) || defined(HPUX)
22 #undef NSS_DEBUG
24 #ifdef NSS_DEBUG
25 #define NSS_DEBUG(str) syslog(LOG_DEBUG, "nss_winbind: %s", str);
26 #else
27 #define NSS_DEBUG(str) ;
28 #endif
30 #define NSS_ARGS(args) ((nss_XbyY_args_t *)args)
32 #define make_pwent_str(dest, src) \
33 { \
34 if((dest = get_static(buffer, buflen, strlen(src)+1)) == NULL) \
35 { \
36 *errnop = ERANGE; \
37 NSS_DEBUG("ERANGE error"); \
38 return NSS_STATUS_TRYAGAIN; \
39 } \
40 strcpy(dest, src); \
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();
49 static NSS_STATUS
50 _nss_winbind_endpwent_solwrap (nss_backend_t * be, void *args)
52 NSS_DEBUG("_nss_winbind_endpwent_solwrap");
53 return _nss_winbind_endpwent();
56 static NSS_STATUS
57 _nss_winbind_getpwent_solwrap (nss_backend_t* be, void *args)
59 NSS_STATUS ret;
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;
64 char logmsg[80];
66 ret = _nss_winbind_getpwent_r(result, buffer,
67 buflen, errnop);
69 if(ret == NSS_STATUS_SUCCESS)
71 snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning user: %s\n",
72 result->pw_name);
73 NSS_DEBUG(logmsg);
74 NSS_ARGS(args)->returnval = (void*) result;
75 } else {
76 snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning error: %d.\n",ret);
77 NSS_DEBUG(logmsg);
80 return ret;
83 static NSS_STATUS
84 _nss_winbind_getpwnam_solwrap (nss_backend_t* be, void* args)
86 NSS_STATUS ret;
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,
92 result,
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;
99 return ret;
102 static NSS_STATUS
103 _nss_winbind_getpwuid_solwrap(nss_backend_t* be, void* args)
105 NSS_STATUS ret;
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,
110 result,
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;
117 return ret;
120 static NSS_STATUS _nss_winbind_passwd_destr (nss_backend_t * be, void *args)
122 SAFE_FREE(be);
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 */
137 nss_backend_t*
138 _nss_winbind_passwd_constr (const char* db_name,
139 const char* src_name,
140 const char* cfg_args)
142 nss_backend_t *be;
144 if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
145 return NULL;
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");
151 return be;
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();
164 static NSS_STATUS
165 _nss_winbind_endgrent_solwrap (nss_backend_t * be, void *args)
167 NSS_DEBUG("_nss_winbind_endgrent_solwrap");
168 return _nss_winbind_endgrent();
171 static NSS_STATUS
172 _nss_winbind_getgrent_solwrap(nss_backend_t* be, void* args)
174 NSS_STATUS ret;
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;
179 char logmsg[80];
181 ret = _nss_winbind_getgrent_r(result, buffer,
182 buflen, errnop);
184 if(ret == NSS_STATUS_SUCCESS)
186 snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning group: %s\n", result->gr_name);
187 NSS_DEBUG(logmsg);
188 NSS_ARGS(args)->returnval = (void*) result;
189 } else {
190 snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning error: %d.\n", ret);
191 NSS_DEBUG(logmsg);
194 return ret;
198 static NSS_STATUS
199 _nss_winbind_getgrnam_solwrap(nss_backend_t* be, void* args)
201 NSS_STATUS ret;
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,
206 result,
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;
214 return ret;
217 static NSS_STATUS
218 _nss_winbind_getgrgid_solwrap(nss_backend_t* be, void* args)
220 NSS_STATUS ret;
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,
225 result,
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;
233 return ret;
236 static NSS_STATUS
237 _nss_winbind_getgroupsbymember_solwrap(nss_backend_t* be, void* args)
239 NSS_DEBUG("_nss_winbind_getgroupsbymember");
240 return NSS_STATUS_NOTFOUND;
243 static NSS_STATUS
244 _nss_winbind_group_destr (nss_backend_t* be, void* args)
246 SAFE_FREE(be);
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
262 nss_backend_t*
263 _nss_winbind_group_constr (const char* db_name,
264 const char* src_name,
265 const char* cfg_args)
267 nss_backend_t* be;
269 if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
270 return NULL;
272 be->ops = group_ops;
273 be->n_ops = sizeof(group_ops) / sizeof(nss_backend_op_t);
275 NSS_DEBUG("Initialized nss_winbind group backend");
276 return be;
279 #endif /* SUN_NSS */