MiniUnix/usr/source/s1/lpr.c
/*
* dpr -- off line print via dataphone daemon to GCOS
* normally invoked through opr
*/
char tfname[] "/usr/lpd/tfaXXXXX";
char cfname[] "/usr/lpd/cfaXXXXX";
char lfname[] "/usr/lpd/lfaXXXXX";
char dfname[] "/usr/lpd/dfaXXXXX";
int nact;
int tff;
int mailflg;
char person[10];
int inchar;
int maxrec 1000;
main(argc, argv)
int argc;
char *argv[];
{
register char *arg;
int c, f, flag;
int out();
pidfn();
if((signal(1, 1) & 01) == 0)
signal(1, out);
if((signal(2, 1) & 01) == 0)
signal(2, out);
if((signal(3, 1) & 01) == 0)
signal(3, out);
flag = 0;
tff = nfile(tfname);
while (argc>1 && (arg = argv[1])[0]=='-') {
switch (arg[1]) {
case 'c':
flag = '+';
break;
case 'r':
flag = '-';
break;
case 'm':
mailflg = 1;
break;
}
argc--;
argv++;
}
ident();
if(argc == 1)
copy(0);
while(--argc) {
arg = *++argv;
if(flag == '+')
goto cf;
if(*arg == '/' && flag != '-') {
card('F', arg);
nact++;
continue;
}
if(link(arg, lfname) < 0)
goto cf;
card('F', lfname);
card('U', lfname);
lfname[inchar]++;
nact++;
goto df;
cf:
f = open(arg, 0);
if(f < 0) {
printf("Cannot open %s\n", arg);
continue;
}
copy(f);
close(f);
df:
if(flag == '-') {
f = unlink(arg);
if(f < 0)
printf("Cannot remove %s\n", arg);
}
}
if(nact) {
tfname[inchar]--;
f = link(tfname, dfname);
if(f < 0) {
printf("Cannot rename %s\n", dfname);
tfname[inchar]++;
out();
}
unlink(tfname);
execl("/etc/lpd", "lpd", 0);
dfname[inchar]++;
}
out();
}
copy(f)
int f;
{
int ff, i, nr, nc;
static int buf[256];
card('F', cfname);
card('U', cfname);
ff = nfile(cfname);
nc = 0;
nr = 0;
while((i = read(f, buf, 512)) > 0) {
write(ff, buf, i);
nc =+ i;
if(nc >= 512) {
nc =- 512;
nr++;
if(nr > maxrec) {
printf("Copy file is too large\n");
break;
}
}
}
close(ff);
nact++;
}
card(c, s)
int c;
char s[];
{
char *p1, *p2;
static char buf[512];
int col;
p1 = buf;
p2 = s;
col = 0;
*p1++ = c;
while((c = *p2++) != '\0') {
*p1++ = c;
col++;
}
*p1++ = '\n';
write(tff, buf, col+2);
}
ident()
{
int c, n;
register char *b1p, *pp, *b2p;
static char b1[100], b2[100];
b1p = b1;
if(getpw(getuid(), b1p)) {
b1p = "pdp::::m0000,m000:";
}
n = 0;
b2p = b2;
while(*b2p++ = "$ ident "[n++]);
b2p--;
n = 5;
while(--n) while(*b1p++ != ':');
while((*b2p++ = *b1p++) != ':');
b2p[-1] = ',';
b1p = b1;
pp = person;
while((c = *b1p++) != ':') {
*b2p++ = c;
*pp++ = c;
}
*b2p++ = 0;
*pp++ = 0;
card('L', b2);
if (mailflg)
card('M', person);
}
pidfn()
{
register i, j, c;
int p;
p = getpid();
i = 0;
while(tfname[i] != 'X')
i++;
i =+ 4;
for(j=0; j<5; j++) {
c = (p%10) + '0';
p =/ 10;
tfname[i] = c;
cfname[i] = c;
lfname[i] = c;
dfname[i] = c;
i--;
}
inchar = i;
}
nfile(name)
char *name;
{
register f;
f = creat(name, 0666);
if(f < 0) {
printf("Cannot create %s\n", name);
out();
}
name[inchar]++;
return(f);
}
out()
{
register i;
signal(1, 1);
signal(1, 2);
signal(1, 3);
i = inchar;
while(tfname[i] != 'a') {
tfname[i]--;
unlink(tfname);
}
while(cfname[i] != 'a') {
cfname[i]--;
unlink(cfname);
}
while(lfname[i] != 'a') {
lfname[i]--;
unlink(lfname);
}
while(dfname[i] != 'a') {
dfname[i]--;
unlink(dfname);
}
exit();
}