aboutsummaryrefslogtreecommitdiff
path: root/coreutils/id.c
diff options
context:
space:
mode:
Diffstat (limited to 'coreutils/id.c')
-rw-r--r--coreutils/id.c76
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
30extern int id_main(int argc, char **argv) 37extern 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}