AUSAM/source/S/pp.c

Compare this file to the similar file:
Show the results in this format:

/*
 *	A program to print the contents of a users password entry
 *	and his limits structure from core and his TDU figure
 *
 *	Peter  Ivanov 1978.
 *	and again July 1979 for alternate passwd file.
 */ 

#include	<local-system>
#include	<passwd.h>
#include	<lnode.h>

/*
 *	some defines to configure certain things
 *	THAT IS select that which is to be printed !!
 */ 

/* no scheduling info
#define	SCHEDULE	/* for sched params */ 
/*	no CORE
#define	CORE		/* for core limits */ 
/*	no CORE_DUSAGE
#define	CORE_DUSAGE	/* if disk usage maintained in core */ 
/*	no CLASSNAMES
#define	CLASSNAMES	/* if the cmask bits are really meaningful */

#define	PAGE		/* for page limits */

struct
{
	int hiword;
	unsigned loword;
};
struct	pwent	pe;
struct	lnode	ln;
char		tbuf[8];
char		*buf;
int		bufs;
int		uflag;
char		*pflag;
int		lflag;

char		*numbers[4]
{
	"No", "One", "Two", "Three"
};
/*
 **	MAIN
 */ 

main(argc, argv)
register int argc;
register char **argv;
{
	register char *s;
	extern int fout;

	fout = dup(1);
	buf = -1;
	while((argc >= 2) && (*argv[1] == '-'))
	{
		s = *++argv;
		argc--;
		while(*++s)
		{
			switch(*s)
			{
			case 'u':
				uflag++;
				break;
			case 'p':
				pflag = ++s;
				while(*s)
					s++;
				--s;
				pwfile(pflag);
				break;
			default:
				printf("Usage: pp [-pfile] [lnames|-u uids]\n");
				return 1;
			}
		}
	}
	if(argc > 1)
	{
		argc--;
		argv++;
		/* some specific requests */ 
		while(argc-- > 0)
		{
			printu(*argv++);
		}
	}
	else
	{
		if(getlogin(getreal()))
			pent();
	}
}

/*
 **	Print user details
 */ 

pent()
{
	extern long time();

	printf("Login name: %11s%35tUid: %18u\n\n", pe.pw_strings[LNAME], pe.pw_uid);
#ifdef	CORE
	if(!lflag)
	{
		printf("Core Limit:%11u KBytes%35tCore Usage:%11u KBytes\n", ln.l_climit, ln.l_cusage);
	}
#endif
	printf("Disk Limit:%12u%35tProcess Limit:%9u\n", ln.l_dlimit, ln.l_plimit);
	printf("Disk Overshoot:%8u%35tProcesses:%13u\n", ln.l_doverflw, ln.l_refcount);
	printf("Disk Usage:");
	if(ln.l_duse == -1)
		printf("%12s", "???");
	else
		printf("%12u", ln.l_duse);
#ifdef	PAGE
	printf("%35tPrinter Units:%9u\n", pe.pw_pages);
#else
	printf("\n");
#endif
#ifdef TERMBOOK
	printf("Booking Units:%9u%35tBooking Rate:%10u\n", pe.pw_tblim&0377, pe.pw_tbrate&0377);
#endif TERMBOOK
#ifdef	SCHEDULE
	printf("Shares:%16u%35tUsage:%16D\n", ln.l_shares, ln.l_usage);
#endif
	printf("\nTime Connected: %s", ptime(pe.pw_contime, tbuf));
	printf("%35tEncrypted Password: \"%8.8s\"\n", pe.pw_pword);
	printf("Total CPU Time: %s", ptime(pe.pw_cputime/60, tbuf));
	printf("%35t%s Warning%s\n", pe.pw_warn <= 3 ? numbers[pe.pw_warn] : "Many", pe.pw_warn == 1 ? "" : "s");
	if(pe.pw_extime)
	{
		register char *p;

		printf("Last used: ");
		p = ctime(pe.pw_extime);
		if(pe.pw_extime < time() - 1555200l)
			printf("%12.12s %4.4s", p+4, p+20);
		else
			printf("%16.16s", p);
	}
	else
		printf("Account has not been used.");
	printtrm(pe.pw_tmask);
#ifdef	CLASSNAMES
	printclasses();
#endif	CLASSNAMES
	printf("\nDirectory: %s\n", pe.pw_strings[DIRPATH]);
	if(*pe.pw_strings[SHELLPATH] != 0)
	{
		printf("Initial shell: %s\n", pe.pw_strings[SHELLPATH]);
	}
	printf("Names:\t%s %s\n", pe.pw_strings[FIRSTNAME], pe.pw_strings[LASTNAME]);
	if(*(pe.pw_strings[OTHER]))
	{
		printf("Other:");
		printother(pe.pw_strings[OTHER]);
	}

	/*	check out to warn him to login again	*/ 

	if((!lflag) && ((ln.l_dlimit != pe.pw_dlimit) || (ln.l_plimit != pe.pw_plimit) || ((ln.l_flags&DLIMIT) && (ln.
		l_duse < ln.l_dlimit))))
	{
		printf("Logout and Login again to reset limits\n");
	}
	flush();
}

