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

1.1       root        1: /*     %W%
                      2: */
                      3: #include "uucp.h"
                      4: VERSION(%W%);
                      5: 
                      6: #ifdef BSD4_2
                      7: #include <netdb.h>
                      8: #include <netinet/in.h>
                      9: #include <sys/socket.h>
                     10: #endif
                     11: #ifdef UNET
                     12: #include  "UNET/unetio.h"
                     13: #include  "UNET/tcp.h"
                     14: #endif
                     15: 
                     16: 
                     17: int alarmtr();
                     18: extern jmp_buf Sjbuf;
                     19: extern char *fdig();
                     20: 
                     21: /*
                     22:  *     to add a new caller:
                     23:  *     declare the function that knows how to call on the device,
                     24:  *     add a line to the callers table giving the name of the device
                     25:  *     (from Devices file) and the name of the function
                     26:  *     add the function to the end of this file
                     27:  */
                     28: 
                     29: #ifdef DIAL801
                     30: int    dial801();
                     31: #endif
                     32: 
                     33: #ifdef DATAKIT
                     34: int    dkcall();
                     35: #endif DATAKIT
                     36: 
                     37: #ifdef V8
                     38: int    Dialout();
                     39: #endif
                     40: 
                     41: #ifdef TCP
                     42: int    unetcall();
                     43: int    tcpcall();
                     44: #endif TCP
                     45: 
                     46: #ifdef SYTEK
                     47: int    sytcall();
                     48: #endif SYTEK
                     49: 
                     50: struct caller Caller[] = {
                     51: 
                     52: #ifdef DIAL801
                     53:        {"801",         dial801},
                     54:        {"212",         dial801},
                     55: #endif DIAL801
                     56: 
                     57: #ifdef V8
                     58:        {"Dialout",     Dialout},       /* ditto but using dialout(III) */
                     59: #endif
                     60: 
                     61: #ifdef TCP
                     62: #ifdef BSD4_2
                     63:        {"TCP",         tcpcall},       /* 4.2BSD sockets */
                     64: #else !BSD4_2
                     65: #ifdef UNET
                     66:        {"TCP",         unetcall},      /* 3com implementation of tcp */
                     67:        {"Unetserver",  unetcall},
                     68: #endif UNET
                     69: #endif BSD4_2
                     70: #endif TCP
                     71: 
                     72: #ifdef DATAKIT
                     73:        {"DK",          dkcall},        /* standard AT&T DATAKIT VCS caller */
                     74: #endif DATAKIT
                     75: 
                     76: #ifdef SYTEK
                     77:        {"Sytek",       sytcall},       /* untested but should work */
                     78: #endif SYTEK
                     79: 
                     80:        {NULL,          NULL}           /* this line must be last */
                     81: };
                     82: 
                     83: /***
                     84:  *     exphone - expand phone number for given prefix and number
                     85:  *
                     86:  *     return code - none
                     87:  */
                     88: 
                     89: static void
                     90: exphone(in, out)
                     91: char *in, *out;
                     92: {
                     93:        FILE *fn;
                     94:        char pre[MAXPH], npart[MAXPH], tpre[MAXPH], p[MAXPH];
                     95:        char buf[BUFSIZ];
                     96:        char *s1;
                     97: 
                     98:        if (!isalpha(*in)) {
                     99:                (void) strcpy(out, in);
                    100:                return;
                    101:        }
                    102: 
                    103:        s1=pre;
                    104:        while (isalpha(*in))
                    105:                *s1++ = *in++;
                    106:        *s1 = NULLCHAR;
                    107:        s1 = npart;
                    108:        while (*in != NULLCHAR)
                    109:                *s1++ = *in++;
                    110:        *s1 = NULLCHAR;
                    111: 
                    112:        tpre[0] = NULLCHAR;
                    113:        fn = fopen(DIALFILE, "r");
                    114:        if (fn != NULL) {
                    115:                while (fgets(buf, BUFSIZ, fn)) {
                    116:                        if ( sscanf(buf, "%s%s", p, tpre) < 1)
                    117:                                continue;
                    118:                        if (EQUALS(p, pre))
                    119:                                break;
                    120:                        tpre[0] = NULLCHAR;
                    121:                }
                    122:                fclose(fn);
                    123:        }
                    124: 
                    125:        (void) strcpy(out, tpre);
                    126:        (void) strcat(out, npart);
                    127:        return;
                    128: }
                    129: 
                    130: /*
                    131:  * repphone - Replace \D and \T sequences in arg with phone
                    132:  * expanding and translating as appropriate.
                    133:  */
                    134: static char *
                    135: repphone(arg, phone, trstr)
                    136: register char *arg, *phone, *trstr;
                    137: {
                    138:        extern void translate();
                    139:        static char pbuf[2*(MAXPH+2)];
                    140:        register char *fp, *tp;
                    141: 
                    142:        for (tp=pbuf; *arg; arg++) {
                    143:                if (*arg != '\\') {
                    144:                        *tp++ = *arg;
                    145:                        continue;
                    146:                } else {
                    147:                        switch (*(arg+1)) {
                    148:                        case 'T':
                    149:                                exphone(phone, tp);
                    150:                                translate(trstr, tp);
                    151:                                for(; *tp; tp++)
                    152:                                    ;
                    153:                                arg++;
                    154:                                break;
                    155:                        case 'D':
                    156:                                for(fp=phone; *tp = *fp++; tp++)
                    157:                                    ;
                    158:                                arg++;
                    159:                                break;
                    160:                        default:
                    161:                                *tp++ = *arg;
                    162:                                break;
                    163:                        }
                    164:                }
                    165:        }
                    166:        *tp = '\0';
                    167:        return(pbuf);
                    168: }
                    169: 
                    170: /*
                    171:  * processdev - Process a line from the Devices file
                    172:  *
                    173:  * return codes:
                    174:  *     file descriptor  -  succeeded
                    175:  *     FAIL  -  failed
                    176:  */
                    177: 
                    178: processdev(flds, dev)
                    179: register char *flds[], *dev[];
                    180: {
                    181:        register int dcf = -1;
                    182:        register struct caller  *ca;
                    183:        char *args[D_MAX+1], dcname[20];
                    184:        register char **sdev;
                    185:        extern void translate();
                    186:        register nullfd;
                    187:        char *phonecl;                  /* clear phone string */
                    188:        char phoneex[2*(MAXPH+2)];      /* expanded phone string */
                    189: 
                    190:        sdev = dev;
                    191:        for (ca = Caller; ca->CA_type != NULL; ca++) {
                    192:                /* This will find built-in caller functions */
                    193:                if (EQUALS(ca->CA_type, dev[D_CALLER])) {
                    194:                        DEBUG(5, "Internal caller type %s\n", dev[D_CALLER]);
                    195:                        if (dev[D_ARG] == NULL) {
                    196:                                /* if NULL - assume translate */
                    197:                                dev[D_ARG+1] = NULL;    /* needed for for loop later to mark the end */
                    198:                                dev[D_ARG] = "\\T";
                    199:                        }
                    200:                        dev[D_ARG] = repphone(dev[D_ARG], flds[F_PHONE], "");
                    201:                        if ((dcf = (*(ca->CA_caller))(flds, dev)) < 0)
                    202:                                return(dcf) ;
                    203:                        dev += 2; /* Skip to next CALLER and ARG */
                    204:                        break;
                    205:                }
                    206:        }
                    207:        if (dcf == -1) {
                    208:                /* Here if not a built-in caller function */
                    209:                if (mlock(dev[D_LINE]) == FAIL) { /* Lock the line */
                    210:                        DEBUG(5, "mlock %s failed\n", dev[D_LINE]);
                    211:                        Uerror = SS_LOCKED_DEVICE;
                    212:                        return(FAIL);
                    213:                }
                    214:                DEBUG(5, "mlock %s succeeded\n", dev[D_LINE]);
                    215:                /*
                    216:                 * Open the line
                    217:                 */
                    218:                (void) sprintf(dcname, "/dev/%s", dev[D_LINE]);
                    219:                /* take care of the possible partial open fd */
                    220:                (void) close(nullfd = open("/", 0));
                    221:                if (setjmp(Sjbuf)) {
                    222:                        (void) close(nullfd);
                    223:                        DEBUG(1, "generic open timeout\n", "");
                    224:                        logent("generic open", "TIMEOUT");
                    225:                        Uerror = SS_CANT_ACCESS_DEVICE;
                    226:                        goto bad;
                    227:                }
                    228:                (void) signal(SIGALRM, alarmtr);
                    229:                (void) alarm(10);
                    230:                dcf = open(dcname, 2);
                    231:                (void) alarm(0);
                    232:                if (dcf < 0) {
                    233:                        (void) close(nullfd);
                    234:                        DEBUG(1, "generic open failed, errno = %d\n", errno);
                    235:                        logent("generic open", "FAILED");
                    236:                        Uerror = SS_CANT_ACCESS_DEVICE;
                    237:                        goto bad;
                    238:                }
                    239:                fixline(dcf, atoi(fdig(flds[F_CLASS])), D_DIRECT);
                    240:        }
                    241:        /*
                    242:         * Now loop through the remaining callers and chat
                    243:         * according to scripts in dialers file.
                    244:         */
                    245:        for (; dev[D_CALLER] != NULL; dev += 2) {
                    246:                register int w;
                    247:                /*
                    248:                 * Scan Dialers file to find an entry
                    249:                 */
                    250:                if ((w = gdial(dev[D_CALLER], args, D_MAX)) < 1) {
                    251:                        DEBUG(1, "%s not found in Dialers file\n", dev[D_CALLER]);
                    252:                        logent("generic call to gdial", "FAILED");
                    253:                        Uerror = SS_CANT_ACCESS_DEVICE;
                    254:                        goto bad;
                    255:                }
                    256:                if (w <= 2)     /* do nothing - no chat */
                    257:                        break;
                    258:                /*
                    259:                 * Translate the phone number
                    260:                 */
                    261:                if (dev[D_ARG] == NULL) {
                    262:                        /* if NULL - assume no translation */
                    263:                        dev[D_ARG+1] = NULL; /* needed for for loop to mark the end */
                    264:                        dev[D_ARG] = "\\D";
                    265:                }
                    266:                
                    267:                phonecl = repphone(dev[D_ARG], flds[F_PHONE], args[1]);
                    268:                exphone(phonecl, phoneex);
                    269:                translate(args[1], phoneex);
                    270:                /*
                    271:                 * Chat
                    272:                 */
                    273:                if (chat(w-2, &args[2], dcf, phonecl, phoneex) != SUCCESS) {
                    274:                        Uerror = SS_CHAT_FAILED;
                    275:                        goto bad;
                    276:                }
                    277:        }
                    278:        /*
                    279:         * Success at last!
                    280:         */
                    281:        strcpy(Dc, sdev[D_LINE]);
                    282:        return(dcf);
                    283: bad:
                    284:        (void)close(dcf);
                    285:        delock(sdev[D_LINE]);
                    286:        return(FAIL);
                    287: }
                    288: 
                    289: /*
                    290:  * translate the pairs of characters present in the first
                    291:  * string whenever the first of the pair appears in the second
                    292:  * string.
                    293:  */
                    294: static void
                    295: translate(ttab, str)
                    296: register char *ttab, *str;
                    297: {
                    298:        register char *s;
                    299: 
                    300:        for(;*ttab && *(ttab+1); ttab += 2)
                    301:                for(s=str;*s;s++)
                    302:                        if(*ttab == *s)
                    303:                                *s = *(ttab+1);
                    304: }
                    305: 
                    306: #define MAXLINE        512
                    307: /*
                    308:  * Get the information about the dialer.
                    309:  * gdial(type, arps, narps)
                    310:  *     type    -> type of dialer (e.g., penril)
                    311:  *     arps    -> array of pointers returned by gdial
                    312:  *     narps   -> number of elements in array returned by gdial
                    313:  * Return value:
                    314:  *     -1      -> Can't open DIALERFILE
                    315:  *     0       -> requested type not found
                    316:  *     >0      -> success - number of fields filled in
                    317:  */
                    318: static
                    319: gdial(type, arps, narps)
                    320: register char *type, *arps[];
                    321: register int narps;
                    322: {
                    323:        static char info[MAXLINE];
                    324:        register FILE *ldial;
                    325:        register na;
                    326: 
                    327:        DEBUG(2, "gdial(%s) called\n", type);
                    328:        if ((ldial = fopen(DIALERFILE, "r")) == NULL)
                    329:                return(-1);
                    330:        while (fgets(info, sizeof(info), ldial) != NULL) {
                    331:                if ((info[0] == '#') || (info[0] == ' ') ||
                    332:                    (info[0] == '\t') || (info[0] == '\n'))
                    333:                        continue;
                    334:                if ((na = getargs(info, arps, narps)) == 0)
                    335:                        continue;
                    336:                if (EQUALS(arps[0], type)) {
                    337:                        (void)fclose(ldial);
                    338:                        bsfix(arps);
                    339:                        return(na);
                    340:                }
                    341:        }
                    342:        (void)fclose(ldial);
                    343:        return(0);
                    344: }
                    345: 
                    346: 
                    347: #ifdef DATAKIT
                    348: 
                    349: /***
                    350:  *     dkcall(flds, dev)       make a DATAKIT VCS connection
                    351:  *                               DATAKIT VCS is a trademark of AT&T
                    352:  *
                    353:  *     return codes:
                    354:  *             >0 - file number - ok
                    355:  *             FAIL - failed
                    356:  */
                    357: 
                    358: #include "dk.h"
                    359: 
                    360: dkcall(flds, dev)
                    361: char *flds[], *dev[];
                    362: {
                    363:        register fd;
                    364: #ifdef V8
                    365:        extern int dkp_ld;
                    366: #endif
                    367: 
                    368:        char    dialstring[64];
                    369: 
                    370:        strcpy(dialstring, dev[D_ARG]);
                    371: 
                    372: #ifndef STANDALONE
                    373:        if(*flds[F_CLASS] < '0' || *flds[F_CLASS] > '9')
                    374:                sprintf(dialstring, "%s.%s", dev[D_ARG], flds[F_CLASS]);
                    375: #endif
                    376: 
                    377:        DEBUG(4, "dkcall(%s)\n", dialstring);
                    378: 
                    379: 
                    380: #ifdef V8
                    381:        if (setjmp(Sjbuf)) {
                    382:                Uerror = SS_DIAL_FAILED;
                    383:                return(FAIL);
                    384:        }
                    385: 
                    386:        (void) signal(SIGALRM, alarmtr);
                    387:        (void) alarm(70);
                    388:        DEBUG(4, "tdkdial(%s", dialstring);
                    389:        DEBUG(4, ", %d)\n", atoi(flds[F_CLASS]));
                    390:        if ((fd = tdkdial(dialstring, atoi(flds[F_CLASS]))) >= 0)
                    391:            if (dkproto(fd, dkp_ld) < 0)
                    392:               {
                    393:                close(fd);
                    394:                fd = -1;
                    395:               }
                    396:        (void) alarm(0);
                    397: #else  
                    398:        fd = dkdial(dialstring);
                    399: #endif
                    400: 
                    401:        (void) strcpy(Dc, "DK");
                    402:        if (fd < 0) {
                    403:                Uerror = SS_DIAL_FAILED;
                    404:                return(FAIL);
                    405:        }
                    406:        else
                    407:                return(fd);
                    408: }
                    409: 
                    410: #endif DATAKIT
                    411: 
                    412: #ifdef TCP
                    413: 
                    414: /***
                    415:  *     tcpcall(flds, dev)      make ethernet/socket connection
                    416:  *
                    417:  *     return codes:
                    418:  *             >0 - file number - ok
                    419:  *             FAIL - failed
                    420:  */
                    421: 
                    422: #ifndef BSD4_2
                    423: /*ARGSUSED*/
                    424: tcpcall(flds, dev)
                    425: char   *flds[], *dev[];
                    426: {
                    427:        Uerror = SS_NO_DEVICE;
                    428:        return(FAIL);
                    429: }
                    430: #else BSD4_2
                    431: tcpcall(flds, dev)
                    432: char *flds[], *dev[];
                    433: {
                    434:        int ret;
                    435:        short port;
                    436:        extern int      errno, sys_nerr;
                    437:        extern char *sys_errlist[];
                    438:        struct servent *sp;
                    439:        struct hostent *hp;
                    440:        struct sockaddr_in sin;
                    441: 
                    442:        port = atoi(dev[D_ARG]);
                    443:        if (port == 0) {
                    444:                sp = getservbyname("uucp", "tcp");
                    445:                ASSERT(sp != NULL, "No uucp server", 0, 0);
                    446:                port = sp->s_port;
                    447:        }
                    448:        else port = htons(port);
                    449:        hp = gethostbyname(flds[F_NAME]);
                    450:        if (hp == NULL) {
                    451:                logent("tcpopen", "no such host");
                    452:                Uerror = SS_NO_DEVICE;
                    453:                return(FAIL);
                    454:        }
                    455:        DEBUG(4, "tcpdial host %s, ", flds[F_NAME]);
                    456:        DEBUG(4, "port %d\n", ntohs(port));
                    457: 
                    458:        ret = socket(AF_INET, SOCK_STREAM, 0);
                    459:        if (ret < 0) {
                    460:                if (errno < sys_nerr) {
                    461:                        DEBUG(5, "no socket: %s\n", sys_errlist[errno]);
                    462:                        logent("no socket", sys_errlist[errno]);
                    463:                }
                    464:                else {
                    465:                        DEBUG(5, "no socket, errno %d\n", errno);
                    466:                        logent("tcpopen", "NO SOCKET");
                    467:                }
                    468:                Uerror = SS_NO_DEVICE;
                    469:                return(FAIL);
                    470:        }
                    471:        sin.sin_family = hp->h_addrtype;
                    472:        bcopy(hp->h_addr, (caddr_t)&sin.sin_addr, hp->h_length);
                    473:        sin.sin_port = port;
                    474:        if (setjmp(Sjbuf)) {
                    475:                DEBUG(4, "timeout tcpopen\n", "");
                    476:                logent("tcpopen", "TIMEOUT");
                    477:                Uerror = SS_NO_DEVICE;
                    478:                return(FAIL);
                    479:        }
                    480:        (void) signal(SIGALRM, alarmtr);
                    481:        (void) alarm(30);
                    482:        DEBUG(7, "family: %d\n", sin.sin_family);
                    483:        DEBUG(7, "port: %d\n", sin.sin_port);
                    484:        DEBUG(7, "addr: %08x\n",*((int *) &sin.sin_addr));
                    485:        if (connect(ret, (caddr_t)&sin, sizeof (sin)) < 0) {
                    486:                (void) alarm(0);
                    487:                (void) close(ret);
                    488:                if (errno < sys_nerr) {
                    489:                        DEBUG(5, "connect failed: %s\n", sys_errlist[errno]);
                    490:                        logent("connect failed", sys_errlist[errno]);
                    491:                }
                    492:                else {
                    493:                        DEBUG(5, "connect failed, errno %d\n", errno);
                    494:                        logent("tcpopen", "CONNECT FAILED");
                    495:                }
                    496:                Uerror = SS_NO_DEVICE;
                    497:                return(FAIL);
                    498:        }
                    499:        (void) signal(SIGPIPE, SIG_IGN);  /* watch out for broken ipc link...*/
                    500:        (void) alarm(0);
                    501:        (void) strcpy(Dc, "IPC");
                    502:        return(ret);
                    503: }
                    504: 
                    505: #endif BSD4_2
                    506: 
                    507: /***
                    508:  *     unetcall(flds, dev)     make ethernet connection
                    509:  *
                    510:  *     return codes:
                    511:  *             >0 - file number - ok
                    512:  *             FAIL - failed
                    513:  */
                    514: 
                    515: #ifndef UNET
                    516: unetcall(flds, dev)
                    517: char   *flds[], *dev[];
                    518: {
                    519:        Uerror = SS_NO_DEVICE;
                    520:        return(FAIL);
                    521: }
                    522: #else UNET
                    523: unetcall(flds, dev)
                    524: char *flds[], *dev[];
                    525: {
                    526:        int ret;
                    527:        int port;
                    528:        extern int      errno;
                    529: 
                    530:        port = atoi(dev[D_ARG]);
                    531:        DEBUG(4, "unetdial host %s, ", flds[F_NAME]);
                    532:        DEBUG(4, "port %d\n", port);
                    533:        (void) alarm(30);
                    534:        ret = tcpopen(flds[F_NAME], port, 0, TO_ACTIVE, "rw");
                    535:        (void) alarm(0);
                    536:        endhnent();     /* wave magic wand at 3com and incant "eat it, bruce" */
                    537:        if (ret < 0) {
                    538:                DEBUG(5, "tcpopen failed: errno %d\n", errno);
                    539:                Uerror = SS_DIAL_FAILED;
                    540:                return(FAIL);
                    541:        }
                    542:        (void) strcpy(Dc, "UNET");
                    543:        return(ret);
                    544: }
                    545: #endif UNET
                    546: 
                    547: #endif TCP
                    548: 
                    549: #ifdef SYTEK
                    550: 
                    551: /****
                    552:  *     sytcall(flds, dev)      make a sytek connection
                    553:  *
                    554:  *     return codes:
                    555:  *             >0 - file number - ok
                    556:  *             FAIL - failed
                    557:  */
                    558: 
                    559: /*ARGSUSED*/
                    560: sytcall(flds, dev)
                    561: char *flds[], *dev[];
                    562: {
                    563:        extern int errno;
                    564:        int dcr, dcr2, nullfd, ret;
                    565:        char dcname[20], command[BUFSIZ];
                    566: 
                    567:        (void) sprintf(dcname, "/dev/%s", dev[D_LINE]);
                    568:        DEBUG(4, "dc - %s, ", dcname);
                    569:        dcr = open(dcname, O_WRONLY|O_NDELAY);
                    570:        if (dcr < 0) {
                    571:                Uerror = SS_DIAL_FAILED;
                    572:                DEBUG(4, "OPEN FAILED %s\n", dcname);
                    573:                delock(dev[D_LINE]);
                    574:                return(FAIL);
                    575:        }
                    576: 
                    577:        sytfixline(dcr, atoi(fdig(dev[D_CLASS])), D_DIRECT);
                    578:        (void) sleep(2);
                    579:        (void) sprintf(command,"\r\rcall %s\r",flds[F_PHONE]);
                    580:        ret = write(dcr, command, strlen(command));
                    581:        (void) sleep(1);
                    582:        DEBUG(4, "COM1 return = %d\n", ret);
                    583:        sytfix2line(dcr);
                    584:        (void) close(nullfd = open("/", 0));
                    585:        (void) signal(SIGALRM, alarmtr);
                    586:        if (setjmp(Sjbuf)) {
                    587:                DEBUG(4, "timeout sytek open\n", "");
                    588:                (void) close(nullfd);
                    589:                (void) close(dcr2);
                    590:                (void) close(dcr);
                    591:                Uerror = SS_DIAL_FAILED;
                    592:                delock(dev[D_LINE]);
                    593:                return(FAIL);
                    594:        }
                    595:        (void) alarm(10);
                    596:        dcr2 = open(dcname,O_RDWR);
                    597:        (void) alarm(0);
                    598:        (void) close(dcr);
                    599:        if (dcr2 < 0) {
                    600:                DEBUG(4, "OPEN 2 FAILED %s\n", dcname);
                    601:                Uerror = SS_DIAL_FAILED;
                    602:                (void) close(nullfd);   /* kernel might think dc2 is open */
                    603:                delock(dev[D_LINE]);
                    604:                return(FAIL);
                    605:        }
                    606:        return(dcr2);
                    607: }
                    608: 
                    609: #endif SYTEK
                    610: 
                    611: #ifdef DIAL801
                    612: 
                    613: /***
                    614:  *     dial801(flds, dev)      dial remote machine on 801/801
                    615:  *     char *flds[], *dev[];
                    616:  *
                    617:  *     return codes:
                    618:  *             file descriptor  -  succeeded
                    619:  *             FAIL  -  failed
                    620:  *
                    621:  *     unfortunately, open801() is different for usg and non-usg
                    622:  */
                    623: 
                    624: /*ARGSUSED*/
                    625: dial801(flds, dev)
                    626: char *flds[], *dev[];
                    627: {
                    628:        char dcname[20], dnname[20], phone[MAXPH+2], *fdig();
                    629:        int dcf = -1, speed;
                    630: 
                    631:        if (mlock(dev[D_LINE]) == FAIL) {
                    632:                DEBUG(5, "mlock %s failed\n", dev[D_LINE]);
                    633:                Uerror = SS_LOCKED_DEVICE;
                    634:                return(FAIL);
                    635:        }
                    636:        (void) sprintf(dnname, "/dev/%s", dev[D_CALLDEV]);
                    637:        (void) sprintf(phone, "%s%s", dev[D_ARG]   , ACULAST);
                    638:        (void) sprintf(dcname, "/dev/%s", dev[D_LINE]);
                    639:        CDEBUG(1, "Use Port %s, ", dcname);
                    640:        DEBUG(4, "acu - %s, ", dnname);
                    641:        CDEBUG(1, "Phone Number  %s\n", phone);
                    642:        VERBOSE("Trying modem - %s, ", dcname); /* for cu */
                    643:        VERBOSE("acu - %s, ", dnname);  /* for cu */
                    644:        VERBOSE("calling  %s:  ", phone);       /* for cu */
                    645:        speed = atoi(fdig(dev[D_CLASS]));
                    646:        dcf = open801(dcname, dnname, phone, speed);
                    647:        if (dcf >= 0) {
                    648:                fixline(dcf, speed, D_ACU);
                    649:                (void) strcpy(Dc, dev[D_LINE]); /* for later unlock() */
                    650:                VERBOSE("SUCCEEDED\n", 0);
                    651:        } else {
                    652:                delock(dev[D_LINE]);
                    653:                VERBOSE("FAILED\n", 0);
                    654:        }
                    655:        return(dcf);
                    656: }
                    657: 
                    658: 
                    659: #ifndef ATTSV
                    660: /*ARGSUSED*/
                    661: open801(dcname, dnname, phone, speed)
                    662: char *dcname, *dnname, *phone;
                    663: {
                    664:        int nw, lt, pid = -1, dcf = -1, nullfd, dnf = -1;
                    665:        unsigned timelim;
                    666: 
                    667:        if ((dnf = open(dnname, 1)) < 0) {
                    668:                DEBUG(5, "can't open %s\n", dnname);
                    669:                Uerror = SS_CANT_ACCESS_DEVICE;
                    670:                return(FAIL);
                    671:        }
                    672:        DEBUG(5, "%s is open\n", dnname);
                    673: 
                    674:        (void) close(nullfd = open("/dev/null", 0));    /* partial open hack */
                    675:        if (setjmp(Sjbuf)) {
                    676:                DEBUG(4, "timeout modem open\n", "");
                    677:                logent("801 open", "TIMEOUT");
                    678:                (void) close(nullfd);
                    679:                (void) close(dcf);
                    680:                (void) close(dnf);
                    681:                if (pid > 0) {
                    682:                        kill(pid, 9);
                    683:                        wait((int *) 0);
                    684:                }
                    685:                Uerror = SS_DIAL_FAILED;
                    686:                return(FAIL);
                    687:        }
                    688:        (void) signal(SIGALRM, alarmtr);
                    689:        timelim = 5 * strlen(phone);
                    690:        (void) alarm(timelim < 30 ? 30 : timelim);
                    691:        if ((pid = fork()) == 0) {
                    692:                sleep(2);
                    693:                nw = write(dnf, phone, lt = strlen(phone));
                    694:                if (nw != lt) {
                    695:                        DEBUG(4, "ACU write error %d\n", errno);
                    696:                        logent("ACU write", "FAILED");
                    697:                        exit(1);
                    698:                }
                    699:                DEBUG(4, "ACU write ok%s\n", "");
                    700:                exit(0);
                    701:        }
                    702:        /*  open line - will return on carrier */
                    703:        dcf = open(dcname, 2);
                    704: 
                    705:        DEBUG(4, "dcf is %d\n", dcf);
                    706:        if (dcf < 0) {  /* handle like a timeout */
                    707:                (void) alarm(0);
                    708:                longjmp(Sjbuf, 1);
                    709:        }
                    710: 
                    711:        /* modem is open */
                    712:        while ((nw = wait(&lt)) != pid && nw != -1)
                    713:                ;
                    714:        (void) alarm(0);
                    715: 
                    716:        (void) close(dnf);      /* no reason to keep the 801 open */
                    717:        if (lt != 0) {
                    718:                DEBUG(4, "Fork Stat %o\n", lt);
                    719:                (void) close(dcf);
                    720:                Uerror = SS_DIAL_FAILED;
                    721:                return(FAIL);
                    722:        }
                    723:        return(dcf);
                    724: }
                    725: 
                    726: #else ATTSV
                    727: 
                    728: open801(dcname, dnname, phone, speed)
                    729: char *dcname, *dnname, *phone;
                    730: {
                    731:        int nw, lt, dcf = -1, nullfd, dnf = -1, ret;
                    732:        unsigned timelim;
                    733: 
                    734:        (void) close(nullfd = open("/", 0));    /* partial open hack */
                    735:        if (setjmp(Sjbuf)) {
                    736:                DEBUG(4, "DN write %s\n", "timeout");
                    737:                (void) close(dnf);
                    738:                (void) close(dcf);
                    739:                (void) close(nullfd);
                    740:                Uerror = SS_DIAL_FAILED;
                    741:                return(FAIL);
                    742:        }
                    743:        (void) signal(SIGALRM, alarmtr);
                    744:        timelim = 5 * strlen(phone);
                    745:        (void) alarm(timelim < 30 ? 30 : timelim);
                    746: 
                    747:        if ((dnf = open(dnname, O_WRONLY)) < 0 ) {
                    748:                DEBUG(5, "can't open %s\n", dnname);
                    749:                Uerror = SS_CANT_ACCESS_DEVICE;
                    750:                return(FAIL);
                    751:        }
                    752:        DEBUG(5, "%s is open\n", dnname);
                    753:        if (  (dcf = open(dcname, O_RDWR | O_NDELAY)) < 0 ) {
                    754:                DEBUG(5, "can't open %s\n", dcname);
                    755:                Uerror = SS_CANT_ACCESS_DEVICE;
                    756:                return(FAIL);
                    757:        }
                    758: 
                    759:        DEBUG(4, "dcf is %d\n", dcf);
                    760:        fixline(dcf, speed, D_ACU);
                    761:        nw = write(dnf, phone, lt = strlen(phone));
                    762:        if (nw != lt) {
                    763:                (void) alarm(0);
                    764:                DEBUG(4, "ACU write error %d\n", errno);
                    765:                (void) close(dnf);
                    766:                (void) close(dcf);
                    767:                Uerror = SS_DIAL_FAILED;
                    768:                return(FAIL);
                    769:        } else 
                    770:                DEBUG(4, "ACU write ok%s\n", "");
                    771: 
                    772:        (void) close(dnf);
                    773:        (void) close(nullfd = open("/", 0));    /* partial open hack */
                    774:        ret = open(dcname, 2);  /* wait for carrier  */
                    775:        (void) alarm(0);
                    776:        (void) close(ret);      /* close 2nd modem open() */
                    777:        if (ret < 0) {          /* open() interrupted by alarm */
                    778:                DEBUG(4, "Line open %s\n", "failed");
                    779:                Uerror = SS_DIAL_FAILED;
                    780:                (void) close(nullfd);           /* close partially opened modem */
                    781:                return(FAIL);
                    782:        }
                    783:        (void) fcntl(dcf,F_SETFL, fcntl(dcf, F_GETFL, 0) & ~O_NDELAY);
                    784:        return(dcf);
                    785: }
                    786: #endif ATTSV
                    787: 
                    788: #endif DIAL801
                    789: 
                    790: #ifdef V8
                    791: Dialout(flds)
                    792: char *flds[];
                    793: {
                    794:     int fd;
                    795:     char phone[MAXPH+2];
                    796: 
                    797:     exphone(flds[F_PHONE], phone);
                    798: 
                    799:     DEBUG(4, "call dialout(%s", phone);
                    800:     DEBUG(4, ", %s)\n", flds[F_CLASS]);
                    801:     fd = dialout(phone, flds[F_CLASS]);
                    802:     if (fd == -1)
                    803:        Uerror = SS_NO_DEVICE;
                    804:     if (fd == -3)
                    805:        Uerror = SS_DIAL_FAILED;
                    806:     if (fd == -9)
                    807:        Uerror = SS_DEVICE_FAILED;
                    808: 
                    809:     (void) strcpy(Dc, "Dialout");
                    810: 
                    811:     return(fd);
                    812: }
                    813: #endif V8

unix.superglobalmegacorp.com

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