PWB1/sys/source/rje/hasp/shqer.c
#define USR 180
#define QLEN 200
#define QUEDIR "/usr/rje/sque"
#define PFILE "/usr/rje/sque/pfile"
#define QUELOG "log"
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) {
seek(ds,-QLEN,1);
write(ds,buf,QLEN);
continue;
}
unlink(q.qfl);
if (fork() == 0) {
if (stat(q.shf,sb) < 0)
exit(1);
close(1);
if (open("/dev/null",1) != 1)
exit(1);
close(2);
dup(1);
ddv = sb[0];
siz = (077600&(sb[4]>>1))+(0177&(sb[5]>>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);
}
seek(ds,-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);
}