Deleted Added
full compact
getpwent.c (129349) getpwent.c (158115)
1/*-
2 * Copyright (c) 2003 Networks Associates Technology, Inc.
3 * All rights reserved.
4 *
5 * This software was developed for the FreeBSD Project by
6 * Jacques A. Vidrine, Safeport Network Services, and Network
7 * Associates Laboratories, the Security Research Division of Network
8 * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035

--- 17 unchanged lines hidden (view full) ---

26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 *
32 */
33#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2003 Networks Associates Technology, Inc.
3 * All rights reserved.
4 *
5 * This software was developed for the FreeBSD Project by
6 * Jacques A. Vidrine, Safeport Network Services, and Network
7 * Associates Laboratories, the Security Research Division of Network
8 * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035

--- 17 unchanged lines hidden (view full) ---

26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 *
32 */
33#include <sys/cdefs.h>
34__FBSDID("$FreeBSD: head/lib/libc/gen/getpwent.c 129349 2004-05-17 18:27:05Z kientzle $");
34__FBSDID("$FreeBSD: head/lib/libc/gen/getpwent.c 158115 2006-04-28 12:03:38Z ume $");
35
36#include "namespace.h"
37#include <sys/param.h>
38#ifdef YP
39#include <rpc/rpc.h>
40#include <rpcsvc/yp_prot.h>
41#include <rpcsvc/ypclnt.h>
42#endif

--- 13 unchanged lines hidden (view full) ---

56#include <string.h>
57#include <syslog.h>
58#include <unistd.h>
59#include "un-namespace.h"
60#include <db.h>
61#include "libc_private.h"
62#include "pw_scan.h"
63#include "nss_tls.h"
35
36#include "namespace.h"
37#include <sys/param.h>
38#ifdef YP
39#include <rpc/rpc.h>
40#include <rpcsvc/yp_prot.h>
41#include <rpcsvc/ypclnt.h>
42#endif

--- 13 unchanged lines hidden (view full) ---

56#include <string.h>
57#include <syslog.h>
58#include <unistd.h>
59#include "un-namespace.h"
60#include <db.h>
61#include "libc_private.h"
62#include "pw_scan.h"
63#include "nss_tls.h"
64#ifdef NS_CACHING
65#include "nscache.h"
66#endif
64
65#ifndef CTASSERT
66#define CTASSERT(x) _CTASSERT(x, __LINE__)
67#define _CTASSERT(x, y) __CTASSERT(x, y)
68#define __CTASSERT(x, y) typedef char __assert_ ## y [(x) ? 1 : -1]
69#endif
70
71/* Counter as stored in /etc/pwd.db */

--- 118 unchanged lines hidden (view full) ---

190static int compat_passwd(void *, void *, va_list);
191static void compat_clear_template(struct passwd *);
192static int compat_set_template(struct passwd *, struct passwd *);
193static int compat_use_template(struct passwd *, struct passwd *, char *,
194 size_t);
195static int compat_redispatch(struct compat_state *, enum nss_lookup_type,
196 enum nss_lookup_type, const char *, const char *, uid_t,
197 struct passwd *, char *, size_t, int *);
67
68#ifndef CTASSERT
69#define CTASSERT(x) _CTASSERT(x, __LINE__)
70#define _CTASSERT(x, y) __CTASSERT(x, y)
71#define __CTASSERT(x, y) typedef char __assert_ ## y [(x) ? 1 : -1]
72#endif
73
74/* Counter as stored in /etc/pwd.db */

--- 118 unchanged lines hidden (view full) ---

