1df930be7Sderaadt /* 2df930be7Sderaadt * Copyright (c) 1983, 1993 3df930be7Sderaadt * The Regents of the University of California. All rights reserved. 4df930be7Sderaadt * 5df930be7Sderaadt * Redistribution and use in source and binary forms, with or without 6df930be7Sderaadt * modification, are permitted provided that the following conditions 7df930be7Sderaadt * are met: 8df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright 9df930be7Sderaadt * notice, this list of conditions and the following disclaimer. 10df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright 11df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the 12df930be7Sderaadt * documentation and/or other materials provided with the distribution. 13df930be7Sderaadt * 3. All advertising materials mentioning features or use of this software 14df930be7Sderaadt * must display the following acknowledgement: 15df930be7Sderaadt * This product includes software developed by the University of 16df930be7Sderaadt * California, Berkeley and its contributors. 17df930be7Sderaadt * 4. Neither the name of the University nor the names of its contributors 18df930be7Sderaadt * may be used to endorse or promote products derived from this software 19df930be7Sderaadt * without specific prior written permission. 20df930be7Sderaadt * 21df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22df930be7Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23df930be7Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24df930be7Sderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25df930be7Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26df930be7Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27df930be7Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28df930be7Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29df930be7Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30df930be7Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31df930be7Sderaadt * SUCH DAMAGE. 32df930be7Sderaadt */ 33df930be7Sderaadt 34df930be7Sderaadt #ifndef lint 35df930be7Sderaadt /*static char sccsid[] = "from: @(#)subr.c 8.1 (Berkeley) 6/4/93";*/ 36*8f901b87Stholo static char rcsid[] = "$Id: subr.c,v 1.7 1996/12/17 19:33:55 tholo Exp $"; 37df930be7Sderaadt #endif /* not lint */ 38df930be7Sderaadt 39df930be7Sderaadt /* 40df930be7Sderaadt * Melbourne getty. 41df930be7Sderaadt */ 42df930be7Sderaadt #define COMPAT_43 43df930be7Sderaadt #include <stdlib.h> 44df930be7Sderaadt #include <unistd.h> 45df930be7Sderaadt #include <string.h> 46df930be7Sderaadt #include <termios.h> 47df930be7Sderaadt #include <sys/ioctl.h> 48df930be7Sderaadt 49df930be7Sderaadt #include "gettytab.h" 50df930be7Sderaadt #include "pathnames.h" 51df930be7Sderaadt #include "extern.h" 52df930be7Sderaadt 53df930be7Sderaadt extern struct termios tmode, omode; 54df930be7Sderaadt 55df930be7Sderaadt static void compatflags __P((long)); 56df930be7Sderaadt 57df930be7Sderaadt /* 58df930be7Sderaadt * Get a table entry. 59df930be7Sderaadt */ 60df930be7Sderaadt void 61df930be7Sderaadt gettable(name, buf) 62df930be7Sderaadt char *name, *buf; 63df930be7Sderaadt { 64df930be7Sderaadt register struct gettystrs *sp; 65df930be7Sderaadt register struct gettynums *np; 66df930be7Sderaadt register struct gettyflags *fp; 67df930be7Sderaadt long n; 68df930be7Sderaadt char *dba[2]; 69df930be7Sderaadt dba[0] = _PATH_GETTYTAB; 70df930be7Sderaadt dba[1] = 0; 71df930be7Sderaadt 72df930be7Sderaadt if (cgetent(&buf, dba, name) != 0) 73df930be7Sderaadt return; 74df930be7Sderaadt 75df930be7Sderaadt for (sp = gettystrs; sp->field; sp++) 76df930be7Sderaadt cgetstr(buf, sp->field, &sp->value); 77df930be7Sderaadt for (np = gettynums; np->field; np++) { 78df930be7Sderaadt if (cgetnum(buf, np->field, &n) == -1) 79df930be7Sderaadt np->set = 0; 80df930be7Sderaadt else { 81df930be7Sderaadt np->set = 1; 82df930be7Sderaadt np->value = n; 83df930be7Sderaadt } 84df930be7Sderaadt } 85df930be7Sderaadt for (fp = gettyflags; fp->field; fp++) { 86df930be7Sderaadt if (cgetcap(buf, fp->field, ':') == NULL) 87df930be7Sderaadt fp->set = 0; 88df930be7Sderaadt else { 89df930be7Sderaadt fp->set = 1; 90df930be7Sderaadt fp->value = 1 ^ fp->invrt; 91df930be7Sderaadt } 92df930be7Sderaadt } 93df930be7Sderaadt #ifdef DEBUG 94df930be7Sderaadt printf("name=\"%s\", buf=\"%s\"\n", name, buf); 95df930be7Sderaadt for (sp = gettystrs; sp->field; sp++) 96df930be7Sderaadt printf("cgetstr: %s=%s\n", sp->field, sp->value); 97df930be7Sderaadt for (np = gettynums; np->field; np++) 98df930be7Sderaadt printf("cgetnum: %s=%d\n", np->field, np->value); 99df930be7Sderaadt for (fp = gettyflags; fp->field; fp++) 100df930be7Sderaadt printf("cgetflags: %s='%c' set='%c'\n", fp->field, 101df930be7Sderaadt fp->value + '0', fp->set + '0'); 102df930be7Sderaadt exit(1); 103df930be7Sderaadt #endif /* DEBUG */ 104df930be7Sderaadt } 105df930be7Sderaadt 106df930be7Sderaadt void 107df930be7Sderaadt gendefaults() 108df930be7Sderaadt { 109df930be7Sderaadt register struct gettystrs *sp; 110df930be7Sderaadt register struct gettynums *np; 111df930be7Sderaadt register struct gettyflags *fp; 112df930be7Sderaadt 113df930be7Sderaadt for (sp = gettystrs; sp->field; sp++) 114df930be7Sderaadt if (sp->value) 115df930be7Sderaadt sp->defalt = sp->value; 116df930be7Sderaadt for (np = gettynums; np->field; np++) 117df930be7Sderaadt if (np->set) 118df930be7Sderaadt np->defalt = np->value; 119df930be7Sderaadt for (fp = gettyflags; fp->field; fp++) 120df930be7Sderaadt if (fp->set) 121df930be7Sderaadt fp->defalt = fp->value; 122df930be7Sderaadt else 123df930be7Sderaadt fp->defalt = fp->invrt; 124df930be7Sderaadt } 125df930be7Sderaadt 126df930be7Sderaadt void 127df930be7Sderaadt setdefaults() 128df930be7Sderaadt { 129df930be7Sderaadt register struct gettystrs *sp; 130df930be7Sderaadt register struct gettynums *np; 131df930be7Sderaadt register struct gettyflags *fp; 132df930be7Sderaadt 133df930be7Sderaadt for (sp = gettystrs; sp->field; sp++) 134df930be7Sderaadt if (!sp->value) 135df930be7Sderaadt sp->value = sp->defalt; 136df930be7Sderaadt for (np = gettynums; np->field; np++) 137df930be7Sderaadt if (!np->set) 138df930be7Sderaadt np->value = np->defalt; 139df930be7Sderaadt for (fp = gettyflags; fp->field; fp++) 140df930be7Sderaadt if (!fp->set) 141df930be7Sderaadt fp->value = fp->defalt; 142df930be7Sderaadt } 143df930be7Sderaadt 144df930be7Sderaadt static char ** 145df930be7Sderaadt charnames[] = { 146df930be7Sderaadt &ER, &KL, &IN, &QU, &XN, &XF, &ET, &BK, 147df930be7Sderaadt &SU, &DS, &RP, &FL, &WE, &LN, 0 148df930be7Sderaadt }; 149df930be7Sderaadt 150df930be7Sderaadt static char * 151df930be7Sderaadt charvars[] = { 152df930be7Sderaadt &tmode.c_cc[VERASE], &tmode.c_cc[VKILL], &tmode.c_cc[VINTR], 153df930be7Sderaadt &tmode.c_cc[VQUIT], &tmode.c_cc[VSTART], &tmode.c_cc[VSTOP], 154df930be7Sderaadt &tmode.c_cc[VEOF], &tmode.c_cc[VEOL], &tmode.c_cc[VSUSP], 155df930be7Sderaadt &tmode.c_cc[VDSUSP], &tmode.c_cc[VREPRINT], &tmode.c_cc[VDISCARD], 156df930be7Sderaadt &tmode.c_cc[VWERASE], &tmode.c_cc[VLNEXT], 0 157df930be7Sderaadt }; 158df930be7Sderaadt 159df930be7Sderaadt void 160df930be7Sderaadt setchars() 161df930be7Sderaadt { 162df930be7Sderaadt register int i; 163df930be7Sderaadt register char *p; 164df930be7Sderaadt 165df930be7Sderaadt for (i = 0; charnames[i]; i++) { 166df930be7Sderaadt p = *charnames[i]; 167df930be7Sderaadt if (p && *p) 168df930be7Sderaadt *charvars[i] = *p; 169df930be7Sderaadt else 170df930be7Sderaadt *charvars[i] = _POSIX_VDISABLE; 171df930be7Sderaadt } 172df930be7Sderaadt } 173df930be7Sderaadt 174df930be7Sderaadt /* Macros to clear/set/test flags. */ 175df930be7Sderaadt #define SET(t, f) (t) |= (f) 176df930be7Sderaadt #define CLR(t, f) (t) &= ~(f) 177df930be7Sderaadt #define ISSET(t, f) ((t) & (f)) 178df930be7Sderaadt 179df930be7Sderaadt void 180df930be7Sderaadt setflags(n) 181df930be7Sderaadt int n; 182df930be7Sderaadt { 183df930be7Sderaadt register tcflag_t iflag, oflag, cflag, lflag; 184df930be7Sderaadt 185df930be7Sderaadt #ifdef COMPAT_43 186df930be7Sderaadt switch (n) { 187df930be7Sderaadt case 0: 188df930be7Sderaadt if (F0set) { 189df930be7Sderaadt compatflags(F0); 190df930be7Sderaadt return; 191df930be7Sderaadt } 192df930be7Sderaadt break; 193df930be7Sderaadt case 1: 194df930be7Sderaadt if (F1set) { 195df930be7Sderaadt compatflags(F1); 196df930be7Sderaadt return; 197df930be7Sderaadt } 198df930be7Sderaadt break; 199df930be7Sderaadt default: 200df930be7Sderaadt if (F2set) { 201df930be7Sderaadt compatflags(F2); 202df930be7Sderaadt return; 203df930be7Sderaadt } 204df930be7Sderaadt break; 205df930be7Sderaadt } 206df930be7Sderaadt #endif 207df930be7Sderaadt 208df930be7Sderaadt switch (n) { 209df930be7Sderaadt case 0: 210df930be7Sderaadt if (C0set && I0set && L0set && O0set) { 211df930be7Sderaadt tmode.c_cflag = C0; 212df930be7Sderaadt tmode.c_iflag = I0; 213df930be7Sderaadt tmode.c_lflag = L0; 214df930be7Sderaadt tmode.c_oflag = O0; 215df930be7Sderaadt return; 216df930be7Sderaadt } 217df930be7Sderaadt break; 218df930be7Sderaadt case 1: 219df930be7Sderaadt if (C1set && I1set && L1set && O1set) { 220df930be7Sderaadt tmode.c_cflag = C1; 221df930be7Sderaadt tmode.c_iflag = I1; 222df930be7Sderaadt tmode.c_lflag = L1; 223df930be7Sderaadt tmode.c_oflag = O1; 224df930be7Sderaadt return; 225df930be7Sderaadt } 226df930be7Sderaadt break; 227df930be7Sderaadt default: 228df930be7Sderaadt if (C2set && I2set && L2set && O2set) { 229df930be7Sderaadt tmode.c_cflag = C2; 230df930be7Sderaadt tmode.c_iflag = I2; 231df930be7Sderaadt tmode.c_lflag = L2; 232df930be7Sderaadt tmode.c_oflag = O2; 233df930be7Sderaadt return; 234df930be7Sderaadt } 235df930be7Sderaadt break; 236df930be7Sderaadt } 237df930be7Sderaadt 238df930be7Sderaadt iflag = omode.c_iflag; 239df930be7Sderaadt oflag = omode.c_oflag; 240df930be7Sderaadt cflag = omode.c_cflag; 241df930be7Sderaadt lflag = omode.c_lflag; 242df930be7Sderaadt 243df930be7Sderaadt if (NP) { 244df930be7Sderaadt CLR(cflag, CSIZE|PARENB); 245df930be7Sderaadt SET(cflag, CS8); 246df930be7Sderaadt CLR(iflag, ISTRIP|INPCK|IGNPAR); 247df930be7Sderaadt } else if (AP || EP || OP) { 248df930be7Sderaadt CLR(cflag, CSIZE); 249df930be7Sderaadt SET(cflag, CS7|PARENB); 250df930be7Sderaadt SET(iflag, ISTRIP); 251df930be7Sderaadt if (OP && !EP) { 252df930be7Sderaadt SET(iflag, INPCK|IGNPAR); 253df930be7Sderaadt SET(cflag, PARODD); 254df930be7Sderaadt if (AP) 255df930be7Sderaadt CLR(iflag, INPCK); 256df930be7Sderaadt } else if (EP && !OP) { 257df930be7Sderaadt SET(iflag, INPCK|IGNPAR); 258df930be7Sderaadt CLR(cflag, PARODD); 259df930be7Sderaadt if (AP) 260df930be7Sderaadt CLR(iflag, INPCK); 261df930be7Sderaadt } else if (AP || EP && OP) { 262df930be7Sderaadt CLR(iflag, INPCK|IGNPAR); 263df930be7Sderaadt CLR(cflag, PARODD); 264df930be7Sderaadt } 265df930be7Sderaadt } /* else, leave as is */ 266df930be7Sderaadt 267*8f901b87Stholo if (UC) { 268*8f901b87Stholo SET(iflag, IUCLC); 269*8f901b87Stholo SET(oflag, OLCUC); 270*8f901b87Stholo SET(lflag, XCASE); 271*8f901b87Stholo } 272df930be7Sderaadt 273df930be7Sderaadt if (HC) 274df930be7Sderaadt SET(cflag, HUPCL); 275df930be7Sderaadt else 276df930be7Sderaadt CLR(cflag, HUPCL); 277df930be7Sderaadt 278df930be7Sderaadt if (MB) 279df930be7Sderaadt SET(cflag, MDMBUF); 280df930be7Sderaadt else 281df930be7Sderaadt CLR(cflag, MDMBUF); 282df930be7Sderaadt 283df930be7Sderaadt if (NL) { 284df930be7Sderaadt SET(iflag, ICRNL); 285df930be7Sderaadt SET(oflag, ONLCR|OPOST); 286df930be7Sderaadt } else { 287df930be7Sderaadt CLR(iflag, ICRNL); 288df930be7Sderaadt CLR(oflag, ONLCR); 289df930be7Sderaadt } 290df930be7Sderaadt 291df930be7Sderaadt if (!HT) 292df930be7Sderaadt SET(oflag, OXTABS|OPOST); 293df930be7Sderaadt else 294df930be7Sderaadt CLR(oflag, OXTABS); 295df930be7Sderaadt 296df930be7Sderaadt #ifdef XXX_DELAY 297df930be7Sderaadt SET(f, delaybits()); 298df930be7Sderaadt #endif 299df930be7Sderaadt 300df930be7Sderaadt if (n == 1) { /* read mode flags */ 301df930be7Sderaadt if (RW) { 302df930be7Sderaadt iflag = 0; 303df930be7Sderaadt CLR(oflag, OPOST); 304df930be7Sderaadt CLR(cflag, CSIZE|PARENB); 305df930be7Sderaadt SET(cflag, CS8); 306df930be7Sderaadt lflag = 0; 307df930be7Sderaadt } else { 308df930be7Sderaadt CLR(lflag, ICANON); 309df930be7Sderaadt } 310df930be7Sderaadt goto out; 311df930be7Sderaadt } 312df930be7Sderaadt 313df930be7Sderaadt if (n == 0) 314df930be7Sderaadt goto out; 315df930be7Sderaadt 316df930be7Sderaadt #if 0 317df930be7Sderaadt if (CB) 318df930be7Sderaadt SET(f, CRTBS); 319df930be7Sderaadt #endif 320df930be7Sderaadt 321df930be7Sderaadt if (CE) 322df930be7Sderaadt SET(lflag, ECHOE); 323df930be7Sderaadt else 324df930be7Sderaadt CLR(lflag, ECHOE); 325df930be7Sderaadt 326df930be7Sderaadt if (CK) 327df930be7Sderaadt SET(lflag, ECHOKE); 328df930be7Sderaadt else 329df930be7Sderaadt CLR(lflag, ECHOKE); 330df930be7Sderaadt 331df930be7Sderaadt if (PE) 332df930be7Sderaadt SET(lflag, ECHOPRT); 333df930be7Sderaadt else 334df930be7Sderaadt CLR(lflag, ECHOPRT); 335df930be7Sderaadt 336df930be7Sderaadt if (EC) 337df930be7Sderaadt SET(lflag, ECHO); 338df930be7Sderaadt else 339df930be7Sderaadt CLR(lflag, ECHO); 340df930be7Sderaadt 341df930be7Sderaadt if (XC) 342df930be7Sderaadt SET(lflag, ECHOCTL); 343df930be7Sderaadt else 344df930be7Sderaadt CLR(lflag, ECHOCTL); 345df930be7Sderaadt 346df930be7Sderaadt if (DX) 347df930be7Sderaadt SET(lflag, IXANY); 348df930be7Sderaadt else 349df930be7Sderaadt CLR(lflag, IXANY); 350df930be7Sderaadt 351df930be7Sderaadt out: 352df930be7Sderaadt tmode.c_iflag = iflag; 353df930be7Sderaadt tmode.c_oflag = oflag; 354df930be7Sderaadt tmode.c_cflag = cflag; 355df930be7Sderaadt tmode.c_lflag = lflag; 356df930be7Sderaadt } 357df930be7Sderaadt 358df930be7Sderaadt #ifdef COMPAT_43 359df930be7Sderaadt /* 360df930be7Sderaadt * Old TTY => termios, snatched from <sys/kern/tty_compat.c> 361df930be7Sderaadt */ 362df930be7Sderaadt void 363df930be7Sderaadt compatflags(flags) 364df930be7Sderaadt register long flags; 365df930be7Sderaadt { 366df930be7Sderaadt register tcflag_t iflag, oflag, cflag, lflag; 367df930be7Sderaadt 368df930be7Sderaadt iflag = BRKINT|ICRNL|IMAXBEL|IXON|IXANY; 369df930be7Sderaadt oflag = OPOST|ONLCR|OXTABS; 370df930be7Sderaadt cflag = CREAD; 371df930be7Sderaadt lflag = ICANON|ISIG|IEXTEN; 372df930be7Sderaadt 373df930be7Sderaadt if (ISSET(flags, TANDEM)) 374df930be7Sderaadt SET(iflag, IXOFF); 375df930be7Sderaadt else 376df930be7Sderaadt CLR(iflag, IXOFF); 377df930be7Sderaadt if (ISSET(flags, ECHO)) 378df930be7Sderaadt SET(lflag, ECHO); 379df930be7Sderaadt else 380df930be7Sderaadt CLR(lflag, ECHO); 381df930be7Sderaadt if (ISSET(flags, CRMOD)) { 382df930be7Sderaadt SET(iflag, ICRNL); 383df930be7Sderaadt SET(oflag, ONLCR); 384df930be7Sderaadt } else { 385df930be7Sderaadt CLR(iflag, ICRNL); 386df930be7Sderaadt CLR(oflag, ONLCR); 387df930be7Sderaadt } 388df930be7Sderaadt if (ISSET(flags, XTABS)) 389df930be7Sderaadt SET(oflag, OXTABS); 390df930be7Sderaadt else 391df930be7Sderaadt CLR(oflag, OXTABS); 392*8f901b87Stholo if (ISSET(flags, LCASE)) { 393fc61cb1eStholo SET(iflag, IUCLC); 394fc61cb1eStholo SET(oflag, OLCUC); 395fc61cb1eStholo SET(lflag, XCASE); 396fc61cb1eStholo } 397fc61cb1eStholo else { 398fc61cb1eStholo CLR(iflag, IUCLC); 399fc61cb1eStholo CLR(oflag, OLCUC); 400fc61cb1eStholo CLR(lflag, XCASE); 401fc61cb1eStholo } 402df930be7Sderaadt 403df930be7Sderaadt 404df930be7Sderaadt if (ISSET(flags, RAW)) { 405df930be7Sderaadt iflag &= IXOFF; 406fc61cb1eStholo CLR(lflag, ISIG|ICANON|IEXTEN|XCASE); 407df930be7Sderaadt CLR(cflag, PARENB); 408df930be7Sderaadt } else { 409df930be7Sderaadt SET(iflag, BRKINT|IXON|IMAXBEL); 410df930be7Sderaadt SET(lflag, ISIG|IEXTEN); 411fc61cb1eStholo if (ISSET(iflag, IUCLC) && ISSET(oflag, OLCUC)) 412fc61cb1eStholo SET(lflag, XCASE); 413df930be7Sderaadt if (ISSET(flags, CBREAK)) 414df930be7Sderaadt CLR(lflag, ICANON); 415df930be7Sderaadt else 416df930be7Sderaadt SET(lflag, ICANON); 417df930be7Sderaadt switch (ISSET(flags, ANYP)) { 418df930be7Sderaadt case 0: 419df930be7Sderaadt CLR(cflag, PARENB); 420df930be7Sderaadt break; 421df930be7Sderaadt case ANYP: 422df930be7Sderaadt SET(cflag, PARENB); 423df930be7Sderaadt CLR(iflag, INPCK); 424df930be7Sderaadt break; 425df930be7Sderaadt case EVENP: 426df930be7Sderaadt SET(cflag, PARENB); 427df930be7Sderaadt SET(iflag, INPCK); 428df930be7Sderaadt CLR(cflag, PARODD); 429df930be7Sderaadt break; 430df930be7Sderaadt case ODDP: 431df930be7Sderaadt SET(cflag, PARENB); 432df930be7Sderaadt SET(iflag, INPCK); 433df930be7Sderaadt SET(cflag, PARODD); 434df930be7Sderaadt break; 435df930be7Sderaadt } 436df930be7Sderaadt } 437df930be7Sderaadt 438df930be7Sderaadt /* Nothing we can do with CRTBS. */ 439df930be7Sderaadt if (ISSET(flags, PRTERA)) 440df930be7Sderaadt SET(lflag, ECHOPRT); 441df930be7Sderaadt else 442df930be7Sderaadt CLR(lflag, ECHOPRT); 443df930be7Sderaadt if (ISSET(flags, CRTERA)) 444df930be7Sderaadt SET(lflag, ECHOE); 445df930be7Sderaadt else 446df930be7Sderaadt CLR(lflag, ECHOE); 447df930be7Sderaadt /* Nothing we can do with TILDE. */ 448df930be7Sderaadt if (ISSET(flags, MDMBUF)) 449df930be7Sderaadt SET(cflag, MDMBUF); 450df930be7Sderaadt else 451df930be7Sderaadt CLR(cflag, MDMBUF); 452df930be7Sderaadt if (ISSET(flags, NOHANG)) 453df930be7Sderaadt CLR(cflag, HUPCL); 454df930be7Sderaadt else 455df930be7Sderaadt SET(cflag, HUPCL); 456df930be7Sderaadt if (ISSET(flags, CRTKIL)) 457df930be7Sderaadt SET(lflag, ECHOKE); 458df930be7Sderaadt else 459df930be7Sderaadt CLR(lflag, ECHOKE); 460df930be7Sderaadt if (ISSET(flags, CTLECH)) 461df930be7Sderaadt SET(lflag, ECHOCTL); 462df930be7Sderaadt else 463df930be7Sderaadt CLR(lflag, ECHOCTL); 464df930be7Sderaadt if (!ISSET(flags, DECCTQ)) 465df930be7Sderaadt SET(iflag, IXANY); 466df930be7Sderaadt else 467df930be7Sderaadt CLR(iflag, IXANY); 468df930be7Sderaadt CLR(lflag, TOSTOP|FLUSHO|PENDIN|NOFLSH); 469df930be7Sderaadt SET(lflag, ISSET(flags, TOSTOP|FLUSHO|PENDIN|NOFLSH)); 470df930be7Sderaadt 471df930be7Sderaadt if (ISSET(flags, RAW|LITOUT|PASS8)) { 472df930be7Sderaadt CLR(cflag, CSIZE); 473df930be7Sderaadt SET(cflag, CS8); 474df930be7Sderaadt if (!ISSET(flags, RAW|PASS8)) 475df930be7Sderaadt SET(iflag, ISTRIP); 476df930be7Sderaadt else 477df930be7Sderaadt CLR(iflag, ISTRIP); 478df930be7Sderaadt if (!ISSET(flags, RAW|LITOUT)) 479df930be7Sderaadt SET(oflag, OPOST); 480df930be7Sderaadt else 481df930be7Sderaadt CLR(oflag, OPOST); 482df930be7Sderaadt } else { 483df930be7Sderaadt CLR(cflag, CSIZE); 484df930be7Sderaadt SET(cflag, CS7); 485df930be7Sderaadt SET(iflag, ISTRIP); 486df930be7Sderaadt SET(oflag, OPOST); 487df930be7Sderaadt } 488df930be7Sderaadt 489df930be7Sderaadt tmode.c_iflag = iflag; 490df930be7Sderaadt tmode.c_oflag = oflag; 491df930be7Sderaadt tmode.c_cflag = cflag; 492df930be7Sderaadt tmode.c_lflag = lflag; 493df930be7Sderaadt } 494df930be7Sderaadt #endif 495df930be7Sderaadt 496df930be7Sderaadt #ifdef XXX_DELAY 497df930be7Sderaadt struct delayval { 498df930be7Sderaadt unsigned delay; /* delay in ms */ 499df930be7Sderaadt int bits; 500df930be7Sderaadt }; 501df930be7Sderaadt 502df930be7Sderaadt /* 503df930be7Sderaadt * below are random guesses, I can't be bothered checking 504df930be7Sderaadt */ 505df930be7Sderaadt 506df930be7Sderaadt struct delayval crdelay[] = { 507df930be7Sderaadt { 1, CR1 }, 508df930be7Sderaadt { 2, CR2 }, 509df930be7Sderaadt { 3, CR3 }, 510df930be7Sderaadt { 83, CR1 }, 511df930be7Sderaadt { 166, CR2 }, 512df930be7Sderaadt { 0, CR3 }, 513df930be7Sderaadt }; 514df930be7Sderaadt 515df930be7Sderaadt struct delayval nldelay[] = { 516df930be7Sderaadt { 1, NL1 }, /* special, calculated */ 517df930be7Sderaadt { 2, NL2 }, 518df930be7Sderaadt { 3, NL3 }, 519df930be7Sderaadt { 100, NL2 }, 520df930be7Sderaadt { 0, NL3 }, 521df930be7Sderaadt }; 522df930be7Sderaadt 523df930be7Sderaadt struct delayval bsdelay[] = { 524df930be7Sderaadt { 1, BS1 }, 525df930be7Sderaadt { 0, 0 }, 526df930be7Sderaadt }; 527df930be7Sderaadt 528df930be7Sderaadt struct delayval ffdelay[] = { 529df930be7Sderaadt { 1, FF1 }, 530df930be7Sderaadt { 1750, FF1 }, 531df930be7Sderaadt { 0, FF1 }, 532df930be7Sderaadt }; 533df930be7Sderaadt 534df930be7Sderaadt struct delayval tbdelay[] = { 535df930be7Sderaadt { 1, TAB1 }, 536df930be7Sderaadt { 2, TAB2 }, 537df930be7Sderaadt { 3, XTABS }, /* this is expand tabs */ 538df930be7Sderaadt { 100, TAB1 }, 539df930be7Sderaadt { 0, TAB2 }, 540df930be7Sderaadt }; 541df930be7Sderaadt 542df930be7Sderaadt int 543df930be7Sderaadt delaybits() 544df930be7Sderaadt { 545df930be7Sderaadt register int f; 546df930be7Sderaadt 547df930be7Sderaadt f = adelay(CD, crdelay); 548df930be7Sderaadt f |= adelay(ND, nldelay); 549df930be7Sderaadt f |= adelay(FD, ffdelay); 550df930be7Sderaadt f |= adelay(TD, tbdelay); 551df930be7Sderaadt f |= adelay(BD, bsdelay); 552df930be7Sderaadt return (f); 553df930be7Sderaadt } 554df930be7Sderaadt 555df930be7Sderaadt int 556df930be7Sderaadt adelay(ms, dp) 557df930be7Sderaadt register ms; 558df930be7Sderaadt register struct delayval *dp; 559df930be7Sderaadt { 560df930be7Sderaadt if (ms == 0) 561df930be7Sderaadt return (0); 562df930be7Sderaadt while (dp->delay && ms > dp->delay) 563df930be7Sderaadt dp++; 564df930be7Sderaadt return (dp->bits); 565df930be7Sderaadt } 566df930be7Sderaadt #endif 567df930be7Sderaadt 568ae998e9eSderaadt char editedhost[48]; 569df930be7Sderaadt 570df930be7Sderaadt void 571df930be7Sderaadt edithost(pat) 572df930be7Sderaadt register char *pat; 573df930be7Sderaadt { 574df930be7Sderaadt register char *host = HN; 575df930be7Sderaadt register char *res = editedhost; 576df930be7Sderaadt 577df930be7Sderaadt if (!pat) 578df930be7Sderaadt pat = ""; 579df930be7Sderaadt while (*pat) { 580df930be7Sderaadt switch (*pat) { 581df930be7Sderaadt 582df930be7Sderaadt case '#': 583df930be7Sderaadt if (*host) 584df930be7Sderaadt host++; 585df930be7Sderaadt break; 586df930be7Sderaadt 587df930be7Sderaadt case '@': 588df930be7Sderaadt if (*host) 589df930be7Sderaadt *res++ = *host++; 590df930be7Sderaadt break; 591df930be7Sderaadt 592df930be7Sderaadt default: 593df930be7Sderaadt *res++ = *pat; 594df930be7Sderaadt break; 595df930be7Sderaadt 596df930be7Sderaadt } 597df930be7Sderaadt if (res == &editedhost[sizeof editedhost - 1]) { 598df930be7Sderaadt *res = '\0'; 599df930be7Sderaadt return; 600df930be7Sderaadt } 601df930be7Sderaadt pat++; 602df930be7Sderaadt } 603df930be7Sderaadt if (*host) 604df930be7Sderaadt strncpy(res, host, sizeof editedhost - (res - editedhost) - 1); 605df930be7Sderaadt else 606df930be7Sderaadt *res = '\0'; 607df930be7Sderaadt editedhost[sizeof editedhost - 1] = '\0'; 608df930be7Sderaadt } 609df930be7Sderaadt 610df930be7Sderaadt void 611df930be7Sderaadt makeenv(env) 612df930be7Sderaadt char *env[]; 613df930be7Sderaadt { 614df930be7Sderaadt static char termbuf[128] = "TERM="; 615df930be7Sderaadt register char *p, *q; 616df930be7Sderaadt register char **ep; 617df930be7Sderaadt 618df930be7Sderaadt ep = env; 619df930be7Sderaadt if (TT && *TT) { 620f77ab1d1Sderaadt strncat(termbuf, TT, sizeof(termbuf)-strlen(termbuf)); 621a065652aSderaadt termbuf[sizeof(termbuf)-1] = '\0'; 622df930be7Sderaadt *ep++ = termbuf; 623df930be7Sderaadt } 624df930be7Sderaadt if (p = EV) { 625df930be7Sderaadt q = p; 626df930be7Sderaadt while (q = strchr(q, ',')) { 627df930be7Sderaadt *q++ = '\0'; 628df930be7Sderaadt *ep++ = p; 629df930be7Sderaadt p = q; 630df930be7Sderaadt } 631df930be7Sderaadt if (*p) 632df930be7Sderaadt *ep++ = p; 633df930be7Sderaadt } 634df930be7Sderaadt *ep = (char *)0; 635df930be7Sderaadt } 636df930be7Sderaadt 637df930be7Sderaadt /* 638df930be7Sderaadt * This speed select mechanism is written for the Develcon DATASWITCH. 639df930be7Sderaadt * The Develcon sends a string of the form "B{speed}\n" at a predefined 640df930be7Sderaadt * baud rate. This string indicates the user's actual speed. 641df930be7Sderaadt * The routine below returns the terminal type mapped from derived speed. 642df930be7Sderaadt */ 643df930be7Sderaadt struct portselect { 644df930be7Sderaadt char *ps_baud; 645df930be7Sderaadt char *ps_type; 646df930be7Sderaadt } portspeeds[] = { 647df930be7Sderaadt { "B110", "std.110" }, 648df930be7Sderaadt { "B134", "std.134" }, 649df930be7Sderaadt { "B150", "std.150" }, 650df930be7Sderaadt { "B300", "std.300" }, 651df930be7Sderaadt { "B600", "std.600" }, 652df930be7Sderaadt { "B1200", "std.1200" }, 653df930be7Sderaadt { "B2400", "std.2400" }, 654df930be7Sderaadt { "B4800", "std.4800" }, 655df930be7Sderaadt { "B9600", "std.9600" }, 656df930be7Sderaadt { "B19200", "std.19200" }, 657df930be7Sderaadt { 0 } 658df930be7Sderaadt }; 659df930be7Sderaadt 660df930be7Sderaadt char * 661df930be7Sderaadt portselector() 662df930be7Sderaadt { 663df930be7Sderaadt char c, baud[20], *type = "default"; 664df930be7Sderaadt register struct portselect *ps; 665df930be7Sderaadt int len; 666df930be7Sderaadt 667df930be7Sderaadt alarm(5*60); 668df930be7Sderaadt for (len = 0; len < sizeof (baud) - 1; len++) { 669df930be7Sderaadt if (read(STDIN_FILENO, &c, 1) <= 0) 670df930be7Sderaadt break; 671df930be7Sderaadt c &= 0177; 672df930be7Sderaadt if (c == '\n' || c == '\r') 673df930be7Sderaadt break; 674df930be7Sderaadt if (c == 'B') 675df930be7Sderaadt len = 0; /* in case of leading garbage */ 676df930be7Sderaadt baud[len] = c; 677df930be7Sderaadt } 678df930be7Sderaadt baud[len] = '\0'; 679df930be7Sderaadt for (ps = portspeeds; ps->ps_baud; ps++) 680df930be7Sderaadt if (strcmp(ps->ps_baud, baud) == 0) { 681df930be7Sderaadt type = ps->ps_type; 682df930be7Sderaadt break; 683df930be7Sderaadt } 684df930be7Sderaadt sleep(2); /* wait for connection to complete */ 685df930be7Sderaadt return (type); 686df930be7Sderaadt } 687df930be7Sderaadt 688df930be7Sderaadt /* 689df930be7Sderaadt * This auto-baud speed select mechanism is written for the Micom 600 690df930be7Sderaadt * portselector. Selection is done by looking at how the character '\r' 691df930be7Sderaadt * is garbled at the different speeds. 692df930be7Sderaadt */ 693df930be7Sderaadt #include <sys/time.h> 694df930be7Sderaadt 695df930be7Sderaadt char * 696df930be7Sderaadt autobaud() 697df930be7Sderaadt { 698df930be7Sderaadt int rfds; 699df930be7Sderaadt struct timeval timeout; 700df930be7Sderaadt char c, *type = "9600-baud"; 701df930be7Sderaadt 702df930be7Sderaadt (void)tcflush(0, TCIOFLUSH); 703df930be7Sderaadt rfds = 1 << 0; 704df930be7Sderaadt timeout.tv_sec = 5; 705df930be7Sderaadt timeout.tv_usec = 0; 706df930be7Sderaadt if (select(32, (fd_set *)&rfds, (fd_set *)NULL, 707df930be7Sderaadt (fd_set *)NULL, &timeout) <= 0) 708df930be7Sderaadt return (type); 709df930be7Sderaadt if (read(STDIN_FILENO, &c, sizeof(char)) != sizeof(char)) 710df930be7Sderaadt return (type); 711df930be7Sderaadt timeout.tv_sec = 0; 712df930be7Sderaadt timeout.tv_usec = 20; 713df930be7Sderaadt (void) select(32, (fd_set *)NULL, (fd_set *)NULL, 714df930be7Sderaadt (fd_set *)NULL, &timeout); 715df930be7Sderaadt (void)tcflush(0, TCIOFLUSH); 716df930be7Sderaadt switch (c & 0377) { 717df930be7Sderaadt 718df930be7Sderaadt case 0200: /* 300-baud */ 719df930be7Sderaadt type = "300-baud"; 720df930be7Sderaadt break; 721df930be7Sderaadt 722df930be7Sderaadt case 0346: /* 1200-baud */ 723df930be7Sderaadt type = "1200-baud"; 724df930be7Sderaadt break; 725df930be7Sderaadt 726df930be7Sderaadt case 015: /* 2400-baud */ 727df930be7Sderaadt case 0215: 728df930be7Sderaadt type = "2400-baud"; 729df930be7Sderaadt break; 730df930be7Sderaadt 731df930be7Sderaadt default: /* 4800-baud */ 732df930be7Sderaadt type = "4800-baud"; 733df930be7Sderaadt break; 734df930be7Sderaadt 735df930be7Sderaadt case 0377: /* 9600-baud */ 736df930be7Sderaadt type = "9600-baud"; 737df930be7Sderaadt break; 738df930be7Sderaadt } 739df930be7Sderaadt return (type); 740df930be7Sderaadt } 741