Annotation of coherent/d/usr/bin/uucpstuff/dcp/dcpsys.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * dcpsys.c
                      3:  *
                      4:  * System File Parsing and Initial Login Negotiation Routines for uucico
                      5:  */
                      6: 
                      7: /* #include <sys/dir.h> */
                      8: #include "dirent.h"
                      9: #include <ctype.h>
                     10: #include "dcp.h"
                     11: #include "lsys.h"
                     12: 
                     13: /*
                     14:  *  Communication Protocol Declarations and Definitions
                     15:  */
                     16: 
                     17: #define PROTOS  "g"
                     18: int (*getpkt)(), (*sendpkt)(), (*openpk)(), (*closepk)();
                     19: 
                     20: extern int ggetpkt(), gsendpkt(), gopenpk(), gclosepk();
                     21: #if 0
                     22: extern int kgetpkt(), ksendpkt(), kopenpk(), kclosepk();
                     23: extern int rgetpkt(), rsendpkt(), ropenpk(), rclosepk();
                     24: extern int tgetpkt(), tsendpkt(), topenpk(), tclosepk();
                     25: #endif
                     26: 
                     27: typedef struct proto {
                     28:        char type;              /* One character Protocol Type  */
                     29:        int (*getpkt)();        /* Get Packet Function          */
                     30:        int (*sendpkt)();       /* Send Packet Function         */
                     31:        int (*openpk)();        /* Open Packet Function         */
                     32:        int (*closepk)();       /* Close Packet Function        */
                     33: } PROTO;
                     34: 
                     35: PROTO protolst[] =
                     36: {
                     37:        { 'g', ggetpkt, gsendpkt, gopenpk, gclosepk },
                     38: #if 0
                     39:        { 'k', kgetpkt, ksendpkt, kopenpk, kclosepk },
                     40:        { 'r', rgetpkt, rsendpkt, ropenpk, rclosepk },
                     41:        { 't', tgetpkt, tsendpkt, topenpk, tclosepk },
                     42: #endif
                     43:        { '\0' }
                     44: };
                     45: 
                     46: int    leavelock = 0;          /* Leave the rmtname lock file  */
                     47: 
                     48: /*
                     49:  * getsystem()
                     50:  * Retrieve and Process an "L.sys" file entry.
                     51:  */
                     52: 
                     53: getsystem()
                     54: {
                     55:        if ( lsys_next() == 0 )
                     56:                return('A');
                     57: 
                     58:        rmtname = lsys_value(sys_e);
                     59:        if ( strcmp(rmtname, sysname) ) {
                     60:                if ( strcmp(sysname, "all") && strcmp(sysname, "any") )
                     61:                        return('I');
                     62:                if ( scandir() != 'S' )
                     63:                        return('I');
                     64:        }
                     65:        printmsg(M_CALL, "Thinking of calling system: %s", rmtname);
                     66:        if ( !checktime(lsys_value(sched_e)) )
                     67:                return('I');
                     68: 
                     69:        open_the_logfile("uucico");
                     70:        if (cfp != NULL)
                     71:                fclose(cfp);    /* in case matched scandir */
                     72:        if ( lockit(rmtname) < 0 ) {
                     73:                plog(M_CALL, "Site Locked: %s", rmtname);
                     74:                close_logfile();
                     75:                return('I');
                     76:        } 
                     77:        return('S');
                     78: }
                     79: 
                     80: /*
                     81:  * checkrmt()
                     82:  * Scan through L.sys file to verify that we know about the given
                     83:  * remote system name.
                     84:  * Returns: (1) if we found match, (0) if rmtname unknown.
                     85:  */
                     86: 
                     87: checkrmt()
                     88: {
                     89:        lsys_open();
                     90:        while ( lsys_next() ) {
                     91:                if ( strcmp(rmtname, lsys_value(sys_e)) == 0 )
                     92:                        return(1);
                     93:        }
                     94:        lsys_close();
                     95:        return(0);
                     96: }
                     97: 
                     98: /*
                     99:  *  rmsg(msg, maxlen)  char *msg;  int maxlen;
                    100:  *  Read a ^P (DLE) type msg from the remote uucp.  (startup negotiation).
                    101:  *
                    102:  *  wmsg(msg)  char *msg;
                    103:  *  Write a ^P (DLE) type msg to the remote uucp.  (startup negotiation).
                    104:  */
                    105: 
                    106: #define        MAXDROP 2048    /* Maximum characters to drop waiting for ^P    */
                    107: 
                    108: rmsg(msg, maxlen)
                    109: char *msg;
                    110: int maxlen;
                    111: {
                    112:        char ch;
                    113:        register char *cp;
                    114:        int i;
                    115: 
                    116:        for (i=0; i<MAXDROP; i++) {
                    117:                if ( sread(&ch, 1, MSGTIME) != 1 ){
                    118:                        goto badrmsg;
                    119:                }
                    120:                if ( ch == DLE )
                    121:                        break;
                    122:        }
                    123: 
                    124:        
                    125:        if ( ch != DLE ){
                    126:                goto nodle;
                    127:        }
                    128: 
                    129:        for (cp=msg,i=1; i<maxlen; i++) {
                    130:                if ( sread(&ch, 1, MSGTIME) != 1 )
                    131:                        goto badrmsg;
                    132:                if ( (ch == '\0') || (ch == '\r') || (ch == '\n') )
                    133:                        break;
                    134:                *cp++ = ch;
                    135:        }
                    136:        *cp = '\0';
                    137:        printmsg(M_DEBUG, "rmsg {%s}", visib(msg));
                    138:        return( strlen(msg) );
                    139: 
                    140: badrmsg:
                    141: /*     *cp = '\0';  this is a NONO, cp never has valid characters here
                    142:  *                  when we've determined that we were missing DLE
                    143:  */
                    144:        printmsg(M_CALL, "Bad received message {%s}", visib(msg));
                    145:        return(-1);
                    146: nodle:
                    147: /*     *cp = '\0';  this is a NONO, cp never has valid characters here */
                    148:        printmsg(M_CALL, "Remote machine not sending DLE startup (uucico)");
                    149:        return(-1);
                    150: }
                    151: 
                    152: wmsg(msg)
                    153: char *msg;
                    154: {
                    155:        char buf[2] = {'\0', DLE};
                    156: 
                    157:        printmsg(M_DEBUG, "wmsg {%s}", visib(msg));
                    158:        swrite(&buf[0], 2);
                    159:        swrite(msg, strlen(msg));
                    160:        swrite(&buf[0], 1);
                    161: }
                    162: 
                    163: /*
                    164:  * startup()
                    165:  *
                    166:  * Initiate communication with a remote uucp.
                    167:  */
                    168: 
                    169: #define        FAIL1(x)        {errmsg=(x); errarg=NULL; goto failure;}
                    170: #define        FAIL2(x, y)     {errmsg=(x); errarg=(y); goto failure;}
                    171: 
                    172: startup()
                    173: {
                    174:        char msg[BUFSIZ];
                    175:        char *errmsg, *errarg, *cp, ch;
                    176:        static char locbuf[SITELEN+1];
                    177:        static char *readymsg = "Ready for transactions";
                    178: 
                    179:        sysended = 0;
                    180:        leavelock = 0;
                    181:        if (role == MASTER) {
                    182:                if ( rmsg(msg, BUFSIZ) < 0 ){
                    183:                        FAIL1("Logon failed: 1st msg (broken communication?)");
                    184:                }
                    185:                printmsg(M_CALLMSG, "1st msg = {%s}", visib(msg));
                    186:                if ( strncmp(msg, "Shere", 5) ){
                    187:                        FAIL1("Bad format for 1st msg");
                    188:                }
                    189:                if ( (msg[5] == '\0') || (msg[5] == '\n') ||
                    190:                     (msg[6] == '\0') || (msg[6] == '\n') )
                    191:                        plog(M_CALL, "Warning: Null sitename contacted");
                    192:                else if ( strncmp(&msg[6], rmtname, SITESIG) )
                    193:                        FAIL2("Incorrect sitename contacted: %s", &msg[6]);
                    194: 
                    195:                sprintf(msg, "S%.*s -Q0 -x%d", SITESIG, nodename, debuglevel);
                    196:                printmsg(M_CALLMSG, "Reply to 1st msg = {%s}", msg);
                    197:                wmsg(msg);
                    198: 
                    199:                if ( rmsg(msg, BUFSIZ) < 0 )
                    200:                        FAIL1("Logon failed: 2nd msg (remote site stale LCK?)");
                    201: 
                    202:                printmsg(M_CALLMSG, "2nd msg = {%s}", visib(msg));
                    203:                if ( strncmp(msg, "ROK", 2) )
                    204:                        FAIL1("Bad format for 2nd msg");
                    205: 
                    206:                if ( rmsg(msg, BUFSIZ) < 0 )
                    207:                        FAIL1("Logon failed: 3rd msg (broken communication?)");
                    208:                printmsg(M_CALLMSG, "3rd msg = {%s}", visib(msg));
                    209:                if ( *msg != 'P' )
                    210:                        FAIL1("Bad format for 3rd msg");
                    211:                ch = 'N';
                    212:                for (cp=PROTOS; *cp; cp++)
                    213:                        if ( index(&msg[1], *cp) != NULL ) {
                    214:                                ch = *cp;
                    215:                                break;
                    216:                        }
                    217:                sprintf(msg, "U%c", ch);
                    218:                printmsg(M_CALLMSG, "Reply to 3rd msg = {%s}", msg);
                    219:                wmsg(msg);
                    220:                if ( ch == 'N' )
                    221:                        FAIL1("No common protocol");
                    222:                setproto(ch);
                    223:                plog(M_CALL, readymsg);
                    224:                return('D');
                    225:        } else {
                    226:                sprintf(msg, "Shere=%s", nodename);
                    227:                printmsg(M_CALLMSG, "1st msg = {%s}", msg);
                    228:                wmsg(msg);
                    229: 
                    230:                if ( rmsg(msg, BUFSIZ) < 0 )
                    231:                        FAIL1("Logon failed: 1st reply (wrong sitename?)");
                    232:                printmsg(M_CALLMSG, "Reply to 1st msg = {%s}", visib(msg));
                    233:                if ( *msg != 'S' )
                    234:                        FAIL1("Bad format for reply to 1st msg");
                    235:                if ( (cp=index(msg+1, ' ')) != NULL )
                    236:                        *cp = '\0';
                    237:                if ( strlen(msg) > (SITELEN+1) )
                    238:                        FAIL1("Received sitename to long");
                    239:                strcpy(locbuf, msg+1);
                    240:                rmtname = &locbuf[0];
                    241: #ifdef BBS
                    242: #define BBSUSER        "bbsuser"
                    243: 
                    244:                /*
                    245:                 * For BBS, anonymous caller's sitename is replaced by the
                    246:                 * device name, notice we skip over "/dev/".
                    247:                 */
                    248:                {
                    249:                        char *tmp;
                    250: 
                    251:                        if ( (strcmp(rmtname, BBSUSER) == 0) &&
                    252:                             ((tmp=ttyname(fileno(stdin))) != NULL) )
                    253:                                sprintf(locbuf, "U%s", tmp+5);
                    254:                        printmsg(M_DEBUG, "BBS replaced new rmtname: <%s>",
                    255:                                                                 rmtname);
                    256:                }
                    257: #endif
                    258:                open_the_logfile("uucico");
                    259:                plog(M_CALL, "Call received from %s {%d} (V%s)",
                    260:                                                rmtname, processid, version);
                    261:                plog(M_CALL,"Locking remote site %s",rmtname);
                    262:                if ( lockit(rmtname) < 0 ) {
                    263:                        leavelock = 1;
                    264:                        FAIL2("Incoming site %s already locked", rmtname);
                    265:                }
                    266: 
                    267:                if ( !checkrmt() )
                    268:                        FAIL2("Unknown host %s", rmtname);
                    269: 
                    270:                if ( (rdevname=ttyname(fileno(stdin))) == NULL )
                    271:                        FAIL1("No attached tty device.");
                    272:                rdevname += 5;
                    273: 
                    274:        /* The incoming device will already have been locked by login.  */
                    275:                if (MASTER == role) { 
                    276:                        if ( locktty(rdevname) < 0 ) {
                    277:                                cp = rdevname;
                    278:                                rdevname = NULL;
                    279:                                FAIL2("Incoming device locked: %s", cp);
                    280:                        }
                    281:                }
                    282: 
                    283:                sprintf(msg, "ROK");
                    284:                printmsg(M_CALLMSG, "2nd msg = {%s}", msg);
                    285:                wmsg(msg);
                    286:                sprintf(msg, "P%s", PROTOS);
                    287:                printmsg(M_CALLMSG, "3rd msg = {%s}", msg);
                    288:                wmsg(msg);
                    289:                if ( rmsg(msg, BUFSIZ) < 0 )
                    290:                        FAIL1("Logon failure: 3rd reply (lost communication?)");
                    291:                printmsg(M_CALLMSG, "Reply to 3rd msg = {%s}", visib(msg));
                    292:                if ( (msg[0] != 'U') || (index(PROTOS, msg[1]) == NULL) )
                    293:                        FAIL1("No common communications protocol");
                    294:                setproto(msg[1]);
                    295:                plog(M_CALL, readymsg);
                    296:                return('R');
                    297:        }
                    298: 
                    299: failure:
                    300:        plog(M_CALL, errmsg, errarg);
                    301:        terminatelevel++;
                    302:        return('Y');
                    303: }
                    304: 
                    305: /*
                    306:  * Assign the global protocol function variables to the specified
                    307:  * protocol type.
                    308:  */
                    309: 
                    310: setproto(type)
                    311: char type;
                    312: {
                    313:        register PROTO *p;
                    314: 
                    315:        for(p=&protolst[0]; (p->type!='\0') && (p->type!=type); p++) ;
                    316: 
                    317:        if (p->type == '\0')
                    318:                fatal("setproto('%c'): Unknown protocol type", type);
                    319:        printmsg(M_CALL, "Agreed protocol: %c", type);
                    320:        getpkt  = p->getpkt;
                    321:        sendpkt = p->sendpkt;
                    322:        openpk  = p->openpk;
                    323:        closepk = p->closepk;
                    324: 
                    325: }
                    326: 
                    327: /*
                    328:  *  expectstr(str, timeout)  char *str; int timeout;
                    329:  *
                    330:  *  Wait to receive the specified "str" from the serial connection.
                    331:  *  Returns: (1) if string received,
                    332:  *          (0) for timeout occurred before string received.
                    333:  */
                    334: 
                    335: expectstr(str, timeout)
                    336: char *str;
                    337: int timeout;
                    338: {
                    339:        register char *cp;
                    340:        char buf[BUFSIZ], ch;
                    341:        int retval = 0;
                    342:        int len;
                    343: 
                    344:        printmsg(M_DEBUG, "waiting for {%s}", str);
                    345: 
                    346:        if ( strcmp(str, "\"\"") == 0 )
                    347:                retval = 1;
                    348:        len = strlen(str);
                    349: 
                    350:        cp = &buf[0];
                    351:        while ( !retval && (sread(&ch, 1, timeout) == 1) ) {
                    352:                *cp++ = ch;
                    353:                if ( (cp-buf) < len )
                    354:                        continue;
                    355:                *cp = '\0';
                    356:                if ( strncmp(str, cp-len, len) == 0 )
                    357:                        retval = 1;
                    358:                if ( cp == &buf[BUFSIZ-1] )
                    359:                        break;
                    360:        }
                    361:        printmsg(M_CALL, "actually received {%s}", visbuf(buf, cp-buf));
                    362:        if ( retval )
                    363:                printmsg(M_CALL, "got that");
                    364:        return(retval);
                    365: }
                    366: 
                    367: /*
                    368:  *  sendstr(str) char *str;
                    369:  *  Send string of chat script out the communications line.
                    370:  */
                    371: 
                    372: sendstr(str)
                    373: char *str;
                    374: {
                    375:        register char *cp = str;
                    376:        char ch;
                    377:        int slash, nocr;
                    378: 
                    379:        sleep(1);
                    380:        if ( strncmp(str, "\"\"", 2) == 0 )
                    381:                str = "";
                    382: 
                    383:        nocr = slash = 0;
                    384:        while ( (ch=*cp++) ) {
                    385:                if ( !slash ) {
                    386:                        if ( strncmp(cp-1, "EOT", 3) == 0 ) {
                    387:                                swrite("\004", 1);
                    388:                                cp += 2;
                    389:                        } else if ( strncmp(cp-1, "BREAK", 4) == 0 ) {
                    390:                                sendbrk();
                    391:                                cp += 4;
                    392:                        } else if ( ch == '\\' ) {
                    393:                                slash = 1;
                    394:                        } else {
                    395:                                swrite(&ch, 1);
                    396:                        }
                    397:                        continue;
                    398:                }
                    399:                switch( ch ) {
                    400:                case 'b':
                    401:                        swrite("\b", 1);
                    402:                        break;
                    403:                case 'c':
                    404:                        nocr = 1;
                    405:                        break;
                    406:                case 'd':
                    407:                        sleep(2);
                    408:                        break;
                    409:                case 'K':
                    410:                        sendbrk();
                    411:                        break;
                    412:                case 'n':
                    413:                        swrite("\n", 1);
                    414:                        break;
                    415:                case 'N':
                    416:                        swrite("\0", 1);
                    417:                        break;
                    418:                case 'p':
                    419:                        sleep(1);
                    420:                        break;
                    421:                case 'r':
                    422:                        swrite("\r", 1);
                    423:                        break;
                    424:                case 's':
                    425:                        swrite(" ", 1);
                    426:                        break;
                    427:                case 't':
                    428:                        swrite("\t", 1);
                    429:                        break;
                    430:                case '\\':
                    431:                        swrite("\\", 1);
                    432:                        break;          
                    433:                default:
                    434:                        if ( !isdigit(ch) ||
                    435:                             !isdigit(*cp) ||
                    436:                             !isdigit(*(cp+1)) )
                    437:                                fatal("Can't parse chat script: {%s}", str);
                    438:                        ch = ((ch-'0')<<6) | ((*cp-'0')<<3) | (*(cp+1));
                    439:                        swrite(&ch, 1);
                    440:                        break;
                    441:                }
                    442:                slash = 0;
                    443:        }
                    444:        if ( !nocr ){
                    445:                swrite("\r", 1);
                    446:        }
                    447: }
                    448: 
                    449: /*
                    450:  * callup()
                    451:  * Initiate the call, and walk through the chat script.
                    452:  */
                    453: 
                    454: callup()
                    455: {
                    456:        char *device, *speed, *phone;
                    457:        char *expect, *send, *dsh;
                    458:        int i;
                    459: 
                    460:        plog(M_CALL, "Calling site %s {%d} (V%s)", rmtname, processid, version);
                    461:        
                    462:        device = lsys_value(device_e);
                    463:        speed  = lsys_value(speed_e);
                    464:        phone  = lsys_value(phone_e);
                    465: 
                    466:        if ( strcmp(device, "ACU") == 0 ) {
                    467:                if ( !dcpdial(NULL, speed, phone) )
                    468:                        goto calluperr;
                    469:        } else if ( !dcpdial(device, speed, NULL) )
                    470:                goto calluperr;
                    471: 
                    472:        for (i=0; (expect=lsys_expect(i)) != NULL; i++) {
                    473:                for (;;) {
                    474:                        printmsg(M_CALL, "callup: expecting {%s}", expect);
                    475:                        if ( (dsh=index(expect, '-')) != NULL )
                    476:                                *dsh++ = '\0';
                    477:                        if ( expectstr(expect, MSGTIME) )
                    478:                                break;
                    479:                        if ( dsh == NULL ) {
                    480:                                plog(M_CALL, "Login failed.");
                    481:                                goto calluperr;
                    482:                        }
                    483:                        if ( (expect=index(dsh, '-')) == NULL )
                    484:                                fatal("Chat script syntax error: %s", dsh);
                    485:                        *expect++ = '\0';
                    486:                        printmsg(M_CALL, "callup: send alternate {%s}", dsh);
                    487:                        sendstr(dsh);
                    488:                }
                    489:                send = lsys_send(i);
                    490:                printmsg(M_CALL, "callup: sending {%s}", send);
                    491:                sendstr(send);
                    492:        }
                    493:        return('P');
                    494: 
                    495: calluperr:
                    496:        terminatelevel++;
                    497:        return('Y');
                    498: }
                    499: 
                    500: /*
                    501:  *  sysend()
                    502:  *  End UUCP session.
                    503:  */
                    504: 
                    505: sysend()
                    506: {
                    507: 
                    508:        /* We may have a problem here. Someone else may be removing the remote
                    509:         * device lock file before we call unlocktty. Tests have shown this to
                    510:         * be unimportant because the lock file IS being removed. A warning
                    511:         * will be printed to the log files for users to check for locks.
                    512:         * Hopefully, this isn't going to be a bug.  Bob H. 11/22/91.
                    513:         */
                    514: 
                    515:        /* December 4, 1991: Problem solved(?). When we are in master mode,
                    516:         * we call dcpundial, which calls the hangup, which, in turn, calls
                    517:         * undial. Undial removes the locks on the device. Thie following
                    518:         * code USED to call dcpundial if in master mode, and THEN continued
                    519:         * to call the unlocktty function, which had previously been called
                    520:         * by dcpundial. I snuck in an 'else' statement to get around this.
                    521:         * Tests show that this solves the problem described above, but who
                    522:         * knows if this will cause problems when we are NOT in master mode.
                    523:         */
                    524: 
                    525:        if ( role == MASTER ){
                    526:                printmsg(M_DEBUG,"Sysend: calling undial and hangup routines.");
                    527:                dcpundial();
                    528:        }else{
                    529:                plog(M_CALL,"Sysend: Removing remote device lock file.");
                    530:                if(unlocktty(rdevname) != 0){
                    531:                        plog(M_CALL,"sysend: Possible lock file removal failure.");
                    532:                }
                    533:        }
                    534: 
                    535: 
                    536:        /* May 05, 1992 (Bob H.) problems communicating with a 386 based bbs
                    537:         * and a customer complaint from Germany lead to the discovery of a
                    538:         * condition where undial() was never called, which meant that cicio
                    539:         * NEVER hung up the phone! Adding the dcpundial() in the following
                    540:         * if... resolves this.
                    541:         */
                    542:        if ( !leavelock && lockexist(rmtname) ){
                    543:                dcpundial();
                    544:                plog(M_CALL,"Removing remote site lock");
                    545:                if (lockexist(rmtname)){
                    546: #ifndef _I386
                    547:                        if (lockrm(rmtname)!= 0) {
                    548: #else
                    549:                        if (!lockrm(rmtname)) {
                    550: #endif
                    551:                                printmsg(M_LOG,"sysend: Remote site Lock file removal failed!");
                    552:                                plog(M_CALL,"sysend: Remote site lock file removal failed!");
                    553:                        }
                    554:                }
                    555:        }
                    556:        plog(M_CALL, terminatelevel ?
                    557:                "Abnormal completion {%d}" :
                    558:                "Call completing normally {%d}", processid);
                    559:        close_logfile();
                    560:        sysended = 1;
                    561:        return( (role == MASTER) ? 'I': 'A' );
                    562: }
                    563: 
                    564: /*
                    565:  * scandir()
                    566:  *
                    567:  * scan work dir for "C." files matching current remote host (rmtname)
                    568:  * return:
                    569:  *        Y    - can't open file
                    570:  *        S    - ok
                    571:  *        Q    - no files 
                    572:  */
                    573: 
                    574: extern DIR *opendir();
                    575: extern struct direct *readdir();
                    576: 
                    577: scandir()
                    578: {
                    579:        char fn[DIRSIZ+1];
                    580:        char dirname[CTLFLEN];
                    581:        DIR *dirp;
                    582:        struct dirent *dp;
                    583: 
                    584:        sprintf(dirname, "%s/%s", SPOOLDIR, rmtname); /* build spool dir name */
                    585:        printmsg(M_INFO, "Scandir: %s", dirname);
                    586: 
                    587:        if ((dirp=opendir(dirname)) == NULL)    /* open spool dir */
                    588:                return('Q');
                    589: 
                    590:        fn[0] = fn[DIRSIZ] = '\0';
                    591:        while ( (dp=readdir(dirp)) != NULL ) {
                    592:                printmsg(M_DEBUG, "Scandir: %s", dp->d_name);
                    593:                if ( strncmp("C.", dp->d_name, 2) )     /* is this a C. file? */
                    594:                        continue;
                    595:                if ( (fn[0] == '\0') || (strncmp(dp->d_name, fn, DIRSIZ) < 0) )
                    596:                        strncpy(fn, dp->d_name, DIRSIZ);
                    597:        }
                    598:        closedir(dirp);
                    599: 
                    600:        if (fn[0] != '\0') {
                    601:                sprintf(cfile, "%s/%s/%s", SPOOLDIR, rmtname, fn);
                    602:                printmsg(M_DEBUG, "Scandir: cfile: %s", cfile);
                    603:                if ((cfp = fopen(cfile, "r")) == NULL) {
                    604:                        plog(M_DEBUG, "Unable to open control file %s", cfile);
                    605:                        terminatelevel++;
                    606:                        return('Y');
                    607:                }
                    608:                return('S');
                    609:        }
                    610:        return('Q');
                    611: }

unix.superglobalmegacorp.com

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