193static int compat_passwd(void *, void *, va_list);
194static void compat_clear_template(struct passwd *);
195static int compat_set_template(struct passwd *, struct passwd *);
196static int compat_use_template(struct passwd *, struct passwd *, char *,
197 size_t);
198static int compat_redispatch(struct compat_state *, enum nss_lookup_type,
199 enum nss_lookup_type, const char *, const char *, uid_t,
200 struct passwd *, char *, size_t, int *);
201
202#ifdef NS_CACHING
203static int pwd_id_func(char *, size_t *, va_list ap, void *);
204static int pwd_marshal_func(char *, size_t *, void *, va_list, void *);
205static int pwd_unmarshal_func(char *, size_t, void *, va_list, void *);
206
207static int
208pwd_id_func(char *buffer, size_t *buffer_size, va_list ap, void *cache_mdata)
209{
210 char *name;
211 uid_t uid;
212 size_t size, desired_size;
213 int res = NS_UNAVAIL;
214 enum nss_lookup_type lookup_type;
215
216 lookup_type = (enum nss_lookup_type)cache_mdata;
217 switch (lookup_type) {
218 case nss_lt_name:
219 name = va_arg(ap, char *);
220 size = strlen(name);
221 desired_size = sizeof(enum nss_lookup_type) + size + 1;
222 if (desired_size > *buffer_size) {
223 res = NS_RETURN;
224 goto fin;
225 }
226
227 memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type));
228 memcpy(buffer + sizeof(enum nss_lookup_type), name, size + 1);
229
230 res = NS_SUCCESS;
231 break;
232 case nss_lt_id:
233 uid = va_arg(ap, uid_t);
234 desired_size = sizeof(enum nss_lookup_type) + sizeof(uid_t);
235 if (desired_size > *buffer_size) {
236 res = NS_RETURN;
237 goto fin;
238 }
239
240 memcpy(buffer, &lookup_type, sizeof(enum nss_lookup_type));
241 memcpy(buffer + sizeof(enum nss_lookup_type), &uid,
242 sizeof(uid_t));
243
244 res = NS_SUCCESS;
245 break;
246 default:
247 /* should be unreachable */
248 return (NS_UNAVAIL);
249 }
250
251fin:
252 *buffer_size = desired_size;
253 return (res);
254}
255
256static int
257pwd_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap,
258 void *cache_mdata)
259{
260 char *name;
261 uid_t uid;
262 struct passwd *pwd;
263 char *orig_buf;
264 size_t orig_buf_size;
265
266 struct passwd new_pwd;
267 size_t desired_size, size;
268 char *p;
269
270 switch ((enum nss_lookup_type)cache_mdata) {
271 case nss_lt_name:
272 name = va_arg(ap, char *);
273 break;
274 case nss_lt_id:
275 uid = va_arg(ap, uid_t);
276 break;
277 case nss_lt_all:
278 break;
279 default:
280 /* should be unreachable */
281 return (NS_UNAVAIL);
282 }
283
284 pwd = va_arg(ap, struct passwd *);
285 orig_buf = va_arg(ap, char *);
286 orig_buf_size = va_arg(ap, size_t);
287
288 desired_size = sizeof(struct passwd) + sizeof(char *) +
289 strlen(pwd->pw_name) + 1;
290 if (pwd->pw_passwd != NULL)
291 desired_size += strlen(pwd->pw_passwd) + 1;
292 if (pwd->pw_class != NULL)
293 desired_size += strlen(pwd->pw_class) + 1;
294 if (pwd->pw_gecos != NULL)
295 desired_size += strlen(pwd->pw_gecos) + 1;
296 if (pwd->pw_dir != NULL)
297 desired_size += strlen(pwd->pw_dir) + 1;
298 if (pwd->pw_shell != NULL)
299 desired_size += strlen(pwd->pw_shell) + 1;
300
301 if (*buffer_size < desired_size) {
302 /* this assignment is here for future use */
303 *buffer_size = desired_size;
304 return (NS_RETURN);
305 }
306
307 memcpy(&new_pwd, pwd, sizeof(struct passwd));
308 memset(buffer, 0, desired_size);
309
310 *buffer_size = desired_size;
311 p = buffer + sizeof(struct passwd) + sizeof(char *);
312 memcpy(buffer + sizeof(struct passwd), &p, sizeof(char *));
313
314 if (new_pwd.pw_name != NULL) {
315 size = strlen(new_pwd.pw_name);
316 memcpy(p, new_pwd.pw_name, size);
317 new_pwd.pw_name = p;
318 p += size + 1;
319 }
320
321 if (new_pwd.pw_passwd != NULL) {
322 size = strlen(new_pwd.pw_passwd);
323 memcpy(p, new_pwd.pw_passwd, size);
324 new_pwd.pw_passwd = p;
325 p += size + 1;
326 }
327
328 if (new_pwd.pw_class != NULL) {
329 size = strlen(new_pwd.pw_class);
330 memcpy(p, new_pwd.pw_class, size);
331 new_pwd.pw_class = p;
332 p += size + 1;
333 }
334
335 if (new_pwd.pw_gecos != NULL) {
336 size = strlen(new_pwd.pw_gecos);
337 memcpy(p, new_pwd.pw_gecos, size);
338 new_pwd.pw_gecos = p;
339 p += size + 1;
340 }
341
342 if (new_pwd.pw_dir != NULL) {
343 size = strlen(new_pwd.pw_dir);
344 memcpy(p, new_pwd.pw_dir, size);
345 new_pwd.pw_dir = p;
346 p += size + 1;
347 }
348
349 if (new_pwd.pw_shell != NULL) {
350 size = strlen(new_pwd.pw_shell);
351 memcpy(p, new_pwd.pw_shell, size);
352 new_pwd.pw_shell = p;
353 p += size + 1;
354 }
355
356 memcpy(buffer, &new_pwd, sizeof(struct passwd));
357 return (NS_SUCCESS);
358}
359
360static int
361pwd_unmarshal_func(char *buffer, size_t buffer_size, void *retval, va_list ap,
362 void *cache_mdata)
363{
364 char *name;
365 uid_t uid;
366 struct passwd *pwd;
367 char *orig_buf;
368 size_t orig_buf_size;
369 int *ret_errno;
370
371 char *p;
372
373 switch ((enum nss_lookup_type)cache_mdata) {
374 case nss_lt_name:
375 name = va_arg(ap, char *);
376 break;
377 case nss_lt_id:
378 uid = va_arg(ap, uid_t);
379 break;
380 case nss_lt_all:
381 break;
382 default:
383 /* should be unreachable */
384 return (NS_UNAVAIL);
385 }
386
387 pwd = va_arg(ap, struct passwd *);
388 orig_buf = va_arg(ap, char *);
389 orig_buf_size = va_arg(ap, size_t);
390 ret_errno = va_arg(ap, int *);
391
392 if (orig_buf_size <
393 buffer_size - sizeof(struct passwd) - sizeof(char *)) {
394 *ret_errno = ERANGE;
395 return (NS_RETURN);
396 }
397
398 memcpy(pwd, buffer, sizeof(struct passwd));
399 memcpy(&p, buffer + sizeof(struct passwd), sizeof(char *));
400 memcpy(orig_buf, buffer + sizeof(struct passwd) + sizeof(char *),
401 buffer_size - sizeof(struct passwd) - sizeof(char *));
402
403 NS_APPLY_OFFSET(pwd->pw_name, orig_buf, p, char *);
404 NS_APPLY_OFFSET(pwd->pw_passwd, orig_buf, p, char *);
405 NS_APPLY_OFFSET(pwd->pw_class, orig_buf, p, char *);
406 NS_APPLY_OFFSET(pwd->pw_gecos, orig_buf, p, char *);
407 NS_APPLY_OFFSET(pwd->pw_dir, orig_buf, p, char *);
408 NS_APPLY_OFFSET(pwd->pw_shell, orig_buf, p, char *);
409
410 if (retval != NULL)
411 *((struct passwd **)retval) = pwd;
412
413 return (NS_SUCCESS);
414}
415
416NSS_MP_CACHE_HANDLING(passwd);
417#endif /* NS_CACHING */
418
198void
199setpwent(void)
200{
419void
420setpwent(void)
421{
422#ifdef NS_CACHING
423 static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER(
424 passwd, (void *)nss_lt_all,
425 NULL, NULL);
426#endif
427
201 static const ns_dtab dtab[] = {
202 { NSSRC_FILES, files_setpwent, (void *)SETPWENT },
203#ifdef HESIOD
204 { NSSRC_DNS, dns_setpwent, (void *)SETPWENT },
205#endif
206#ifdef YP
207 { NSSRC_NIS, nis_setpwent, (void *)SETPWENT },
208#endif
209 { NSSRC_COMPAT, compat_setpwent, (void *)SETPWENT },
428 static const ns_dtab dtab[] = {
429 { NSSRC_FILES, files_setpwent, (void *)SETPWENT },
430#ifdef HESIOD
431 { NSSRC_DNS, dns_setpwent, (void *)SETPWENT },
432#endif
433#ifdef YP
434 { NSSRC_NIS, nis_setpwent, (void *)SETPWENT },
435#endif
436 { NSSRC_COMPAT, compat_setpwent, (void *)SETPWENT },
437#ifdef NS_CACHING
438 NS_CACHE_CB(&cache_info)
439#endif
210 { NULL, NULL, NULL }
211 };
212 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "setpwent", defaultsrc, 0);
213}
214
215
216int
217setpassent(int stayopen)
218{
440 { NULL, NULL, NULL }
441 };
442 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "setpwent", defaultsrc, 0);
443}
444
445
446int
447setpassent(int stayopen)
448{
449#ifdef NS_CACHING
450 static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER(
451 passwd, (void *)nss_lt_all,
452 NULL, NULL);
453#endif
454
219 static const ns_dtab dtab[] = {
220 { NSSRC_FILES, files_setpwent, (void *)SETPWENT },
221#ifdef HESIOD
222 { NSSRC_DNS, dns_setpwent, (void *)SETPWENT },
223#endif
224#ifdef YP
225 { NSSRC_NIS, nis_setpwent, (void *)SETPWENT },
226#endif
227 { NSSRC_COMPAT, compat_setpwent, (void *)SETPWENT },
455 static const ns_dtab dtab[] = {
456 { NSSRC_FILES, files_setpwent, (void *)SETPWENT },
457#ifdef HESIOD
458 { NSSRC_DNS, dns_setpwent, (void *)SETPWENT },
459#endif
460#ifdef YP
461 { NSSRC_NIS, nis_setpwent, (void *)SETPWENT },
462#endif
463 { NSSRC_COMPAT, compat_setpwent, (void *)SETPWENT },
464#ifdef NS_CACHING
465 NS_CACHE_CB(&cache_info)
466#endif
228 { NULL, NULL, NULL }
229 };
230 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "setpwent", defaultsrc,
231 stayopen);
232 return (1);
233}
234
235
236void
237endpwent(void)
238{
467 { NULL, NULL, NULL }
468 };
469 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "setpwent", defaultsrc,
470 stayopen);
471 return (1);
472}
473
474
475void
476endpwent(void)
477{
478#ifdef NS_CACHING
479 static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER(
480 passwd, (void *)nss_lt_all,
481 NULL, NULL);
482#endif
483
239 static const ns_dtab dtab[] = {
240 { NSSRC_FILES, files_setpwent, (void *)ENDPWENT },
241#ifdef HESIOD
242 { NSSRC_DNS, dns_setpwent, (void *)ENDPWENT },
243#endif
244#ifdef YP
245 { NSSRC_NIS, nis_setpwent, (void *)ENDPWENT },
246#endif
247 { NSSRC_COMPAT, compat_setpwent, (void *)ENDPWENT },
484 static const ns_dtab dtab[] = {
485 { NSSRC_FILES, files_setpwent, (void *)ENDPWENT },
486#ifdef HESIOD
487 { NSSRC_DNS, dns_setpwent, (void *)ENDPWENT },
488#endif
489#ifdef YP
490 { NSSRC_NIS, nis_setpwent, (void *)ENDPWENT },
491#endif
492 { NSSRC_COMPAT, compat_setpwent, (void *)ENDPWENT },
493#ifdef NS_CACHING
494 NS_CACHE_CB(&cache_info)
495#endif
248 { NULL, NULL, NULL }
249 };
250 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "endpwent", defaultsrc);
251}
252
253
254int
255getpwent_r(struct passwd *pwd, char *buffer, size_t bufsize,
256 struct passwd **result)
257{
496 { NULL, NULL, NULL }
497 };
498 (void)_nsdispatch(NULL, dtab, NSDB_PASSWD, "endpwent", defaultsrc);
499}
500
501
502int
503getpwent_r(struct passwd *pwd, char *buffer, size_t bufsize,
504 struct passwd **result)
505{
506#ifdef NS_CACHING
507 static const nss_cache_info cache_info = NS_MP_CACHE_INFO_INITIALIZER(
508 passwd, (void *)nss_lt_all,
509 pwd_marshal_func, pwd_unmarshal_func);
510#endif
511
258 static const ns_dtab dtab[] = {
259 { NSSRC_FILES, files_passwd, (void *)nss_lt_all },
260#ifdef HESIOD
261 { NSSRC_DNS, dns_passwd, (void *)nss_lt_all },
262#endif
263#ifdef YP
264 { NSSRC_NIS, nis_passwd, (void *)nss_lt_all },
265#endif
266 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all },
512 static const ns_dtab dtab[] = {
513 { NSSRC_FILES, files_passwd, (void *)nss_lt_all },
514#ifdef HESIOD
515 { NSSRC_DNS, dns_passwd, (void *)nss_lt_all },
516#endif
517#ifdef YP
518 { NSSRC_NIS, nis_passwd, (void *)nss_lt_all },
519#endif
520 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_all },
521#ifdef NS_CACHING
522 NS_CACHE_CB(&cache_info)
523#endif
267 { NULL, NULL, NULL }
268 };
269 int rv, ret_errno;
270
271 pwd_init(pwd);
272 ret_errno = 0;
273 *result = NULL;
274 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwent_r", defaultsrc,

