/*
 * This no worky on sysy fivey...  Someone (who cares) should fix it, but
 * not me.. JB
 */
#define USR 180
#define QLEN 200
#define QUEDIR "/usr/rje/sque"
#define PFILE "/usr/rje/sque/pfile"
#define QUELOG	"log"
#include <sys/types.h>
#include <sys/stat.h>

struct stat statb;
char *sh, *p2;
char buf[QLEN+4], *ddv;
int ds;
int siz,sb[18];
char fspce[2];
int tout;
int i,j,k;

int cont();


struct qdat {
	char *jnb;	/*job number*/
	char *jnm;	/*job name*/
	char *pnm;	/*programmer name*/
	char *fnm;	/*file name to execl*/
	char *shf;	/*full path to execl*/
	char *dir;	/*directory of execl file*/
	char *unm;	/*login name from usr=*/
	char *qfl;	/*standard input file*/
	char sbf[250];
}

main(argc,argv) int argc; 
char **argv;
{

	struct qdat q;
	register char *p, *p1;
	register int pse;
	char c;

	signal(1,1);
	signal(2,1);
	if (fork()==0) {
		if (argc > 1) {
			++argv;
			p = *argv;
			pse = 0;
			while(((c = *p++) >= '0') && (c <= '9')) {
				pse =* 10;
				pse =+ c - '0';
			}
		}
		else
			pse = 180;
		if (pse < 15)
			pse = 15;
		buf[0] = buf[1] = ':';
		i = getpid();
		j = dup(1); 
		k = creat(PFILE,0644); 
		close(1); 
		dup(k);
		printf("%d\n",i);
		close(1); 
		dup(j); 
		close(j); 
		close(k);
		chdir(QUEDIR);
		signal(14,cont);
		for(;;) {
			if ((ds = open(QUELOG,2)) < 0) {
				alarm(300);
				pause();
				continue;
			}
			else break;
		}
		for(;;) {
			while(read(ds,&buf[2],QLEN) > 0) {
				if (buf[2] != '/') continue;
				p = &buf[2];
				p1 = q.shf = q.sbf;
				while ((*p1++ = *p++) != ':');
				p1[-1] = '\0';
				sh = p1; 
				q.fnm = p1;
				while(*--sh != '/');
				p2 = sh;
				sh++;
				while(*p1++ = *sh++);
				q.dir = p1;
				sh = q.shf;
				do
				    *p1++ = *sh;
				while(sh++ != p2);
				*p1++ = '\0';
				q.qfl = p1;
				while ((*p1++ = *p++) != ':');
				p1[-1] = '\0';
				q.jnm = p1;
				while((*p1++ = *p++) != ':');
				if (*q.jnm == ':')
					p1++;
				p1[-1] = '\0';
				q.pnm = p1;
				while((*p1++ = *p++) != ':');
				if (*q.pnm == ':')
					p1++;
				p1[-1] = '\0';
				q.jnb = p1;
				while((*p1++ = *p++) != ':');
				if (*q.jnb == ':')
					p1++;
				p1[-1] = '\0';
				q.unm = p1;
				while((*p1++ = *p++) != ':');
				if (*q.unm == ':')
					p1++;
				p1[-1] = '\0';
				buf[QLEN-1] = '\n';
				close(0);
				if (open(q.qfl,0) != 0) {
					lseek(ds,(long)(-QLEN),1);
					write(ds,buf,QLEN);
					continue;
				}
				unlink(q.qfl);
				if (fork() == 0) {
					if (stat(q.shf,&statb) < 0)
						exit(1);
					close(1);
					if (open("/dev/null",1) != 1)
						exit(1);
					close(2);
					dup(1);
					ddv = statb.st_dev;
					siz = (statb.st_size + 511) >> 9;
					if (fsfree(ddv,sb) >= 0)
						if (sb[0] <(siz+1200) || sb[1]<50)
							fspce[0] = '1';
					else
					    fspce[0] = '0';
					setuid(USR);
					chdir(q.dir);
					execl(q.shf,q.fnm,fspce,q.jnm,q.pnm,q.jnb,q.unm,0);
					execl("/bin/sh","sh",q.shf,fspce,q.jnm,q.pnm,q.jnb,q.unm,0);
					exit(1);
				}
				lseek(ds,(long)(-QLEN),1);
				write(ds,buf,QLEN);
				alarm(pse);
				while(wait(0) > 0);
				tout = alarm(0);
				if (tout > 10) {
					alarm(tout);
					pause();
				}
			}
			alarm(pse);
			pause();
		}
	}
}
cont() {
	signal(14,cont);
}
