Annotation of coherent/b/kernel/i386/tioc.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * i386/tioc.c
        !             3:  *
        !             4:  * Convert COH286 tty ioctl's to Sys 5 compatible calls.
        !             5:  *
        !             6:  * Revised: Wed May 26 16:49:20 1993 CDT
        !             7:  */
        !             8: 
        !             9: /*
        !            10:  * ----------------------------------------------------------------------
        !            11:  * Includes.
        !            12:  */
        !            13: #include <sys/coherent.h>
        !            14: #include <sgtty.h>
        !            15: #include <errno.h>
        !            16: 
        !            17: /*
        !            18:  * ----------------------------------------------------------------------
        !            19:  * Definitions.
        !            20:  *     Constants.
        !            21:  *     Macros with argument lists.
        !            22:  *     Typedefs.
        !            23:  *     Enums.
        !            24:  */
        !            25: 
        !            26: #define        OIOC_LOW        0100
        !            27: #define OIOC_HIGH      0110
        !            28: 
        !            29: /*
        !            30:  * Bits from COH286 sgttyb sg_flags field.
        !            31:  */
        !            32: #define        O_EVENP         0x0001  /* Allow even parity */
        !            33: #define        O_ODDP          0x0002  /* Allow odd parity */
        !            34: #define        O_CRMOD         0x0004  /* Map '\r' to '\n' */
        !            35: #define        O_ECHO          0x0008  /* Echo input characters */
        !            36: #define        O_LCASE         0x0010  /* Lowercase mapping on input */
        !            37: #define        O_CBREAK        0x0020  /* Each input character causes wakeup */
        !            38: #define        O_RAWIN         0x0040  /* 8-bit input raw */
        !            39: #define        O_RAWOUT        0x0080  /* 8-bit output raw */
        !            40: #define        O_TANDEM        0x0100  /* flow control protocol */
        !            41: #define        O_XTABS         0x0200  /* Expand tabs to spaces */
        !            42: #define        O_CRT           0x0400  /* CRT character erase */
        !            43: 
        !            44: #define        O_RAW   (O_RAWIN|O_RAWOUT)      /* Raw mode */
        !            45: 
        !            46: /*
        !            47:  * Names for terminal speeds.
        !            48:  */
        !            49: #define        O_B0    0               /* Hangup if modem control enabled */
        !            50: #define        O_B50   1               /* 50 bps */
        !            51: #define        O_B75   2               /* 75 bps */
        !            52: #define        O_B110  3               /* 110 bps */
        !            53: #define        O_B134  4               /* 134.5 bps (IBM 2741) */
        !            54: #define        O_B150  5               /* 150 bps */
        !            55: #define        O_B200  6               /* 200 bps */
        !            56: #define        O_B300  7               /* 300 bps */
        !            57: #define        O_B600  8               /* 600 bps */
        !            58: #define        O_B1200 9               /* 1200 bps */
        !            59: #define        O_B1800 10              /* 1800 bps */
        !            60: #define        O_B2000 11              /* 2000 bps */
        !            61: #define        O_B2400 12              /* 2400 bps */
        !            62: #define        O_B3600 13              /* 3600 bps */
        !            63: #define        O_B4800 14              /* 4800 bps */
        !            64: #define        O_B7200 15              /* 7200 bps */
        !            65: #define        O_B9600 16              /* 9600 bps */
        !            66: #define        O_B19200        17      /* 19200 bps */
        !            67: #define        O_EXTA  18              /* External A (DH-11) */
        !            68: #define        O_EXTB  19              /* External B (DH-11) */
        !            69: 
        !            70: /*
        !            71:  * ----------------------------------------------------------------------
        !            72:  * Functions.
        !            73:  *     Import Functions.
        !            74:  *     Export Functions.
        !            75:  *     Local Functions.
        !            76:  */
        !            77: 
        !            78: static void to_s5_sgfld();
        !            79: static void to_s5speed();
        !            80: static void to_coh_sgfld();
        !            81: static void to_cohspeed();
        !            82: 
        !            83: /*
        !            84:  * ----------------------------------------------------------------------
        !            85:  * Global Data.
        !            86:  *     Import Variables.
        !            87:  *     Export Variables.
        !            88:  *     Local Variables.
        !            89:  */
        !            90: /*
        !            91:  * Here are the COH286 values for tty ioctl's.
        !            92:  * In cvtsgtty[] below, subtract 0100 from the 286 COH ioctl value to
        !            93:  * index to the equivalent Sys V ioctl.
        !            94:  *
        !            95:  *     OIOCSETP        0100             Terminal set modes (old stty) 
        !            96:  *     OIOCGETP        0101             Terminal get modes (old gtty) 
        !            97:  *     OIOCSETC        0102             Set characters 
        !            98:  *     OIOCGETC        0103             Get characters 
        !            99:  *     OIOCSETN        0104             Set modes w/o delay or out flush 
        !           100:  *     OIOCEXCL        0105             Set exclusive use 
        !           101:  *     OIOCNXCL        0106             Set non-exclusive use 
        !           102:  *     OIOCHPCL        0107             Hang up on last close 
        !           103:  *     OIOCFLUSH       0110             Flush characters in I/O queues 
        !           104:  */
        !           105: static unsigned short cvtsgtty[] = {
        !           106:        TIOCSETP,
        !           107:        TIOCGETP,
        !           108:        TIOCSETC,
        !           109:        TIOCGETC,
        !           110:        TIOCSETN,
        !           111:        TIOCEXCL,
        !           112:        TIOCNXCL,
        !           113:        TIOCHPCL,
        !           114:        TIOCFLUSH
        !           115: };
        !           116: 
        !           117: /*
        !           118:  * ----------------------------------------------------------------------
        !           119:  * Code.
        !           120:  */
        !           121: 
        !           122: /*
        !           123:  * tioc()
        !           124:  *
        !           125:  * This function is called by dioctl() whenever a 286 binary does an ioctl().
        !           126:  * Its arguments are the arguments for to the ioctl, plus the local driver's
        !           127:  * ioctl function, which should support S5 sgtty and termio commands.
        !           128:  *
        !           129:  * 1.  If com is COH 286 TIOC, translate it to S5 TIOC.
        !           130:  * 2.  If translated com is TIOCSET[NP], convert sgttyb struct *vec to S5.
        !           131:  * 3.  If translated com is TIOCGETP, point vec to a full S5 struct (COH 286
        !           132:  *     sgttyb struct is 2 bytes shorter than S5 format).
        !           133:  * 4.  Call driver's ioctl().
        !           134:  * 5.  If just finished a converted TIOCGETP, convert back to COH 286 sgttyb.
        !           135:  */
        !           136: void tioc(dev, com, vec, iocfn)
        !           137: int dev, com, vec, (*iocfn)();
        !           138: {
        !           139:        struct sgttyb sg;
        !           140:        int my_com = com, my_vec = vec, old_getp = 0;
        !           141: 
        !           142:        if (com >= OIOC_LOW && com <= OIOC_HIGH && u.u_error==0) {
        !           143:                my_com = cvtsgtty[com - OIOC_LOW];
        !           144:                if (my_com==TIOCSETP || my_com==TIOCSETN) {
        !           145:                        ukcopy(vec, &sg, sizeof (struct sgttyb));
        !           146:                        sg.sg_flags &= 0xffff;
        !           147:                        to_s5_sgfld(&sg);
        !           148:                        my_vec = &sg;
        !           149:                }
        !           150:                if (my_com==TIOCGETP) {
        !           151:                        old_getp = 1;
        !           152:                        my_vec = &sg;
        !           153:                }
        !           154:        }
        !           155:        (*iocfn)(dev, my_com, my_vec);
        !           156:        if (old_getp && u.u_error==0) {
        !           157:                to_coh_sgfld(my_vec);
        !           158:                kucopy(my_vec, vec, sizeof(struct sgttyb)-2);
        !           159:        }
        !           160: }
        !           161: 
        !           162: /*
        !           163:  * to_s5_sgfld()
        !           164:  *
        !           165:  * Convert fields in a sgttyb struct from COH 286 format to Sys 5.
        !           166:  */
        !           167: static void to_s5_sgfld(sgp)
        !           168: struct sgttyb * sgp;
        !           169: {
        !           170:        unsigned int f = sgp->sg_flags, g = 0;
        !           171: 
        !           172:        /*
        !           173:         * Convert sg_ispeed and sg_ospeed.
        !           174:         */
        !           175:        to_s5speed(&(sgp->sg_ispeed));
        !           176:        to_s5speed(&(sgp->sg_ospeed));
        !           177: 
        !           178:        /*
        !           179:         * Convert sg_flags.
        !           180:         *   f is old COH 286 flags.
        !           181:         *   g is new Sys V flags.
        !           182:         */
        !           183:        if (f & O_EVENP)
        !           184:                g |= EVENP;
        !           185:        if (f & O_ODDP)
        !           186:                g |= ODDP;
        !           187:        if (f & O_CRMOD)
        !           188:                g |= CRMOD;
        !           189:        if (f & O_ECHO)
        !           190:                g |= ECHO;
        !           191:        if (f & O_LCASE)
        !           192:                g |= LCASE;
        !           193:        if (f & O_CBREAK)
        !           194:                g |= CBREAK;    /* No CBREAK in Sys 5 sgtty. */
        !           195:                                /* Only one RAW bit in Sys 5 sgtty. */
        !           196:        if ((f & O_RAWIN)&&(f & O_RAWOUT))
        !           197:                g |= RAW;
        !           198:        if (f & O_RAWIN)
        !           199:                g |= RAWIN;
        !           200:        if (f & O_RAWOUT)
        !           201:                g |= RAWOUT;
        !           202:        if (f & O_TANDEM)
        !           203:                g |= TANDEM;    /* No TANDEM in Sys 5 sgtty. */
        !           204:        if (f & O_XTABS)
        !           205:                g |= XTABS;
        !           206:        if (f & O_CRT)
        !           207:                g |= CRT;       /* No CRT in Sys 5 sgtty. */
        !           208:        sgp->sg_flags = g;
        !           209: }
        !           210: 
        !           211: /*
        !           212:  * to_s5speed()
        !           213:  *
        !           214:  * Convert speed from COH286 to Sys5.
        !           215:  * Here are the numbers:
        !           216:  *     const.  COH286  Sys5
        !           217:  *     B0      0       0
        !           218:  *     B50     1       1
        !           219:  *     B75     2       2
        !           220:  *     B110    3       3
        !           221:  *     B134    4       4
        !           222:  *     B150    5       5
        !           223:  *     B200    6       6
        !           224:  *     B300    7       7
        !           225:  *     B600    8       8
        !           226:  *     B1200   9       9
        !           227:  *     B1800   10      10
        !           228:  *     B2000   11      -
        !           229:  *     B2400   12      11
        !           230:  *     B3600   13      -
        !           231:  *     B4800   14      12
        !           232:  *     B7200   15      -
        !           233:  *     B9600   16      13
        !           234:  *     B19200  17      14
        !           235:  *     EXTA    18      14
        !           236:  *     EXTB    19      15
        !           237:  */
        !           238: #define BADSPD 99
        !           239: 
        !           240: static void to_s5speed(speed)
        !           241: unsigned char *speed;
        !           242: {
        !           243:        static char s5sp[]={B0,B50,B75,B110,B134,B150,B200,B300,B600,B1200,
        !           244:                B1800,BADSPD,B2400,BADSPD,B4800,BADSPD,B9600,EXTA,EXTA,EXTB};
        !           245: 
        !           246:        if (*speed >= sizeof(s5sp))
        !           247:                u.u_error = EINVAL;
        !           248:        else if (s5sp[*speed] == BADSPD)
        !           249:                u.u_error = EINVAL;
        !           250:        else *speed = s5sp[*speed];
        !           251: }
        !           252: 
        !           253: /*
        !           254:  * to_coh_sgfld()
        !           255:  *
        !           256:  * Convert fields in a sgttyb struct from Sys V format to COH 286.
        !           257:  */
        !           258: static void to_coh_sgfld(sgp)
        !           259: struct sgttyb * sgp;
        !           260: {
        !           261:        unsigned int f = sgp->sg_flags, g = 0;
        !           262: 
        !           263:        /*
        !           264:         * Convert sg_ispeed and sg_ospeed.
        !           265:         */
        !           266:        to_cohspeed(&(sgp->sg_ispeed));
        !           267:        to_cohspeed(&(sgp->sg_ospeed));
        !           268: 
        !           269:        /*
        !           270:         * Convert sg_flags.
        !           271:         *   f is old Sys V flags.
        !           272:         *   g is new COH 286 flags.
        !           273:         */
        !           274:        if (f & EVENP)
        !           275:                g |= O_EVENP;
        !           276:        if (f & ODDP)
        !           277:                g |= O_ODDP;
        !           278:        if (f & CRMOD)
        !           279:                g |= O_CRMOD;
        !           280:        if (f & ECHO)
        !           281:                g |= O_ECHO;
        !           282:        if (f & LCASE)
        !           283:                g |= O_LCASE;
        !           284:        if (f & CBREAK)
        !           285:                g |= O_CBREAK;  /* No CBREAK in Sys 5 sgtty. */
        !           286:        if (f & RAWIN)          /* Only one RAW bit in Sys 5 sgtty. */
        !           287:                g |= O_RAWIN;
        !           288:        if (f & RAWOUT)
        !           289:                g |= O_RAWOUT;
        !           290:        if (f & TANDEM)
        !           291:                g |= O_TANDEM;  /* No TANDEM in Sys 5 sgtty. */
        !           292:        if (f & XTABS)
        !           293:                g |= O_XTABS;
        !           294:        if (f & CRT)
        !           295:                g |= O_CRT;     /* No CRT in Sys 5 sgtty. */
        !           296:        sgp->sg_flags = g;
        !           297: }
        !           298: 
        !           299: static void to_cohspeed(speed)
        !           300: unsigned char *speed;
        !           301: {
        !           302:        static char cohsp[]={O_B0,O_B50,O_B75,O_B110,O_B134,O_B150,O_B200,
        !           303:                O_B300,O_B600,O_B1200,O_B1800,O_B2400,O_B4800,O_B9600,O_EXTA,
        !           304:                O_EXTB};
        !           305: 
        !           306:        if (*speed >= sizeof(cohsp))
        !           307:                u.u_error = EINVAL;
        !           308:        else *speed = cohsp[*speed];
        !           309: }

unix.superglobalmegacorp.com

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