4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #pragma ident "%Z%%M% %I% %E% SMI"
28 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
29 /* All Rights Reserved */
36 #include <sys/param.h>
43 #define PWNULL ((struct passwd *)0)
44 #define GRNULL ((struct group *)0)
47 UID
, EUID
, GID
, EGID
, SGID
51 CURR
, /* Print uid/gid only */
52 ALLGROUPS
, /* Print all groups */
53 GROUP
, /* Print only group */
54 USER
/* Print only uid */
56 static PRINT mode
= CURR
;
58 static int usage(void);
59 static void puid(uid_t
);
60 static void pgid(gid_t
);
61 static void prid(TYPE
, uid_t
);
62 static int getusergroups(int, gid_t
*, char *, gid_t
);
64 static int nflag
= 0; /* Output names, not numbers */
65 static int rflag
= 0; /* Output real, not effective IDs */
66 static char stdbuf
[BUFSIZ
];
69 main(int argc
, char *argv
[])
73 gid_t gid
, egid
, prgid
;
74 int c
, project_flag
= 0;
77 int groupmax
= sysconf(_SC_NGROUPS_MAX
);
78 gid_t
*groupids
= alloca(groupmax
* sizeof (gid_t
));
82 (void) setlocale(LC_ALL
, "");
84 #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
85 #define TEXT_DOMAIN "SYS_TEST"
87 (void) textdomain(TEXT_DOMAIN
);
88 while ((c
= getopt(argc
, argv
, "Ggunrp")) != EOF
) {
126 setbuf(stdout
, stdbuf
);
130 /* -n and -r must be combined with one of -[Ggu] */
131 /* -r cannot be combined with -G */
132 /* -p cannot be combined with -[Ggu] */
134 if ((mode
== CURR
&& (nflag
|| rflag
)) ||
135 (mode
== ALLGROUPS
&& rflag
) ||
136 (argc
!= 1 && argc
!= 2) ||
137 (mode
!= CURR
&& project_flag
))
140 if ((pwp
= getpwnam(argv
[1])) == PWNULL
) {
141 (void) fprintf(stderr
,
142 gettext("id: invalid user name: \"%s\"\n"),
147 uid
= euid
= pwp
->pw_uid
;
148 prgid
= gid
= egid
= pwp
->pw_gid
;
163 else if (mode
== GROUP
)
165 else if (mode
== ALLGROUPS
) {
168 i
= getusergroups(groupmax
, groupids
, user
,
171 i
= getgroups(groupmax
, groupids
);
175 for (j
= 0; j
< i
; ++j
) {
176 if ((gid
= groupids
[j
]) == egid
)
183 (void) putchar('\n');
193 i
= getusergroups(groupmax
, groupids
, user
,
196 i
= getgroups(groupmax
, groupids
);
200 (void) printf(" groups=");
201 for (idp
= groupids
; i
--; idp
++) {
204 (void) printf("%u", *idp
);
205 if (gr
= getgrgid(*idp
))
206 (void) printf("(%s)",
216 projid_t curprojid
= getprojid();
218 if ((projbuf
= malloc(PROJECT_BUFSZ
)) == NULL
) {
219 (void) fprintf(stderr
, "unable to allocate "
225 if (getdefaultproj(user
, &proj
, projbuf
,
226 PROJECT_BUFSZ
) != NULL
)
227 (void) printf(" projid=%d(%s)",
228 (int)proj
.pj_projid
, proj
.pj_name
);
231 * This can only happen if project
232 * "default" has been removed from
233 * /etc/project file or the whole
234 * project database file was removed.
236 (void) printf(" projid=(NONE)");
238 if (getprojbyid(curprojid
, &proj
, projbuf
,
239 PROJECT_BUFSZ
) == NULL
)
240 (void) printf(" projid=%d",
243 (void) printf(" projid=%d(%s)",
244 (int)curprojid
, proj
.pj_name
);
248 (void) putchar('\n');
256 (void) fprintf(stderr
, gettext(
258 " id -G [-n] [user]\n"
259 " id -g [-nr] [user]\n"
261 " id -u [-nr] [user]\n"));
270 if (nflag
&& (pw
= getpwuid(uid
)) != PWNULL
)
271 (void) printf("%s", pw
->pw_name
);
273 (void) printf("%u", uid
);
281 if (nflag
&& (gr
= getgrgid(gid
)) != GRNULL
)
282 (void) printf("%s", gr
->gr_name
);
284 (void) printf("%u", gid
);
288 prid(TYPE how
, uid_t id
)
311 (void) printf("%s=", s
);
312 (void) printf("%u", id
);
319 if ((pwp
= getpwuid(id
)) != PWNULL
)
320 (void) printf("(%s)", pwp
->pw_name
);
329 if ((grp
= getgrgid(id
)) != GRNULL
)
330 (void) printf("(%s)", grp
->gr_name
);
337 * Get the supplementary group affiliation for the user
339 static int getusergroups(gidsetsize
, grouplist
, user
, prgid
)
350 while ((ngroups
< gidsetsize
) && ((group
= getgrent()) != NULL
))
351 for (gr_mem
= group
->gr_mem
; *gr_mem
; gr_mem
++)
352 if (strcmp(user
, *gr_mem
) == 0) {
354 grouplist
[ngroups
] = group
->gr_gid
;
358 if (gidsetsize
&& !ngroups
)
359 grouplist
[ngroups
++] = prgid
;