Annotation of researchv8dc/cmd/uucp/callers.c, revision 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.