URI: 
       id.c - ubase - suckless linux base utils
  HTML git clone git://git.suckless.org/ubase
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       id.c (2942B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 #include <sys/types.h>
            3 
            4 #include <ctype.h>
            5 #include <errno.h>
            6 #include <grp.h>
            7 #include <limits.h>
            8 #include <pwd.h>
            9 #include <stdio.h>
           10 #include <stdlib.h>
           11 #include <unistd.h>
           12 
           13 #include "util.h"
           14 
           15 static void groupid(struct passwd *pw);
           16 static void user(struct passwd *pw);
           17 static void userid(uid_t id);
           18 static void usernam(const char *nam);
           19 
           20 static int gflag = 0;
           21 static int uflag = 0;
           22 static int Gflag = 0;
           23 static int nflag = 0;
           24 
           25 static void
           26 groupid(struct passwd *pw)
           27 {
           28         gid_t gid, groups[NGROUPS_MAX];
           29         struct group *gr;
           30         int ngroups;
           31         int i;
           32 
           33         ngroups = NGROUPS_MAX;
           34         getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups);
           35         for (i = 0; i < ngroups; i++) {
           36                 gid = groups[i];
           37                 if (nflag) {
           38                         if (!(gr = getgrgid(gid)))
           39                                 eprintf("getgrgid:");
           40                         printf("%s", gr->gr_name);
           41                 } else
           42                         printf("%u", gid);
           43 
           44                 if (i < ngroups - 1)
           45                         putchar(' ');
           46         }
           47         putchar('\n');
           48 }
           49 
           50 static void
           51 user(struct passwd *pw)
           52 {
           53         struct group *gr;
           54         gid_t gid, groups[NGROUPS_MAX];
           55         int ngroups;
           56         int i;
           57 
           58         if (uflag) {
           59                 if (nflag)
           60                         printf("%s\n", pw->pw_name);
           61                 else
           62                         printf("%u\n", pw->pw_uid);
           63                 return;
           64         } else if (gflag) {
           65                 if (nflag) {
           66                         if (!(gr = getgrgid(pw->pw_gid)))
           67                                 eprintf("getgrgid:");
           68                         printf("%s\n", gr->gr_name);
           69                 } else
           70                         printf("%u\n", pw->pw_gid);
           71                 return;
           72         }
           73 
           74         printf("uid=%u(%s)", pw->pw_uid, pw->pw_name);
           75         printf(" gid=%u", pw->pw_gid);
           76         if (!(gr = getgrgid(pw->pw_gid)))
           77                 eprintf("getgrgid:");
           78         printf("(%s)", gr->gr_name);
           79 
           80         ngroups = NGROUPS_MAX;
           81         getgrouplist(pw->pw_name, pw->pw_gid, groups, &ngroups);
           82         for (i = 0; i < ngroups; i++) {
           83                 gid = groups[i];
           84                 printf("%s%u", !i ? " groups=" : ",", gid);
           85                 if (!(gr = getgrgid(gid)))
           86                         eprintf("getgrgid:");
           87                 printf("(%s)", gr->gr_name);
           88         }
           89         putchar('\n');
           90 }
           91 
           92 static void
           93 usernam(const char *nam)
           94 {
           95         struct passwd *pw;
           96 
           97         errno = 0;
           98         pw = getpwnam(nam);
           99         if (!pw) {
          100                 if (errno)
          101                         eprintf("getpwnam %s:", nam);
          102                 else
          103                         eprintf("getpwnam %s: no such user\n", nam);
          104         }
          105         if (Gflag)
          106                 groupid(pw);
          107         else
          108                 user(pw);
          109 }
          110 
          111 static void
          112 userid(uid_t id)
          113 {
          114         struct passwd *pw;
          115 
          116         errno = 0;
          117         pw = getpwuid(id);
          118         if (!pw) {
          119                 if (errno)
          120                         eprintf("getpwuid %d:", id);
          121                 else
          122                         eprintf("getpwuid %d: no such user\n", id);
          123         }
          124         if (Gflag)
          125                 groupid(pw);
          126         else
          127                 user(pw);
          128 }
          129 
          130 static void
          131 usage(void)
          132 {
          133         eprintf("usage: %s [-n] [-g | -u | -G] [user | uid]\n", argv0);
          134 }
          135 
          136 int
          137 main(int argc, char *argv[])
          138 {
          139         ARGBEGIN {
          140         case 'g':
          141                 gflag = 1;
          142                 break;
          143         case 'u':
          144                 uflag = 1;
          145                 break;
          146         case 'G':
          147                 Gflag = 1;
          148                 break;
          149         case 'n':
          150                 nflag = 1;
          151                 break;
          152         default:
          153                 usage();
          154         } ARGEND;
          155 
          156         /* ensure that only one of -g, -u, or -G was specified */
          157         if (gflag + uflag + Gflag > 1)
          158                 usage();
          159 
          160         switch (argc) {
          161         case 0:
          162                 userid(getuid());
          163                 break;
          164         case 1:
          165                 /* user names can't begin [0-9] */
          166                 if (isdigit(argv[0][0]))
          167                         userid(estrtol(argv[0], 0));
          168                 else
          169                         usernam(argv[0]);
          170                 break;
          171         default:
          172                 usage();
          173         }
          174 
          175         return 0;
          176 }