sicontrol.c revision 50479
110045Speter/* 210045Speter * Device driver for Specialix range (SLXOS) of serial line multiplexors. 310045Speter * SLXOS configuration and debug interface 410045Speter * 510045Speter * Copyright (C) 1990, 1992 Specialix International, 610045Speter * Copyright (C) 1993, Andy Rutter <andy@acronym.co.uk> 710045Speter * Copyright (C) 1995, Peter Wemm <peter@haywire.dialix.com> 810045Speter * 910045Speter * Derived from: SunOS 4.x version 1010045Speter * 1110045Speter * Redistribution and use in source and binary forms, with or without 1210045Speter * modification, are permitted provided that the following conditions 1310045Speter * are met: 1410045Speter * 1. Redistributions of source code must retain the above copyright 1510045Speter * notices, this list of conditions and the following disclaimer. 1610045Speter * 2. Redistributions in binary form must reproduce the above copyright 1710045Speter * notices, this list of conditions and the following disclaimer in the 1810045Speter * documentation and/or other materials provided with the distribution. 1910045Speter * 3. All advertising materials mentioning features or use of this software 2010045Speter * must display the following acknowledgement: 2110045Speter * This product includes software developed by Andy Rutter of 2210045Speter * Advanced Methods and Tools Ltd. based on original information 2310045Speter * from Specialix International. 2410045Speter * 4. Neither the name of Advanced Methods and Tools, nor Specialix 2510045Speter * International may be used to endorse or promote products derived from 2610045Speter * this software without specific prior written permission. 2710045Speter * 2810045Speter * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY EXPRESS OR IMPLIED 2910045Speter * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 3010045Speter * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 3110045Speter * NO EVENT SHALL THE AUTHORS BE LIABLE. 3210045Speter */ 3310045Speter 3430427Scharnier#ifndef lint 3530427Scharnierstatic const char rcsid[] = 3650479Speter "$FreeBSD: head/usr.sbin/sicontrol/sicontrol.c 50479 1999-08-28 01:35:59Z peter $"; 3730427Scharnier#endif /* not lint */ 3830427Scharnier 3930427Scharnier#include <ctype.h> 4030427Scharnier#include <err.h> 4130427Scharnier#include <fcntl.h> 4210045Speter#include <stdio.h> 4330427Scharnier#include <stdlib.h> 4430427Scharnier#include <string.h> 4510045Speter#include <sys/types.h> 4610045Speter#include <sys/param.h> 4710045Speter#include <sys/stat.h> 4810045Speter#include <sys/ioctl.h> 4910045Speter#include <sys/device.h> 5010045Speter#include <sys/tty.h> 5110045Speter 5210045Speter#include <machine/si.h> 5310045Speter 5410045Speterstruct lv { 5510045Speter char *lv_name; 5610045Speter int lv_bit; 5710045Speter} lv[] = { 5830427Scharnier {"entry", DBG_ENTRY}, 5930427Scharnier {"open", DBG_OPEN}, 6030427Scharnier {"close", DBG_CLOSE}, 6130427Scharnier {"read", DBG_READ}, 6230427Scharnier {"write", DBG_WRITE}, 6330427Scharnier {"param", DBG_PARAM}, 6430427Scharnier {"modem", DBG_MODEM}, 6530427Scharnier {"select", DBG_SELECT}, 6630427Scharnier {"optim", DBG_OPTIM}, 6730427Scharnier {"intr", DBG_INTR}, 6830427Scharnier {"start", DBG_START}, 6930427Scharnier {"lstart", DBG_LSTART}, 7030427Scharnier {"ioctl", DBG_IOCTL}, 7130427Scharnier {"fail", DBG_FAIL}, 7230427Scharnier {"autoboot", DBG_AUTOBOOT}, 7330427Scharnier {"download", DBG_DOWNLOAD}, 7430427Scharnier {"drain", DBG_DRAIN}, 7530427Scharnier {"poll", DBG_POLL}, 7630427Scharnier {0, 0} 7710045Speter}; 7810045Speter 7910045Speterstatic int alldev = 0; 8010045Speter 8130427Scharniervoid ccb_stat __P((int, char **)); 8230427Scharniervoid debug __P((int, char **)); 8330427Scharniervoid dostat __P((void)); 8430427Scharnierint getnum __P((char *)); 8530427Scharnierint islevel __P((char *)); 8630427Scharnierint lvls2bits __P((char *)); 8730427Scharniervoid mstate __P((int, char **)); 8830427Scharniervoid nport __P((int, char **)); 8930427Scharniervoid onoff __P((int, char **, int, char *, char *, int)); 9030427Scharnierint opencontrol __P((void)); 9130427Scharniervoid prlevels __P((int)); 9230427Scharniervoid prusage __P((int, int)); 9330427Scharniervoid rxint __P((int, char **)); 9430427Scharniervoid tty_stat __P((int, char **)); 9530427Scharniervoid txint __P((int, char **)); 9630427Scharnier 9710045Speterstruct opt { 9810045Speter char *o_name; 9930427Scharnier void (*o_func)(); 10010045Speter} opt[] = { 10130427Scharnier {"debug", debug}, 10230427Scharnier {"rxint_throttle", rxint}, 10330427Scharnier {"int_throttle", txint}, 10430427Scharnier {"nport", nport}, 10530427Scharnier {"mstate", mstate}, 10630427Scharnier {"ccbstat", ccb_stat}, 10730427Scharnier {"ttystat", tty_stat}, 10830427Scharnier {0, 0} 10910045Speter}; 11010045Speter 11110045Speterstruct stat_list { 11230427Scharnier void (*st_func)(); 11310045Speter} stat_list[] = { 11430427Scharnier {mstate}, 11530427Scharnier {0} 11610045Speter}; 11710045Speter 11810045Speter#define U_DEBUG 0 11910045Speter#define U_TXINT 1 12010045Speter#define U_RXINT 2 12111098Speter#define U_NPORT 3 12211098Speter#define U_MSTATE 4 12310045Speter#define U_STAT_CCB 5 12410045Speter#define U_STAT_TTY 6 12510045Speter 12610045Speter#define U_MAX 7 12710045Speter#define U_ALL -1 12810045Speterchar *usage[] = { 12910045Speter "debug [[add|del|set debug_levels] | [off]]\n", 13010045Speter "int_throttle [newvalue]\n", 13110045Speter "rxint_throttle [newvalue]\n", 13211098Speter "nport\n", 13310045Speter "mstate\n", 13410045Speter "ccbstat\n", 13510045Speter "ttystat\n", 13610045Speter 0 13710045Speter}; 13810045Speter 13910045Speterint ctlfd; 14010045Speterchar *Devname; 14110045Speterstruct si_tcsi tc; 14210045Speter 14330427Scharnierint 14410045Spetermain(argc, argv) 14510045Speter char **argv; 14610045Speter{ 14710045Speter struct opt *op; 14830427Scharnier void (*func)() = NULL; 14910045Speter 15010045Speter if (argc < 2) 15110045Speter prusage(U_ALL, 1); 15210045Speter Devname = argv[1]; 15310045Speter if (strcmp(Devname, "-") == 0) { 15410045Speter alldev = 1; 15510045Speter } else { 15610045Speter sidev_t dev; 15710045Speter struct stat st; 15810045Speter 15910045Speter if (strchr(Devname, '/') == NULL) { 16010045Speter char *acp = malloc(6 + strlen(Devname)); 16110045Speter strcpy(acp, "/dev/"); 16210045Speter strcat(acp, Devname); 16310045Speter Devname = acp; 16410045Speter } 16530427Scharnier if (stat(Devname, &st) < 0) 16630427Scharnier errx(1, "can't stat %s", Devname); 16710045Speter dev.sid_card = SI_CARD(minor(st.st_rdev)); 16810045Speter dev.sid_port = SI_PORT(minor(st.st_rdev)); 16910045Speter tc.tc_dev = dev; 17010045Speter } 17110045Speter ctlfd = opencontrol(); 17210045Speter if (argc == 2) { 17310045Speter dostat(); 17410045Speter exit(0); 17510045Speter } 17610045Speter 17710045Speter argc--; argv++; 17810045Speter for (op = opt; op->o_name; op++) { 17910045Speter if (strcmp(argv[1], op->o_name) == 0) { 18010045Speter func = op->o_func; 18110045Speter break; 18210045Speter } 18310045Speter } 18410045Speter if (func == NULL) 18510045Speter prusage(U_ALL, 1); 18610045Speter 18710045Speter argc -= 2; 18810045Speter argv += 2; 18910045Speter (*func)(argc, argv); 19010045Speter exit(0); 19110045Speter} 19210045Speter 19330427Scharnierint 19410045Speteropencontrol() 19510045Speter{ 19610045Speter int fd; 19710045Speter 19810045Speter fd = open(CONTROLDEV, O_RDWR|O_NDELAY); 19930427Scharnier if (fd < 0) 20030427Scharnier err(1, "open on %s", CONTROLDEV); 20110045Speter return(fd); 20210045Speter} 20310045Speter 20410045Speter/* 20510045Speter * Print a usage message - this relies on U_DEBUG==0 and U_BOOT==1. 20610045Speter * Don't print the DEBUG usage string unless explicity requested. 20710045Speter */ 20830427Scharniervoid 20910045Speterprusage(strn, eflag) 21010045Speter int strn, eflag; 21110045Speter{ 21210045Speter char **cp; 21310045Speter 21410045Speter if (strn == U_ALL) { 21530427Scharnier fprintf(stderr, "usage: sicontrol %s", usage[1]); 21630427Scharnier fprintf(stderr, " sicontrol %s", usage[2]); 21730427Scharnier fprintf(stderr, " sicontrol %s", usage[3]); 21811098Speter fprintf(stderr, " sicontrol devname %s", usage[4]); 21911098Speter for (cp = &usage[5]; *cp; cp++) 22011098Speter fprintf(stderr, " sicontrol devname %s", *cp); 22110045Speter } 22210045Speter else if (strn >= 0 && strn <= U_MAX) 22330427Scharnier fprintf(stderr, "usage: sicontrol devname %s", usage[strn]); 22410045Speter else 22510052Speter fprintf(stderr, "sicontrol: usage ???\n"); 22610045Speter exit(eflag); 22710045Speter} 22810045Speter 22910045Speter/* print port status */ 23030427Scharniervoid 23110045Speterdostat() 23210045Speter{ 23310045Speter char *av[1], *acp; 23410045Speter struct stat_list *stp; 23510045Speter struct si_tcsi stc; 23610045Speter int donefirst = 0; 23710045Speter 23810045Speter printf("%s: ", alldev ? "ALL" : Devname); 23910045Speter acp = malloc(strlen(Devname) + 3); 24010045Speter memset(acp, ' ', strlen(Devname)); 24110045Speter strcat(acp, " "); 24210045Speter stc = tc; 24310045Speter for (stp = stat_list; stp->st_func != NULL; stp++) { 24410045Speter if (donefirst) 24510045Speter fputs(acp, stdout); 24610045Speter else 24710045Speter donefirst++; 24810045Speter av[0] = NULL; 24910045Speter tc = stc; 25010045Speter (*stp->st_func)(-1, av); 25110045Speter } 25210045Speter} 25310045Speter 25410045Speter/* 25510045Speter * debug 25610045Speter * debug [[set|add|del debug_lvls] | [off]] 25710045Speter */ 25830427Scharniervoid 25910045Speterdebug(ac, av) 26010045Speter char **av; 26110045Speter{ 26230427Scharnier int level; 26310045Speter 26410045Speter if (ac > 2) 26510045Speter prusage(U_DEBUG, 1); 26610045Speter if (alldev) { 26710045Speter if (ioctl(ctlfd, TCSIGDBG_ALL, &tc.tc_dbglvl) < 0) 26830427Scharnier err(1, "TCSIGDBG_ALL on %s", Devname); 26910045Speter } else { 27010045Speter if (ioctl(ctlfd, TCSIGDBG_LEVEL, &tc) < 0) 27130427Scharnier err(1, "TCSIGDBG_LEVEL on %s", Devname); 27210045Speter } 27310045Speter 27410045Speter switch (ac) { 27510045Speter case 0: 27610045Speter printf("%s: debug levels - ", Devname); 27710045Speter prlevels(tc.tc_dbglvl); 27810045Speter return; 27910045Speter case 1: 28010045Speter if (strcmp(av[0], "off") == 0) { 28110045Speter tc.tc_dbglvl = 0; 28210045Speter break; 28310045Speter } 28410045Speter prusage(U_DEBUG, 1); 28510045Speter /* no return */ 28610045Speter case 2: 28710045Speter level = lvls2bits(av[1]); 28810045Speter if (strcmp(av[0], "add") == 0) 28910045Speter tc.tc_dbglvl |= level; 29010045Speter else if (strcmp(av[0], "del") == 0) 29110045Speter tc.tc_dbglvl &= ~level; 29210045Speter else if (strcmp(av[0], "set") == 0) 29310045Speter tc.tc_dbglvl = level; 29410045Speter else 29510045Speter prusage(U_DEBUG, 1); 29610045Speter } 29710045Speter if (alldev) { 29810045Speter if (ioctl(ctlfd, TCSISDBG_ALL, &tc.tc_dbglvl) < 0) 29930427Scharnier err(1, "TCSISDBG_ALL on %s", Devname); 30010045Speter } else { 30110045Speter if (ioctl(ctlfd, TCSISDBG_LEVEL, &tc) < 0) 30230427Scharnier err(1, "TCSISDBG_LEVEL on %s", Devname); 30310045Speter } 30410045Speter} 30510045Speter 30630427Scharniervoid 30710045Speterrxint(ac, av) 30810045Speter char **av; 30910045Speter{ 31010045Speter tc.tc_port = 0; 31110045Speter switch (ac) { 31210045Speter case 0: 31310045Speter printf("%s: ", Devname); 31410045Speter case -1: 31510045Speter if (ioctl(ctlfd, TCSIGRXIT, &tc) < 0) 31630427Scharnier err(1, "TCSIGRXIT"); 31710045Speter printf("RX interrupt throttle: %d msec\n", tc.tc_int*10); 31810045Speter break; 31910045Speter case 1: 32010045Speter tc.tc_int = getnum(av[0]) / 10; 32110045Speter if (tc.tc_int == 0) 32210045Speter tc.tc_int = 1; 32310045Speter if (ioctl(ctlfd, TCSIRXIT, &tc) < 0) 32430427Scharnier err(1, "TCSIRXIT on %s at %d msec", 32530427Scharnier Devname, tc.tc_int*10); 32610045Speter break; 32710045Speter default: 32810045Speter prusage(U_RXINT, 1); 32910045Speter } 33010045Speter} 33110045Speter 33230427Scharniervoid 33310045Spetertxint(ac, av) 33410045Speter char **av; 33510045Speter{ 33610045Speter 33710045Speter tc.tc_port = 0; 33810045Speter switch (ac) { 33910045Speter case 0: 34010045Speter printf("%s: ", Devname); 34110045Speter case -1: 34210045Speter if (ioctl(ctlfd, TCSIGIT, &tc) < 0) 34330427Scharnier err(1, "TCSIGIT"); 34410045Speter printf("aggregate interrupt throttle: %d\n", tc.tc_int); 34510045Speter break; 34610045Speter case 1: 34710045Speter tc.tc_int = getnum(av[0]); 34810045Speter if (ioctl(ctlfd, TCSIIT, &tc) < 0) 34930427Scharnier err(1, "TCSIIT on %s at %d", Devname, tc.tc_int); 35010045Speter break; 35110045Speter default: 35210045Speter prusage(U_TXINT, 1); 35310045Speter } 35410045Speter} 35510045Speter 35630427Scharniervoid 35710045Speteronoff(ac, av, cmd, cmdstr, prstr, usage) 35810045Speter char **av, *cmdstr, *prstr; 35910045Speter int ac, cmd, usage; 36010045Speter{ 36110045Speter if (ac > 1) 36210045Speter prusage(usage, 1); 36310045Speter if (ac == 1) { 36410045Speter if (strcmp(av[0], "on") == 0) 36510045Speter tc.tc_int = 1; 36610045Speter else if (strcmp(av[0], "off") == 0) 36710045Speter tc.tc_int = 0; 36810045Speter else 36910045Speter prusage(usage, 1); 37010045Speter } else 37110045Speter tc.tc_int = -1; 37210045Speter if (ioctl(ctlfd, cmd, &tc) < 0) 37330427Scharnier err(1, "%s on %s", cmdstr, Devname); 37410045Speter switch (ac) { 37510045Speter case 0: 37610045Speter printf("%s: ", Devname); 37710045Speter case -1: 37810045Speter printf("%s ", prstr); 37910045Speter if (tc.tc_int) 38010045Speter printf("on\n"); 38110045Speter else 38210045Speter printf("off\n"); 38310045Speter } 38410045Speter} 38510045Speter 38630427Scharniervoid 38710045Spetermstate(ac, av) 38810045Speter char **av; 38910045Speter{ 39010045Speter switch (ac) { 39110045Speter case 0: 39210045Speter printf("%s: ", Devname); 39310045Speter case -1: 39410045Speter break; 39510045Speter default: 39610045Speter prusage(U_MSTATE, 1); 39710045Speter } 39810045Speter if (ioctl(ctlfd, TCSISTATE, &tc) < 0) 39930427Scharnier err(1, "TCSISTATE on %s", Devname); 40010045Speter printf("modem bits state - (0x%x)", tc.tc_int); 40110045Speter if (tc.tc_int & IP_DCD) printf(" DCD"); 40210045Speter if (tc.tc_int & IP_DTR) printf(" DTR"); 40310045Speter if (tc.tc_int & IP_RTS) printf(" RTS"); 40410045Speter printf("\n"); 40510045Speter} 40610045Speter 40730427Scharniervoid 40810045Speternport(ac, av) 40910045Speter char **av; 41010045Speter{ 41110045Speter int ports; 41210045Speter 41310045Speter if (ac != 0) 41410045Speter prusage(U_NPORT, 1); 41510045Speter if (ioctl(ctlfd, TCSIPORTS, &ports) < 0) 41630427Scharnier err(1, "TCSIPORTS on %s", Devname); 41710045Speter printf("SLXOS: total of %d ports\n", ports); 41810045Speter} 41910045Speter 42030427Scharniervoid 42110045Speterccb_stat(ac, av) 42210045Speterchar **av; 42310045Speter{ 42410045Speter struct si_pstat sip; 42510045Speter#define CCB sip.tc_ccb 42610045Speter 42710045Speter if (ac != 0) 42830427Scharnier prusage(U_STAT_CCB, 1); 42910045Speter sip.tc_dev = tc.tc_dev; 43010045Speter if (ioctl(ctlfd, TCSI_CCB, &sip) < 0) 43130427Scharnier err(1, "TCSI_CCB on %s", Devname); 43210045Speter printf("%s: ", Devname); 43310045Speter 43410045Speter /* WORD next - Next Channel */ 43510045Speter /* WORD addr_uart - Uart address */ 43610045Speter /* WORD module - address of module struct */ 43710045Speter printf("\tuart_type 0x%x\n", CCB.type); /* BYTE type - Uart type */ 43810045Speter /* BYTE fill - */ 43910045Speter printf("\tx_status 0x%x\n", CCB.x_status); /* BYTE x_status - XON / XOFF status */ 44010045Speter printf("\tc_status 0x%x\n", CCB.c_status); /* BYTE c_status - cooking status */ 44110045Speter printf("\thi_rxipos 0x%x\n", CCB.hi_rxipos); /* BYTE hi_rxipos - stuff into rx buff */ 44210045Speter printf("\thi_rxopos 0x%x\n", CCB.hi_rxopos); /* BYTE hi_rxopos - stuff out of rx buffer */ 44310045Speter printf("\thi_txopos 0x%x\n", CCB.hi_txopos); /* BYTE hi_txopos - Stuff into tx ptr */ 44410045Speter printf("\thi_txipos 0x%x\n", CCB.hi_txipos); /* BYTE hi_txipos - ditto out */ 44510045Speter printf("\thi_stat 0x%x\n", CCB.hi_stat); /* BYTE hi_stat - Command register */ 44610045Speter printf("\tdsr_bit 0x%x\n", CCB.dsr_bit); /* BYTE dsr_bit - Magic bit for DSR */ 44710045Speter printf("\ttxon 0x%x\n", CCB.txon); /* BYTE txon - TX XON char */ 44810045Speter printf("\ttxoff 0x%x\n", CCB.txoff); /* BYTE txoff - ditto XOFF */ 44910045Speter printf("\trxon 0x%x\n", CCB.rxon); /* BYTE rxon - RX XON char */ 45010045Speter printf("\trxoff 0x%x\n", CCB.rxoff); /* BYTE rxoff - ditto XOFF */ 45110045Speter printf("\thi_mr1 0x%x\n", CCB.hi_mr1); /* BYTE hi_mr1 - mode 1 image */ 45210045Speter printf("\thi_mr2 0x%x\n", CCB.hi_mr2); /* BYTE hi_mr2 - mode 2 image */ 45310045Speter printf("\thi_csr 0x%x\n", CCB.hi_csr); /* BYTE hi_csr - clock register */ 45410045Speter printf("\thi_op 0x%x\n", CCB.hi_op); /* BYTE hi_op - Op control */ 45510045Speter printf("\thi_ip 0x%x\n", CCB.hi_ip); /* BYTE hi_ip - Input pins */ 45610045Speter printf("\thi_state 0x%x\n", CCB.hi_state); /* BYTE hi_state - status */ 45710045Speter printf("\thi_prtcl 0x%x\n", CCB.hi_prtcl); /* BYTE hi_prtcl - Protocol */ 45810045Speter printf("\thi_txon 0x%x\n", CCB.hi_txon); /* BYTE hi_txon - host copy tx xon stuff */ 45910045Speter printf("\thi_txoff 0x%x\n", CCB.hi_txoff); /* BYTE hi_txoff - */ 46010045Speter printf("\thi_rxon 0x%x\n", CCB.hi_rxon); /* BYTE hi_rxon - */ 46110045Speter printf("\thi_rxoff 0x%x\n", CCB.hi_rxoff); /* BYTE hi_rxoff - */ 46210045Speter printf("\tclose_prev 0x%x\n", CCB.close_prev); /* BYTE close_prev - Was channel previously closed */ 46310045Speter printf("\thi_break 0x%x\n", CCB.hi_break); /* BYTE hi_break - host copy break process */ 46410045Speter printf("\tbreak_state 0x%x\n", CCB.break_state); /* BYTE break_state - local copy ditto */ 46510045Speter printf("\thi_mask 0x%x\n", CCB.hi_mask); /* BYTE hi_mask - Mask for CS7 etc. */ 46610045Speter printf("\tmask_z280 0x%x\n", CCB.mask_z280); /* BYTE mask_z280 - Z280's copy */ 46710045Speter /* BYTE res[0x60 - 36] - */ 46810045Speter /* BYTE hi_txbuf[SLXOS_BUFFERSIZE] - */ 46910045Speter /* BYTE hi_rxbuf[SLXOS_BUFFERSIZE] - */ 47010045Speter /* BYTE res1[0xA0] - */ 47110045Speter} 47210045Speter 47330427Scharniervoid 47410045Spetertty_stat(ac, av) 47510045Speterchar **av; 47610045Speter{ 47710045Speter struct si_pstat sip; 47810045Speter#define TTY sip.tc_tty 47910045Speter 48010045Speter if (ac != 0) 48130427Scharnier prusage(U_STAT_TTY, 1); 48210045Speter sip.tc_dev = tc.tc_dev; 48310045Speter if (ioctl(ctlfd, TCSI_TTY, &sip) < 0) 48430427Scharnier err(1, "TCSI_TTY on %s", Devname); 48510045Speter printf("%s: ", Devname); 48610045Speter 48710045Speter printf("\tt_outq.c_cc %d.\n", TTY.t_outq.c_cc); /* struct clist t_outq */ 48810045Speter printf("\tt_dev 0x%x\n", TTY.t_dev); /* dev_t t_dev */ 48910045Speter printf("\tt_flags 0x%x\n", TTY.t_flags); /* int t_flags */ 49010045Speter printf("\tt_state 0x%x\n", TTY.t_state); /* int t_state */ 49134185Sbde printf("\tt_ihiwat %d.\n", TTY.t_ihiwat); /* int t_ihiwat */ 49234185Sbde printf("\tt_ilowat %d.\n", TTY.t_ilowat); /* int t_ilowat */ 49334185Sbde printf("\tt_ohiwat %d.\n", TTY.t_ohiwat); /* int t_ohiwat */ 49434185Sbde printf("\tt_olowat %d.\n", TTY.t_olowat); /* int t_olowat */ 49510045Speter printf("\tt_iflag 0x%x\n", TTY.t_iflag); /* t_iflag */ 49610045Speter printf("\tt_oflag 0x%x\n", TTY.t_oflag); /* t_oflag */ 49710045Speter printf("\tt_cflag 0x%x\n", TTY.t_cflag); /* t_cflag */ 49810045Speter printf("\tt_lflag 0x%x\n", TTY.t_lflag); /* t_lflag */ 49910045Speter printf("\tt_cc 0x%x\n", TTY.t_cc); /* t_cc */ 50010045Speter printf("\tt_termios.c_ispeed 0x%x\n", TTY.t_termios.c_ispeed); /* t_termios.c_ispeed */ 50110045Speter printf("\tt_termios.c_ospeed 0x%x\n", TTY.t_termios.c_ospeed); /* t_termios.c_ospeed */ 50210045Speter} 50310045Speter 50430427Scharnierint 50510045Speterislevel(tk) 50610045Speter char *tk; 50710045Speter{ 50810045Speter register struct lv *lvp; 50910045Speter register char *acp; 51010045Speter 51110045Speter for (acp = tk; *acp; acp++) 51210045Speter if (isupper(*acp)) 51310045Speter *acp = tolower(*acp); 51410045Speter for (lvp = lv; lvp->lv_name; lvp++) 51510045Speter if (strcmp(lvp->lv_name, tk) == 0) 51610045Speter return(lvp->lv_bit); 51710045Speter return(0); 51810045Speter} 51910045Speter 52010045Speter/* 52110045Speter * Convert a string consisting of tokens separated by white space, commas 52210045Speter * or `|' into a bitfield - flag any unrecognised tokens. 52310045Speter */ 52430427Scharnierint 52510045Speterlvls2bits(str) 52610045Speter char *str; 52710045Speter{ 52810045Speter int i, bits = 0; 52910045Speter int errflag = 0; 53010045Speter char token[20]; 53110045Speter 53210045Speter while (sscanf(str, "%[^,| \t]", token) == 1) { 53310045Speter str += strlen(token); 53410045Speter while (isspace(*str) || *str==',' || *str=='|') 53510045Speter str++; 53610045Speter if (strcmp(token, "all") == 0) 53710045Speter return(0xffffffff); 53810045Speter if ((i = islevel(token)) == 0) { 53930427Scharnier warnx("unknown token '%s'", token); 54010045Speter errflag++; 54110045Speter } else 54210045Speter bits |= i; 54310045Speter } 54410045Speter if (errflag) 54510045Speter exit(1); 54610045Speter 54710045Speter return(bits); 54810045Speter} 54910045Speter 55010045Speterint 55110045Spetergetnum(char *str) 55210045Speter{ 55310045Speter int x; 55410045Speter register char *acp = str; 55510045Speter 55610045Speter x = 0; 55710045Speter while (*acp) { 55830427Scharnier if (!isdigit(*acp)) 55930427Scharnier errx(1, "%s is not a number", str); 56010045Speter x *= 10; 56110045Speter x += (*acp - '0'); 56210045Speter acp++; 56310045Speter } 56410045Speter return(x); 56510045Speter} 56610045Speter 56730427Scharniervoid 56810045Speterprlevels(x) 56910045Speter int x; 57010045Speter{ 57110045Speter struct lv *lvp; 57210045Speter 57310045Speter switch (x) { 57410045Speter case 0: 57510045Speter printf("(none)\n"); 57610045Speter break; 57710045Speter case 0xffffffff: 57810045Speter printf("all\n"); 57910045Speter break; 58010045Speter default: 58110045Speter for (lvp = lv; lvp->lv_name; lvp++) 58210045Speter if (x & lvp->lv_bit) 58310045Speter printf(" %s", lvp->lv_name); 58410045Speter printf("\n"); 58510045Speter } 58610045Speter} 58710045Speter 588