AUSAM/source/S/lpq.c

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

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

struct dirent
{
	unsigned d_inum;
	char d_name[14];
};
struct lpdrec
{
	char l_cntrl;
	char l_data[39];
};

struct dirent *dtab;
struct statbuf sb;
struct pwent pe;
struct lpdrec *p;
struct lpdrec *df;
char *lpd "/tmp/lpd/x";
#define lpdnum lpd[9]
char *banner,*origin,*mesg,*time,buf[SSIZ];
char *tmp,rflg,aflg,fd,ncpy,bflg,
     nxtch '\n';
int lcount,uid,size,iown,nred,maxdf;
#define MAXCF 20	/* max number of "cf" files that I can digest from one
			 * "df" file	*/
char *cfbuf[MAXCF];
int  ncfs;
comp(a,b)
	struct dirent *a,*b;
{
	char c;
	int ret;

	ret=0;
	if(a->d_inum && b->d_inum)
	{
		c=0;
		while(c<14 && !(ret=a->d_name[c] - b->d_name[c]))
			c++;
	}
	else
		ret=b->d_inum - a->d_inum;
	return(ret);
}

main(argc,argv)
	int argc;
	char **argv;
{
	extern fout,exit();
	char *arg;
	int i;

	fout=dup(1);
	uid=getreal();
	while(argc>1 && (arg=argv[1])[0]=='-')
	{
		while(*++arg)
			switch(*arg)
			{
			case '0':
				break;
			case '1':
			case '2':
			case '3':
				lpdnum= *arg;
				break;
			default:
				prints(2,"Bad Argument\n");
				exit(-1);
			case 'a':
				aflg++;
				break;
			case 'r':
				rflg++;
			}
		argv++;
		argc--;
	}
	signal(3,exit);		/* dont want cores in lpd directory */
	if(chdir(lpd)== -1)
	{
		prints(2,lpd);
		prints(2,": Can't chdir\n");
		exit(-1);
	}
	newstat("",&sb);
	if((fd=open("",0))== -1 || seek(fd,32,0)== -1 ||
		(tmp=sbrk(sb.sb_size1=- 32))== -1 ||
		read(fd,tmp,sb.sb_size1)!=sb.sb_size1)
	{
		prints(2,". unreadable\n");
		exit(-1);
	}
	dtab=tmp;
	qsort(dtab,sb.sb_size1/sizeof *dtab,sizeof *dtab,comp);
	tmp=+sb.sb_size1;
	for(lcount=0;&dtab[lcount]<tmp && dtab[lcount].d_inum;lcount++);
	df= &dtab[lcount];
	maxdf=(df-tmp)-((df-tmp)%sizeof *df);
	for(i=0;i<lcount;i++)
		process(i);
	if(!(iown || aflg))
		printf("No jobs found\n");
	fout=0;
	flush();
	if(rflg)
	{
		while(iown && (rflg=input()))
			if(rflg!=',' && rflg!='\n')
			{
				while((nxtch=getchar())!='\n');
				prints(2,"Syntax\n");
			}
	}
}

process(n)
{

	getdf(dtab[n].d_name);
	if(pe.pw_uid==uid || !uid)
		iown++;
	if(aflg || pe.pw_uid==uid)
	{
		if(!bflg)
		{
			printf("     Date Time     Owner     Banner   Size Origin  tty  Message\n");
			bflg++;
		}
		time=ctime(sb.sb_modtime);
		time[16]=0;
		if(getpwlog(&pe,buf,sizeof buf)== -1)
			pe.pw_strings[LNAME]="";
		printf("%3d%11s%11s%11s%5d%8s",n,time+8,pe.pw_strings[LNAME],banner,size*ncpy,origin);
		if(mesg)
			printf("  tty%c %s",*mesg,mesg+1);
		putchar('\n');
	}
}

mint(p)
	struct lpdrec *p;
{

	return((p->l_data[1]<<8) + (*p->l_data & 0377));
}

input()
{
	int top,bot;

	if(nxtch=='\n')
		printf("Delete: ");
	bot=top=readnum();
	if(nxtch=='-')
		bot=readnum();
	if(nxtch)
		if(0<=top && bot<lcount)
			for(;top<=bot;top++)
				delete(top);
		else
			prints(2,"Line number?\n");
	return(nxtch);
}

readnum()
{
	int i;
	char cr;

	i=cr=0;
	while((nxtch=getchar())==' ');
	while(nxtch<='9' && '0'<=nxtch)
	{
		i=i*10+nxtch-'0';
		nxtch=getchar();
		cr++;
	}
	while(nxtch==' ')
		nxtch=getchar();
	if(!cr)
		i= -1;
	return(i);
}

delete(n)
{
	getdf(dtab[n].d_name);
	if(pe.pw_uid==uid || !uid)
	{
		iown--;
		unlink(dtab[n].d_name);
		while(ncfs)
			unlink(cfbuf[--ncfs]);
	}
	else
		printf("%d Permission Denied\n",n);
}
getdf(name)
	char *name;
{
	char *t;
	int i;

	banner="";
	origin=0;
	ncfs=mesg=size=0;
	t=pe.pw_uid= -1;
	ncpy=1;

	if(newstat(name,&sb)!=-1 && sb.sb_size1>maxdf)
	{
		if( sb.sb_size0 || sb.sb_size1 & 0100000 || (t=sbrk(sb.sb_size1-maxdf))==-1)
		{
			prints(2,"Out of core\n");
			exit(-1);
		}
		maxdf=sb.sb_size1;
	}
	fd=open(name,0);
	nred=read(fd,df,maxdf)/sizeof *df;
	close(fd);
	if(nred*sizeof *df == sb.sb_size1)
		for(i=0;i<nred;i++)
		{
			p= &df[i];
			switch(p->l_cntrl | 040)
			{
			case '*':
				origin="cyber";
				banner=p->l_data;
				break;
			case 'l':
				banner= p->l_data;
				break;
			case 'u':
				if(ncfs<(MAXCF-1))
					cfbuf[ncfs++]=p->l_data;
				break;
			case 'i':
				pe.pw_uid=mint(p);
				break;
			case 's':
				size=mint(p);
				break;
			case 'b':
				origin="batch";
				banner=p->l_data;
				break;
			case 'm':
				mesg= p->l_data;
				break;
			case 'n':
				ncpy= *p->l_data-'0';
			}
		}
	if (pe.pw_uid == -1)
		origin = "NULL";
	else
		if (origin == 0) origin = "unix";
}