Annotation of researchv8dc/cmd/uucp/conn.c, revision 1.1.1.1

1.1       root        1: /*     @(#)conn.c      1.16
                      2: */
                      3: #include "uucp.h"
                      4: VERSION(@(#)conn.c     1.16);
                      5: 
                      6: static char _ProtoStr[20] = "";        /* protocol string from Systems file entry */
                      7: extern jmp_buf Sjbuf;
                      8: 
                      9: int alarmtr();
                     10: static void getProto();
                     11: /* static getto(), finds();   PUT this back after altconn is included */
                     12: extern getto();
                     13: static finds();
                     14: 
                     15: static notin(), ifdate(), classmatch();
                     16: 
                     17: extern struct caller caller[];
                     18: 
                     19: /* Needed for cu for force which line will be used */
                     20: #ifdef STANDALONE
                     21: extern char *Myline;
                     22: #endif STANDALONE
                     23: 
                     24: /*
                     25:  * conn - place a telephone call to system and login, etc.
                     26:  *
                     27:  * return codes:
                     28:  *     FAIL - connection failed
                     29:  *     >0  - file no.  -  connect ok
                     30:  * When a failure occurs, Uerror is set.
                     31:  */
                     32: 
                     33: conn(system)
                     34: char *system;
                     35: {
                     36:        int nf, fn = FAIL;
                     37:        char *flds[F_MAX+1];
                     38:        FILE *fsys;
                     39: #ifdef MANYSYS
                     40:        int nsys = 0;
                     41:        int lerror = 0;         /* local copy so first error is saved */
                     42:        FILE *sysopen();
                     43: #endif
                     44: 
                     45:        CDEBUG(4, "conn(%s)\n", system);
                     46: #ifndef MANYSYS
                     47:        fsys = fopen(SYSFILE, "r");
                     48:        ASSERT(fsys != NULL, Ct_OPEN, SYSFILE, errno);
                     49: #else
                     50:        sysrewind();
                     51:        while ((fsys = sysopen("r")) != NULL) {
                     52:                nsys++;
                     53: #endif
                     54:        Uerror = 0;
                     55:        while ((nf = finds(fsys, system, flds, F_MAX)) > 0) {
                     56:                fn = getto(flds);
                     57:                CDEBUG(4, "getto ret %d\n", fn);
                     58:                if (fn < 0)
                     59:                    continue;
                     60: 
                     61: #ifdef STANDALONE
                     62:                fclose(fsys);
                     63:                return(fn);
                     64: #else !STANDALONE
                     65:                if (chat(nf - F_LOGIN, flds + F_LOGIN, fn,"","") == SUCCESS) {
                     66:                        fclose(fsys);
                     67:                        return(fn); /* successful return */
                     68:                }
                     69: 
                     70:                /* login failed */
                     71:                DEBUG(6, "close caller (%d)\n", fn);
                     72:                close(fn);
                     73:                if (Dc[0] != NULLCHAR) {
                     74:                        DEBUG(6, "delock(%s)\n", Dc);
                     75:                        delock(Dc);
                     76:                }
                     77: #endif STANDALONE
                     78:        }
                     79: 
                     80:        /* finds or getto failed */
                     81:        fclose(fsys);
                     82: #ifdef MANYSYS
                     83:        if (lerror == 0 && Uerror != SS_BADSYSTEM)
                     84:                lerror = Uerror;
                     85:        CDEBUG(4, "not in this Systems; Uerror %d\n", Uerror);
                     86:        }
                     87:        ASSERT(nsys != 0, Ct_OPEN, SYSFILE, errno);
                     88:        if (lerror)
                     89:                Uerror = lerror;
                     90: #endif
                     91:        CDEBUG(1, "Call Failed: %s\n", UERRORTEXT);
                     92:        return(FAIL);
                     93: }
                     94: 
                     95: /*
                     96:  * getto - connect to remote machine
                     97:  *
                     98:  * return codes:
                     99:  *     >0  -  file number - ok
                    100:  *     FAIL  -  failed
                    101:  */
                    102: 
                    103: getto(flds)
                    104: char *flds[];
                    105: {
                    106:        FILE *dfp;
                    107:        char *dev[D_MAX+2], devbuf[BUFSIZ];
                    108:        register int status;
                    109:        register int dcf = -1;
                    110:        int reread = 0;
                    111:        int tries = 0;  /* count of call attempts - for limit purposes */
                    112: 
                    113:        CDEBUG(1, "Device Type %s wanted\n", flds[F_TYPE]);
                    114:        dfp = fopen(DEVFILE, "r");
                    115:        ASSERT(dfp != NULL, Ct_OPEN, DEVFILE, errno);
                    116:        Uerror = 0;
                    117:        while (tries < TRYCALLS) {
                    118:                if ((status=rddev(dfp, flds[F_TYPE], dev, devbuf, D_MAX)) == FAIL) {
                    119:                        if (tries == 0 || ++reread >= TRYCALLS)
                    120:                                break;
                    121:                        rewind(dfp);
                    122:                        continue;
                    123:                }
                    124:                /* check class, check (and possibly set) speed */
                    125:                if (classmatch(flds, dev) != SUCCESS)
                    126:                        continue;
                    127:                if ((dcf = processdev(flds, dev)) >= 0)
                    128:                        break;
                    129: 
                    130:                switch(Uerror) {
                    131:                case SS_CANT_ACCESS_DEVICE:
                    132:                case SS_DEVICE_FAILED:
                    133:                case SS_LOCKED_DEVICE:
                    134:                        break;
                    135:                default:
                    136:                        tries++;
                    137:                        break;
                    138:                }
                    139:        }
                    140:        (void) fclose(dfp);
                    141:        if (status == FAIL && !Uerror) {
                    142:                CDEBUG(1, "Requested Device Type Not Found\n", 0);
                    143:                Uerror = SS_NO_DEVICE;
                    144:        }
                    145:        return(dcf);
                    146: }
                    147: 
                    148: /*
                    149:  * classmatch - process 'Any' in Devices and Systems and
                    150:  *     determine the correct speed, or match for ==
                    151:  */
                    152: 
                    153: static int
                    154: classmatch(flds, dev)
                    155: char *flds[], *dev[];
                    156: {
                    157:        /* check class, check (and possibly set) speed */
                    158:        if (EQUALS(flds[F_CLASS], "Any")
                    159:           && EQUALS(dev[D_CLASS], "Any")) {
                    160:                dev[D_CLASS] = flds[F_CLASS] = DEFAULT_BAUDRATE;
                    161:                return(SUCCESS);
                    162:        } else if (EQUALS(dev[F_CLASS], "Any")) {
                    163:                dev[D_CLASS] = flds[F_CLASS];
                    164:                return(SUCCESS);
                    165:        } else if (EQUALS(flds[F_CLASS], "Any")) {
                    166:                flds[D_CLASS] = dev[F_CLASS];
                    167:                return(SUCCESS);
                    168:        } else if (EQUALS(flds[F_CLASS], dev[D_CLASS]))
                    169:                return(SUCCESS);
                    170:        else
                    171:                return(FAIL);
                    172: }
                    173: 
                    174: 
                    175: /***
                    176:  *     rddev - find and unpack a line from device file for this caller type 
                    177:  *     lines starting with whitespace of '#' are comments
                    178:  *
                    179:  *     return codes:
                    180:  *             >0  -  number of arguments in vector - succeeded
                    181:  *             FAIL - EOF
                    182:  ***/
                    183: 
                    184: rddev(fp, type, dev, buf, devcount)
                    185: FILE *fp;
                    186: char *type;
                    187: char *dev[];
                    188: char *buf;
                    189: {
                    190:        int na;
                    191: 
                    192:        while (fgets(buf, BUFSIZ, fp) != NULL) {
                    193:                if (buf[0] == ' ' || buf[0] == '\t'
                    194:                    ||  buf[0] == '\n' || buf[0] == '\0' || buf[0] == '#')
                    195:                        continue;
                    196:                na = getargs(buf, dev, devcount);
                    197:                ASSERT(na >= D_CALLER, "BAD LINE", buf, na);
                    198: 
                    199: /* For cu -- to force the requested line to be used */
                    200: #ifdef STANDALONE
                    201:                if ((Myline != NULL) && (!EQUALS(Myline, dev[D_LINE])) )
                    202:                    continue;
                    203: #endif STANDALONE
                    204: 
                    205:                bsfix(dev);     /* replace \X fields */
                    206:                if (EQUALS(dev[D_TYPE], type))
                    207:                        return(na);
                    208:        }
                    209:        return(FAIL);
                    210: }
                    211: 
                    212: 
                    213: /*
                    214:  * finds       - set system attribute vector
                    215:  *
                    216:  * input:
                    217:  *     fsys - open Systems file descriptor
                    218:  *     sysnam - system name to find
                    219:  * output:
                    220:  *     flds - attibute vector from Systems file
                    221:  *     fldcount - number of fields in flds
                    222:  * return codes:
                    223:  *     >0  -  number of arguments in vector - succeeded
                    224:  *     FAIL - failed
                    225:  * Uerror set:
                    226:  *     0 - found a line in Systems file
                    227:  *     SS_BADSYSTEM - no line found in Systems file
                    228:  *     SS_TIME_WRONG - wrong time to call
                    229:  */
                    230: 
                    231: static
                    232: finds(fsys, sysnam, flds, fldcount)
                    233: char *sysnam, *flds[];
                    234: FILE *fsys;
                    235: {
                    236:        static char info[BUFSIZ];
                    237:        int na;
                    238: 
                    239:        /* format of fields
                    240:         *      0 name;
                    241:         *      1 time
                    242:         *      2 acu/hardwired
                    243:         *      3 speed
                    244:         *      etc
                    245:         */
                    246:        while (fgets(info, BUFSIZ, fsys) != NULL) {
                    247:                if (info[0] == '#')
                    248:                        continue;
                    249:                na = getargs(info, flds, fldcount);
                    250:                bsfix(flds);    /* replace \X fields */
                    251:                if ( !EQUALSN(sysnam, flds[F_NAME], SYSNSIZE))
                    252:                        continue;
                    253: #ifndef STANDALONE
                    254:                if (ifdate(flds[F_TIME])) {
                    255:                        /*  found a good entry  */
                    256:                        getProto(flds[F_TYPE]);
                    257:                        Uerror = 0;
                    258:                        return(na);     /* FOUND OK LINE */
                    259:                }
                    260:                CDEBUG(1, "Wrong Time To Call: %s\n", flds[F_TIME]);
                    261:                Uerror = SS_TIME_WRONG;
                    262: #else !STANDALONE
                    263:                        Uerror = 0;
                    264:                        return(na);     /* FOUND OK LINE */
                    265: #endif STANDALONE
                    266:        }
                    267:        if (!Uerror)
                    268:                Uerror = SS_BADSYSTEM;
                    269:        return(FAIL);
                    270: }
                    271: 
                    272: /*
                    273:  * getProto - get the protocol letters from the input string.
                    274:  * input:
                    275:  *     str - string from Systems file (flds[F_TYPE])--the ,
                    276:  *             delimits the protocol string
                    277:  *             e.g. ACU,g or DK,d
                    278:  * output:
                    279:  *     str - the , (if present) will be replaced with NULLCHAR
                    280:  *     global ProtoStr will be modified
                    281:  * return:  none
                    282:  */
                    283: 
                    284: static
                    285: void
                    286: getProto(str)
                    287: char *str;
                    288: {
                    289:        register char *p;
                    290:        if ( (p=strchr(str, ',')) != NULL) {
                    291:                *p = NULLCHAR;
                    292:                (void) strcpy(_ProtoStr, p+1);
                    293:                DEBUG(7, "ProtoStr = %s\n", _ProtoStr);
                    294:        }
                    295:        else
                    296:                *_ProtoStr = NULLCHAR;
                    297: }
                    298: 
                    299: /*
                    300:  * check for a specified protocol selection string
                    301:  * return:
                    302:  *     protocol string pointer
                    303:  *     NULL if none specified for LOGNAME
                    304:  */
                    305: char *
                    306: protoString()
                    307: {
                    308:        return(_ProtoStr[0] == NULLCHAR ? NULL : _ProtoStr);
                    309: }
                    310: 
                    311: static int _Echoflag;
                    312: static int _Slowflag;
                    313: /*
                    314:  * chat -      do conversation
                    315:  * input:
                    316:  *     flds - fields from Systems file
                    317:  *     nf - number of fields in flds array
                    318:  *     dcr - write file number
                    319:  *     phstr1 - phone number to replace \D
                    320:  *     phstr2 - phone number to replace \T
                    321:  *
                    322:  *     return codes:  0  |  FAIL
                    323:  */
                    324: 
                    325: chat(nf, flds, fn, phstr1, phstr2)
                    326: char *flds[], *phstr1, *phstr2;
                    327: int nf, fn;
                    328: {
                    329:        char *want, *altern;
                    330:        extern char *index();
                    331:        int k, ok;
                    332: 
                    333:        _Echoflag = 0;
                    334:        _Slowflag = 0;
                    335:        for (k = 0; k < nf; k += 2) {
                    336:                want = flds[k];
                    337:                ok = FAIL;
                    338:                while (ok != 0) {
                    339:                        altern = index(want, '-');
                    340:                        if (altern != NULL)
                    341:                                *altern++ = NULLCHAR;
                    342:                        ok = expect(want, fn);
                    343:                        if (ok == 0)
                    344:                                break;
                    345:                        if (altern == NULL) {
                    346:                                Uerror = SS_LOGIN_FAILED;
                    347:                                logent(UERRORTEXT, "FAILED");
                    348:                                return(FAIL);
                    349:                        }
                    350:                        want = index(altern, '-');
                    351:                        if (want != NULL)
                    352:                                *want++ = NULLCHAR;
                    353:                        sendthem(altern, fn, phstr1, phstr2);
                    354:                }
                    355:                sleep(2);
                    356:                if (flds[k+1])
                    357:                    sendthem(flds[k+1], fn, phstr1, phstr2);
                    358:        }
                    359:        return(0);
                    360: }
                    361: 
                    362: #define MR 500
                    363: 
                    364: /***
                    365:  *     expect(str, fn) look for expected string
                    366:  *     char *str;
                    367:  *
                    368:  *     return codes:
                    369:  *             0  -  found
                    370:  *             FAIL  -  lost line or too many characters read
                    371:  *             some character  -  timed out
                    372:  */
                    373: 
                    374: expect(str, fn)
                    375: char *str;
                    376: int fn;
                    377: {
                    378:        static char rdvec[MR];
                    379:        char *rp = rdvec;
                    380:        register int kr, c;
                    381:        char nextch;
                    382:        extern  errno;
                    383: 
                    384:        *rp = 0;
                    385: 
                    386:        CDEBUG(4, "expect: (", 0);
                    387:        for (c=0; kr=str[c]; c++)
                    388:                if (kr < 040) {
                    389:                        CDEBUG(4, "^%c", kr | 0100);
                    390:                } else
                    391:                        CDEBUG(4, "%c", kr);
                    392:        CDEBUG(4, ")\n", 0);
                    393: 
                    394:        if (EQUALS(str, "\"\"")) {
                    395:                CDEBUG(4, "got it\n", 0);
                    396:                return(0);
                    397:        }
                    398:        if (setjmp(Sjbuf)) {
                    399:                return(FAIL);
                    400:        }
                    401:        (void) signal(SIGALRM, alarmtr);
                    402:        alarm(MAXEXPECTTIME);
                    403:        while (notin(str, rdvec)) {
                    404:                errno = 0;
                    405:                kr = read(fn, &nextch, 1);
                    406:                if (kr <= 0) {
                    407:                        alarm(0);
                    408:                        CDEBUG(4, "lost line errno - %d\n", errno);
                    409:                        logent("LOGIN", "LOST LINE");
                    410:                        return(FAIL);
                    411:                }
                    412:                c = nextch & 0177;
                    413:                if ((*rp = c) != NULLCHAR) {
                    414:                        CDEBUG(4, "%s", c < 040 ? "^" : "");
                    415:                        CDEBUG(4, "%c", c < 040 ? c | 0100 : c);
                    416:                        rp++;
                    417:                }
                    418:                if (rp >= rdvec + MR) {
                    419:                        CDEBUG(4, "enough already\n", 0);
                    420:                        alarm(0);
                    421:                        return(FAIL);
                    422:                }
                    423:                *rp = NULLCHAR;
                    424:        }
                    425:        alarm(0);
                    426:        CDEBUG(4, "got it\n", 0);
                    427:        return(0);
                    428: }
                    429: 
                    430: 
                    431: /***
                    432:  *     alarmtr()  -  catch alarm routine for "expect".
                    433:  */
                    434: 
                    435: alarmtr()
                    436: {
                    437:        CDEBUG(6, "timed out\n", 0);
                    438:        longjmp(Sjbuf, 1);
                    439: }
                    440: 
                    441: 
                    442: /***
                    443:  *     sendthem(str, fn, phstr1, phstr2)       send line of chat sequence
                    444:  *     char *str, *phstr;
                    445:  *
                    446:  *     return codes:  none
                    447:  */
                    448: 
                    449: sendthem(str, fn, phstr1, phstr2)
                    450: char *str, *phstr1, *phstr2;
                    451: int fn;
                    452: {
                    453:        int sendcr = 1;
                    454:        register char   *sptr, *pptr;
                    455: 
                    456:        if (PREFIX("BREAK", str)) {
                    457:                /* send break */
                    458:                CDEBUG(5, "BREAK\n", 0);
                    459:                genbrk(fn);
                    460:                return;
                    461:        }
                    462: 
                    463:        if (EQUALS(str, "EOT")) {
                    464:                CDEBUG(5, "EOT\n", 0);
                    465:                (void) write(fn, EOTMSG, strlen(EOTMSG));
                    466:                return;
                    467:        }
                    468: 
                    469:        if (EQUALS(str, "\"\"")) {
                    470:                CDEBUG(5, "\"\"\n", 0);
                    471:                str += 2;
                    472:        }
                    473: 
                    474:        CDEBUG(5, "sendthem (", "");
                    475:        if (setjmp(Sjbuf))      /* Timer so echo check doesn't last forever */
                    476:                goto err;
                    477:        (void) signal(SIGALRM, alarmtr);
                    478:        alarm(MAXEXPECTTIME);
                    479:        for (sptr = str; *sptr; sptr++) {
                    480:                if (*sptr == '\\')
                    481:                        switch(*++sptr) {
                    482:                        case 'D':
                    483:                                for (pptr=phstr1; *pptr; pptr++)
                    484:                                        if (wrchar(fn, pptr))
                    485:                                                goto err;
                    486:                                continue;
                    487:                        case 'T':
                    488:                                for (pptr=phstr2; *pptr; pptr++)
                    489:                                        if (wrchar(fn, pptr))
                    490:                                                goto err;
                    491:                                continue;
                    492:                        case 'N':
                    493:                                *sptr = 0;
                    494:                                break;
                    495:                        case 'd':
                    496:                                CDEBUG(5, "DELAY\n", 0);
                    497:                                sleep(2);
                    498:                                continue;
                    499:                        case 'c':
                    500:                                if (*(sptr+1) == NULLCHAR) {
                    501:                                CDEBUG(5, "<NO CR>", 0);
                    502:                                        sendcr = 0;
                    503:                                        continue;
                    504:                                }
                    505:                                CDEBUG(5, "<NO CR - MIDDLE IGNORED>\n", 0);
                    506:                                continue;
                    507:                        case 's':
                    508:                                *sptr = ' ';
                    509:                                break;
                    510:                        case 'p':
                    511:                                CDEBUG(5, "PAUSE\n", 0);
                    512:                                nap(HZ/4);      /* approximately 1/4 second */
                    513:                                continue;
                    514:                        case 'E':
                    515:                                CDEBUG(5, "ECHO CHECK ON\n", 0);
                    516:                                _Echoflag = 1;
                    517:                                continue;
                    518:                        case 'e':
                    519:                                CDEBUG(5, "ECHO CHECK OFF\n", 0);
                    520:                                _Echoflag = 0;
                    521:                                continue;
                    522:                        case 'K':
                    523:                                CDEBUG(5, "BREAK\n", 0);
                    524:                                genbrk(fn);
                    525:                                continue;
                    526:                        case 'W':
                    527:                                _Slowflag = 1;
                    528:                                continue;
                    529:                        case 'w':
                    530:                                _Slowflag = 0;
                    531:                                continue;
                    532:                        case '\\':
                    533:                                /* backslash escapes itself */
                    534:                                break;
                    535:                        default:
                    536:                                /* send the backslash */
                    537:                                --sptr;
                    538:                                break;
                    539:                        }
                    540:                if (wrchar(fn, sptr))
                    541:                        goto err;
                    542:        }
                    543: 
                    544:        if (sendcr) {
                    545:                CDEBUG(5, "^M", 0);
                    546:                (void) write(fn, "\r", 1);
                    547:        }
                    548: err:
                    549:        alarm(0);
                    550:        CDEBUG(5, ")\n", 0);
                    551:        return;
                    552: }
                    553: 
                    554: wrchar(fn, sptr)
                    555: register int fn;
                    556: register char *sptr;
                    557: {
                    558:        if (GRPCHK(getgid()))   /* protect Systems file */
                    559:        {
                    560:                CDEBUG(5, "%s", *sptr < 040 ? "^" : "");
                    561:                CDEBUG(5, "%c", *sptr < 040 ? *sptr | 0100 : *sptr);
                    562:        }
                    563:        if ((write(fn, sptr, 1)) != 1)
                    564:                return(FAIL);
                    565:        if (_Echoflag) {
                    566:                char chr;
                    567:                while(1) {      /* Should set a timer here */
                    568:                        if (read(fn, &chr, 1) != 1)
                    569:                                return(FAIL);
                    570:                        chr &= 0177;
                    571:                        CDEBUG(4, "%s", chr < 040 ? "^" : "");
                    572:                        CDEBUG(4, "%c", chr < 040 ? chr | 0100 : chr);
                    573:                        if (chr == ((*sptr) & 0177))
                    574:                                break;
                    575:                }
                    576: 
                    577:        }
                    578:        if (_Slowflag)
                    579:                sleep(1);
                    580:        return(SUCCESS);
                    581: }
                    582: 
                    583: 
                    584: /***
                    585:  *     notin(sh, lg)   check for occurrence of substring "sh"
                    586:  *     char *sh, *lg;
                    587:  *
                    588:  *     return codes:
                    589:  *             0  -  found the string
                    590:  *             1  -  not in the string
                    591:  */
                    592: 
                    593: static
                    594: notin(sh, lg)
                    595: char *sh, *lg;
                    596: {
                    597:        while (*lg != NULLCHAR) {
                    598:                if (PREFIX(sh, lg))
                    599:                        return(0);
                    600:                else
                    601:                        lg++;
                    602:        }
                    603:        return(1);
                    604: }
                    605: 
                    606: 
                    607: /*******
                    608:  *     ifdate(s)
                    609:  *     char *s;
                    610:  *
                    611:  *     ifdate  -  this routine will check a string (s)
                    612:  *     like "MoTu0800-1730" to see if the present
                    613:  *     time is within the given limits.
                    614:  *     SIDE EFFECT - Retrytime is set to number following ";"
                    615:  *
                    616:  *     String alternatives:
                    617:  *             Wk - Mo thru Fr
                    618:  *             zero or one time means all day
                    619:  *             Any - any day
                    620:  *
                    621:  *     return codes:
                    622:  *             0  -  not within limits
                    623:  *             1  -  within limits
                    624:  */
                    625: 
                    626: static
                    627: ifdate(s)
                    628: char *s;
                    629: {
                    630:        static char *days[] = {
                    631:                "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", 0
                    632:        };
                    633:        time_t  clock;
                    634:        int     t__now;
                    635:        char    *p, *rindex(), *index();
                    636:        struct tm       *tp;
                    637: 
                    638:        time(&clock);
                    639:        tp = localtime(&clock);
                    640:        t__now = tp->tm_hour * 100 + tp->tm_min;        /* "navy" time */
                    641: 
                    642:        /*
                    643:         *      pick up retry time for failures
                    644:         *      global variable Retrytime is set here
                    645:         */
                    646:        if ((p = rindex(s, ';')) != NULL)
                    647:            if (isdigit(p[1])) {
                    648:                if (sscanf(p+1, "%d", &Retrytime) < 1)
                    649:                        Retrytime = 5;  /* 5 minutes is error default */
                    650:                Retrytime  *= 60;
                    651:                *p = NULLCHAR;
                    652:            }
                    653: 
                    654:        while (*s) {
                    655:                int     i, dayok;
                    656: 
                    657:                for (dayok = 0; (!dayok) && isalpha(*s); s++) {
                    658:                        if (PREFIX("Any", s))
                    659:                                dayok = 1;
                    660:                        else if (PREFIX("Wk", s)) {
                    661:                                if (tp->tm_wday >= 1 && tp->tm_wday <= 5)
                    662:                                        dayok = 1;
                    663:                        } else
                    664:                                for (i = 0; days[i]; i++)
                    665:                                        if (PREFIX(days[i], s))
                    666:                                                if (tp->tm_wday == i)
                    667:                                                        dayok = 1;
                    668:                }
                    669: 
                    670:                if (dayok) {
                    671:                        int     t__low, t__high;
                    672: 
                    673:                        while (isalpha(*s))     /* flush remaining day stuff */
                    674:                                s++;
                    675: 
                    676:                        if ((sscanf(s, "%d-%d", &t__low, &t__high) < 2)
                    677:                         || (t__low == t__high))
                    678:                                return(1);
                    679: 
                    680:                        /* 0000 crossover? */
                    681:                        if (t__low < t__high) {
                    682:                                if (t__low <= t__now && t__now <= t__high)
                    683:                                        return(1);
                    684:                        } else if (t__low <= t__now || t__now <= t__high)
                    685:                                return(1);
                    686: 
                    687:                        /* aim at next time slot */
                    688:                        if ((s = index(s, ',')) == NULL)
                    689:                                break;
                    690:                }
                    691:                s++;
                    692:        }
                    693:        return(0);
                    694: }
                    695: 
                    696: /***
                    697:  *     char *
                    698:  *     fdig(cp)        find first digit in string
                    699:  *
                    700:  *     return - pointer to first digit in string or end of string
                    701:  */
                    702: 
                    703: char *
                    704: fdig(cp)
                    705: char *cp;
                    706: {
                    707:        char *c;
                    708: 
                    709:        for (c = cp; *c; c++)
                    710:                if (*c >= '0' && *c <= '9')
                    711:                        break;
                    712:        return(c);
                    713: }
                    714: 
                    715: 
                    716: #ifdef FASTTIMER
                    717: /*     Sleep in increments of 60ths of second. */
                    718: nap (time)
                    719: register int time;
                    720: {
                    721:        static int fd;
                    722: 
                    723:        if (fd == 0)
                    724:                fd = open (FASTTIMER, 0);
                    725: 
                    726:        read (fd, 0, time);
                    727: }
                    728: 
                    729: #endif FASTTIMER
                    730: 
                    731: #ifdef BSD4_2
                    732: 
                    733:        /* nap(n) -- sleep for 'n' ticks of 1/60th sec each. */
                    734:        /* This version, by Mark Horton, uses the select system call */
                    735: 
                    736: 
                    737: nap(n)
                    738: unsigned n;
                    739: {
                    740:        struct timeval tv;
                    741:        int rc;
                    742: 
                    743:        if (n==0)
                    744:                return;
                    745:        tv.tv_sec = n/60;
                    746:        tv.tv_usec = ((n%60)*1000000L)/60;
                    747:        rc = select(32, 0, 0, 0, &tv);
                    748: }
                    749: 
                    750: #endif BSD4_2
                    751: 
                    752: #ifdef NONAP
                    753: 
                    754: /*     nap(n) where n is ticks
                    755:  *
                    756:  *     loop using n/HZ part of a second
                    757:  *     if n represents more than 1 second, then
                    758:  *     use sleep(time) where time is the equivalent
                    759:  *     seconds rounded off to full seconds
                    760:  *     NOTE - this is a rough approximation and chews up
                    761:  *     processor resource!
                    762:  */
                    763: 
                    764: nap(n)
                    765: unsigned n;
                    766: {
                    767:        struct tms      tbuf;
                    768:        long endtime;
                    769:        int i;
                    770: 
                    771:        if (n > HZ) {
                    772:                /* > second, use sleep, rounding time */
                    773:                sleep( (int) (((n)+HZ/2)/HZ) );
                    774:                return;
                    775:        }
                    776: 
                    777:        /* use timing loop for < 1 second */
                    778:        endtime = times(&tbuf) + 3*n/4; /* use 3/4 because of scheduler! */
                    779:        while (times(&tbuf) < endtime) {
                    780:            for (i=0; i<1000; i++, i*i)
                    781:                ;
                    782:        }
                    783:        return;
                    784: }
                    785: 
                    786: 
                    787: #endif NONAP

unix.superglobalmegacorp.com

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