150008Sbostic /*- 250008Sbostic * Copyright (c) 1991 The Regents of the University of California. 350008Sbostic * All rights reserved. 450008Sbostic * 550008Sbostic * %sccs.include.redist.c% 650008Sbostic */ 750008Sbostic 850008Sbostic #ifndef lint 9*50041Sbostic static char sccsid[] = "@(#)key.c 5.3 (Berkeley) 06/10/91"; 1050008Sbostic #endif /* not lint */ 1150008Sbostic 1250008Sbostic #include <sys/types.h> 1350008Sbostic #include <errno.h> 1450008Sbostic #include <stdlib.h> 1550008Sbostic #include <stdio.h> 1650008Sbostic #include <string.h> 1750008Sbostic #include "stty.h" 1850008Sbostic #include "extern.h" 1950008Sbostic 2050008Sbostic __BEGIN_DECLS 2150008Sbostic void f_all __P((struct info *)); 2250008Sbostic void f_cbreak __P((struct info *)); 2350008Sbostic void f_columns __P((struct info *)); 2450008Sbostic void f_dec __P((struct info *)); 2550008Sbostic void f_everything __P((struct info *)); 2650008Sbostic void f_extproc __P((struct info *)); 2750008Sbostic void f_ispeed __P((struct info *)); 2850008Sbostic void f_nl __P((struct info *)); 2950008Sbostic void f_ospeed __P((struct info *)); 3050008Sbostic void f_raw __P((struct info *)); 3150008Sbostic void f_rows __P((struct info *)); 3250008Sbostic void f_sane __P((struct info *)); 3350008Sbostic void f_size __P((struct info *)); 3450008Sbostic void f_speed __P((struct info *)); 3550008Sbostic void f_tty __P((struct info *)); 3650008Sbostic __END_DECLS 3750008Sbostic 38*50041Sbostic static struct key { 39*50041Sbostic char *name; /* name */ 40*50041Sbostic void (*f) __P((struct info *)); /* function */ 41*50041Sbostic #define F_NEEDARG 0x01 /* needs an argument */ 42*50041Sbostic #define F_OFFOK 0x02 /* can turn off */ 43*50041Sbostic int flags; 44*50041Sbostic } keys[] = { 4550008Sbostic "all", f_all, 0, 4650008Sbostic "cbreak", f_cbreak, F_OFFOK, 4750008Sbostic "cols", f_columns, F_NEEDARG, 4850008Sbostic "columns", f_columns, F_NEEDARG, 4950008Sbostic "cooked", f_sane, 0, 5050008Sbostic "dec", f_dec, 0, 5150008Sbostic "everything", f_everything, 0, 5250008Sbostic "extproc", f_extproc, F_OFFOK, 5350008Sbostic "ispeed", f_ispeed, 0, 5450008Sbostic "new", f_tty, 0, 5550008Sbostic "nl", f_nl, F_OFFOK, 5650008Sbostic "old", f_tty, 0, 5750008Sbostic "ospeed", f_ospeed, F_NEEDARG, 5850008Sbostic "raw", f_raw, F_OFFOK, 5950008Sbostic "rows", f_rows, F_NEEDARG, 6050008Sbostic "sane", f_sane, 0, 6150008Sbostic "size", f_size, 0, 6250008Sbostic "speed", f_speed, 0, 6350008Sbostic "tty", f_tty, 0, 6450008Sbostic }; 6550008Sbostic 6650010Sbostic ksearch(argvp, ip) 6750010Sbostic char ***argvp; 6850010Sbostic struct info *ip; 6950008Sbostic { 7050010Sbostic register struct key *kp; 7150010Sbostic register char *name; 7250008Sbostic struct key tmp; 7350010Sbostic static int c_key __P((const void *, const void *)); 7450008Sbostic 7550010Sbostic name = **argvp; 7650010Sbostic if (*name == '-') { 7750010Sbostic ip->off = 1; 7850010Sbostic ++name; 7950010Sbostic } else 8050010Sbostic ip->off = 0; 8150010Sbostic 8250008Sbostic tmp.name = name; 8350010Sbostic if (!(kp = (struct key *)bsearch(&tmp, keys, 8450010Sbostic sizeof(keys)/sizeof(struct key), sizeof(struct key), c_key))) 8550010Sbostic return(0); 8650010Sbostic if (!(kp->flags & F_OFFOK) && ip->off) 8750010Sbostic err("illegal option -- %s\n%s", name, usage); 8850010Sbostic if (kp->flags & F_NEEDARG && !(ip->arg = *++*argvp)) 8950010Sbostic err("option requires an argument -- %s\n%s", name, usage); 9050010Sbostic kp->f(ip); 9150010Sbostic return(1); 9250008Sbostic } 9350008Sbostic 9450008Sbostic static 9550008Sbostic c_key(a, b) 9650008Sbostic const void *a, *b; 9750008Sbostic { 9850008Sbostic return(strcmp(((struct key *)a)->name, ((struct key *)b)->name)); 9950008Sbostic } 10050008Sbostic 10150008Sbostic void 10250008Sbostic f_all(ip) 10350008Sbostic struct info *ip; 10450008Sbostic { 10550008Sbostic print(&ip->t, &ip->win, ip->ldisc, BSD); 10650008Sbostic } 10750008Sbostic 10850008Sbostic void 10950008Sbostic f_cbreak(ip) 11050008Sbostic struct info *ip; 11150008Sbostic { 11250008Sbostic if (ip->off) 11350008Sbostic f_sane(ip); 11450008Sbostic else { 11550008Sbostic ip->t.c_iflag |= BRKINT|IXON|IMAXBEL; 11650008Sbostic ip->t.c_oflag |= OPOST; 11750008Sbostic ip->t.c_lflag |= ISIG|IEXTEN; 11850008Sbostic ip->t.c_lflag &= ~ICANON; 11950008Sbostic ip->set = 1; 12050008Sbostic } 12150008Sbostic } 12250008Sbostic 12350008Sbostic void 12450008Sbostic f_columns(ip) 12550008Sbostic struct info *ip; 12650008Sbostic { 12750008Sbostic ip->win.ws_col = atoi(ip->arg); 12850008Sbostic ip->wset = 1; 12950008Sbostic } 13050008Sbostic 13150008Sbostic void 13250008Sbostic f_dec(ip) 13350008Sbostic struct info *ip; 13450008Sbostic { 13550008Sbostic ip->t.c_cc[VERASE] = (u_char)0177; 13650008Sbostic ip->t.c_cc[VKILL] = CTRL('u'); 13750008Sbostic ip->t.c_cc[VINTR] = CTRL('c'); 13850008Sbostic ip->t.c_lflag &= ~ECHOPRT; 13950008Sbostic ip->t.c_lflag |= ECHOE|ECHOKE|ECHOCTL; 14050008Sbostic ip->t.c_iflag &= ~IXANY; 14150008Sbostic ip->set = 1; 14250008Sbostic } 14350008Sbostic 14450008Sbostic void 14550008Sbostic f_everything(ip) 14650008Sbostic struct info *ip; 14750008Sbostic { 14850008Sbostic print(&ip->t, &ip->win, ip->ldisc, BSD); 14950008Sbostic } 15050008Sbostic 15150008Sbostic void 15250008Sbostic f_extproc(ip) 15350008Sbostic struct info *ip; 15450008Sbostic { 15550008Sbostic int tmp; 15650008Sbostic 15750008Sbostic if (ip->set) { 15850008Sbostic tmp = 1; 15950008Sbostic (void)ioctl(ip->fd, TIOCEXT, &tmp); 16050008Sbostic } else { 16150008Sbostic tmp = 0; 16250008Sbostic (void)ioctl(ip->fd, TIOCEXT, &tmp); 16350008Sbostic } 16450008Sbostic } 16550008Sbostic 16650008Sbostic void 16750008Sbostic f_ispeed(ip) 16850008Sbostic struct info *ip; 16950008Sbostic { 17050008Sbostic cfsetispeed(&ip->t, atoi(ip->arg)); 17150008Sbostic ip->set = 1; 17250008Sbostic } 17350008Sbostic 17450008Sbostic void 17550008Sbostic f_nl(ip) 17650008Sbostic struct info *ip; 17750008Sbostic { 17850008Sbostic if (ip->off) { 17950008Sbostic ip->t.c_iflag |= ICRNL; 18050008Sbostic ip->t.c_oflag |= ONLCR; 18150008Sbostic } else { 18250008Sbostic ip->t.c_iflag &= ~ICRNL; 18350008Sbostic ip->t.c_oflag &= ~ONLCR; 18450008Sbostic } 18550008Sbostic ip->set = 1; 18650008Sbostic } 18750008Sbostic 18850008Sbostic void 18950008Sbostic f_ospeed(ip) 19050008Sbostic struct info *ip; 19150008Sbostic { 19250008Sbostic cfsetospeed(&ip->t, atoi(ip->arg)); 19350008Sbostic ip->set = 1; 19450008Sbostic } 19550008Sbostic 19650008Sbostic void 19750008Sbostic f_raw(ip) 19850008Sbostic struct info *ip; 19950008Sbostic { 20050008Sbostic if (ip->off) 20150008Sbostic f_sane(ip); 20250008Sbostic else { 20350008Sbostic cfmakeraw(&ip->t); 20450008Sbostic ip->t.c_cflag &= ~(CSIZE|PARENB); 20550008Sbostic ip->t.c_cflag |= CS8; 20650008Sbostic ip->set = 1; 20750008Sbostic } 20850008Sbostic } 20950008Sbostic 21050008Sbostic void 21150008Sbostic f_rows(ip) 21250008Sbostic struct info *ip; 21350008Sbostic { 21450008Sbostic ip->win.ws_row = atoi(ip->arg); 21550008Sbostic ip->wset = 1; 21650008Sbostic } 21750008Sbostic 21850008Sbostic void 21950008Sbostic f_sane(ip) 22050008Sbostic struct info *ip; 22150008Sbostic { 22250008Sbostic ip->t.c_cflag = TTYDEF_CFLAG | (ip->t.c_cflag & CLOCAL); 22350008Sbostic ip->t.c_iflag = TTYDEF_IFLAG; 22450008Sbostic ip->t.c_iflag |= ICRNL; 22550008Sbostic /* preserve user-preference flags in lflag */ 22650008Sbostic #define LKEEP (ECHOKE|ECHOE|ECHOK|ECHOPRT|ECHOCTL|ALTWERASE|TOSTOP|NOFLSH) 22750008Sbostic ip->t.c_lflag = TTYDEF_LFLAG | (ip->t.c_lflag & LKEEP); 22850008Sbostic ip->t.c_oflag = TTYDEF_OFLAG; 22950008Sbostic ip->set = 1; 23050008Sbostic } 23150008Sbostic 23250008Sbostic void 23350008Sbostic f_size(ip) 23450008Sbostic struct info *ip; 23550008Sbostic { 23650008Sbostic (void)printf("%d %d\n", ip->win.ws_row, ip->win.ws_col); 23750008Sbostic } 23850008Sbostic 23950008Sbostic void 24050008Sbostic f_speed(ip) 24150008Sbostic struct info *ip; 24250008Sbostic { 24350008Sbostic (void)printf("%d\n", cfgetospeed(&ip->t)); 24450008Sbostic } 24550008Sbostic 24650008Sbostic void 24750008Sbostic f_tty(ip) 24850008Sbostic struct info *ip; 24950008Sbostic { 25050008Sbostic int tmp; 25150008Sbostic 25250008Sbostic tmp = TTYDISC; 25350008Sbostic if (ioctl(0, TIOCSETD, &tmp) < 0) 25450008Sbostic err("TIOCSETD: %s", strerror(errno)); 25550008Sbostic } 256