Interdata_v6/usr/source/lpd_melb/opq.c
/*
* opq -- interrogation of the spool queue
*
* Written by Kenj McDonell, April 17 1978.
*
*/
char lpd[] "/u/usr/lpd"; /* spool directory */
char jobf[] "/u/usr/lpd/job"; /* active job number file */
char dbuf[16]; /* directory buffer */
int cmdbuf[131]; /* spool command buffer */
char lbuf[64]; /* for spool command lines */
char person[20]; /* login id of spool job submitter */
char submitted[30]; /* date/time spool job submitted */
char realfname[64]; /* real spool job file name */
struct ibuf {
int idev;
int inum;
int iflags;
char inl;
char iuid;
char igid;
char isize0;
int isize;
int iaddr[8];
char *iatime[2];
char *imtime[2];
int filler; /***/
};
int active; /* active job number */
int job; /* report job number */
int copies; /* number of copies per spool file */
int lflag; /* long report format */
int sflag; /* spool file names */
int aflag; /* all jobs */
main(argc, argv)
int argc;
char *argv[];
{
char *arg;
int f; /* file descriptor */
int found; /* no. jobs located */
int i;
int fd; /* spool directory file descriptor */
int format; /* report format flag */
/* open the directory */
if ((fd = open(lpd, 0)) == -1) {
/* woops */
printf ("Cannot open %s\n", lpd);
exit(1);
}
/* move to the spool directory */
if (chdir(lpd) < 0) exit(1);
/* locate the active job, if any */
if ((f = open(jobf, 0)) != -1) {
read(f, dbuf, 6);
close(f);
active = atoi(dbuf);
}
/* set up report flags */
while (argc > 1 && (arg = argv[1])[0] == '-') {
for (i = 1; arg[i] != '\0'; i++)
switch (arg[i]) {
/* long format */
case 'l':
lflag = 1;
break;
/* list all jobs */
case 'a':
aflag = 1;
break;
/* list spool file names */
case 's':
sflag = 1;
break;
/* bad option */
default:
printf("Bad option: %s\n", argv[1]);
exit(1);
}
argc--;
argv++;
}
/* examine each entry in turn, looking for spool command files */
while (read(fd, dbuf, 16) == 16)
if (dbuf[0] | dbuf[1] != 0 && dbuf[2] == 'd' && dbuf[3] == 'f') {
/* found a command file */
found++;
job = atoi(&dbuf[5]);
if (argc == 1) {
/* no job numbers specified */
report();
continue;
}
for (i = 1; i < argc; i++) {
/* test each argument for equality */
if (job == atoi(argv[i])) {
report();
continue;
}
}
}
/* check for line printer not all there ... */
if (active == 0 && found > 0) printf("Line printer off-line?\n");
}
report()
{
int fd;
char c;
int flag;
struct ibuf statb;
if (fopen(&dbuf[2], cmdbuf) < 0) {
/* woops .. cannot access spool commands file */
printf("Cannot open %s\n", &dbuf[2]);
return;
}
/* check owner of commands file */
if (!aflag) {
stat(&dbuf[2], &statb);
if (statb.iuid != getuid()) return;
}
flag = 1;
copies = 1;
submitted[0] = '\0';
realfname[0] = '\0';
person[0] = '\0';
/* loop round here extracting commands */
for (;;) {
switch (c = getc(cmdbuf)) {
/* print a file */
case 'F':
getline(lbuf);
if (flag) {
flag = 0;
printf("%6d", job);
if (job == active) printf("*");
else printf(" ");
if (lflag) {
printf(" %s", person);
submitted[16] = '\0';
printf("\t%s", &submitted[4]);
}
}
else if (lflag || sflag) {
printf(" "); /* job number */
if (lflag) printf(" \t "); /* user and date/time */
}
if (lflag) {
if (stat(lbuf, &statb) < 0) statb.isize = 0;
printf(" %9d", statb.isize);
printf(" %2d", copies);
}
if (sflag) printf(" (%s)", &lbuf[11]);
if (lflag) printf(" %s", realfname);
printf("\n");
if (lflag || sflag) continue;
close(cmdbuf[0]);
return;
/* login person id */
case 'L':
getline(person);
continue;
/* number of copies */
case 'N':
getline(lbuf);
copies = atoi(lbuf);
continue;
/* real file name */
case 'R':
getline(realfname);
continue;
/* time submitted */
case 'S':
getline(submitted);
continue;
/* end of command file */
case -1:
close(cmdbuf[0]);
return;
/* ignore all other commands */
default:
getline(lbuf);
continue;
}
}
}
/*
* Read rest of line from command file
*/
getline(buf)
char buf[];
{
register char *p;
register c;
for (p = buf; (*p = c = getc(cmdbuf)) != '\n' && c > 0; p++)
;
*p = '\0';
}