1*50008Sbostic /*- 2*50008Sbostic * Copyright (c) 1991 The Regents of the University of California. 3*50008Sbostic * All rights reserved. 4*50008Sbostic * 5*50008Sbostic * %sccs.include.redist.c% 6*50008Sbostic */ 7*50008Sbostic 8*50008Sbostic #ifndef lint 9*50008Sbostic static char sccsid[] = "@(#)key.c 5.1 (Berkeley) 06/05/91"; 10*50008Sbostic #endif /* not lint */ 11*50008Sbostic 12*50008Sbostic #include <sys/types.h> 13*50008Sbostic #include <errno.h> 14*50008Sbostic #include <stdlib.h> 15*50008Sbostic #include <stdio.h> 16*50008Sbostic #include <string.h> 17*50008Sbostic #include "stty.h" 18*50008Sbostic #include "extern.h" 19*50008Sbostic 20*50008Sbostic __BEGIN_DECLS 21*50008Sbostic int c_key __P((const void *, const void *)); 22*50008Sbostic void f_all __P((struct info *)); 23*50008Sbostic void f_cbreak __P((struct info *)); 24*50008Sbostic void f_columns __P((struct info *)); 25*50008Sbostic void f_dec __P((struct info *)); 26*50008Sbostic void f_everything __P((struct info *)); 27*50008Sbostic void f_extproc __P((struct info *)); 28*50008Sbostic void f_ispeed __P((struct info *)); 29*50008Sbostic void f_nl __P((struct info *)); 30*50008Sbostic void f_ospeed __P((struct info *)); 31*50008Sbostic void f_raw __P((struct info *)); 32*50008Sbostic void f_rows __P((struct info *)); 33*50008Sbostic void f_sane __P((struct info *)); 34*50008Sbostic void f_size __P((struct info *)); 35*50008Sbostic void f_speed __P((struct info *)); 36*50008Sbostic void f_tty __P((struct info *)); 37*50008Sbostic __END_DECLS 38*50008Sbostic 39*50008Sbostic static struct key keys[] = { 40*50008Sbostic "all", f_all, 0, 41*50008Sbostic "cbreak", f_cbreak, F_OFFOK, 42*50008Sbostic "cols", f_columns, F_NEEDARG, 43*50008Sbostic "columns", f_columns, F_NEEDARG, 44*50008Sbostic "cooked", f_sane, 0, 45*50008Sbostic "dec", f_dec, 0, 46*50008Sbostic "everything", f_everything, 0, 47*50008Sbostic "extproc", f_extproc, F_OFFOK, 48*50008Sbostic "ispeed", f_ispeed, 0, 49*50008Sbostic "new", f_tty, 0, 50*50008Sbostic "nl", f_nl, F_OFFOK, 51*50008Sbostic "old", f_tty, 0, 52*50008Sbostic "ospeed", f_ospeed, F_NEEDARG, 53*50008Sbostic "raw", f_raw, F_OFFOK, 54*50008Sbostic "rows", f_rows, F_NEEDARG, 55*50008Sbostic "sane", f_sane, 0, 56*50008Sbostic "size", f_size, 0, 57*50008Sbostic "speed", f_speed, 0, 58*50008Sbostic "tty", f_tty, 0, 59*50008Sbostic }; 60*50008Sbostic 61*50008Sbostic struct key * 62*50008Sbostic ksearch(name) 63*50008Sbostic char *name; 64*50008Sbostic { 65*50008Sbostic struct key tmp; 66*50008Sbostic int c_key __P((const void *, const void *)); 67*50008Sbostic 68*50008Sbostic tmp.name = name; 69*50008Sbostic return((struct key *)bsearch(&tmp, keys, 70*50008Sbostic sizeof(keys)/sizeof(struct key), sizeof(struct key), c_key)); 71*50008Sbostic } 72*50008Sbostic 73*50008Sbostic static 74*50008Sbostic c_key(a, b) 75*50008Sbostic const void *a, *b; 76*50008Sbostic { 77*50008Sbostic return(strcmp(((struct key *)a)->name, ((struct key *)b)->name)); 78*50008Sbostic } 79*50008Sbostic 80*50008Sbostic void 81*50008Sbostic f_all(ip) 82*50008Sbostic struct info *ip; 83*50008Sbostic { 84*50008Sbostic print(&ip->t, &ip->win, ip->ldisc, BSD); 85*50008Sbostic } 86*50008Sbostic 87*50008Sbostic void 88*50008Sbostic f_cbreak(ip) 89*50008Sbostic struct info *ip; 90*50008Sbostic { 91*50008Sbostic if (ip->off) 92*50008Sbostic f_sane(ip); 93*50008Sbostic else { 94*50008Sbostic ip->t.c_iflag |= BRKINT|IXON|IMAXBEL; 95*50008Sbostic ip->t.c_oflag |= OPOST; 96*50008Sbostic ip->t.c_lflag |= ISIG|IEXTEN; 97*50008Sbostic ip->t.c_lflag &= ~ICANON; 98*50008Sbostic ip->set = 1; 99*50008Sbostic } 100*50008Sbostic } 101*50008Sbostic 102*50008Sbostic void 103*50008Sbostic f_columns(ip) 104*50008Sbostic struct info *ip; 105*50008Sbostic { 106*50008Sbostic ip->win.ws_col = atoi(ip->arg); 107*50008Sbostic ip->wset = 1; 108*50008Sbostic } 109*50008Sbostic 110*50008Sbostic void 111*50008Sbostic f_dec(ip) 112*50008Sbostic struct info *ip; 113*50008Sbostic { 114*50008Sbostic ip->t.c_cc[VERASE] = (u_char)0177; 115*50008Sbostic ip->t.c_cc[VKILL] = CTRL('u'); 116*50008Sbostic ip->t.c_cc[VINTR] = CTRL('c'); 117*50008Sbostic ip->t.c_lflag &= ~ECHOPRT; 118*50008Sbostic ip->t.c_lflag |= ECHOE|ECHOKE|ECHOCTL; 119*50008Sbostic ip->t.c_iflag &= ~IXANY; 120*50008Sbostic ip->set = 1; 121*50008Sbostic } 122*50008Sbostic 123*50008Sbostic void 124*50008Sbostic f_everything(ip) 125*50008Sbostic struct info *ip; 126*50008Sbostic { 127*50008Sbostic print(&ip->t, &ip->win, ip->ldisc, BSD); 128*50008Sbostic } 129*50008Sbostic 130*50008Sbostic void 131*50008Sbostic f_extproc(ip) 132*50008Sbostic struct info *ip; 133*50008Sbostic { 134*50008Sbostic int tmp; 135*50008Sbostic 136*50008Sbostic if (ip->set) { 137*50008Sbostic tmp = 1; 138*50008Sbostic (void)ioctl(ip->fd, TIOCEXT, &tmp); 139*50008Sbostic } else { 140*50008Sbostic tmp = 0; 141*50008Sbostic (void)ioctl(ip->fd, TIOCEXT, &tmp); 142*50008Sbostic } 143*50008Sbostic } 144*50008Sbostic 145*50008Sbostic void 146*50008Sbostic f_ispeed(ip) 147*50008Sbostic struct info *ip; 148*50008Sbostic { 149*50008Sbostic cfsetispeed(&ip->t, atoi(ip->arg)); 150*50008Sbostic ip->set = 1; 151*50008Sbostic } 152*50008Sbostic 153*50008Sbostic void 154*50008Sbostic f_nl(ip) 155*50008Sbostic struct info *ip; 156*50008Sbostic { 157*50008Sbostic if (ip->off) { 158*50008Sbostic ip->t.c_iflag |= ICRNL; 159*50008Sbostic ip->t.c_oflag |= ONLCR; 160*50008Sbostic } else { 161*50008Sbostic ip->t.c_iflag &= ~ICRNL; 162*50008Sbostic ip->t.c_oflag &= ~ONLCR; 163*50008Sbostic } 164*50008Sbostic ip->set = 1; 165*50008Sbostic } 166*50008Sbostic 167*50008Sbostic void 168*50008Sbostic f_ospeed(ip) 169*50008Sbostic struct info *ip; 170*50008Sbostic { 171*50008Sbostic cfsetospeed(&ip->t, atoi(ip->arg)); 172*50008Sbostic ip->set = 1; 173*50008Sbostic } 174*50008Sbostic 175*50008Sbostic void 176*50008Sbostic f_raw(ip) 177*50008Sbostic struct info *ip; 178*50008Sbostic { 179*50008Sbostic if (ip->off) 180*50008Sbostic f_sane(ip); 181*50008Sbostic else { 182*50008Sbostic cfmakeraw(&ip->t); 183*50008Sbostic ip->t.c_cflag &= ~(CSIZE|PARENB); 184*50008Sbostic ip->t.c_cflag |= CS8; 185*50008Sbostic ip->set = 1; 186*50008Sbostic } 187*50008Sbostic } 188*50008Sbostic 189*50008Sbostic void 190*50008Sbostic f_rows(ip) 191*50008Sbostic struct info *ip; 192*50008Sbostic { 193*50008Sbostic ip->win.ws_row = atoi(ip->arg); 194*50008Sbostic ip->wset = 1; 195*50008Sbostic } 196*50008Sbostic 197*50008Sbostic void 198*50008Sbostic f_sane(ip) 199*50008Sbostic struct info *ip; 200*50008Sbostic { 201*50008Sbostic ip->t.c_cflag = TTYDEF_CFLAG | (ip->t.c_cflag & CLOCAL); 202*50008Sbostic ip->t.c_iflag = TTYDEF_IFLAG; 203*50008Sbostic ip->t.c_iflag |= ICRNL; 204*50008Sbostic /* preserve user-preference flags in lflag */ 205*50008Sbostic #define LKEEP (ECHOKE|ECHOE|ECHOK|ECHOPRT|ECHOCTL|ALTWERASE|TOSTOP|NOFLSH) 206*50008Sbostic ip->t.c_lflag = TTYDEF_LFLAG | (ip->t.c_lflag & LKEEP); 207*50008Sbostic ip->t.c_oflag = TTYDEF_OFLAG; 208*50008Sbostic ip->set = 1; 209*50008Sbostic } 210*50008Sbostic 211*50008Sbostic void 212*50008Sbostic f_size(ip) 213*50008Sbostic struct info *ip; 214*50008Sbostic { 215*50008Sbostic (void)printf("%d %d\n", ip->win.ws_row, ip->win.ws_col); 216*50008Sbostic } 217*50008Sbostic 218*50008Sbostic void 219*50008Sbostic f_speed(ip) 220*50008Sbostic struct info *ip; 221*50008Sbostic { 222*50008Sbostic (void)printf("%d\n", cfgetospeed(&ip->t)); 223*50008Sbostic } 224*50008Sbostic 225*50008Sbostic void 226*50008Sbostic f_tty(ip) 227*50008Sbostic struct info *ip; 228*50008Sbostic { 229*50008Sbostic int tmp; 230*50008Sbostic 231*50008Sbostic tmp = TTYDISC; 232*50008Sbostic if (ioctl(0, TIOCSETD, &tmp) < 0) 233*50008Sbostic err("TIOCSETD: %s", strerror(errno)); 234*50008Sbostic } 235