PWB1/sys/source/s2/vp.c
# include "stdio.h"
# include "macros.h"
# include "fatal.h"
# define QSIZE 32
# define DOWN "The printer has been down since %s"
# define FULL "The printer queue is temporarily full.\n"
# define NOMORE "No new jobs will be accepted until the queue gets smaller.\n"
# define CONTACT "Contact UNIX operations to get the printer running again.\n"
char *tspec "--";
char *bin "r711";
char *rm;
int offset 8;
int notify;
int reform 1;
char dir[64];
int down;
char *qfile;
main(argc,argv)
int argc;
char *argv[];
{
register int i;
register char *ldir;
int j, count;
struct statb sb;
struct {
int ino;
char entry[14];
} direct;
char *tmpfile, *name;
FILE *iop;
Ffile = "vp";
Fflags = FTLMSG | FTLEXIT;
for(i=1; i<argc && argv[i][0]=='-'; i++)
switch(argv[i][1]) {
case 't':
tspec = &argv[i][2];
continue;
case 'b':
bin = &argv[i][2];
continue;
case 'n':
notify++;
continue;
case 'R':
reform = 0;
continue;
case 'o':
offset = patoi(&argv[i][2]);
continue;
case 'r':
rm = &argv[i][2];
continue;
default:
fatal("unknown key letter (69)");
}
if (stat("/usr/vpd/.error",&sb) == 0) {
printf(DOWN,ctime(&sb.i_mtime));
down = 1;
}
j = xopen("/usr/vpd",0);
count = 0;
while (read(j, &direct, 16) == 16)
if (direct.ino && ++count > QSIZE)
break;
close(j);
if ((count >= QSIZE || down) && rm)
unlink(rm);
if (count >= QSIZE) {
printf(FULL);
printf(NOMORE);
if (down)
printf(CONTACT);
execl("/etc/vpd","vpd",0);
exit(1);
}
if (i==argc) fatal("nothing to do!");
name = logname();
ldir = logdir();
tmpfile = mktemp("/usr/vpd/tfXXXXX");
qfile = mktemp("/usr/vpd/qfXXXXX");
setsig();
iop = xfcreat(tmpfile,0444);
fprintf(iop,": %s\n", name);
curdir(dir);
fprintf(iop,"vpbrk %s %s %s\n",bin,name,qfile);
fprintf(iop,"chdir %s\n",dir);
if ((j=open(stringf("%s/.path",ldir),0))>=0) {
close(j);
fprintf(iop,"= p <%s/.path\n",ldir);
}
else
fprintf(iop,"= p /bin:/usr/bin:\n");
for (; i<argc; i++)
fprintf(iop,"%s ",argv[i]);
fprintf(iop,"</dev/null ");
if (reform) {
fprintf(iop,"^ reform %s -0 ", tspec);
if (offset>0)
fprintf(iop,"+p%d ", offset);
if (100 - offset)
fprintf(iop, "+t%d ", 100 - offset);
}
putc('\n', iop);
if (rm)
fprintf(iop,"rm -f %s\n",rm);
fprintf(iop,"cat /usr/vpd/.X %s\n",qfile);
fprintf(iop,"echo \"\\n\\n$0 $0 $0 $0 $0 $0 $0 $0\\n\\n\"\n");
fprintf(iop,"date&\n");
fprintf(iop,"wait\n");
if (notify) {
fprintf(iop,"echo %s finished ^ write %s >/dev/null\n",qfile,name);
fprintf(iop,"if 0$r -ne 0 then\n");
fprintf(iop,"echo %s finished ^ mail %s >/dev/null\n",qfile,name);
fprintf(iop,"endif\n");
}
fprintf(iop,"wait\n");
fprintf(iop,"exit 0\n");
fclose(iop);
link(tmpfile, qfile);
unlink(tmpfile);
fprintf(stderr, "Queued as %s\n",qfile);
execl("/etc/vpd","vpd",0);
unlink(qfile);
fatal("can't exec /etc/vpd");
}
clean_up()
{
unlink(qfile);
}