/* Copyright (C) 1991, 1995, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include static void print_grpname (id, parens) gid_t id; int parens; { const struct group *const g = getgrgid (id); if (g == NULL) { if (parens) return; else { fprintf (stderr, _("Couldn't find name for group %d\n"), id); exit (EXIT_FAILURE); } } if (parens) printf ("(%s)", g->gr_name); else puts (g->gr_name); } static void print_pwdname (id, parens) uid_t id; int parens; { const struct passwd *const p = getpwuid (id); if (p == NULL) { if (parens) return; else { fprintf (stderr, _("Couldn't find name for user %d\n"), (int) id); exit (EXIT_FAILURE); } } if (parens) printf ("(%s)", p->pw_name); else puts (p->pw_name); } int main (argc, argv) int argc; char **argv; { int print_gid = 1, print_uid = 1; int real = 0, name = 0; int error = 0; int c; uid_t ruid = getuid (), euid = geteuid (); gid_t rgid = getgid (), egid = getegid (); while ((c = getopt (argc, argv, "gurn")) != -1) switch (c) { default: error = 1; break; case 'g': print_gid = 1; print_uid = 0; break; case 'u': print_uid = 1; print_gid = 0; break; case 'r': real = 1; break; case 'n': name = 1; break; } if (error || argc != optind) { fputs (_("Usage: id [-gurn]\n"), stderr); exit (EXIT_FAILURE); } if (print_uid && !print_gid) { const uid_t uid = real ? ruid : euid; if (name) print_pwdname (uid, 0); else printf ("%d\n", (int) uid); } else if (print_gid && !print_uid) { const gid_t gid = real ? rgid : egid; if (name) print_grpname (gid, 0); else printf ("%d\n", (int) gid); } else { #if NGROUPS_MAX > 0 gid_t groups[NGROUPS_MAX]; int ngroups; ngroups = getgroups (NGROUPS_MAX, groups); #endif printf ("uid=%d", (int) ruid); print_pwdname (ruid, 1); printf (" gid=%d", (int) rgid); print_grpname (rgid, 1); if (euid != ruid) { printf (" euid=%d", (int) euid); print_pwdname (euid, 1); } if (egid != rgid) { printf (" egid=%d", (int) egid); print_grpname (egid, 1); } #if NGROUPS > 0 if (ngroups > 0) { size_t i; printf (" groups=%d", (int) groups[0]); print_grpname (groups[0], 1); for (i = 1; i < ngroups; ++i) { printf (", %d", (int) groups[i]); print_grpname (groups[i], 1); } } #endif putchar ('\n'); } exit (EXIT_SUCCESS); }