--- 4 unchanged lines hidden (view full) ---

279 return (ret_errno);
280}
281
282
283int
284getpwnam_r(const char *name, struct passwd *pwd, char *buffer, size_t bufsize,
285 struct passwd **result)
286{
524 { NULL, NULL, NULL }
525 };
526 int rv, ret_errno;
527
528 pwd_init(pwd);
529 ret_errno = 0;
530 *result = NULL;
531 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwent_r", defaultsrc,

--- 4 unchanged lines hidden (view full) ---

536 return (ret_errno);
537}
538
539
540int
541getpwnam_r(const char *name, struct passwd *pwd, char *buffer, size_t bufsize,
542 struct passwd **result)
543{
544#ifdef NS_CACHING
545 static const nss_cache_info cache_info =
546 NS_COMMON_CACHE_INFO_INITIALIZER(
547 passwd, (void *)nss_lt_name,
548 pwd_id_func, pwd_marshal_func, pwd_unmarshal_func);
549#endif
550
287 static const ns_dtab dtab[] = {
288 { NSSRC_FILES, files_passwd, (void *)nss_lt_name },
289#ifdef HESIOD
290 { NSSRC_DNS, dns_passwd, (void *)nss_lt_name },
291#endif
292#ifdef YP
293 { NSSRC_NIS, nis_passwd, (void *)nss_lt_name },
294#endif
295 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_name },
551 static const ns_dtab dtab[] = {
552 { NSSRC_FILES, files_passwd, (void *)nss_lt_name },
553#ifdef HESIOD
554 { NSSRC_DNS, dns_passwd, (void *)nss_lt_name },
555#endif
556#ifdef YP
557 { NSSRC_NIS, nis_passwd, (void *)nss_lt_name },
558#endif
559 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_name },
560#ifdef NS_CACHING
561 NS_CACHE_CB(&cache_info)
562#endif
296 { NULL, NULL, NULL }
297 };
298 int rv, ret_errno;
299
300 pwd_init(pwd);
301 ret_errno = 0;
302 *result = NULL;
303 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwnam_r", defaultsrc,

