Annotation of coherent/g/usr/lib/uucp/tay104/unix/cohtty.c, revision 1.1

1.1     ! root        1: /* Coherent tty locking support.  This file was contributed by Bob
        !             2:    Hemedinger <[email protected]> of Mark Williams Corporation and
        !             3:    lightly edited by Ian Lance Taylor.  */
        !             4: 
        !             5: /* The bottom part of this file is lock.c.
        !             6:  * This is a hacked lock.c. A full lock.c can be found in the libmisc sources 
        !             7:  * under /usr/src/misc.tar.Z.
        !             8:  *
        !             9:  * These are for checking for the existence of locks:
        !            10:  * lockexist(resource)
        !            11:  * lockttyexist(ttyname)
        !            12:  */
        !            13: 
        !            14: #include "uucp.h"
        !            15: 
        !            16: #if HAVE_COHERENT_LOCKFILES
        !            17: 
        !            18: /* cohtty.c:   Given a serial device name, read /etc/ttys and determine if
        !            19:  *             the device is already enabled. If it is, disable the
        !            20:  *             device and return a string so that it can be re-enabled
        !            21:  *             at the completion of the uucico session as part of the
        !            22:  *             function that resets the serial device before uucico
        !            23:  *             terminates.
        !            24:  *
        !            25:  */
        !            26: 
        !            27: #include "uudefs.h"
        !            28: #include "sysdep.h"
        !            29: 
        !            30: #include <ctype.h>
        !            31: #include <access.h>
        !            32: 
        !            33: /* fscoherent_disable_tty() is a COHERENT specific function. It takes the name
        !            34:  * of a serial device and then scans /etc/ttys for a match. If it finds one,
        !            35:  * it checks the first field of the entry. If it is a '1', then it will disable
        !            36:  * the port and set a flag. The flag will be checked later when uucico wants to
        !            37:  * reset the serial device to see if the device needs to be re-enabled.
        !            38:  */
        !            39: 
        !            40: /* May 10, 1993: This function will always return true for the following
        !            41:  * reasons:
        !            42:  *     1) lock files have already been dealt with
        !            43:  *     2) if someone else already has the port open, uucico should fail anyways
        !            44:  *     3) Coherent's disable command return can return '0' or '1', but will
        !            45:  *        succeed in any event.
        !            46:  *     4) It doesn't matter if there is a ttys entry for the port in question.
        !            47:  *        /etc/ttys generally only lists devices that MAY be enabled for logins.
        !            48:  *        If a device will never be used for logins, then there may not be a
        !            49:  *        ttys entry, in which case, disable won't be called anyways.
        !            50:  *     [email protected]
        !            51:  */
        !            52: 
        !            53: boolean
        !            54: fscoherent_disable_tty (zdevice, pzenable)
        !            55:      const char *zdevice;
        !            56:      char **pzenable;
        !            57: {
        !            58: 
        !            59: 
        !            60: struct ttyentry{                       /* this is an /etc/ttys entry */
        !            61:        char enable_disable[1];
        !            62:        char remote_local[1];
        !            63:        char baud_rate[1];
        !            64:        char tty_device[16];
        !            65: };
        !            66: 
        !            67: struct ttyentry sought_tty;
        !            68: 
        !            69: int x,y,z;                             /* dummy */
        !            70: FILE * infp;                           /* this will point to /etc/ttys */
        !            71: char disable_command[66];              /* this will be the disable command
        !            72:                                         * passed to the system.
        !            73:                                         */
        !            74: char enable_device[16];                        /* this will hold our device name
        !            75:                                         * to enable.
        !            76:                                         */
        !            77: 
        !            78:        *pzenable = NULL;
        !            79: 
        !            80:        strcpy(enable_device,"");       /* initialize our strings */
        !            81:        strcpy(sought_tty.tty_device,"");
        !            82: 
        !            83:        if( (infp = fopen("/etc/ttys","r")) == NULL){
        !            84:                ulog(LOG_ERROR,"Error: check_disable_tty: failed to open /etc/ttys\n");
        !            85:                return FALSE;
        !            86:        }
        !            87: 
        !            88:        while (NULL !=(fgets(&sought_tty, sizeof (sought_tty), infp ))){
        !            89:                sought_tty.tty_device[strlen(sought_tty.tty_device) -1] = '\0';
        !            90:                strcpy(enable_device,sought_tty.tty_device);
        !            91: 
        !            92:                /* we must strip away the suffix to the com port name or
        !            93:                 * we will never find a match. For example, if we are passed
        !            94:                 * /dev/com4l to call out with and the port is already enabled,
        !            95:                 * 9/10 the port enabled will be com4r. After we strip away the
        !            96:                 * suffix of the port found in /etc/ttys, then we can test
        !            97:                 * if the base port name appears in the device name string
        !            98:                 * passed to us.
        !            99:                 */
        !           100: 
        !           101:                for(z = strlen(sought_tty.tty_device) ; z > 0 ; z--){
        !           102:                        if(isdigit(sought_tty.tty_device[z])){
        !           103:                                break;
        !           104:                        }
        !           105:                }
        !           106:                y = strlen(sought_tty.tty_device);
        !           107:                for(x = z+1 ; x <= y; x++){
        !           108:                        sought_tty.tty_device[x] = '\0';
        !           109:                }
        !           110: 
        !           111: 
        !           112: /*             ulog(LOG_NORMAL,"found device {%s}\n",sought_tty.tty_device); */
        !           113:                if(strstr(zdevice, sought_tty.tty_device)){
        !           114:                        if(sought_tty.enable_disable[0] == '1'){
        !           115:                                ulog(LOG_NORMAL, "coh_tty: Disabling device %s {%s}\n",
        !           116:                                        zdevice, sought_tty.tty_device);
        !           117:                                        sprintf(disable_command, "/etc/disable %s",enable_device);
        !           118:                                {
        !           119:                                  pid_t ipid;
        !           120:                                  const char *azargs[3];
        !           121:                                  int aidescs[3];
        !           122: 
        !           123:                                  azargs[0] = "/etc/disable";
        !           124:                                  azargs[1] = enable_device;
        !           125:                                  azargs[2] = NULL;
        !           126:                                  aidescs[0] = SPAWN_NULL;
        !           127:                                  aidescs[1] = SPAWN_NULL;
        !           128:                                  aidescs[2] = SPAWN_NULL;
        !           129:                                  ipid = ixsspawn (azargs, aidescs, TRUE,
        !           130:                                                   FALSE,
        !           131:                                                   (const char *) NULL, TRUE,
        !           132:                                                   TRUE,
        !           133:                                                   (const char *) NULL,
        !           134:                                                   (const char *) NULL,
        !           135:                                                   (const char *) NULL);
        !           136:                                  if (ipid < 0)
        !           137:                                    x = 1;
        !           138:                                  else
        !           139:                                    x = ixswait ((unsigned long) ipid,
        !           140:                                                 (const char *) NULL); 
        !           141:                                }
        !           142:                                *pzenable = zbufalc (sizeof "/dev/"
        !           143:                                                     + strlen (enable_device));
        !           144:                                sprintf(*pzenable,"/dev/%s", enable_device);
        !           145: /*                             ulog(LOG_NORMAL,"Enable string is {%s}",*pzenable); */
        !           146:                                return (TRUE);
        !           147:                        }else{
        !           148:                                /* device not enabled */
        !           149:                                return TRUE;    
        !           150:                        }
        !           151:                }
        !           152:        }
        !           153:        return TRUE;    /* no ttys entry found */
        !           154: }
        !           155: 
        !           156: /* The following is COHERENT 4.0 specific. It is used to test for any
        !           157:  * existing lockfiles on a port which would have been created by init
        !           158:  * when a user logs into a port.
        !           159:  */
        !           160: 
        !           161: #define LOCKSIG                9       /* Significant Chars of Lockable Resources.  */
        !           162: #define LOKFLEN                64      /* Max Length of UUCP Lock File Name.        */
        !           163: 
        !           164: #define        LOCKPRE "LCK.."
        !           165: #define PIDLEN 6       /* Maximum length of string representing a pid.  */
        !           166: 
        !           167: #ifndef LOCKDIR
        !           168: #define LOCKDIR SPOOLDIR
        !           169: #endif
        !           170: 
        !           171: /* There is a special version of DEVMASK for the PE multiport driver
        !           172:  * because of the peculiar way it uses the minor device number.  For
        !           173:  * all other drivers, the lower 5 bits describe the physical port--
        !           174:  * the upper 3 bits give attributes for the port.
        !           175:  */
        !           176: 
        !           177: #define PE_DRIVER 21   /* Major device number for the PE driver.  */
        !           178: #define PE_DEVMASK 0x3f        /* PE driver minor device mask.  */
        !           179: #define DEVMASK 0x1f   /* Minor device mask.  */
        !           180: 
        !           181: /*
        !           182:  * Generates a resource name for locking, based on the major number
        !           183:  * and the lower 4 bits of the minor number of the tty device.
        !           184:  *
        !           185:  * Builds the name in buff as two "." separated decimal numbers.
        !           186:  * Returns NULL on failure, buff on success.
        !           187:  */
        !           188: static char *
        !           189: gen_res_name(path, buff)
        !           190: char *path;
        !           191: char *buff;
        !           192: {
        !           193:        struct stat sbuf;
        !           194:        int status;
        !           195:        
        !           196:        if (0 != (status = stat(path, &sbuf))) {
        !           197:                /* Can't stat the file.  */
        !           198:                return (NULL);
        !           199:        }
        !           200: 
        !           201:        if (PE_DRIVER == major(sbuf.st_rdev)) {
        !           202:                sprintf(buff, "%d.%d", major(sbuf.st_rdev),
        !           203:                                       PE_DEVMASK & minor(sbuf.st_rdev));
        !           204:        } else {
        !           205:                sprintf(buff, "%d.%d", major(sbuf.st_rdev),
        !           206:                                       DEVMASK & minor(sbuf.st_rdev));
        !           207:        }
        !           208: 
        !           209:        return(buff);
        !           210: } /* gen_res_name */
        !           211: 
        !           212: /*
        !           213:  *  lockexist(resource)  char *resource;
        !           214:  *
        !           215:  *  Test for existance of a lock on the given resource.
        !           216:  *
        !           217:  *  Returns:  (1)  Resource is locked.
        !           218:  *           (0)  Resource is not locked.
        !           219:  */
        !           220: 
        !           221: static boolean
        !           222: lockexist(resource)
        !           223: const char     *resource;
        !           224: {
        !           225:        char lockfn[LOKFLEN];
        !           226: 
        !           227:        if ( resource == NULL )
        !           228:                return(0);
        !           229:        sprintf(lockfn, "%s/%s%.*s", LOCKDIR, LOCKPRE, LOCKSIG, resource);
        !           230: 
        !           231:        return (!access(lockfn, AEXISTS));
        !           232: } /* lockexist() */
        !           233: 
        !           234: /*
        !           235:  *  lockttyexist(ttyname)  char *ttyname;
        !           236:  *
        !           237:  *  Test for existance of a lock on the given tty.
        !           238:  *
        !           239:  *  Returns:  (1)  Resource is locked.
        !           240:  *           (0)  Resource is not locked.
        !           241:  */
        !           242: boolean
        !           243: lockttyexist(ttyn)
        !           244: const char *ttyn;
        !           245: {
        !           246:        char resource[LOKFLEN];
        !           247:        char filename[LOKFLEN];
        !           248: 
        !           249:        sprintf(filename, "/dev/%s", ttyn);
        !           250:        if (NULL == gen_res_name(filename, resource)){
        !           251:                return(0);      /* Non-existent tty can not be locked :-) */
        !           252:        }
        !           253: 
        !           254:        return(lockexist(resource));
        !           255: } /* lockttyexist() */
        !           256: 
        !           257: #endif /* HAVE_COHERENT_LOCKFILES */

unix.superglobalmegacorp.com

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