preparing for release of 2.2.3a
[Samba.git] / source / nsswitch / winbind_nss_solaris.c
blobe349acc2131d37bc9c371af9a58e6a4883805740
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 <syslog.h>
14 #include "includes.h"
15 #include "winbind_nss_config.h"
17 #if defined(HAVE_NSS_COMMON_H) || defined(HPUX)
19 #undef NSS_DEBUG
21 #ifdef NSS_DEBUG
22 #define NSS_DEBUG(str) syslog(LOG_DEBUG, "nss_winbind: %s", str);
23 #else
24 #define NSS_DEBUG(str) ;
25 #endif
27 #define NSS_ARGS(args) ((nss_XbyY_args_t *)args)
29 #define make_pwent_str(dest, src) \
30 { \
31 if((dest = get_static(buffer, buflen, strlen(src)+1)) == NULL) \
32 { \
33 *errnop = ERANGE; \
34 NSS_DEBUG("ERANGE error"); \
35 return NSS_STATUS_TRYAGAIN; \
36 } \
37 strcpy(dest, src); \
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();
46 static NSS_STATUS
47 _nss_winbind_endpwent_solwrap (nss_backend_t * be, void *args)
49 NSS_DEBUG("_nss_winbind_endpwent_solwrap");
50 return _nss_winbind_endpwent();
53 static NSS_STATUS
54 _nss_winbind_getpwent_solwrap (nss_backend_t* be, void *args)
56 NSS_STATUS ret;
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;
61 char logmsg[80];
63 ret = _nss_winbind_getpwent_r(result, buffer,
64 buflen, errnop);
66 if(ret == NSS_STATUS_SUCCESS)
68 snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning user: %s\n",
69 result->pw_name);
70 NSS_DEBUG(logmsg);
71 NSS_ARGS(args)->returnval = (void*) result;
72 } else {
73 snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning error: %d.\n",ret);
74 NSS_DEBUG(logmsg);
77 return ret;
80 static NSS_STATUS
81 _nss_winbind_getpwnam_solwrap (nss_backend_t* be, void* args)
83 NSS_STATUS ret;
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,
89 result,
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;
96 return ret;
99 static NSS_STATUS
100 _nss_winbind_getpwuid_solwrap(nss_backend_t* be, void* args)
102 NSS_STATUS ret;
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,
107 result,
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;
114 return ret;
117 static NSS_STATUS _nss_winbind_passwd_destr (nss_backend_t * be, void *args)
119 SAFE_FREE(be);
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 */
134 nss_backend_t*
135 _nss_winbind_passwd_constr (const char* db_name,
136 const char* src_name,
137 const char* cfg_args)
139 nss_backend_t *be;
141 if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
142 return NULL;
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");
148 return be;
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();
161 static NSS_STATUS
162 _nss_winbind_endgrent_solwrap (nss_backend_t * be, void *args)
164 NSS_DEBUG("_nss_winbind_endgrent_solwrap");
165 return _nss_winbind_endgrent();
168 static NSS_STATUS
169 _nss_winbind_getgrent_solwrap(nss_backend_t* be, void* args)
171 NSS_STATUS ret;
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;
176 char logmsg[80];
178 ret = _nss_winbind_getgrent_r(result, buffer,
179 buflen, errnop);
181 if(ret == NSS_STATUS_SUCCESS)
183 snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning group: %s\n", result->gr_name);
184 NSS_DEBUG(logmsg);
185 NSS_ARGS(args)->returnval = (void*) result;
186 } else {
187 snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning error: %d.\n", ret);
188 NSS_DEBUG(logmsg);
191 return ret;
195 static NSS_STATUS
196 _nss_winbind_getgrnam_solwrap(nss_backend_t* be, void* args)
198 NSS_STATUS ret;
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,
203 result,
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;
211 return ret;
214 static NSS_STATUS
215 _nss_winbind_getgrgid_solwrap(nss_backend_t* be, void* args)
217 NSS_STATUS ret;
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,
222 result,
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;
230 return ret;
233 static NSS_STATUS
234 _nss_winbind_getgroupsbymember_solwrap(nss_backend_t* be, void* args)
236 NSS_DEBUG("_nss_winbind_getgroupsbymember");
237 return NSS_STATUS_NOTFOUND;
240 static NSS_STATUS
241 _nss_winbind_group_destr (nss_backend_t* be, void* args)
243 SAFE_FREE(be);
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
259 nss_backend_t*
260 _nss_winbind_group_constr (const char* db_name,
261 const char* src_name,
262 const char* cfg_args)
264 nss_backend_t* be;
266 if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
267 return NULL;
269 be->ops = group_ops;
270 be->n_ops = sizeof(group_ops) / sizeof(nss_backend_op_t);
272 NSS_DEBUG("Initialized nss_winbind group backend");
273 return be;
276 #endif /* defined(HAVE_NSS_COMMON_H) || defined(HPUX) */