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*50010Sbostic static char sccsid[] = "@(#)key.c 5.2 (Berkeley) 06/05/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 3850008Sbostic static struct key keys[] = { 3950008Sbostic "all", f_all, 0, 4050008Sbostic "cbreak", f_cbreak, F_OFFOK, 4150008Sbostic "cols", f_columns, F_NEEDARG, 4250008Sbostic "columns", f_columns, F_NEEDARG, 4350008Sbostic "cooked", f_sane, 0, 4450008Sbostic "dec", f_dec, 0, 4550008Sbostic "everything", f_everything, 0, 4650008Sbostic "extproc", f_extproc, F_OFFOK, 4750008Sbostic "ispeed", f_ispeed, 0, 4850008Sbostic "new", f_tty, 0, 4950008Sbostic "nl", f_nl, F_OFFOK, 5050008Sbostic "old", f_tty, 0, 5150008Sbostic "ospeed", f_ospeed, F_NEEDARG, 5250008Sbostic "raw", f_raw, F_OFFOK, 5350008Sbostic "rows", f_rows, F_NEEDARG, 5450008Sbostic "sane", f_sane, 0, 5550008Sbostic "size", f_size, 0, 5650008Sbostic "speed", f_speed, 0, 5750008Sbostic "tty", f_tty, 0, 5850008Sbostic }; 5950008Sbostic 60*50010Sbostic ksearch(argvp, ip) 61*50010Sbostic char ***argvp; 62*50010Sbostic struct info *ip; 6350008Sbostic { 64*50010Sbostic register struct key *kp; 65*50010Sbostic register char *name; 6650008Sbostic struct key tmp; 67*50010Sbostic static int c_key __P((const void *, const void *)); 6850008Sbostic 69*50010Sbostic name = **argvp; 70*50010Sbostic if (*name == '-') { 71*50010Sbostic ip->off = 1; 72*50010Sbostic ++name; 73*50010Sbostic } else 74*50010Sbostic ip->off = 0; 75*50010Sbostic 7650008Sbostic tmp.name = name; 77*50010Sbostic if (!(kp = (struct key *)bsearch(&tmp, keys, 78*50010Sbostic sizeof(keys)/sizeof(struct key), sizeof(struct key), c_key))) 79*50010Sbostic return(0); 80*50010Sbostic if (!(kp->flags & F_OFFOK) && ip->off) 81*50010Sbostic err("illegal option -- %s\n%s", name, usage); 82*50010Sbostic if (kp->flags & F_NEEDARG && !(ip->arg = *++*argvp)) 83*50010Sbostic err("option requires an argument -- %s\n%s", name, usage); 84*50010Sbostic kp->f(ip); 85*50010Sbostic return(1); 8650008Sbostic } 8750008Sbostic 8850008Sbostic static 8950008Sbostic c_key(a, b) 9050008Sbostic const void *a, *b; 9150008Sbostic { 9250008Sbostic return(strcmp(((struct key *)a)->name, ((struct key *)b)->name)); 9350008Sbostic } 9450008Sbostic 9550008Sbostic void 9650008Sbostic f_all(ip) 9750008Sbostic struct info *ip; 9850008Sbostic { 9950008Sbostic print(&ip->t, &ip->win, ip->ldisc, BSD); 10050008Sbostic } 10150008Sbostic 10250008Sbostic void 10350008Sbostic f_cbreak(ip) 10450008Sbostic struct info *ip; 10550008Sbostic { 10650008Sbostic if (ip->off) 10750008Sbostic f_sane(ip); 10850008Sbostic else { 10950008Sbostic ip->t.c_iflag |= BRKINT|IXON|IMAXBEL; 11050008Sbostic ip->t.c_oflag |= OPOST; 11150008Sbostic ip->t.c_lflag |= ISIG|IEXTEN; 11250008Sbostic ip->t.c_lflag &= ~ICANON; 11350008Sbostic ip->set = 1; 11450008Sbostic } 11550008Sbostic } 11650008Sbostic 11750008Sbostic void 11850008Sbostic f_columns(ip) 11950008Sbostic struct info *ip; 12050008Sbostic { 12150008Sbostic ip->win.ws_col = atoi(ip->arg); 12250008Sbostic ip->wset = 1; 12350008Sbostic } 12450008Sbostic 12550008Sbostic void 12650008Sbostic f_dec(ip) 12750008Sbostic struct info *ip; 12850008Sbostic { 12950008Sbostic ip->t.c_cc[VERASE] = (u_char)0177; 13050008Sbostic ip->t.c_cc[VKILL] = CTRL('u'); 13150008Sbostic ip->t.c_cc[VINTR] = CTRL('c'); 13250008Sbostic ip->t.c_lflag &= ~ECHOPRT; 13350008Sbostic ip->t.c_lflag |= ECHOE|ECHOKE|ECHOCTL; 13450008Sbostic ip->t.c_iflag &= ~IXANY; 13550008Sbostic ip->set = 1; 13650008Sbostic } 13750008Sbostic 13850008Sbostic void 13950008Sbostic f_everything(ip) 14050008Sbostic struct info *ip; 14150008Sbostic { 14250008Sbostic print(&ip->t, &ip->win, ip->ldisc, BSD); 14350008Sbostic } 14450008Sbostic 14550008Sbostic void 14650008Sbostic f_extproc(ip) 14750008Sbostic struct info *ip; 14850008Sbostic { 14950008Sbostic int tmp; 15050008Sbostic 15150008Sbostic if (ip->set) { 15250008Sbostic tmp = 1; 15350008Sbostic (void)ioctl(ip->fd, TIOCEXT, &tmp); 15450008Sbostic } else { 15550008Sbostic tmp = 0; 15650008Sbostic (void)ioctl(ip->fd, TIOCEXT, &tmp); 15750008Sbostic } 15850008Sbostic } 15950008Sbostic 16050008Sbostic void 16150008Sbostic f_ispeed(ip) 16250008Sbostic struct info *ip; 16350008Sbostic { 16450008Sbostic cfsetispeed(&ip->t, atoi(ip->arg)); 16550008Sbostic ip->set = 1; 16650008Sbostic } 16750008Sbostic 16850008Sbostic void 16950008Sbostic f_nl(ip) 17050008Sbostic struct info *ip; 17150008Sbostic { 17250008Sbostic if (ip->off) { 17350008Sbostic ip->t.c_iflag |= ICRNL; 17450008Sbostic ip->t.c_oflag |= ONLCR; 17550008Sbostic } else { 17650008Sbostic ip->t.c_iflag &= ~ICRNL; 17750008Sbostic ip->t.c_oflag &= ~ONLCR; 17850008Sbostic } 17950008Sbostic ip->set = 1; 18050008Sbostic } 18150008Sbostic 18250008Sbostic void 18350008Sbostic f_ospeed(ip) 18450008Sbostic struct info *ip; 18550008Sbostic { 18650008Sbostic cfsetospeed(&ip->t, atoi(ip->arg)); 18750008Sbostic ip->set = 1; 18850008Sbostic } 18950008Sbostic 19050008Sbostic void 19150008Sbostic f_raw(ip) 19250008Sbostic struct info *ip; 19350008Sbostic { 19450008Sbostic if (ip->off) 19550008Sbostic f_sane(ip); 19650008Sbostic else { 19750008Sbostic cfmakeraw(&ip->t); 19850008Sbostic ip->t.c_cflag &= ~(CSIZE|PARENB); 19950008Sbostic ip->t.c_cflag |= CS8; 20050008Sbostic ip->set = 1; 20150008Sbostic } 20250008Sbostic } 20350008Sbostic 20450008Sbostic void 20550008Sbostic f_rows(ip) 20650008Sbostic struct info *ip; 20750008Sbostic { 20850008Sbostic ip->win.ws_row = atoi(ip->arg); 20950008Sbostic ip->wset = 1; 21050008Sbostic } 21150008Sbostic 21250008Sbostic void 21350008Sbostic f_sane(ip) 21450008Sbostic struct info *ip; 21550008Sbostic { 21650008Sbostic ip->t.c_cflag = TTYDEF_CFLAG | (ip->t.c_cflag & CLOCAL); 21750008Sbostic ip->t.c_iflag = TTYDEF_IFLAG; 21850008Sbostic ip->t.c_iflag |= ICRNL; 21950008Sbostic /* preserve user-preference flags in lflag */ 22050008Sbostic #define LKEEP (ECHOKE|ECHOE|ECHOK|ECHOPRT|ECHOCTL|ALTWERASE|TOSTOP|NOFLSH) 22150008Sbostic ip->t.c_lflag = TTYDEF_LFLAG | (ip->t.c_lflag & LKEEP); 22250008Sbostic ip->t.c_oflag = TTYDEF_OFLAG; 22350008Sbostic ip->set = 1; 22450008Sbostic } 22550008Sbostic 22650008Sbostic void 22750008Sbostic f_size(ip) 22850008Sbostic struct info *ip; 22950008Sbostic { 23050008Sbostic (void)printf("%d %d\n", ip->win.ws_row, ip->win.ws_col); 23150008Sbostic } 23250008Sbostic 23350008Sbostic void 23450008Sbostic f_speed(ip) 23550008Sbostic struct info *ip; 23650008Sbostic { 23750008Sbostic (void)printf("%d\n", cfgetospeed(&ip->t)); 23850008Sbostic } 23950008Sbostic 24050008Sbostic void 24150008Sbostic f_tty(ip) 24250008Sbostic struct info *ip; 24350008Sbostic { 24450008Sbostic int tmp; 24550008Sbostic 24650008Sbostic tmp = TTYDISC; 24750008Sbostic if (ioctl(0, TIOCSETD, &tmp) < 0) 24850008Sbostic err("TIOCSETD: %s", strerror(errno)); 24950008Sbostic } 250