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