#include /* LOGIN_NAME_MAX */ #include #include /* fprintf(3) */ #include /* stderr, stdout */ #include #include /* getuid(2), geteuid(2), getopt(3) */ #include "usefulmacros.h" int main(int argc, char *argv[]){ int c; char mode; bool n; char name[LOGIN_NAME_MAX]; bool r; uid_t euid; uid_t uid; NOARGVZERO(argv); mode = 0; n = false; r = false; while((c = getopt(argc, argv, "Gghnru")) != -1) switch(c){ case 'G': case 'g': case 'u': if(mode == 0){ mode = c; break; } /* FALLTHROUGH */ case 'h': default: usage: fprintf(stderr, "Usage: %s [-G]|[-g]|[-u] (-rn) (user)\n", argv[0]); return EX_USAGE; case 'n': n = true; break; case 'r': r = true; break; } switch(mode){ case 0: goto usage; case 'G': case 'g': return EX_SOFTWARE; case 'u': euid = geteuid(); uid = getuid(); if(!n){ if(r || euid != uid) fprintf(stdout, "%u\n", uid); if(!r) fprintf(stdout, "%u\n", euid); }else {} /* Both busybox and GNU coreutils (according to straces) parse passwd(5) * for this. TODO. */ break; default: return EX_SOFTWARE; } return EX_OK; }