AUSAM/source/S/pv.c
/*
* pv - list the perversities of all the users (foul)
*
*
* pv [-wdsoupaniclxrTt] [passwdfile] [lowuid [..hiuid]]
* w: who --> give first name last name
* d: give initial directory path
* s: give initial shell
* o: give other info
* u: gives uid
* p: gives encrypted password
* a: == wdsup
* n: print number of users
* i: people without passwords and initial shells
* c: classes
* l: give a list of all his/hers files (login directory only)
* r: with the lflag gives a recursive look at the directories
* x: people without passwords
* t: users terminal groups
* T: print usage times
*
* Written Bryan David Palmer,
* Inspired by Peter (-wdsourpanicltTx) Ivanov
* P.S: don't blame me for it -- BDP fix
*/
#include <local-system>
#include <passwd.h>
#include <class.h>
struct pwent pe;
char buf[SSIZ];
#include <stat16.h>
struct statbuf se;
int wflag,
sflag,
dflag,
oflag,
pflag,
uflag,
xflag,
tflag,
iflag,
lflag,
nflag,
rflag,
Tflag,
cflag;
char initsh[] "/usr/logins/initsh";
compar(s1,s2)
register char *s1, *s2;
{
while((*s1++ == *s2++) && (s1[-1]));
return(*--s1-*--s2);
}
struct dirbuf
{
int dd_inode;
char dd_name[14];
}dirbuf;
#define IFMT 060000
#define DIR 0100000
#define CHR 020000
#define BLK 040000
#define ISARG 01000
#define LARGE 010000
#define STXT 010000
#define SUID 04000
#define SLOK 02000
#define ROWN 0400
#define WOWN 0200
#define XOWN 0100
#define AUTOLOK 010
#define ROTH 04
#define WOTH 02
#define XOTH 01
#define RSTXT 01000
#define MAXDIRSZ 1000
char direct[MAXDIRSZ][14];
long tell();
char *ctime();
lscomp(s1,s2)
register char *s1, *s2;
{
register len;
len = 14;
while((*s1++ == *s2++) && (--len));
return(*--s1-*--s2);
}
printtimes(conect, cpu)
long conect, cpu;
{
char wundabuf[8]; /* all is revealed */
char eveni_wunda[8]; /* see wot i mean */
printf("Connect time: %s\tCpu time: %s",
ptime(conect, wundabuf),
ptime(cpu/60, eveni_wunda));
}
printfiles(directory,indent)
register char *directory;
{
int fd;
long place;
register int i, j;
char *tm;
if((chdir(directory)) == -1)
{
printf("%s: cannot chdir\n",directory);
return(1);
}
if((fd = open("",0)) == -1)
{
printf("%s: can't open\n",directory);
return(0);
}
i = 0;
while((read(fd,&dirbuf,16) == 16) && (i < MAXDIRSZ))
{
if(dirbuf.dd_inode)
{
for(j = 0; j < 14; j++)
direct[i][j] = dirbuf.dd_name[j];
i++;
}
}
qsort(direct,i,14,lscomp);
for(j = 0; j < i; j++)
{
if(newstat(direct[j],&se) != -1)
{
if((se.sb_flags & IFTYP) == IFDIR)
putchar('d');
else if(se.sb_flags & CHR)
putchar('c');
else if(se.sb_flags & BLK)
putchar('b');
else
putchar('-');
if(se.sb_flags & ROWN)
putchar('r');
else
putchar('-');
if(se.sb_flags & WOWN)
putchar('w');
else
putchar('-');
if(se.sb_flags & SUID)
putchar('s');
else if(se.sb_flags & XOWN)
putchar('x');
else
putchar('-');
printf("---");
if(se.sb_flags & ROTH)
putchar('r');
else
putchar('-');
if(se.sb_flags & WOTH)
putchar('w');
else
putchar('-');
if(se.sb_flags & XOTH)
putchar('x');
else
putchar('-');
if(se.sb_flags & RSTXT)
putchar('T');
else if((se.sb_flags & AUTOLOK) && (se.sb_flags & SLOK))
putchar('A');
else if(se.sb_flags & SLOK)
putchar('L');
else putchar(' ');
tm = ctime(se.sb_modtime);
tm[24] = 0;
printf(" %3d %4d\t%s\t %s %14s\n",
se.sb_nlinks, se.sb_uid
,locv(se.sb_size0, se.sb_size1)
,tm,direct[j]);
}
}
if(rflag)
{
seek(fd,32,0); /* seek past '.' and '..' */
while(read(fd,&dirbuf,16) == 16)
{
if(dirbuf.dd_inode)
{
newstat(dirbuf.dd_name,&se);
if(IFDIR & se.sb_flags)
{
place = tell(fd);
close(fd);
printf("./");
for(i = 0; i < indent; i++)
putchar('/');
printf("%s:\n",dirbuf.dd_name);
if(printfiles(dirbuf.dd_name,indent+1) != 1)
chdir("..");
fd = open("",0);
lseek(fd,place,0);
}
}
}
}
close(fd);
}
printclasses() /* FLOGGED CODE from 'pp.c' */
{
register i,j,k;
printf("\nClasses:");
j = k = 0;
for(i = 0; i < CMASKSIZE*16; i++)
{
if( pe.pw_cmask[classes[i].c_word] & classes[i].c_mask)
{
if(j == 0 && k != 0)
putchar('\t');
k++;
printf("%10s", classes[i].c_name);
if( ++j == 7)
{
j = 0;
putchar('\n');
}
}
}
if(k == 0)
printf(" None\n");
else if(j != 0)
putchar('\n');
}
printterms(u) /* more code from pp */
register unsigned u;
{
register i;
printf("\nTerminals: ");
if(u == 0)
printf("None\n");
else if(u == -1)
printf("Any\n");
else
{
for(i = 0; i < 16; i++)
{
if(u&01)
putchar('a'+i);
u =>> 1;
}
putchar('\n');
}
}
extern fout;
main(argc,argv)
char **argv;
{
register int uid;
char *s;
register struct pwent *pee;
int louid, hiuid, count;
fout = dup(1);
while((argc >= 2) && (*argv[1] == '-'))
{
s = *++argv;
argc--;
while(*++s)
{
switch(*s)
{
case 's' : sflag++;
break;
case 'w' : wflag++;
break;
case 'T' : Tflag++;
break;
case 'd' : dflag++;
break;
case 'o' : oflag++;
break;
case 'p' : pflag++;
break;
case 'n' : nflag++;
break;
case 'u' : uflag++;
break;
case 'r' : rflag++;
break;
case 'x' : xflag++;
break;
case 'c' : cflag++;
break;
case 'a' : wflag++;
dflag++;
sflag++;
uflag++;
pflag++;
break;
case 'i' : iflag++;
xflag++;
break;
case 't' : tflag++;
break;
case 'l' : lflag++;
break;
default : printf("pv [-wdsourpaniclxtT] [optpwfile] [louid[..hiuid]]\n");
flush();
exit(1);
}
}
}
pee = &pe;
louid = 0;
hiuid = PWTABSIZE;
/* see if a new password file is needed */
if((argc >= 2) && ((argv[1][0] < '0') || (argv[1][0] > '9')))
{
argc--, argv++;
pwfile(*argv);
}
if(argc == 2) /* assume a subrange was entred */
{
s = argv[1];
louid = atoi(s);
while((*s >= '0') && (*s <= '9')) s++;
if(*s)
{
while(*s++ == '.');
if(*--s)
hiuid = atoi(s);
}
else hiuid = louid;
}
count = 0;
for(uid = louid; uid <= hiuid; uid++)
{
pee->pw_uid = uid;
if((getpwlog(pee,buf,sizeof buf)) != -1)
{
if(nflag)
{
count++;
goto sloop; /*WELL*/
}
if((xflag) && (*pee->pw_pword))
goto sloop; /*YUK*/
if((iflag) && (compar(initsh,pee->pw_strings[SHELLPATH]) == 0))
goto sloop; /*GROTTY*/
printf("%s",pee->pw_strings[LNAME]);
if(uflag)
printf(":%d",pee->pw_uid);
if(pflag)
{
putchar(':');
if(pee->pw_pword[0])
printf("%8.8s",pee->pw_pword);
else
printf(" ");
}
if(wflag)
printf(":%s %s",pee->pw_strings[FIRSTNAME]
,pee->pw_strings[LASTNAME]);
if(sflag)
printf(":%s",pee->pw_strings[SHELLPATH]);
if(dflag)
printf(":%s",pee->pw_strings[DIRPATH]);
if(cflag)
printclasses();
if(tflag)
printterms(pee->pw_tmask);
if(oflag)
{
printf("\nOther:\n");
printf("\n%s\n",pee->pw_strings[OTHER]);
}
if(lflag)
{
printf("\nFiles:\n");
printfiles(pee->pw_strings[DIRPATH],0);
}
if(Tflag)
printtimes(pee->pw_contime, pee->pw_cputime);
putchar('\n');
sloop:;
}
}
if(nflag)
printf("%d\n",count);
flush();
exit(0);
}