|
|
researchv10 Norman
/*
* daemon.c -- main control routines for spider and phone dpd daemons,
* and for line printer daemon.
*/
long snsum = 0; /*number of characters written*/
#include "daemon0.c"
#include <setjmp.h>
#include <sys/dir.h>
struct direct dbuf;
int LDIRNAM = 0; /*length of directory name. MRW*/
int LCHAR = 0; /*length of file name thru 'df'.*/
int LPID = 0; /*length of file name to process-id.*/
int retcode = 1;
int nwait = 0;
char *fowner; /*RBB*/
char baddf[30]; /*name for unsendable df-files.*/
FILE *popen();
#if LPD
int waittm = 10;
#else
int waittm = 60;
#endif
main()
{
register char *p1, *p2;
FILE *df;
dem_setup();
LDIRNAM = 0; /*calculate length of directory name. MRW*/
while(dfname[LDIRNAM]) LDIRNAM++;
LCHAR = LDIRNAM + 2;
LPID = LDIRNAM + 3;
again:
snsum = 0;
if(access(lock, 0) < 0){
logerr("Lock has disappeared.");
dem_dis();
exit(1);
}
df = fopen(dpd, "r");
if (df) {
do {
if(fread((char *)&dbuf, sizeof dbuf, 1, df) < 1){
dem_dis(); /*disconnect phone line. MRW*/
unlink(lock);
exit(0);
}
} while (dbuf.d_ino==0 || dbuf.d_name[0]!='d' || dbuf.d_name[1]!='f');
fclose(df);
}
p1 = dbuf.d_name;
p2 = &dfname[LDIRNAM];
while (p1 < &dbuf.d_name[DIRSIZ])
*p2++ = *p1++;
if (trysend() == 0) {
waittm = 60;
nwait = 0;
goto again;
}
#if PHONE
if(nwait > 10){ /*after 3 hours try fresh daemon. MRW*/
unlink(lock);
execl("/usr/lib/dpd", "dpd", (char *)0);
execl("/etc/dpd", "dpd", (char *)0);
logerr("Can't find dpd.");
exit(1);
}
#endif
sleep(waittm);
#if PHONE || SPIDER
#ifndef DEBUG
if (waittm <= 8*60)
waittm *= 2;
else
nwait++;
#endif
#endif
goto again;
}
/*
* The remaining part is the device interface, to spider, the dataphone,
* or the line printer.
*/
#define MXLINE 128
#define MXMESS 500
char *snumb;
char line[MXLINE];
char message[MXMESS+1];
char *mesp;
char mailfname[64];
int linel;
FILE *dfb = NULL;
jmp_buf env;
char ff = '\014'; /*formfeed*/
char *copline();
trysend()
{
if(retcode != 0)
if(retcode = dem_con()) /*connect phone line.*/
return(retcode);
retcode = 1;
if(setjmp(env))
return(retcode);
xtrysend();
return(0);
}
xtrysend()
{
int i;
dem_open(dfname); /*open spider connection.*/
if((dfb = fopen(dfname, "r")) == NULL){
if(LDIRNAM < (i = sizeof(baddf)-1)){
strncpy(baddf, dfname, i);
baddf[i] = '\0';
baddf[LDIRNAM] = 'b';
link(dfname, baddf);
}
unlink(dfname);
retcode = 0;
trouble("Can't read %s.", dfname);
}
getowner(dfname); /*RBB*/
mesp = message;
*mesp = 0;
while (getline()) switch (line[0]) {
case 'S':
get_snumb(); /*get snumb for GCOS.*/
continue;
case 'B':
if(sascii(0))
trouble("Can't send %s.", &line[1]);
continue;
case 'F':
if(sascii(1))
trouble("Can't send %s.", &line[1]);
continue;
case 'I': /*mail back $IDENT card. MRW*/
mesp = copline(&line[1], linel-1, mesp);
case 'L':
lwrite(); /*write a literal line.*/
continue;
case 'M':
continue;
case 'N': /*mail back file name. MRW*/
copline(&line[1], linel-1, mailfname);
continue;
case 'Q': /*additional text to mail back*/
if(mesp+linel <= message+MXMESS)
mesp = copline(&line[1], linel-1, mesp);
case 'U':
continue;
}
/*
* Second pass.
* Unlink files and send mail.
*/
alarm(0);
fseek(dfb, (long)0, 0);
while (getline()) switch (line[0]) {
default:
continue;
case 'U':
unlink(&line[1]);
continue;
case 'M':
sendmail();
continue;
}
FCLOSE(dfb);
dem_close(); /*close connection to spider.*/
unlink(dfname);
retcode = 0;
trouble("OK: %-5s %-7s %-8s", snumb, fowner, dfname+LDIRNAM); /*RBB*/
}
#define LUBM 30 /*length of mail command line.*/
#define IARG1 5 /*start of arg to mail command.*/
char mail[LUBM+1] = "mail ";
FILE *pmail;
sendmail()
{
register i;
alarm(0);
i = 0;
while((mail[IARG1+i] = line[i+1]) && (++i < LUBM-IARG1));
mail[IARG1+i] = 0;
if((pmail = popen(mail, "w")) == NULL){
logerr("Can't mail: %-5s %-8s",snumb,dfname+LDIRNAM); /*MRW*/
return;
}
maildname();
pclose(pmail);
}
#if LPD == 0
maildname() /*break up dfname into command name, and process-id
to send back in the mail. MRW*/
{
char c;
char *command;
fprintf(pmail,"Sent %-5s: file %s%s",snumb,mailfname,message);
/*
c = dfname[LCHAR];
switch (c){
case 'A':
case 'a':
command = "dpr";
break;
case 'G':
case 'g':
command = "gcat";
break;
case 'J':
case 'j':
command = "ibm";
break;
case 'N':
case 'n':
command = "fsend";
break;
case 'T':
case 't':
command = "fget";
break;
default:
command = &dfname[LDIRNAM];
break;
}
fprintf(pmail, "%s process-id was %s\n", command, &dfname[LPID]);
*/
}
#endif
getline()
{
register char *lp;
register c;
lp = line;
linel = 0;
while ((c = getc(dfb)) != '\n' && linel < MXLINE-2) {
if (c == EOF)
return(0);
if (c=='\t') {
do {
*lp++ = ' ';
linel++;
} while ((linel & 07) != 0);
continue;
}
*lp++ = c;
linel++;
}
*lp++ = 0;
return(1);
}
char *
copline(ab, n, ml)
char *ab;
int n;
char ml[64];
{
register char *b, *p, *eb;
b = ab;
eb = b+n;
p = ml;
while (b<eb && p < &ml[63])
*p++ = *b++;
*p++ = '\n';
*p = 0; /*RBB*/
return(p);
}
#if LPD == 0
/*
* the following code determines who the file's owner is.
* /*RBB*/
struct passwd *getpwuid();
getowner(file)
char *file;
{
struct passwd *f;
if(stat(file, &statbuf) < 0)
return;
if((f = getpwuid(statbuf.st_uid)) == NULL)
fowner = "";
else
fowner = f->pw_name;
}
#endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.