Set type to NOTUSED if lookup fail.
[ira/wip.git] / source3 / nsswitch / winbind_nss_solaris.c
1 /*
2   Solaris NSS wrapper for winbind 
3   - Shirish Kalele 2000
4
5   Based on Luke Howard's ldap_nss module for Solaris 
6   */
7
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 <sys/syslog.h>
15 #include "includes.h"
16 #include "winbind_nss_config.h"
17
18 #ifdef HAVE_NSS_COMMON_H 
19
20 #undef NSS_DEBUG
21
22 #ifdef NSS_DEBUG
23 #define NSS_DEBUG(str) syslog(LOG_DEBUG, "nss_winbind: %s", str);
24 #else
25 #define NSS_DEBUG(str) ;
26 #endif
27
28 #define NSS_ARGS(args) ((nss_XbyY_args_t *)args)
29
30 #define make_pwent_str(dest, src)                                       \
31 {                                                                       \
32   if((dest = get_static(buffer, buflen, strlen(src)+1)) == NULL)        \
33     {                                                                   \
34       *errnop = ERANGE;                                                 \
35       NSS_DEBUG("ERANGE error");                                        \
36       return NSS_STATUS_TRYAGAIN;                                       \
37     }                                                                   \
38   strcpy(dest, src);                                                    \
39 }
40
41 static NSS_STATUS _nss_winbind_setpwent_solwrap (nss_backend_t* be, void* args)
42 {
43         NSS_DEBUG("_nss_winbind_setpwent_solwrap");
44         return _nss_winbind_setpwent();
45 }
46
47 static NSS_STATUS
48 _nss_winbind_endpwent_solwrap (nss_backend_t * be, void *args)
49 {
50         NSS_DEBUG("_nss_winbind_endpwent_solwrap");
51         return _nss_winbind_endpwent();
52 }
53
54 static NSS_STATUS
55 _nss_winbind_getpwent_solwrap (nss_backend_t* be, void *args)
56 {
57         NSS_STATUS ret;
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;
62         char logmsg[80];
63
64         ret = _nss_winbind_getpwent_r(result, buffer, 
65                                       buflen, errnop);
66
67         if(ret == NSS_STATUS_SUCCESS)
68                 {
69                         snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning user: %s\n",
70                                  result->pw_name);
71                         NSS_DEBUG(logmsg);
72                         NSS_ARGS(args)->returnval = (void*) result;
73                 } else {
74                         snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning error: %d.\n",ret);
75                         NSS_DEBUG(logmsg);
76                 }
77     
78         return ret;
79 }
80
81 static NSS_STATUS
82 _nss_winbind_getpwnam_solwrap (nss_backend_t* be, void* args)
83 {
84         NSS_STATUS ret;
85         struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
86
87         NSS_DEBUG("_nss_winbind_getpwnam_solwrap");
88
89         ret = _nss_winbind_getpwnam_r (NSS_ARGS(args)->key.name,
90                                                 result,
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;
96   
97         return ret;
98 }
99
100 static NSS_STATUS
101 _nss_winbind_getpwuid_solwrap(nss_backend_t* be, void* args)
102 {
103         NSS_STATUS ret;
104         struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
105   
106         NSS_DEBUG("_nss_winbind_getpwuid_solwrap");
107         ret = _nss_winbind_getpwuid_r (NSS_ARGS(args)->key.uid,
108                                        result,
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;
114   
115         return ret;
116 }
117
118 static NSS_STATUS _nss_winbind_passwd_destr (nss_backend_t * be, void *args)
119 {
120         SAFE_FREE(be);
121         NSS_DEBUG("_nss_winbind_passwd_destr");
122         return NSS_STATUS_SUCCESS;
123 }
124
125 static nss_backend_op_t passwd_ops[] =
126 {
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 */
133 };
134
135 nss_backend_t*
136 _nss_winbind_passwd_constr (const char* db_name,
137                             const char* src_name,
138                             const char* cfg_args)
139 {
140         nss_backend_t *be;
141   
142         if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
143                 return NULL;
144
145         be->ops = passwd_ops;
146         be->n_ops = sizeof(passwd_ops) / sizeof(nss_backend_op_t);
147
148         NSS_DEBUG("Initialized nss_winbind passwd backend");
149         return be;
150 }
151
152 /*****************************************************************
153  GROUP database backend
154  *****************************************************************/
155
156 static NSS_STATUS _nss_winbind_setgrent_solwrap (nss_backend_t* be, void* args)
157 {
158         NSS_DEBUG("_nss_winbind_setgrent_solwrap");
159         return _nss_winbind_setgrent();
160 }
161
162 static NSS_STATUS
163 _nss_winbind_endgrent_solwrap (nss_backend_t * be, void *args)
164 {
165         NSS_DEBUG("_nss_winbind_endgrent_solwrap");
166         return _nss_winbind_endgrent();
167 }
168
169 static NSS_STATUS
170 _nss_winbind_getgrent_solwrap(nss_backend_t* be, void* args)
171 {
172         NSS_STATUS ret;
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;
177         char logmsg[80];
178
179         ret = _nss_winbind_getgrent_r(result, buffer, 
180                                       buflen, errnop);
181
182         if(ret == NSS_STATUS_SUCCESS)
183                 {
184                         snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning group: %s\n", result->gr_name);
185                         NSS_DEBUG(logmsg);
186                         NSS_ARGS(args)->returnval = (void*) result;
187                 } else {
188                         snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning error: %d.\n", ret);
189                         NSS_DEBUG(logmsg);
190                 }
191
192         return ret;
193         
194 }
195
196 static NSS_STATUS
197 _nss_winbind_getgrnam_solwrap(nss_backend_t* be, void* args)
198 {
199         NSS_STATUS ret;
200         struct group* result = (struct group*) NSS_ARGS(args)->buf.result;
201
202         NSS_DEBUG("_nss_winbind_getgrnam_solwrap");
203         ret = _nss_winbind_getgrnam_r(NSS_ARGS(args)->key.name,
204                                       result,
205                                       NSS_ARGS(args)->buf.buffer,
206                                       NSS_ARGS(args)->buf.buflen,
207                                       &NSS_ARGS(args)->erange);
208
209         if(ret == NSS_STATUS_SUCCESS)
210                 NSS_ARGS(args)->returnval = (void*) result;
211   
212         return ret;
213 }
214   
215 static NSS_STATUS
216 _nss_winbind_getgrgid_solwrap(nss_backend_t* be, void* args)
217 {
218         NSS_STATUS ret;
219         struct group* result = (struct group*) NSS_ARGS(args)->buf.result;
220
221         NSS_DEBUG("_nss_winbind_getgrgid_solwrap");
222         ret = _nss_winbind_getgrgid_r (NSS_ARGS(args)->key.gid,
223                                        result,
224                                        NSS_ARGS(args)->buf.buffer,
225                                        NSS_ARGS(args)->buf.buflen,
226                                        &NSS_ARGS(args)->erange);
227
228         if(ret == NSS_STATUS_SUCCESS)
229                 NSS_ARGS(args)->returnval = (void*) result;
230
231         return ret;
232 }
233
234 static NSS_STATUS
235 _nss_winbind_getgroupsbymember_solwrap(nss_backend_t* be, void* args)
236 {
237         NSS_DEBUG("_nss_winbind_getgroupsbymember");
238         return NSS_STATUS_NOTFOUND;
239 }
240
241 static NSS_STATUS
242 _nss_winbind_group_destr (nss_backend_t* be, void* args)
243 {
244         SAFE_FREE(be);
245         NSS_DEBUG("_nss_winbind_group_destr");
246         return NSS_STATUS_SUCCESS;
247 }
248
249 static nss_backend_op_t group_ops[] = 
250 {
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
258 }; 
259
260 nss_backend_t*
261 _nss_winbind_group_constr (const char* db_name,
262                            const char* src_name,
263                            const char* cfg_args)
264 {
265         nss_backend_t* be;
266
267         if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
268                 return NULL;
269
270         be->ops = group_ops;
271         be->n_ops = sizeof(group_ops) / sizeof(nss_backend_op_t);
272   
273         NSS_DEBUG("Initialized nss_winbind group backend");
274         return be;
275 }
276
277 #endif /* SUN_NSS */
278
279