diff options
author | aldot <aldot@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2005-10-28 11:21:40 +0000 |
---|---|---|
committer | aldot <aldot@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2005-10-28 11:21:40 +0000 |
commit | fc4a13d6990c9037e58ed152ce98909674f0ae41 (patch) | |
tree | 1b77618915ceb3a318bb868addc1eb0e935cc758 | |
parent | b585c1272598e5210247cb97220146be05af33e2 (diff) | |
download | busybox-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.c | 89 | ||||
-rw-r--r-- | libpwdgrp/pwd_grp_internal.c | 111 |
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 | ||
79 | int fgetpwent_r(FILE *__restrict stream, struct passwd *__restrict resultbuf, | 80 | int 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 | |||
268 | int 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 | ||
306 | struct passwd *getpwuid(uid_t uid) | 274 | struct 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 | ||
414 | static 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 | ||
445 | static FILE *pwf /*= NULL*/; | 424 | static FILE *pwf /*= NULL*/; |
446 | void setpwent(void) | 425 | void 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 | ||
453 | void endpwent(void) | 434 | void 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, | |||
490 | static FILE *grf /*= NULL*/; | 475 | static FILE *grf /*= NULL*/; |
491 | void setgrent(void) | 476 | void 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 | ||
498 | void endgrent(void) | 485 | void 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 | ||
506 | int getgrent_r(struct group *__restrict resultbuf, | 495 | int 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, | |||
534 | static FILE *spf /*= NULL*/; | 525 | static FILE *spf /*= NULL*/; |
535 | void setspent(void) | 526 | void 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 | ||
542 | void endspent(void) | 535 | void 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 | ||
550 | int getspent_r(struct spwd *resultbuf, char *buffer, | 545 | int 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 | ||
633 | int initgroups(const char *user, gid_t gid) | 630 | int 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 | ||
759 | static const unsigned char sp_off[] = { | 756 | static 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 | |||
55 | extern int __parsepwent(void *pw, char *line); | ||
56 | extern int __parsegrent(void *gr, char *line); | ||
57 | extern int __parsespent(void *sp, char *line); | ||
58 | |||
59 | extern 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 | |||
69 | int 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 | |||