|
|
1.1 ! root 1: /* ! 2: * getuid user group passwd uid gid acct bin gcid home shell ! 3: */ ! 4: #include <stdio.h> ! 5: extern char *user(), *group(), *passwd(), *uid(), *gid(), *acct(), *bin(), *gcid(), *home(), *shell(); ! 6: struct op{ ! 7: char *name; ! 8: char * (*fn)(); ! 9: } op[] = { ! 10: "user", user, /* login id */ ! 11: "group", group, /* group id */ ! 12: "passwd", passwd, /* encrypted password */ ! 13: "uid", uid, /* numerical user id */ ! 14: "gid", gid, /* numerical group id */ ! 15: "acct", acct, /* GCOS account number */ ! 16: "bin", bin, /* GCOS output bin */ ! 17: "gcid", gcid, /* GCOS user id */ ! 18: "home", home, /* home directory */ ! 19: "shell", shell, /* default shell */ ! 20: 0, 0, ! 21: }; ! 22: int tagflag=0; ! 23: char buf[132]; ! 24: main(argc, argv) ! 25: char *argv[]; ! 26: { ! 27: register i; ! 28: if(getpw(getuid(), buf)!=0){ ! 29: fprintf(stderr, "getuid: no line in /etc/passwd for %d\n", getuid()); ! 30: return (1); ! 31: } ! 32: if(argc>1 && argv[1][0]=='-'){ ! 33: tagflag++; ! 34: --argc; argv++; ! 35: } ! 36: if(argc < 2) ! 37: print(0); ! 38: else{ ! 39: if(argc > 2) ! 40: tagflag++; ! 41: for(i=1; i<argc; i++) ! 42: print(lookup(argv[i])); ! 43: } ! 44: return (0); ! 45: } ! 46: lookup(s) ! 47: register char *s; ! 48: { ! 49: register struct op *p; ! 50: for(p=op; p->name; p++) ! 51: if(strcmp(p->name, s)==0) ! 52: return(p-op); ! 53: fprintf(stderr, "getuid: unknown option %s\n", s); ! 54: exit(1); ! 55: } ! 56: print(n) ! 57: register n; ! 58: { ! 59: if(tagflag) ! 60: printf("%s=", op[n].name); ! 61: printf("%s\n", (*op[n].fn)()); ! 62: } ! 63: char * ! 64: field(b, n, delim) ! 65: register char *b; ! 66: register n, delim; ! 67: { ! 68: register char *s, *t; ! 69: static char rbuf[64]; ! 70: s=b; ! 71: rbuf[0]='\0'; ! 72: while(n-- > 0){ ! 73: while(*s!=delim) ! 74: if(*s++ == '\0') ! 75: return(rbuf); ! 76: s++; /* Point past the delim */ ! 77: } ! 78: t=rbuf; ! 79: while(*t = *s++) ! 80: if(*t++ == delim){ ! 81: *--t = '\0'; ! 82: break; ! 83: } ! 84: return(rbuf); ! 85: } ! 86: char * ! 87: whois(uid){ ! 88: static char buf[132]; ! 89: register char *p = buf; ! 90: if(getpw(uid,buf)!=0) ! 91: sprintf(buf, "%d", uid); ! 92: else{ ! 93: while(*p!=':') ! 94: p++; ! 95: *p=0; ! 96: } ! 97: return(buf); ! 98: } ! 99: char * ! 100: user(){ ! 101: return(field(buf, 0, ':')); ! 102: } ! 103: char * ! 104: passwd(){ ! 105: return(field(buf, 1, ':')); ! 106: } ! 107: char * ! 108: uid(){ ! 109: return(field(buf, 2, ':')); ! 110: } ! 111: char * ! 112: gid(){ ! 113: return(field(buf, 3, ':')); ! 114: } ! 115: char * ! 116: group(){ ! 117: # include <grp.h> ! 118: struct group *getgrgid(); ! 119: register struct group *g; ! 120: g=getgrgid(atoi(field(buf, 3, ':'))); ! 121: return(g? g->gr_name : field(buf, 3, ':')); ! 122: } ! 123: char * ! 124: acct(){ ! 125: char sbuf[64]; ! 126: strcpy(sbuf, field(buf, 4, ':')); ! 127: return(field(sbuf, 0, ',')); ! 128: } ! 129: char * ! 130: bin(){ ! 131: char sbuf[64]; ! 132: strcpy(sbuf, field(buf, 4, ':')); ! 133: return(field(sbuf, 1, ',')); ! 134: } ! 135: char * ! 136: gcid(){ ! 137: char *c, sbuf[64]; ! 138: strcpy(sbuf, field(buf, 4, ':')); ! 139: if (*(c = field(sbuf, 2, ',')) == '\0') { ! 140: return(field(buf, 0, ':')); ! 141: } ! 142: else { ! 143: return(c); ! 144: } ! 145: } ! 146: char * ! 147: home(){ ! 148: return(field(buf, 5, ':')); ! 149: } ! 150: char * ! 151: shell(){ ! 152: return(field(buf, 6, ':')); ! 153: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.