Annotation of researchv10no/cmd/daemon/daemon.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *  daemon.c -- main control routines for spider and phone dpd daemons,
        !             3:  *                     and for line printer daemon.
        !             4:  */
        !             5: 
        !             6: long   snsum = 0;              /*number of characters written*/
        !             7: 
        !             8: #include       "daemon0.c"
        !             9: 
        !            10: #include       <setjmp.h>
        !            11: #include       <sys/dir.h>
        !            12: 
        !            13: struct direct  dbuf;
        !            14: int    LDIRNAM = 0;            /*length of directory name. MRW*/
        !            15: int    LCHAR   = 0;            /*length of file name thru 'df'.*/
        !            16: int    LPID    = 0;            /*length of file name to process-id.*/
        !            17: int    retcode = 1;
        !            18: int    nwait   = 0;
        !            19: char   *fowner;                /*RBB*/
        !            20: char   baddf[30];              /*name for unsendable df-files.*/
        !            21: FILE   *popen();
        !            22: 
        !            23: #if LPD
        !            24: int    waittm  = 10;
        !            25: #else
        !            26: int    waittm  = 60;
        !            27: #endif
        !            28: 
        !            29: main()
        !            30: {
        !            31:        register char *p1, *p2;
        !            32:        FILE *df;
        !            33: 
        !            34:        dem_setup();
        !            35:        LDIRNAM = 0;            /*calculate length of directory name. MRW*/
        !            36:        while(dfname[LDIRNAM])  LDIRNAM++;
        !            37:        LCHAR = LDIRNAM + 2;
        !            38:        LPID = LDIRNAM + 3;
        !            39: 
        !            40: again:
        !            41:        snsum = 0;
        !            42:        if(access(lock, 0) < 0){
        !            43:                logerr("Lock has disappeared.");
        !            44:                dem_dis();
        !            45:                exit(1);
        !            46:        }
        !            47:        df = fopen(dpd, "r");
        !            48:        if (df) {
        !            49:                do {
        !            50:                        if(fread((char *)&dbuf, sizeof dbuf, 1, df) < 1){
        !            51:                                dem_dis();      /*disconnect phone line. MRW*/
        !            52:                                unlink(lock);
        !            53:                                exit(0);
        !            54:                        }
        !            55:                } while (dbuf.d_ino==0 || dbuf.d_name[0]!='d' || dbuf.d_name[1]!='f');
        !            56:                fclose(df);
        !            57:        }
        !            58:        p1 = dbuf.d_name;
        !            59:        p2 = &dfname[LDIRNAM];
        !            60:        while (p1 < &dbuf.d_name[DIRSIZ])
        !            61:                *p2++ = *p1++;
        !            62:        if (trysend() == 0) {
        !            63:                waittm = 60;
        !            64:                nwait = 0;
        !            65:                goto again;
        !            66:                }
        !            67: #if PHONE
        !            68:        if(nwait > 10){         /*after 3 hours try fresh daemon. MRW*/
        !            69:                unlink(lock);
        !            70:                execl("/usr/lib/dpd", "dpd", (char *)0);
        !            71:                execl("/etc/dpd", "dpd", (char *)0);
        !            72:                logerr("Can't find dpd.");
        !            73:                exit(1);
        !            74:        }
        !            75: #endif
        !            76:        sleep(waittm);
        !            77: #if PHONE || SPIDER
        !            78: #ifndef DEBUG
        !            79:        if (waittm <= 8*60)
        !            80:                waittm *= 2;
        !            81:        else
        !            82:                nwait++;
        !            83: #endif
        !            84: #endif
        !            85:        goto again;
        !            86: }
        !            87: 
        !            88: /*
        !            89:  * The remaining part is the device interface, to spider, the dataphone,
        !            90:  *    or the line printer.
        !            91:  */
        !            92: 
        !            93: #define        MXLINE  128
        !            94: #define        MXMESS  500
        !            95: 
        !            96: char   *snumb;
        !            97: char   line[MXLINE];
        !            98: char   message[MXMESS+1];
        !            99: char   *mesp;
        !           100: char   mailfname[64];
        !           101: int    linel;
        !           102: FILE   *dfb = NULL;
        !           103: jmp_buf        env;
        !           104: char   ff      = '\014';               /*formfeed*/
        !           105: char   *copline();
        !           106: 
        !           107: trysend()
        !           108: {
        !           109:        if(retcode != 0)
        !           110:                if(retcode = dem_con())         /*connect phone line.*/
        !           111:                        return(retcode);
        !           112:        retcode = 1;
        !           113:        if(setjmp(env))
        !           114:                return(retcode);
        !           115:        xtrysend();
        !           116:        return(0);
        !           117: }
        !           118: 
        !           119: xtrysend()
        !           120: {
        !           121:        int i;
        !           122: 
        !           123:        dem_open(dfname);               /*open spider connection.*/
        !           124:        if((dfb = fopen(dfname, "r")) == NULL){
        !           125:                if(LDIRNAM < (i = sizeof(baddf)-1)){
        !           126:                        strncpy(baddf, dfname, i);
        !           127:                        baddf[i] = '\0';
        !           128:                        baddf[LDIRNAM] = 'b';
        !           129:                        link(dfname, baddf);
        !           130:                }
        !           131:                unlink(dfname);
        !           132:                retcode = 0;
        !           133:                trouble("Can't read %s.", dfname);
        !           134:        }
        !           135:        getowner(dfname);               /*RBB*/
        !           136:        mesp = message;
        !           137:        *mesp = 0;
        !           138:        while (getline()) switch (line[0]) {
        !           139: 
        !           140:        case 'S':
        !           141:                get_snumb();            /*get snumb for GCOS.*/
        !           142:                continue;
        !           143: 
        !           144:        case 'B':
        !           145:                if(sascii(0))
        !           146:                        trouble("Can't send %s.", &line[1]);
        !           147:                continue;
        !           148: 
        !           149:        case 'F':
        !           150:                if(sascii(1))
        !           151:                        trouble("Can't send %s.", &line[1]);
        !           152:                continue;
        !           153: 
        !           154:        case 'I':                       /*mail back $IDENT card. MRW*/
        !           155:                mesp = copline(&line[1], linel-1, mesp);
        !           156: 
        !           157:        case 'L':
        !           158:                lwrite();               /*write a literal line.*/
        !           159:                continue;
        !           160: 
        !           161:        case 'M':
        !           162:                continue;
        !           163: 
        !           164:        case 'N':                       /*mail back file name. MRW*/
        !           165:                copline(&line[1], linel-1, mailfname);
        !           166:                continue;
        !           167: 
        !           168:        case 'Q':                       /*additional text to mail back*/
        !           169:                if(mesp+linel <= message+MXMESS)
        !           170:                        mesp = copline(&line[1], linel-1, mesp);
        !           171: 
        !           172:        case 'U':
        !           173:                continue;
        !           174:        }
        !           175: /*
        !           176:  * Second pass.
        !           177:  * Unlink files and send mail.
        !           178:  */
        !           179:        alarm(0);
        !           180:        fseek(dfb, (long)0, 0);
        !           181:        while (getline()) switch (line[0]) {
        !           182: 
        !           183:        default:
        !           184:                continue;
        !           185: 
        !           186:        case 'U':
        !           187:                unlink(&line[1]);
        !           188:                continue;
        !           189: 
        !           190:        case 'M':
        !           191:                sendmail();
        !           192:                continue;
        !           193:        }
        !           194:        FCLOSE(dfb);
        !           195:        dem_close();            /*close connection to spider.*/
        !           196:        unlink(dfname);
        !           197:        retcode = 0;
        !           198:        trouble("OK: %-5s %-7s %-8s", snumb, fowner, dfname+LDIRNAM);   /*RBB*/
        !           199: }
        !           200: 
        !           201: #define        LUBM    30      /*length of mail command line.*/
        !           202: #define        IARG1   5       /*start of arg to mail command.*/
        !           203: char   mail[LUBM+1]    = "mail ";
        !           204: FILE   *pmail;
        !           205: 
        !           206: sendmail()
        !           207: {
        !           208:        register i;
        !           209: 
        !           210:        alarm(0);
        !           211:        i = 0;
        !           212:        while((mail[IARG1+i] = line[i+1]) && (++i < LUBM-IARG1));
        !           213:        mail[IARG1+i] = 0;
        !           214:        if((pmail = popen(mail, "w")) == NULL){
        !           215:                logerr("Can't mail: %-5s %-8s",snumb,dfname+LDIRNAM);  /*MRW*/
        !           216:                return;
        !           217:        }
        !           218:        maildname();
        !           219:        pclose(pmail);
        !           220: }
        !           221: 
        !           222: #if LPD == 0
        !           223: 
        !           224: maildname()            /*break up dfname into command name, and process-id
        !           225:                            to send back in the mail. MRW*/
        !           226: {
        !           227:        char c;
        !           228:        char *command;
        !           229: 
        !           230:        fprintf(pmail,"Sent %-5s:  file  %s%s",snumb,mailfname,message);
        !           231: /*
        !           232:        c = dfname[LCHAR];
        !           233:        switch (c){
        !           234:        case 'A':
        !           235:        case 'a':
        !           236:                command = "dpr";
        !           237:                break;
        !           238: 
        !           239:        case 'G':
        !           240:        case 'g':
        !           241:                command = "gcat";
        !           242:                break;
        !           243: 
        !           244:        case 'J':
        !           245:        case 'j':
        !           246:                command = "ibm";
        !           247:                break;
        !           248: 
        !           249:        case 'N':
        !           250:        case 'n':
        !           251:                command = "fsend";
        !           252:                break;
        !           253: 
        !           254:        case 'T':
        !           255:        case 't':
        !           256:                command = "fget";
        !           257:                break;
        !           258: 
        !           259:        default:
        !           260:                command = &dfname[LDIRNAM];
        !           261:                break;
        !           262:        }
        !           263:        fprintf(pmail, "%s process-id was %s\n", command, &dfname[LPID]);
        !           264: */
        !           265: }
        !           266: 
        !           267: #endif
        !           268: 
        !           269: 
        !           270: getline()
        !           271: {
        !           272:        register char *lp;
        !           273:        register c;
        !           274: 
        !           275:        lp = line;
        !           276:        linel = 0;
        !           277:        while ((c = getc(dfb)) != '\n' && linel < MXLINE-2) {
        !           278:                if (c == EOF)
        !           279:                        return(0);
        !           280:                if (c=='\t') {
        !           281:                        do {
        !           282:                                *lp++ = ' ';
        !           283:                                linel++;
        !           284:                        } while ((linel & 07) != 0);
        !           285:                        continue;
        !           286:                }
        !           287:                *lp++ = c;
        !           288:                linel++;
        !           289:        }
        !           290:        *lp++ = 0;
        !           291:        return(1);
        !           292: }
        !           293: 
        !           294: char *
        !           295: copline(ab, n, ml)
        !           296: char   *ab;
        !           297: int    n;
        !           298: char   ml[64];
        !           299: {
        !           300:        register char *b, *p, *eb;
        !           301: 
        !           302:        b = ab;
        !           303:        eb = b+n;
        !           304:        p = ml;
        !           305:        while (b<eb && p < &ml[63])
        !           306:                *p++ = *b++;
        !           307:        *p++ = '\n';
        !           308:        *p = 0;                 /*RBB*/
        !           309:        return(p);
        !           310: }
        !           311: 
        !           312: #if LPD == 0
        !           313: 
        !           314: /*
        !           315:  * the following code determines who the file's owner is.
        !           316:  *                     /*RBB*/
        !           317: 
        !           318: struct passwd *getpwuid();
        !           319: 
        !           320: getowner(file)
        !           321: char   *file;
        !           322: {
        !           323:        struct passwd *f;
        !           324: 
        !           325:        if(stat(file, &statbuf) < 0)
        !           326:                return;
        !           327:        if((f = getpwuid(statbuf.st_uid)) == NULL)
        !           328:                fowner = "";
        !           329:        else
        !           330:                fowner = f->pw_name;
        !           331: }
        !           332: 
        !           333: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.