V10/cmd/getuid.c
/*
* getuid user group passwd uid gid acct bin gcid home shell
*/
#include <stdio.h>
extern char *user(), *group(), *passwd(), *uid(), *gid(), *acct(), *bin(), *gcid(), *home(), *shell();
struct op{
char *name;
char * (*fn)();
} op[] = {
"user", user, /* login id */
"group", group, /* group id */
"passwd", passwd, /* encrypted password */
"uid", uid, /* numerical user id */
"gid", gid, /* numerical group id */
"acct", acct, /* GCOS account number */
"bin", bin, /* GCOS output bin */
"gcid", gcid, /* GCOS user id */
"home", home, /* home directory */
"shell", shell, /* default shell */
0, 0,
};
int tagflag=0;
char buf[132];
main(argc, argv)
char *argv[];
{
register i;
if(getpw(getuid(), buf)!=0){
fprintf(stderr, "getuid: no line in /etc/passwd for %d\n", getuid());
return (1);
}
if(argc>1 && argv[1][0]=='-'){
tagflag++;
--argc; argv++;
}
if(argc < 2)
print(0);
else{
if(argc > 2)
tagflag++;
for(i=1; i<argc; i++)
print(lookup(argv[i]));
}
return (0);
}
lookup(s)
register char *s;
{
register struct op *p;
for(p=op; p->name; p++)
if(strcmp(p->name, s)==0)
return(p-op);
fprintf(stderr, "getuid: unknown option %s\n", s);
exit(1);
}
print(n)
register n;
{
if(tagflag)
printf("%s=", op[n].name);
printf("%s\n", (*op[n].fn)());
}
char *
field(b, n, delim)
register char *b;
register n, delim;
{
register char *s, *t;
static char rbuf[64];
s=b;
rbuf[0]='\0';
while(n-- > 0){
while(*s!=delim)
if(*s++ == '\0')
return(rbuf);
s++; /* Point past the delim */
}
t=rbuf;
while(*t = *s++)
if(*t++ == delim){
*--t = '\0';
break;
}
return(rbuf);
}
char *
whois(uid){
static char buf[132];
register char *p = buf;
if(getpw(uid,buf)!=0)
sprintf(buf, "%d", uid);
else{
while(*p!=':')
p++;
*p=0;
}
return(buf);
}
char *
user(){
return(field(buf, 0, ':'));
}
char *
passwd(){
return(field(buf, 1, ':'));
}
char *
uid(){
return(field(buf, 2, ':'));
}
char *
gid(){
return(field(buf, 3, ':'));
}
char *
group(){
# include <grp.h>
struct group *getgrgid();
register struct group *g;
g=getgrgid(atoi(field(buf, 3, ':')));
return(g? g->gr_name : field(buf, 3, ':'));
}
char *
acct(){
char sbuf[64];
strcpy(sbuf, field(buf, 4, ':'));
return(field(sbuf, 0, ','));
}
char *
bin(){
char sbuf[64];
strcpy(sbuf, field(buf, 4, ':'));
return(field(sbuf, 1, ','));
}
char *
gcid(){
char *c, sbuf[64];
strcpy(sbuf, field(buf, 4, ':'));
if (*(c = field(sbuf, 2, ',')) == '\0') {
return(field(buf, 0, ':'));
}
else {
return(c);
}
}
char *
home(){
return(field(buf, 5, ':'));
}
char *
shell(){
return(field(buf, 6, ':'));
}