aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraldot <aldot@69ca8d6d-28ef-0310-b511-8ec308f3f277>2005-10-28 11:21:40 +0000
committeraldot <aldot@69ca8d6d-28ef-0310-b511-8ec308f3f277>2005-10-28 11:21:40 +0000
commitfc4a13d6990c9037e58ed152ce98909674f0ae41 (patch)
tree1b77618915ceb3a318bb868addc1eb0e935cc758
parentb585c1272598e5210247cb97220146be05af33e2 (diff)
downloadbusybox-w32-fc4a13d6990c9037e58ed152ce98909674f0ae41.tar.gz
busybox-w32-fc4a13d6990c9037e58ed152ce98909674f0ae41.tar.bz2
busybox-w32-fc4a13d6990c9037e58ed152ce98909674f0ae41.zip
- move GETXXKEY_R_FUNC into an internal helper file to allow for compiling
with IMA. git-svn-id: svn://busybox.net/trunk/busybox@11952 69ca8d6d-28ef-0310-b511-8ec308f3f277
-rw-r--r--libpwdgrp/pwd_grp.c89
-rw-r--r--libpwdgrp/pwd_grp_internal.c111
2 files changed, 154 insertions, 46 deletions
diff --git a/libpwdgrp/pwd_grp.c b/libpwdgrp/pwd_grp.c
index 3661834b2..18782002d 100644
--- a/libpwdgrp/pwd_grp.c
+++ b/libpwdgrp/pwd_grp.c
@@ -74,6 +74,7 @@ extern int __pgsreader(int (*__parserfunc)(void *d, char *line), void *data,
74 * Doing so is analogous to having fgetc() set errno on EOF. 74 * Doing so is analogous to having fgetc() set errno on EOF.
75 */ 75 */
76/**********************************************************************/ 76/**********************************************************************/
77
77#ifdef L_fgetpwent_r 78#ifdef L_fgetpwent_r
78 79
79int fgetpwent_r(FILE *__restrict stream, struct passwd *__restrict resultbuf, 80int fgetpwent_r(FILE *__restrict stream, struct passwd *__restrict resultbuf,
@@ -224,6 +225,7 @@ int sgetspent_r(const char *string, struct spwd *result_buf,
224#define GETXXKEY_R_TEST(ENT) (!strcmp((ENT)->pw_name, key)) 225#define GETXXKEY_R_TEST(ENT) (!strcmp((ENT)->pw_name, key))
225#define DO_GETXXKEY_R_KEYTYPE const char *__restrict 226#define DO_GETXXKEY_R_KEYTYPE const char *__restrict
226#define DO_GETXXKEY_R_PATHNAME _PATH_PASSWD 227#define DO_GETXXKEY_R_PATHNAME _PATH_PASSWD
228#include "pwd_grp_internal.c"
227#endif 229#endif
228 230
229#ifdef L_getgrnam_r 231#ifdef L_getgrnam_r
@@ -233,6 +235,7 @@ int sgetspent_r(const char *string, struct spwd *result_buf,
233#define GETXXKEY_R_TEST(ENT) (!strcmp((ENT)->gr_name, key)) 235#define GETXXKEY_R_TEST(ENT) (!strcmp((ENT)->gr_name, key))
234#define DO_GETXXKEY_R_KEYTYPE const char *__restrict 236#define DO_GETXXKEY_R_KEYTYPE const char *__restrict
235#define DO_GETXXKEY_R_PATHNAME _PATH_GROUP 237#define DO_GETXXKEY_R_PATHNAME _PATH_GROUP
238#include "pwd_grp_internal.c"
236#endif 239#endif
237 240
238#ifdef L_getspnam_r 241#ifdef L_getspnam_r
@@ -242,6 +245,7 @@ int sgetspent_r(const char *string, struct spwd *result_buf,
242#define GETXXKEY_R_TEST(ENT) (!strcmp((ENT)->sp_namp, key)) 245#define GETXXKEY_R_TEST(ENT) (!strcmp((ENT)->sp_namp, key))
243#define DO_GETXXKEY_R_KEYTYPE const char *__restrict 246#define DO_GETXXKEY_R_KEYTYPE const char *__restrict
244#define DO_GETXXKEY_R_PATHNAME _PATH_SHADOW 247#define DO_GETXXKEY_R_PATHNAME _PATH_SHADOW
248#include "pwd_grp_internal.c"
245#endif 249#endif
246 250
247#ifdef L_getpwuid_r 251#ifdef L_getpwuid_r
@@ -251,6 +255,7 @@ int sgetspent_r(const char *string, struct spwd *result_buf,
251#define GETXXKEY_R_TEST(ENT) ((ENT)->pw_uid == key) 255#define GETXXKEY_R_TEST(ENT) ((ENT)->pw_uid == key)
252#define DO_GETXXKEY_R_KEYTYPE uid_t 256#define DO_GETXXKEY_R_KEYTYPE uid_t
253#define DO_GETXXKEY_R_PATHNAME _PATH_PASSWD 257#define DO_GETXXKEY_R_PATHNAME _PATH_PASSWD
258#include "pwd_grp_internal.c"
254#endif 259#endif
255 260
256#ifdef L_getgrgid_r 261#ifdef L_getgrgid_r
@@ -260,47 +265,10 @@ int sgetspent_r(const char *string, struct spwd *result_buf,
260#define GETXXKEY_R_TEST(ENT) ((ENT)->gr_gid == key) 265#define GETXXKEY_R_TEST(ENT) ((ENT)->gr_gid == key)
261#define DO_GETXXKEY_R_KEYTYPE gid_t 266#define DO_GETXXKEY_R_KEYTYPE gid_t
262#define DO_GETXXKEY_R_PATHNAME _PATH_GROUP 267#define DO_GETXXKEY_R_PATHNAME _PATH_GROUP
268#include "pwd_grp_internal.c"
263#endif 269#endif
264 270
265/**********************************************************************/ 271/**********************************************************************/
266#ifdef GETXXKEY_R_FUNC
267
268int GETXXKEY_R_FUNC(DO_GETXXKEY_R_KEYTYPE key,
269 GETXXKEY_R_ENTTYPE *__restrict resultbuf,
270 char *__restrict buffer, size_t buflen,
271 GETXXKEY_R_ENTTYPE **__restrict result)
272{
273 FILE *stream;
274 int rv;
275
276 *result = NULL;
277
278 if (!(stream = fopen(DO_GETXXKEY_R_PATHNAME, "r"))) {
279 rv = errno;
280 } else {
281 do {
282 if (!(rv = __pgsreader(GETXXKEY_R_PARSER, resultbuf,
283 buffer, buflen, stream))
284 ) {
285 if (GETXXKEY_R_TEST(resultbuf)) { /* Found key? */
286 *result = resultbuf;
287 break;
288 }
289 } else {
290 if (rv == ENOENT) { /* end-of-file encountered. */
291 rv = 0;
292 }
293 break;
294 }
295 } while (1);
296 fclose(stream);
297 }
298
299 return rv;
300}
301
302#endif
303/**********************************************************************/
304#ifdef L_getpwuid 272#ifdef L_getpwuid
305 273
306struct passwd *getpwuid(uid_t uid) 274struct passwd *getpwuid(uid_t uid)
@@ -440,22 +408,37 @@ int getpw(uid_t uid, char *buf)
440 408
441#endif 409#endif
442/**********************************************************************/ 410/**********************************************************************/
443#ifdef L_getpwent_r
444 411
412#if defined(L_getpwent_r) || defined(L_getgrent_r) || defined(L_getspent_r)
413#if defined CONFIG_USE_BB_THREADSAFE_SHADOW && defined PTHREAD_MUTEX_INITIALIZER
414static pthread_mutex_t mylock = PTHREAD_MUTEX_INITIALIZER;
415# define LOCK pthread_mutex_lock(&mylock)
416# define UNLOCK pthread_mutex_unlock(&mylock);
417#else
418# define LOCK ((void) 0)
419# define UNLOCK ((void) 0)
420#endif
421#endif
422
423#ifdef L_getpwent_r
445static FILE *pwf /*= NULL*/; 424static FILE *pwf /*= NULL*/;
446void setpwent(void) 425void setpwent(void)
447{ 426{
427 LOCK;
448 if (pwf) { 428 if (pwf) {
449 rewind(pwf); 429 rewind(pwf);
450 } 430 }
431 UNLOCK;
451} 432}
452 433
453void endpwent(void) 434void endpwent(void)
454{ 435{
436 LOCK;
455 if (pwf) { 437 if (pwf) {
456 fclose(pwf); 438 fclose(pwf);
457 pwf = NULL; 439 pwf = NULL;
458 } 440 }
441 UNLOCK;
459} 442}
460 443
461 444
@@ -465,6 +448,7 @@ int getpwent_r(struct passwd *__restrict resultbuf,
465{ 448{
466 int rv; 449 int rv;
467 450
451 LOCK;
468 *result = NULL; /* In case of error... */ 452 *result = NULL; /* In case of error... */
469 453
470 if (!pwf) { 454 if (!pwf) {
@@ -480,6 +464,7 @@ int getpwent_r(struct passwd *__restrict resultbuf,
480 } 464 }
481 465
482 ERR: 466 ERR:
467 UNLOCK;
483 return rv; 468 return rv;
484} 469}
485 470
@@ -490,17 +475,21 @@ int getpwent_r(struct passwd *__restrict resultbuf,
490static FILE *grf /*= NULL*/; 475static FILE *grf /*= NULL*/;
491void setgrent(void) 476void setgrent(void)
492{ 477{
478 LOCK;
493 if (grf) { 479 if (grf) {
494 rewind(grf); 480 rewind(grf);
495 } 481 }
482 UNLOCK;
496} 483}
497 484
498void endgrent(void) 485void endgrent(void)
499{ 486{
487 LOCK;
500 if (grf) { 488 if (grf) {
501 fclose(grf); 489 fclose(grf);
502 grf = NULL; 490 grf = NULL;
503 } 491 }
492 UNLOCK;
504} 493}
505 494
506int getgrent_r(struct group *__restrict resultbuf, 495int getgrent_r(struct group *__restrict resultbuf,
@@ -509,6 +498,7 @@ int getgrent_r(struct group *__restrict resultbuf,
509{ 498{
510 int rv; 499 int rv;
511 500
501 LOCK;
512 *result = NULL; /* In case of error... */ 502 *result = NULL; /* In case of error... */
513 503
514 if (!grf) { 504 if (!grf) {
@@ -524,6 +514,7 @@ int getgrent_r(struct group *__restrict resultbuf,
524 } 514 }
525 515
526 ERR: 516 ERR:
517 UNLOCK;
527 return rv; 518 return rv;
528} 519}
529 520
@@ -534,17 +525,21 @@ int getgrent_r(struct group *__restrict resultbuf,
534static FILE *spf /*= NULL*/; 525static FILE *spf /*= NULL*/;
535void setspent(void) 526void setspent(void)
536{ 527{
528 LOCK;
537 if (spf) { 529 if (spf) {
538 rewind(spf); 530 rewind(spf);
539 } 531 }
532 UNLOCK;
540} 533}
541 534
542void endspent(void) 535void endspent(void)
543{ 536{
537 LOCK;
544 if (spf) { 538 if (spf) {
545 fclose(spf); 539 fclose(spf);
546 spf = NULL; 540 spf = NULL;
547 } 541 }
542 UNLOCK;
548} 543}
549 544
550int getspent_r(struct spwd *resultbuf, char *buffer, 545int getspent_r(struct spwd *resultbuf, char *buffer,
@@ -552,6 +547,7 @@ int getspent_r(struct spwd *resultbuf, char *buffer,
552{ 547{
553 int rv; 548 int rv;
554 549
550 LOCK;
555 *result = NULL; /* In case of error... */ 551 *result = NULL; /* In case of error... */
556 552
557 if (!spf) { 553 if (!spf) {
@@ -567,6 +563,7 @@ int getspent_r(struct spwd *resultbuf, char *buffer,
567 } 563 }
568 564
569 ERR: 565 ERR:
566 UNLOCK;
570 return rv; 567 return rv;
571} 568}
572 569
@@ -632,7 +629,7 @@ struct spwd *sgetspent(const char *string)
632 629
633int initgroups(const char *user, gid_t gid) 630int initgroups(const char *user, gid_t gid)
634{ 631{
635 FILE *grf; 632 FILE *grfile;
636 gid_t *group_list; 633 gid_t *group_list;
637 int num_groups, rv; 634 int num_groups, rv;
638 char **m; 635 char **m;
@@ -643,13 +640,13 @@ int initgroups(const char *user, gid_t gid)
643 640
644 /* We alloc space for 8 gids at a time. */ 641 /* We alloc space for 8 gids at a time. */
645 if (((group_list = (gid_t *) malloc(8*sizeof(gid_t *))) != NULL) 642 if (((group_list = (gid_t *) malloc(8*sizeof(gid_t *))) != NULL)
646 && ((grf = fopen(_PATH_GROUP, "r")) != NULL) 643 && ((grfile = fopen(_PATH_GROUP, "r")) != NULL)
647 ) { 644 ) {
648 645
649 *group_list = gid; 646 *group_list = gid;
650 num_groups = 1; 647 num_groups = 1;
651 648
652 while (!__pgsreader(__parsegrent, &group, buff, sizeof(buff), grf)) { 649 while (!__pgsreader(__parsegrent, &group, buff, sizeof(buff), grfile)) {
653 assert(group.gr_mem); /* Must have at least a NULL terminator. */ 650 assert(group.gr_mem); /* Must have at least a NULL terminator. */
654 if (group.gr_gid != gid) { 651 if (group.gr_gid != gid) {
655 for (m=group.gr_mem ; *m ; m++) { 652 for (m=group.gr_mem ; *m ; m++) {
@@ -673,7 +670,7 @@ int initgroups(const char *user, gid_t gid)
673 670
674 rv = setgroups(num_groups, group_list); 671 rv = setgroups(num_groups, group_list);
675 DO_CLOSE: 672 DO_CLOSE:
676 fclose(grf); 673 fclose(grfile);
677 } 674 }
678 675
679 /* group_list will be NULL if initial malloc failed, which may trigger 676 /* group_list will be NULL if initial malloc failed, which may trigger
@@ -756,7 +753,7 @@ int putgrent(const struct group *__restrict p, FILE *__restrict f)
756/**********************************************************************/ 753/**********************************************************************/
757#ifdef L_putspent 754#ifdef L_putspent
758 755
759static const unsigned char sp_off[] = { 756static const unsigned char _sp_off[] = {
760 offsetof(struct spwd, sp_lstchg), /* 2 - not a char ptr */ 757 offsetof(struct spwd, sp_lstchg), /* 2 - not a char ptr */
761 offsetof(struct spwd, sp_min), /* 3 - not a char ptr */ 758 offsetof(struct spwd, sp_min), /* 3 - not a char ptr */
762 offsetof(struct spwd, sp_max), /* 4 - not a char ptr */ 759 offsetof(struct spwd, sp_max), /* 4 - not a char ptr */
@@ -780,9 +777,9 @@ int putspent(const struct spwd *p, FILE *stream)
780 goto DO_UNLOCK; 777 goto DO_UNLOCK;
781 } 778 }
782 779
783 for (i=0 ; i < sizeof(sp_off) ; i++) { 780 for (i=0 ; i < sizeof(_sp_off) ; i++) {
784 f = ld_format; 781 f = ld_format;
785 if ((x = *(const long int *)(((const char *) p) + sp_off[i])) == -1) { 782 if ((x = *(const long int *)(((const char *) p) + _sp_off[i])) == -1) {
786 f += 3; 783 f += 3;
787 } 784 }
788 if (fprintf(stream, f, x) < 0) { 785 if (fprintf(stream, f, x) < 0) {
diff --git a/libpwdgrp/pwd_grp_internal.c b/libpwdgrp/pwd_grp_internal.c
new file mode 100644
index 000000000..d935b8622
--- /dev/null
+++ b/libpwdgrp/pwd_grp_internal.c
@@ -0,0 +1,111 @@
1/* Copyright (C) 2003 Manuel Novoa III
2 *
3 * Licensed under GPL v2, or later. See file LICENSE in this tarball.
4 */
5
6/* Nov 6, 2003 Initial version.
7 *
8 * NOTE: This implementation is quite strict about requiring all
9 * field seperators. It also does not allow leading whitespace
10 * except when processing the numeric fields. glibc is more
11 * lenient. See the various glibc difference comments below.
12 *
13 * TODO:
14 * Move to dynamic allocation of (currently staticly allocated)
15 * buffers; especially for the group-related functions since
16 * large group member lists will cause error returns.
17 *
18 */
19
20#include <features.h>
21#include <stdio.h>
22#include <stdlib.h>
23#include <stdint.h>
24#include <string.h>
25#include <stddef.h>
26#include <errno.h>
27#include <assert.h>
28#include <ctype.h>
29#include "busybox.h"
30#include "pwd_.h"
31#include "grp_.h"
32#include "shadow_.h"
33
34#ifndef _PATH_SHADOW
35#define _PATH_SHADOW "/etc/shadow"
36#endif
37#ifndef _PATH_PASSWD
38#define _PATH_PASSWD "/etc/passwd"
39#endif
40#ifndef _PATH_GROUP
41#define _PATH_GROUP "/etc/group"
42#endif
43
44/**********************************************************************/
45/* Sizes for staticly allocated buffers. */
46
47/* If you change these values, also change _SC_GETPW_R_SIZE_MAX and
48 * _SC_GETGR_R_SIZE_MAX in libc/unistd/sysconf.c to match */
49#define PWD_BUFFER_SIZE 256
50#define GRP_BUFFER_SIZE 256
51
52/**********************************************************************/
53/* Prototypes for internal functions. */
54
55extern int __parsepwent(void *pw, char *line);
56extern int __parsegrent(void *gr, char *line);
57extern int __parsespent(void *sp, char *line);
58
59extern int __pgsreader(int (*__parserfunc)(void *d, char *line), void *data,
60 char *__restrict line_buff, size_t buflen, FILE *f);
61
62
63#ifndef GETXXKEY_R_FUNC
64#error GETXXKEY_R_FUNC is not defined!
65#endif
66/**********************************************************************/
67#ifdef GETXXKEY_R_FUNC
68
69int GETXXKEY_R_FUNC(DO_GETXXKEY_R_KEYTYPE key,
70 GETXXKEY_R_ENTTYPE *__restrict resultbuf,
71 char *__restrict buffer, size_t buflen,
72 GETXXKEY_R_ENTTYPE **__restrict result)
73{
74 FILE *stream;
75 int rv;
76
77 *result = NULL;
78
79 if (!(stream = fopen(DO_GETXXKEY_R_PATHNAME, "r"))) {
80 rv = errno;
81 } else {
82 do {
83 if (!(rv = __pgsreader(GETXXKEY_R_PARSER, resultbuf,
84 buffer, buflen, stream))
85 ) {
86 if (GETXXKEY_R_TEST(resultbuf)) { /* Found key? */
87 *result = resultbuf;
88 break;
89 }
90 } else {
91 if (rv == ENOENT) { /* end-of-file encountered. */
92 rv = 0;
93 }
94 break;
95 }
96 } while (1);
97 fclose(stream);
98 }
99
100 return rv;
101}
102
103#endif
104/**********************************************************************/
105#undef GETXXKEY_R_FUNC
106#undef GETXXKEY_R_PARSER
107#undef GETXXKEY_R_ENTTYPE
108#undef GETXXKEY_R_TEST
109#undef DO_GETXXKEY_R_KEYTYPE
110#undef DO_GETXXKEY_R_PATHNAME
111