Annotation of coherent/b/kernel/i386/tioc.c, revision 1.1.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.