/*
 **	Get the relevant entries from passwords and lnodes
 */ 

printu(p)
register unsigned p;
{
	if(uflag)
	{
		/* have asked to treat arg as uid */ 
		if(getlogin(atoi(p)))
			pent();
		if(buf != -1)
		{
			free(buf);
			buf = -1;
		}
	}
	else
	{
		/* have an arg to try as login name */ 
		if(getuserid(p))
			pent();
		if(buf != -1)
		{
			free(buf);
			buf = -1;
		}
	}
}

printtrm(u)
register unsigned u;
{
	register i;

	if(u == 0)
		printf("%35tAccount may not use any terminal\n");
	else if(u == -1)
		printf("%35tAccount may use any terminal\n");
	else
	{
		printf("%35tValid terminal groups: ");
		for(i = 0; i < 16; i++)
		{
			if(u&01)
				putchar('a'+i);
			u =>> 1;
		}
		putchar('\n');
	}
}

/*
 **	Get login name
 */ 

getlogin(uid)
register unsigned uid;
{
	lflag = 0;
	pe.pw_uid = uid;
	if(getpwlog(&pe, 0, 0) == 0)
	{
		put();
		return(1);
	}
	else
	{
		printf("Uid does not exist !?!\n");
		return(0);
	}
}

/*
 **	Set up user limits and strings
 */ 

put()
{
	ln.l_uid = pe.pw_uid;
	buf = alloc(bufs = sum());
	getpwlog(&pe, buf, bufs);
	if(lflag = (limits(&ln, L_OTHLIM) < 0))
	{
		ln.l_shares = pe.pw_shares;
		ln.l_usage = pe.pw_shares;
		ln.l_dlimit = pe.pw_dlimit;
		ln.l_doverflw = pe.pw_doverflw;
		ln.l_plimit = pe.pw_plimit;
		ln.l_climit = pe.pw_climit;
		ln.l_refcount = 0;
	}
#ifndef	CORE_DUSAGE
	if(pe.pw_dlimit)
		ln.l_duse = tdu(pe.pw_strings[DIRPATH]);
#endif	CORE_DUSAGE
}
/*
 **	Get user user-id
 */ 

getuserid(s)
register char *s;
{
	lflag = 0;
	pe.pw_strings[LNAME] = s;
	if(getpwuid(&pe, 0, 0) == 0)
	{
		put();
		return(1);
	}
	else
	{
		printf("Login name does not exist !?!\n");
		return(0);
	}
}

/*
 **	Add up string lengths for password entry
 */ 

sum()
{
	register int i;
	register int s;

	s = 0;
	for(i = 0; i < PWSLENCNT; i++)
	{
		s =+ pe.pw_strings[i];
	}
	return(s);
}

#ifdef	CLASSNAMES
#include	<class.h>
printclasses()
{
	register i, j, k;

	printf("Classes:");
	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');
}
#endif	CLASSNAMES

printother(s)
register char *s;
{
	register char *r;

	do
	{
		r = s;
		while(*s && *s != '\n')
			s++;
		if(*s != 0)
			*s++ = 0;
		printf("\t%s\n", r);
	}
	while(*s);
}