Annotation of coherent/a/usr/bob/uusrc/modemcap/dial.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *  dial.c
        !             3:  *
        !             4:  *  Implement the dial(3) function calls.
        !             5:  *
        !             6:  *  Copyright 1987 (c) John F. Haugh II
        !             7:  *  Changes Copyright 1989-91 (c) Mark Williams Company
        !             8:  */
        !             9: 
        !            10: #include <stdio.h>
        !            11: #include <signal.h>
        !            12: #include <sys/fcntl.h>
        !            13: #include "modemcap.h"
        !            14: #include "dial.h"
        !            15: #include "dcp.h"
        !            16: #include "ldev.h"
        !            17: 
        !            18: 
        !            19: char   *devname = NULL;        /* Communications Device Name Connected */
        !            20: char   *rdevname = NULL;       /* Remote device name */
        !            21: 
        !            22: static char    login_lock[15];
        !            23: static char    enableme[16];
        !            24: static int     modemfd = -1;
        !            25: extern char    *strtok();
        !            26: extern int     hupcatch();
        !            27: 
        !            28: /*
        !            29:  *  dial(cp)  CALL cp;
        !            30:  *
        !            31:  *  Dial and initiate the call specified via the given CALL data structure.
        !            32:  *  Returns the opened file descriptor to be used for reads and writes to
        !            33:  *  the determined device line.  If there is an error, then the return value
        !            34:  *  is less than zero, and the variable "merror" is set appropriately.
        !            35:  */
        !            36: 
        !            37: dial(cp)
        !            38: CALL *cp;
        !            39: {
        !            40:        char    modemline[64];          /* device name                  */
        !            41:        char    *modemname = "\0";
        !            42:        char    *strcpy (),
        !            43:        *strcat ();
        !            44:        int     fd, err;
        !            45:        
        !            46:        fd = -1;                /* channel illegal until line is opened */
        !            47:        if ( (err=findline(cp, &modemname)) <= 0 )
        !            48:                goto error;
        !            49:        strcat(strcpy(modemline, DEVDIR), cp->line);
        !            50:        if ((fd = open (modemline, O_RDWR)) < 0) { /* can't open modem line */
        !            51:                err = M_L_PROB;
        !            52:                goto error;
        !            53:        }
        !            54:        if ( (err=ttyinit(fd, cp->baud)) != 0 )
        !            55:                goto error;
        !            56: 
        !            57:        initmodem(modemname, fd);       /* setup modemcap variables */
        !            58:        if (cp->telno == NULL)     /* no phone number, connection complete */
        !            59:                goto okay;
        !            60:        if (! DI) {                     /* modem has no ACU!!! */
        !            61:                /* plog("Says no acu to attatch to???"); */
        !            62:                err = M_A_PROB;         /* no ACU to attach to */
        !            63:                goto error;
        !            64:        }
        !            65:        if (BD != cp->baud) {   /* is connection desired at high speed? */
        !            66:                if (BL != cp->baud) {/* is connection desired at low speed? */
        !            67:                        err = M_ILL_BD; /* modem can't handle this speed */
        !            68:                        goto error;
        !            69:                }
        !            70:                BD = BL;                /* set baud to low baud rate */
        !            71:                CO = CL;        /* set connect reply to low baud reply */
        !            72:        }
        !            73:        if (err = mdial (cp->telno, fd))        /* some error trying to dial */
        !            74:                goto error;
        !            75: 
        !            76: okay:
        !            77:        return (modemfd = fd);
        !            78: error:
        !            79:        hangup(fd);
        !            80:        return (merrno = err);
        !            81: }
        !            82: 
        !            83: /* undial()    
        !            84:  * removes the lock on the remote device if it exists and reenables
        !            85:  * the port. Undial() is called by hangup(), which was called by 
        !            86:  * sysend(). Bob H. 11/22/91.
        !            87: */
        !            88: undial (fd)
        !            89: int    fd;
        !            90: {
        !            91:        close (fd); /* close the port */
        !            92: 
        !            93:        /* If lock removal fails, print message. */
        !            94: 
        !            95:        if ( (strcmp(rdevname,"-") != 0) && lockttyexist(rdevname) ){
        !            96:                if(unlocktty(rdevname) == -1){
        !            97:                        printmsg(M_DEBUG,"Undial: tty lock file removal failed");
        !            98:                        plog(M_CALL,"Undial: tty lock file removal failed");
        !            99:                }
        !           100:        }
        !           101:        /* If lock removal failed, then do not re enable the port because we
        !           102:         * no longer know who did what to the remote port. Re enabling the
        !           103:         * port could result in a race condition we don't want.
        !           104:        */
        !           105: 
        !           106:        if ((enableme[0] != '\0') && (lockttyexist(rdevname) == 0)){
        !           107:                plog(M_CALL, "Enabling tty line %s", enableme);
        !           108:                exec_stat("enable", enableme);
        !           109:                strcpy(enableme, "");
        !           110:        }else{
        !           111:                if(enableme[0] != '\0'){
        !           112:                printmsg(M_DEBUG,"Undial: Can not re-enable port due to tty lock file.");
        !           113:                plog(M_CALL,"Undial: Could not re-enable port due to tty lock file.");
        !           114:                }
        !           115:        }
        !           116:        rdevname = NULL;
        !           117: }
        !           118: 
        !           119: static
        !           120: findline(callp, brand)
        !           121: CALL *callp;
        !           122: char **brand;
        !           123: {
        !           124:        int     exists = 0;             /* device exists at some baud rate */
        !           125:        int     tried = 0;              /* found a device but it was locked */
        !           126:        int     devflag, telflag;
        !           127:        char    *l_lline;               /* tty device local name */
        !           128:        char    *l_rline;               /* tty device remote name */
        !           129:        char    *l_type;                /* ACU, DIR, etc. */
        !           130:        char    *l_brand;               /* modemcap brand name */
        !           131:        int     l_baud;                 /* tty baud rate */
        !           132:        int     retval;                 /* Place to stash return of exec_stat */
        !           133: 
        !           134:        ldev_open();
        !           135:        if ( ((devflag=(callp->line != NULL)) &&
        !           136:              (telflag=(callp->telno != NULL))) || (!devflag && !telflag) )
        !           137:                return(M_DEV_TEL);
        !           138: 
        !           139:        while ( ldev_next() ) {
        !           140:                l_type  = ldev_value(type_e);
        !           141:                l_lline = ldev_value(lline_e);
        !           142:                l_rline = ldev_value(rline_e);
        !           143:                l_baud  = atoi(ldev_value(baud_e));
        !           144:                l_brand = ldev_value(brand_e);
        !           145: 
        !           146:                if ( strcmp(l_type, "ACU") == 0 ) {
        !           147:                        if ( devflag )
        !           148:                                continue;
        !           149:                        exists++;
        !           150:                        if (l_baud != callp->baud)
        !           151:                                continue;
        !           152:                } else if ( strcmp(l_type, "DIR") == 0 ) {
        !           153:                        if ( telflag )
        !           154:                                continue;
        !           155:                        if ( strcmp(l_lline, callp->line) )
        !           156:                                continue;
        !           157:                        callp->baud = l_baud;
        !           158:                } else {
        !           159:                        continue;
        !           160:                }
        !           161:                ++tried;                /* found device at desired baud rate */
        !           162: 
        !           163: 
        !           164:                /* If the Ldev remote line is not a '-', then see if a lock
        !           165:                 * exists on the remote device. If a lock exists, then we don't
        !           166:                 * want to disable the remote before calling out on the local
        !           167:                 * local device for fear of booting off a logged in process.
        !           168:                */
        !           169: 
        !           170:                /* Check for a lock on the remote device */
        !           171:                if ((strcmp(l_rline,"-")!=0) && (0 != lockttyexist(l_rline))) {
        !           172:                        plog(M_CALL,"Remote tty device %s locked, cannot disable.",
        !           173:                                l_rline);
        !           174:                        continue;
        !           175:                } else {
        !           176:                        enableme[0] = '\0';
        !           177:                        if(strcmp(l_rline,"-") !=0){
        !           178:        /* Disable the remote device and then create a lock on it.
        !           179:         * If the lock fails, abort.
        !           180:         * Note that we will then sleep for 5 seconds to make sure that
        !           181:         * the port gets closed after the disable.
        !           182:         */
        !           183:                                if (locktty(l_rline) < 0) {
        !           184:                                        plog(M_CALL,"Remote tty device %s locked, cannot disable.",
        !           185:                                                l_rline);
        !           186:                                        continue;
        !           187:                                }
        !           188: 
        !           189:                                /* Note that disable could be terminated by
        !           190:                                 * a SIGHUP when the port is disabled.
        !           191:                                 */
        !           192:                                if (0!=(retval=exec_stat("disable", l_rline)) &&
        !           193:                                    SIGHUP<<8 != retval) {
        !           194:                                        plog(M_CALL,"Disable of tty line %s failed",
        !           195:                                             l_rline);
        !           196:                                        continue;
        !           197:                                }else{
        !           198:                                plog(M_CALL,"Disabling tty line %s", l_rline);
        !           199:                                        sleep(5);
        !           200:                                        strcpy(enableme,l_rline);
        !           201:                                }
        !           202:                        }
        !           203:                }
        !           204:                devname = l_lline;
        !           205:                rdevname = l_rline;
        !           206:                *brand = l_brand;
        !           207:                ldev_close();
        !           208:                callp->line = l_lline;
        !           209:                return (1);
        !           210:        }
        !           211:        if (tried)
        !           212:                return (merrno = M_DV_NT_A);
        !           213:        else if (exists) {
        !           214:                return (merrno = M_ILL_BD);
        !           215:        } else {
        !           216:                /* plog("Device not known: %s", brand); */
        !           217:                return (merrno = M_DV_NT_K);
        !           218:        }
        !           219: }
        !           220: 
        !           221: exec_stat(command, line)
        !           222: char   *command;
        !           223: char   *line;
        !           224: {
        !           225:        int     pid;
        !           226:        int     waitstat;
        !           227:        static  char    etccommand[32];
        !           228: 
        !           229:        strcpy(etccommand, "/etc/");
        !           230:        strcat(etccommand, command);
        !           231:        /* plog("%s (%s) on line %s", command, etccommand, line);
        !           232:         */
        !           233:        pid = fork();
        !           234:        if (pid == 0) {
        !           235:                execl(etccommand, command, line, NULL);
        !           236:                exit(1);
        !           237:        } else 
        !           238:                wait(&waitstat);
        !           239:         
        !           240:        return waitstat;
        !           241: }
        !           242: 

unix.superglobalmegacorp.com

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