diff options
Diffstat (limited to 'coreutils/id.c')
-rw-r--r-- | coreutils/id.c | 76 |
1 files changed, 33 insertions, 43 deletions
diff --git a/coreutils/id.c b/coreutils/id.c index c7f61532d..9b2d60dc7 100644 --- a/coreutils/id.c +++ b/coreutils/id.c | |||
@@ -20,6 +20,8 @@ | |||
20 | * | 20 | * |
21 | */ | 21 | */ |
22 | 22 | ||
23 | /* BB_AUDIT SUSv3 _NOT_ compliant -- option -G is not currently supported. */ | ||
24 | |||
23 | #include "busybox.h" | 25 | #include "busybox.h" |
24 | #include <stdio.h> | 26 | #include <stdio.h> |
25 | #include <unistd.h> | 27 | #include <unistd.h> |
@@ -27,70 +29,58 @@ | |||
27 | #include <string.h> | 29 | #include <string.h> |
28 | #include <sys/types.h> | 30 | #include <sys/types.h> |
29 | 31 | ||
32 | #define NO_GROUP 1 | ||
33 | #define NO_USER 2 | ||
34 | #define PRINT_REAL 4 | ||
35 | #define NAME_NOT_NUMBER 8 | ||
36 | |||
30 | extern int id_main(int argc, char **argv) | 37 | extern int id_main(int argc, char **argv) |
31 | { | 38 | { |
32 | int no_user = 0, no_group = 0, print_real = 0; | ||
33 | int name_not_number = 0; | ||
34 | char user[9], group[9]; | 39 | char user[9], group[9]; |
35 | long gid; | ||
36 | long pwnam, grnam; | 40 | long pwnam, grnam; |
37 | int opt; | 41 | int uid, gid; |
42 | int flags; | ||
38 | 43 | ||
39 | gid = 0; | 44 | flags = bb_getopt_ulflags(argc, argv, "ugrn"); |
40 | 45 | ||
41 | while ((opt = getopt(argc, argv, "ugrn")) > 0) { | 46 | if (((flags & (NO_USER | NO_GROUP)) == (NO_USER | NO_GROUP)) |
42 | switch (opt) { | 47 | || (argc > optind + 1) |
43 | case 'u': | 48 | ) { |
44 | no_group++; | 49 | bb_show_usage(); |
45 | break; | ||
46 | case 'g': | ||
47 | no_user++; | ||
48 | break; | ||
49 | case 'r': | ||
50 | print_real++; | ||
51 | break; | ||
52 | case 'n': | ||
53 | name_not_number++; | ||
54 | break; | ||
55 | default: | ||
56 | show_usage(); | ||
57 | } | ||
58 | } | 50 | } |
59 | 51 | ||
60 | if (no_user && no_group) show_usage(); | ||
61 | |||
62 | if (argv[optind] == NULL) { | 52 | if (argv[optind] == NULL) { |
63 | if (print_real) { | 53 | if (flags & PRINT_REAL) { |
64 | my_getpwuid(user, getuid()); | 54 | uid = getuid(); |
65 | my_getgrgid(group, getgid()); | 55 | gid = getgid(); |
66 | } else { | 56 | } else { |
67 | my_getpwuid(user, geteuid()); | 57 | uid = geteuid(); |
68 | my_getgrgid(group, getegid()); | 58 | gid = getegid(); |
69 | } | 59 | } |
60 | my_getpwuid(user, uid); | ||
70 | } else { | 61 | } else { |
71 | safe_strncpy(user, argv[optind], sizeof(user)); | 62 | safe_strncpy(user, argv[optind], sizeof(user)); |
72 | gid = my_getpwnamegid(user); | 63 | gid = my_getpwnamegid(user); |
73 | my_getgrgid(group, gid); | ||
74 | } | 64 | } |
65 | my_getgrgid(group, gid); | ||
75 | 66 | ||
76 | pwnam=my_getpwnam(user); | 67 | pwnam=my_getpwnam(user); |
77 | grnam=my_getgrnam(group); | 68 | grnam=my_getgrnam(group); |
78 | 69 | ||
79 | if (no_group) { | 70 | if (flags & (NO_GROUP | NO_USER)) { |
80 | if(name_not_number) | 71 | char *s = group; |
81 | puts(user); | 72 | if (flags & NO_GROUP) { |
82 | else | 73 | s = user; |
83 | printf("%ld\n", pwnam); | 74 | grnam = pwnam; |
84 | } else if (no_user) { | 75 | } |
85 | if(name_not_number) | 76 | if (flags & NAME_NOT_NUMBER) { |
86 | puts(group); | 77 | puts(s); |
87 | else | 78 | } else { |
88 | printf("%ld\n", grnam); | 79 | printf("%ld\n", grnam); |
80 | } | ||
89 | } else { | 81 | } else { |
90 | printf("uid=%ld(%s) gid=%ld(%s)\n", pwnam, user, grnam, group); | 82 | printf("uid=%ld(%s) gid=%ld(%s)\n", pwnam, user, grnam, group); |
91 | } | 83 | } |
92 | return(0); | ||
93 | } | ||
94 | 84 | ||
95 | 85 | bb_fflush_stdout_and_exit(0); | |
96 | /* END CODE */ | 86 | } |