Initial revision
[kopensolaris-gnu/glibc.git] / posix / id.c
1 /* Copyright (C) 1991 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 1, or (at your option)
7 any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with the GNU C Library; see the file COPYING.  If not, write to
16 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
17
18 #include <ansidecl.h>
19 #include <stdio.h>
20 #include <unistd.h>
21 #include <stdlib.h>
22 #include <grp.h>
23 #include <pwd.h>
24 #include <limits.h>
25 #include <sys/types.h>
26
27
28 static void
29 DEFUN(print_grpname, (id, parens),
30       gid_t id AND int parens)
31 {
32   CONST struct group *CONST g = getgrgid(id);
33   if (g == NULL)
34     {
35       if (parens)
36         return;
37       else
38         {
39           fprintf(stderr, "Couldn't find name for group %d\n", id);
40           exit(EXIT_FAILURE);
41         }
42     }
43
44   if (parens)
45     printf("(%s)", g->gr_name);
46   else
47     puts(g->gr_name);
48 }
49
50 static void
51 DEFUN(print_pwdname, (id, parens),
52       uid_t id AND int parens)
53 {
54   CONST struct passwd *CONST p = getpwuid(id);
55   if (p == NULL)
56     {
57       if (parens)
58         return;
59       else
60         {
61           fprintf(stderr, "Couldn't find name for user %d\n", (int) id);
62           exit(EXIT_FAILURE);
63         }
64     }
65
66   if (parens)
67     printf("(%s)", p->pw_name);
68   else
69     puts(p->pw_name);
70 }
71 \f
72 int
73 DEFUN(main, (argc, argv), int argc AND char **argv)
74 {
75   int print_gid = 1, print_uid = 1;
76   int real = 0, name = 0;
77   int error = 0;
78   register int c;
79
80   uid_t ruid = getuid(), euid = geteuid();
81   gid_t rgid = getgid(), egid = getegid();
82
83   while ((c = getopt(argc, argv, "gurn")) != -1)
84     switch (c)
85       {
86       default:
87         error = 1;
88         break;
89
90       case 'g':
91         print_gid = 1;
92         print_uid = 0;
93         break;
94
95       case 'u':
96         print_uid = 1;
97         print_gid = 0;
98         break;
99
100       case 'r':
101         real = 1;
102         break;
103
104       case 'n':
105         name = 1;
106         break;
107       }
108
109   if (error || argc != optind)
110     {
111       fputs("Usage: id [-gurn]\n", stderr);
112       exit(EXIT_FAILURE);
113     }
114
115   if (print_uid && !print_gid)
116     {
117       CONST uid_t uid = real ? ruid : euid;
118       if (name)
119         print_pwdname(uid, 0);
120       else
121         printf("%d\n", (int) uid);
122     }
123   else if (print_gid && !print_uid)
124     {
125       CONST gid_t gid = real ? rgid : egid;
126       if (name)
127         print_grpname(gid, 0);
128       else
129         printf("%d\n", (int) gid);
130     }
131   else
132     {
133 #if     NGROUPS_MAX > 0
134       gid_t groups[NGROUPS_MAX];
135       int ngroups;
136       ngroups = getgroups(NGROUPS_MAX, groups);
137 #endif
138
139       printf("uid=%d", (int) ruid);
140       print_pwdname(ruid, 1);
141       printf(" gid=%d", (int) rgid);
142       print_grpname(rgid, 1);
143       if (euid != ruid)
144         {
145           printf(" euid=%d", (int) euid);
146           print_pwdname(euid, 1);
147         }
148       if (egid != rgid)
149         {
150           printf(" egid=%d", (int) egid);
151           print_grpname(egid, 1);
152         }
153
154 #if     NGROUPS > 0
155       if (ngroups > 0)
156         {
157           register size_t i;
158           printf(" groups=%d", (int) groups[0]);
159           print_grpname(groups[0], 1);
160           for (i = 1; i < ngroups; ++i)
161             {
162               printf(", %d", (int) groups[i]);
163               print_grpname(groups[i], 1);
164             }
165         }
166 #endif
167
168       putchar('\n');
169     }
170
171   exit(EXIT_SUCCESS);
172 }