--- 4 unchanged lines hidden (view full) ---

308 return (ret_errno);
309}
310
311
312int
313getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer, size_t bufsize,
314 struct passwd **result)
315{
563 { NULL, NULL, NULL }
564 };
565 int rv, ret_errno;
566
567 pwd_init(pwd);
568 ret_errno = 0;
569 *result = NULL;
570 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwnam_r", defaultsrc,

--- 4 unchanged lines hidden (view full) ---

575 return (ret_errno);
576}
577
578
579int
580getpwuid_r(uid_t uid, struct passwd *pwd, char *buffer, size_t bufsize,
581 struct passwd **result)
582{
583#ifdef NS_CACHING
584 static const nss_cache_info cache_info =
585 NS_COMMON_CACHE_INFO_INITIALIZER(
586 passwd, (void *)nss_lt_id,
587 pwd_id_func, pwd_marshal_func, pwd_unmarshal_func);
588#endif
589
316 static const ns_dtab dtab[] = {
317 { NSSRC_FILES, files_passwd, (void *)nss_lt_id },
318#ifdef HESIOD
319 { NSSRC_DNS, dns_passwd, (void *)nss_lt_id },
320#endif
321#ifdef YP
322 { NSSRC_NIS, nis_passwd, (void *)nss_lt_id },
323#endif
324 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_id },
590 static const ns_dtab dtab[] = {
591 { NSSRC_FILES, files_passwd, (void *)nss_lt_id },
592#ifdef HESIOD
593 { NSSRC_DNS, dns_passwd, (void *)nss_lt_id },
594#endif
595#ifdef YP
596 { NSSRC_NIS, nis_passwd, (void *)nss_lt_id },
597#endif
598 { NSSRC_COMPAT, compat_passwd, (void *)nss_lt_id },
599#ifdef NS_CACHING
600 NS_CACHE_CB(&cache_info)
601#endif
325 { NULL, NULL, NULL }
326 };
327 int rv, ret_errno;
328
329 pwd_init(pwd);
330 ret_errno = 0;
331 *result = NULL;
332 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwuid_r", defaultsrc,

--- 1400 unchanged lines hidden ---
602 { NULL, NULL, NULL }
603 };
604 int rv, ret_errno;
605
606 pwd_init(pwd);
607 ret_errno = 0;
608 *result = NULL;
609 rv = _nsdispatch(result, dtab, NSDB_PASSWD, "getpwuid_r", defaultsrc,

--- 1400 unchanged lines hidden ---