# @(#)Makefile 8.1 (Berkeley) 5/31/93
SUBDIR= cat date df echo ed expr kill ksh ln ls \
- mkdir pax pwd rm rmdir sync test
+ mkdir pax pwd rm rmdir sync test stty
.include <bsd.subdir.mk>
--- /dev/null
+# $NetBSD: Makefile,v 1.11 2012/04/04 10:59:44 joerg Exp $
+# @(#)Makefile 8.1 (Berkeley) 5/31/93
+
+PROG= stty
+SRCS= cchar.c gfmt.c key.c modes.c print.c stty.c
+
+CWARNFLAGS.clang+= -Wno-string-plus-int
+
+.include <bsd.prog.mk>
--- /dev/null
+/* $NetBSD: cchar.c,v 1.16 2006/10/16 00:37:55 christos Exp $ */
+
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cchar.c 8.5 (Berkeley) 4/2/94";
+#else
+__RCSID("$NetBSD: cchar.c,v 1.16 2006/10/16 00:37:55 christos Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include <err.h>
+#include <limits.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "stty.h"
+#include "extern.h"
+
+/*
+ * Special control characters.
+ *
+ * Cchars1 are the standard names, cchars2 are the old aliases.
+ * The first are displayed, but both are recognized on the
+ * command line.
+ */
+const struct cchar cchars1[] = {
+ { "discard", VDISCARD, CDISCARD },
+ { "dsusp", VDSUSP, CDSUSP },
+ { "eof", VEOF, CEOF },
+ { "eol", VEOL, CEOL },
+ { "eol2", VEOL2, CEOL },
+ { "erase", VERASE, CERASE },
+ { "intr", VINTR, CINTR },
+ { "kill", VKILL, CKILL },
+ { "lnext", VLNEXT, CLNEXT },
+ { "min", VMIN, CMIN },
+ { "quit", VQUIT, CQUIT },
+ { "reprint", VREPRINT, CREPRINT },
+ { "start", VSTART, CSTART },
+ { "status", VSTATUS, CSTATUS },
+ { "stop", VSTOP, CSTOP },
+ { "susp", VSUSP, CSUSP },
+ { "time", VTIME, CTIME },
+ { "werase", VWERASE, CWERASE },
+ { .name = NULL },
+};
+
+const struct cchar cchars2[] = {
+ { "brk", VEOL, CEOL },
+ { "flush", VDISCARD, CDISCARD },
+ { "rprnt", VREPRINT, CREPRINT },
+ { .name = NULL },
+};
+
+static int c_cchar(const void *, const void *);
+
+static int
+c_cchar(const void *a, const void *b)
+{
+ return (strcmp(((const struct cchar *)a)->name,
+ ((const struct cchar *)b)->name));
+}
+
+int
+csearch(char ***argvp, struct info *ip)
+{
+ struct cchar *cp, tmp;
+ long val;
+ char *arg, *ep, *name;
+
+ name = **argvp;
+
+ tmp.name = name;
+ if (!(cp = (struct cchar *)bsearch(&tmp, cchars1,
+ sizeof(cchars1)/sizeof(cchars1[0]) - 1, sizeof(cchars1[0]),
+ c_cchar)) &&
+ !(cp = (struct cchar *)bsearch(&tmp, cchars2,
+ sizeof(cchars2)/sizeof(cchars2[0]) - 1, sizeof(cchars2[0]),
+ c_cchar)))
+ return (0);
+
+ arg = *++*argvp;
+ if (!arg) {
+ warnx("option requires an argument -- %s", name);
+ usage();
+ }
+
+#define CHK(s) (*arg == s[0] && !strcmp(arg, s))
+ if (CHK("undef") || CHK("<undef>"))
+ ip->t.c_cc[cp->sub] = _POSIX_VDISABLE;
+ else if (cp->sub == VMIN || cp->sub == VTIME) {
+ val = strtol(arg, &ep, 10);
+ if (val == _POSIX_VDISABLE) {
+ warnx("value of %ld would disable the option -- %s",
+ val, name);
+ usage();
+ }
+ if (val > UCHAR_MAX) {
+ warnx("maximum option value is %d -- %s",
+ UCHAR_MAX, name);
+ usage();
+ }
+ if (*ep != '\0') {
+ warnx("option requires a numeric argument -- %s", name);
+ usage();
+ }
+ ip->t.c_cc[cp->sub] = (cc_t)val;
+ } else if (arg[0] == '^')
+ ip->t.c_cc[cp->sub] = (arg[1] == '?') ? 0177 :
+ (arg[1] == '-') ? _POSIX_VDISABLE : arg[1] & 037;
+ else
+ ip->t.c_cc[cp->sub] = arg[0];
+ ip->set = 1;
+ return (1);
+}
--- /dev/null
+/* $NetBSD: extern.h,v 1.12 2011/08/29 14:51:19 joerg Exp $ */
+
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)extern.h 8.1 (Berkeley) 5/31/93
+ */
+
+#ifndef _EXTERN_H_
+#define _EXTERN_H_
+
+int c_cchars(const void *, const void *);
+int c_modes(const void *, const void *);
+int csearch(char ***, struct info *);
+void checkredirect(void);
+void gprint(struct termios *);
+void gread(struct termios *, char *);
+int ksearch(char ***, struct info *);
+int msearch(char ***, struct info *);
+void optlist(void);
+void print(struct termios *, struct winsize *, int, enum FMT);
+__dead void usage(void);
+
+extern const struct cchar cchars1[], cchars2[];
+
+#endif /* !_EXTERN_H_ */
--- /dev/null
+/* $NetBSD: gfmt.c,v 1.17 2011/08/29 14:51:19 joerg Exp $ */
+
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)gfmt.c 8.6 (Berkeley) 4/2/94";
+#else
+__RCSID("$NetBSD: gfmt.c,v 1.17 2011/08/29 14:51:19 joerg Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/param.h>
+
+#include <err.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "stty.h"
+#include "extern.h"
+
+__dead static void gerr(char *);
+
+static void
+gerr(char *s)
+{
+ if (s)
+ errx(1, "illegal gfmt1 option -- %s", s);
+ else
+ errx(1, "illegal gfmt1 option");
+}
+
+void
+gprint(struct termios *tp)
+{
+ const struct cchar *cp;
+
+ (void)printf("gfmt1:cflag=%x:iflag=%x:lflag=%x:oflag=%x:",
+ tp->c_cflag, tp->c_iflag, tp->c_lflag, tp->c_oflag);
+ for (cp = cchars1; cp->name; ++cp)
+ (void)printf("%s=%x:", cp->name, tp->c_cc[cp->sub]);
+ (void)printf("ispeed=%d:ospeed=%d\n", cfgetispeed(tp), cfgetospeed(tp));
+}
+
+void
+gread(struct termios *tp, char *s)
+{
+ const struct cchar *cp;
+ char *ep, *p;
+ long tmp;
+
+ if ((s = strchr(s, ':')) == NULL)
+ gerr(NULL);
+ for (++s; s != NULL;) {
+ p = strsep(&s, ":\0");
+ if (!p || !*p)
+ break;
+ if (!(ep = strchr(p, '=')))
+ gerr(p);
+ *ep++ = '\0';
+ (void)sscanf(ep, "%lx", &tmp);
+
+#define CHK(s) (*p == s[0] && !strcmp(p, s))
+ if (CHK("cflag")) {
+ tp->c_cflag = tmp;
+ continue;
+ }
+ if (CHK("iflag")) {
+ tp->c_iflag = tmp;
+ continue;
+ }
+#ifdef BSD4_4
+ if (CHK("ispeed")) {
+ (void)sscanf(ep, "%ld", &tmp);
+ tp->c_ispeed = tmp;
+ continue;
+ }
+#endif
+ if (CHK("lflag")) {
+ tp->c_lflag = tmp;
+ continue;
+ }
+ if (CHK("oflag")) {
+ tp->c_oflag = tmp;
+ continue;
+ }
+#ifdef BSD4_4
+ if (CHK("ospeed")) {
+ (void)sscanf(ep, "%ld", &tmp);
+ tp->c_ospeed = tmp;
+ continue;
+ }
+#endif
+ for (cp = cchars1; cp->name != NULL; ++cp)
+ if (CHK(cp->name)) {
+ if (cp->sub == VMIN || cp->sub == VTIME)
+ (void)sscanf(ep, "%ld", &tmp);
+ tp->c_cc[cp->sub] = tmp;
+ break;
+ }
+ if (cp->name == NULL)
+ gerr(p);
+ }
+}
--- /dev/null
+/* $NetBSD: key.c,v 1.20 2004/04/01 16:10:03 tsarna Exp $ */
+
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)key.c 8.4 (Berkeley) 2/20/95";
+#else
+__RCSID("$NetBSD: key.c,v 1.20 2004/04/01 16:10:03 tsarna Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <paths.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "stty.h"
+#include "extern.h"
+
+__BEGIN_DECLS
+void f_all(struct info *);
+void f_cbreak(struct info *);
+void f_columns(struct info *);
+void f_dec(struct info *);
+void f_everything(struct info *);
+void f_extproc(struct info *);
+void f_insane(struct info *);
+void f_ispeed(struct info *);
+void f_nl(struct info *);
+void f_ospeed(struct info *);
+void f_raw(struct info *);
+void f_rows(struct info *);
+void f_sane(struct info *);
+void f_size(struct info *);
+void f_speed(struct info *);
+void f_ostart(struct info *);
+void f_ostop(struct info *);
+void f_tty(struct info *);
+__END_DECLS
+
+static const struct key {
+ const char *name; /* name */
+ void (*f)(struct info *); /* function */
+#define F_NEEDARG 0x01 /* needs an argument */
+#define F_OFFOK 0x02 /* can turn off */
+ int flags;
+} keys[] = {
+ { "all", f_all, 0 },
+ { "cbreak", f_cbreak, F_OFFOK },
+ { "cols", f_columns, F_NEEDARG },
+ { "columns", f_columns, F_NEEDARG },
+ { "cooked", f_sane, 0 },
+ { "dec", f_dec, 0 },
+ { "everything", f_everything, 0 },
+ { "extproc", f_extproc, F_OFFOK },
+ { "insane", f_insane, 0 },
+ { "ispeed", f_ispeed, F_NEEDARG },
+ { "new", f_tty, 0 },
+ { "nl", f_nl, F_OFFOK },
+ { "old", f_tty, 0 },
+ { "ospeed", f_ospeed, F_NEEDARG },
+ { "ostart", f_ostart, 0 },
+ { "ostop", f_ostop, 0 },
+ { "raw", f_raw, F_OFFOK },
+ { "rows", f_rows, F_NEEDARG },
+ { "sane", f_sane, 0 },
+ { "size", f_size, 0 },
+ { "speed", f_speed, 0 },
+ { "tty", f_tty, 0 },
+};
+
+static int c_key(const void *, const void *);
+
+static int
+c_key(const void *a, const void *b)
+{
+
+ return (strcmp(((const struct key *)a)->name,
+ ((const struct key *)b)->name));
+}
+
+int
+ksearch(char ***argvp, struct info *ip)
+{
+ char *name;
+ struct key *kp, tmp;
+
+ name = **argvp;
+ if (*name == '-') {
+ ip->off = 1;
+ ++name;
+ } else
+ ip->off = 0;
+
+ tmp.name = name;
+ if (!(kp = (struct key *)bsearch(&tmp, keys,
+ sizeof(keys)/sizeof(struct key), sizeof(struct key), c_key)))
+ return (0);
+ if (!(kp->flags & F_OFFOK) && ip->off) {
+ warnx("illegal option -- %s", name);
+ usage();
+ }
+ if (kp->flags & F_NEEDARG && !(ip->arg = *++*argvp)) {
+ warnx("option requires an argument -- %s", name);
+ usage();
+ }
+ kp->f(ip);
+ return (1);
+}
+
+void
+f_all(struct info *ip)
+{
+ print(&ip->t, &ip->win, ip->ldisc, STTY_BSD);
+}
+
+void
+f_cbreak(struct info *ip)
+{
+ if (ip->off)
+ f_sane(ip);
+ else {
+ ip->t.c_iflag |= BRKINT|IXON|IMAXBEL;
+ ip->t.c_oflag |= OPOST;
+ ip->t.c_lflag |= ISIG|IEXTEN;
+ ip->t.c_lflag &= ~ICANON;
+ ip->set = 1;
+ }
+}
+
+void
+f_columns(struct info *ip)
+{
+ ip->win.ws_col = atoi(ip->arg);
+ ip->wset = 1;
+}
+
+void
+f_dec(struct info *ip)
+{
+ ip->t.c_cc[VERASE] = (u_char)0177;
+ ip->t.c_cc[VKILL] = CTRL('u');
+ ip->t.c_cc[VINTR] = CTRL('c');
+ ip->t.c_lflag &= ~ECHOPRT;
+ ip->t.c_lflag |= ECHOE|ECHOKE|ECHOCTL;
+ ip->t.c_iflag &= ~IXANY;
+ ip->set = 1;
+}
+
+void
+f_everything(struct info *ip)
+{
+ print(&ip->t, &ip->win, ip->ldisc, STTY_BSD);
+}
+
+void
+f_extproc(struct info *ip)
+{
+#ifdef TIOCEXT
+ if (ip->off) {
+ int tmp = 0;
+ (void)ioctl(ip->fd, TIOCEXT, &tmp);
+ } else {
+ int tmp = 1;
+ (void)ioctl(ip->fd, TIOCEXT, &tmp);
+ }
+ ip->set = 1;
+#endif
+}
+
+void
+f_insane(struct info *ip)
+{
+ int f, r;
+
+ r = f = open(_PATH_URANDOM, O_RDONLY, 0);
+ if (f >= 0) {
+ r = read(f, &(ip->t), sizeof(struct termios));
+ close(f);
+ }
+ if (r < 0) {
+ /* XXX not cryptographically secure! */
+
+ srandom(time(NULL));
+ ip->t.c_iflag = random();
+ ip->t.c_oflag = random();
+ ip->t.c_cflag = random();
+ ip->t.c_lflag = random();
+ for (f = 0; f < NCCS; f++) {
+ ip->t.c_cc[f] = random() & 0xFF;
+ }
+ ip->t.c_ispeed = random();
+ ip->t.c_ospeed = random();
+ }
+
+ ip->set = 1;
+}
+
+void
+f_ispeed(struct info *ip)
+{
+ cfsetispeed(&ip->t, atoi(ip->arg));
+ ip->set = 1;
+}
+
+void
+f_nl(struct info *ip)
+{
+ if (ip->off) {
+ ip->t.c_iflag |= ICRNL;
+ ip->t.c_oflag |= ONLCR;
+ } else {
+ ip->t.c_iflag &= ~ICRNL;
+ ip->t.c_oflag &= ~ONLCR;
+ }
+ ip->set = 1;
+}
+
+void
+f_ospeed(struct info *ip)
+{
+ cfsetospeed(&ip->t, atoi(ip->arg));
+ ip->set = 1;
+}
+
+void
+f_raw(struct info *ip)
+{
+ if (ip->off)
+ f_sane(ip);
+ else {
+ cfmakeraw(&ip->t);
+ ip->t.c_cflag &= ~(CSIZE|PARENB);
+ ip->t.c_cflag |= CS8;
+ ip->set = 1;
+ }
+}
+
+void
+f_rows(struct info *ip)
+{
+ ip->win.ws_row = atoi(ip->arg);
+ ip->wset = 1;
+}
+
+void
+f_sane(struct info *ip)
+{
+ ip->t.c_cflag = TTYDEF_CFLAG | (ip->t.c_cflag & (CLOCAL|CRTSCTS|CDTRCTS));
+ ip->t.c_iflag = TTYDEF_IFLAG;
+ ip->t.c_iflag |= ICRNL;
+ /* preserve user-preference flags in lflag */
+#define LKEEP (ECHOKE|ECHOE|ECHOK|ECHOPRT|ECHOCTL|ALTWERASE|TOSTOP|NOFLSH)
+ ip->t.c_lflag = TTYDEF_LFLAG | (ip->t.c_lflag & LKEEP);
+ ip->t.c_oflag = TTYDEF_OFLAG;
+ ip->set = 1;
+}
+
+void
+f_size(struct info *ip)
+{
+ (void)printf("%d %d\n", ip->win.ws_row, ip->win.ws_col);
+}
+
+void
+f_speed(struct info *ip)
+{
+ (void)printf("%d\n", cfgetospeed(&ip->t));
+}
+
+/* ARGSUSED */
+void
+f_tty(struct info *ip)
+{
+#ifdef TTYDISC
+ int tmp;
+
+ tmp = TTYDISC;
+ if (ioctl(0, TIOCSETD, &tmp) < 0)
+ err(1, "TIOCSETD");
+#endif
+}
+
+void
+f_ostart(struct info *ip)
+{
+#ifndef __minix
+ if (ioctl (0, TIOCSTART) < 0)
+#else
+ if (ioctl (0, TIOCSTART, NULL) < 0)
+#endif
+ err(1, "TIOCSTART");
+}
+
+void
+f_ostop(struct info *ip)
+{
+#ifndef __minix
+ if (ioctl (0, TIOCSTOP) < 0)
+#else
+ if (ioctl (0, TIOCSTOP, NULL) < 0)
+#endif
+ err(1, "TIOCSTOP");
+}
--- /dev/null
+/* $NetBSD: modes.c,v 1.17 2006/10/16 00:37:55 christos Exp $ */
+
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)modes.c 8.3 (Berkeley) 4/2/94";
+#else
+__RCSID("$NetBSD: modes.c,v 1.17 2006/10/16 00:37:55 christos Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include <stddef.h>
+#include <string.h>
+
+#include "stty.h"
+#include "extern.h"
+
+struct modes {
+ const char *name;
+ tcflag_t set;
+ tcflag_t unset;
+};
+
+/*
+ * The code in optlist() depends on minus options following regular
+ * options, i.e. "foo" must immediately precede "-foo".
+ */
+const struct modes cmodes[] = {
+ { "cs5", CS5, CSIZE },
+ { "cs6", CS6, CSIZE },
+ { "cs7", CS7, CSIZE },
+ { "cs8", CS8, CSIZE },
+ { "cstopb", CSTOPB, 0 },
+ { "-cstopb", 0, CSTOPB },
+ { "cread", CREAD, 0 },
+ { "-cread", 0, CREAD },
+ { "parenb", PARENB, 0 },
+ { "-parenb", 0, PARENB },
+ { "parodd", PARODD, 0 },
+ { "-parodd", 0, PARODD },
+ { "parity", PARENB | CS7, PARODD | CSIZE },
+ { "-parity", CS8, PARODD | PARENB | CSIZE },
+ { "evenp", PARENB | CS7, PARODD | CSIZE },
+ { "-evenp", CS8, PARODD | PARENB | CSIZE },
+ { "oddp", PARENB | CS7 | PARODD, CSIZE },
+ { "-oddp", CS8, PARODD | PARENB | CSIZE },
+ { "pass8", CS8, PARODD | PARENB | CSIZE },
+ { "-pass8", PARENB | CS7, PARODD | CSIZE },
+ { "hupcl", HUPCL, 0 },
+ { "-hupcl", 0, HUPCL },
+ { "hup", HUPCL, 0 },
+ { "-hup", 0, HUPCL },
+ { "clocal", CLOCAL, 0 },
+ { "-clocal", 0, CLOCAL },
+ { "crtscts", CRTSCTS, 0 },
+ { "-crtscts", 0, CRTSCTS },
+ { "mdmbuf", MDMBUF, 0 },
+ { "-mdmbuf", 0, MDMBUF },
+ { "cdtrcts", CDTRCTS, 0 },
+ { "-cdtrcts", 0, CDTRCTS },
+ { .name = NULL },
+};
+
+const struct modes imodes[] = {
+ { "ignbrk", IGNBRK, 0 },
+ { "-ignbrk", 0, IGNBRK },
+ { "brkint", BRKINT, 0 },
+ { "-brkint", 0, BRKINT },
+ { "ignpar", IGNPAR, 0 },
+ { "-ignpar", 0, IGNPAR },
+ { "parmrk", PARMRK, 0 },
+ { "-parmrk", 0, PARMRK },
+ { "inpck", INPCK, 0 },
+ { "-inpck", 0, INPCK },
+ { "istrip", ISTRIP, 0 },
+ { "-istrip", 0, ISTRIP },
+ { "inlcr", INLCR, 0 },
+ { "-inlcr", 0, INLCR },
+ { "igncr", IGNCR, 0 },
+ { "-igncr", 0, IGNCR },
+ { "icrnl", ICRNL, 0 },
+ { "-icrnl", 0, ICRNL },
+ { "ixon", IXON, 0 },
+ { "-ixon", 0, IXON },
+ { "flow", IXON, 0 },
+ { "-flow", 0, IXON },
+ { "ixoff", IXOFF, 0 },
+ { "-ixoff", 0, IXOFF },
+ { "tandem", IXOFF, 0 },
+ { "-tandem", 0, IXOFF },
+ { "ixany", IXANY, 0 },
+ { "-ixany", 0, IXANY },
+ { "decctlq", 0, IXANY },
+ { "-decctlq", IXANY, 0 },
+ { "imaxbel", IMAXBEL, 0 },
+ { "-imaxbel", 0, IMAXBEL },
+ { .name = NULL },
+};
+
+const struct modes lmodes[] = {
+ { "echo", ECHO, 0 },
+ { "-echo", 0, ECHO },
+ { "echoe", ECHOE, 0 },
+ { "-echoe", 0, ECHOE },
+ { "crterase", ECHOE, 0 },
+ { "-crterase", 0, ECHOE },
+ { "crtbs", ECHOE, 0 }, /* crtbs not supported, close enough */
+ { "-crtbs", 0, ECHOE },
+ { "echok", ECHOK, 0 },
+ { "-echok", 0, ECHOK },
+ { "echoke", ECHOKE, 0 },
+ { "-echoke", 0, ECHOKE },
+ { "crtkill", ECHOKE, 0 },
+ { "-crtkill", 0, ECHOKE },
+ { "altwerase", ALTWERASE, 0 },
+ { "-altwerase", 0, ALTWERASE },
+ { "iexten", IEXTEN, 0 },
+ { "-iexten", 0, IEXTEN },
+ { "echonl", ECHONL, 0 },
+ { "-echonl", 0, ECHONL },
+ { "echoctl", ECHOCTL, 0 },
+ { "-echoctl", 0, ECHOCTL },
+ { "ctlecho", ECHOCTL, 0 },
+ { "-ctlecho", 0, ECHOCTL },
+ { "echoprt", ECHOPRT, 0 },
+ { "-echoprt", 0, ECHOPRT },
+ { "prterase", ECHOPRT, 0 },
+ { "-prterase", 0, ECHOPRT },
+ { "isig", ISIG, 0 },
+ { "-isig", 0, ISIG },
+ { "icanon", ICANON, 0 },
+ { "-icanon", 0, ICANON },
+ { "noflsh", NOFLSH, 0 },
+ { "-noflsh", 0, NOFLSH },
+ { "tostop", TOSTOP, 0 },
+ { "-tostop", 0, TOSTOP },
+ { "flusho", FLUSHO, 0 },
+ { "-flusho", 0, FLUSHO },
+ { "pendin", PENDIN, 0 },
+ { "-pendin", 0, PENDIN },
+ { "crt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT },
+ { "-crt", ECHOK, ECHOE|ECHOKE|ECHOCTL },
+ { "newcrt", ECHOE|ECHOKE|ECHOCTL, ECHOK|ECHOPRT },
+ { "-newcrt", ECHOK, ECHOE|ECHOKE|ECHOCTL },
+ { "nokerninfo", NOKERNINFO, 0 },
+ { "-nokerninfo",0, NOKERNINFO },
+ { "kerninfo", 0, NOKERNINFO },
+ { "-kerninfo", NOKERNINFO, 0 },
+ { .name = NULL },
+};
+
+const struct modes omodes[] = {
+ { "opost", OPOST, 0 },
+ { "-opost", 0, OPOST },
+ { "litout", 0, OPOST },
+ { "-litout", OPOST, 0 },
+ { "onlcr", ONLCR, 0 },
+ { "-onlcr", 0, ONLCR },
+ { "ocrnl", OCRNL, 0 },
+ { "-ocrnl", 0, OCRNL },
+ { "tabs", 0, OXTABS }, /* "preserve" tabs */
+ { "-tabs", OXTABS, 0 },
+ { "oxtabs", OXTABS, 0 },
+ { "-oxtabs", 0, OXTABS },
+ { "onocr", ONOCR, 0 },
+ { "-onocr", 0, ONOCR },
+ { "onlret", ONLRET, 0 },
+ { "-onlret", 0, ONLRET },
+ { .name = NULL },
+};
+
+#define CHK(s) (!strcmp(name, s))
+
+int
+msearch(char ***argvp, struct info *ip)
+{
+ const struct modes *mp;
+ char *name;
+
+ name = **argvp;
+
+ for (mp = cmodes; mp->name; ++mp)
+ if (CHK(mp->name)) {
+ ip->t.c_cflag &= ~mp->unset;
+ ip->t.c_cflag |= mp->set;
+ ip->set = 1;
+ return (1);
+ }
+ for (mp = imodes; mp->name; ++mp)
+ if (CHK(mp->name)) {
+ ip->t.c_iflag &= ~mp->unset;
+ ip->t.c_iflag |= mp->set;
+ ip->set = 1;
+ return (1);
+ }
+ for (mp = lmodes; mp->name; ++mp)
+ if (CHK(mp->name)) {
+ ip->t.c_lflag &= ~mp->unset;
+ ip->t.c_lflag |= mp->set;
+ ip->set = 1;
+ return (1);
+ }
+ for (mp = omodes; mp->name; ++mp)
+ if (CHK(mp->name)) {
+ ip->t.c_oflag &= ~mp->unset;
+ ip->t.c_oflag |= mp->set;
+ ip->set = 1;
+ return (1);
+ }
+ return (0);
+}
--- /dev/null
+/* $NetBSD: print.c,v 1.22 2005/06/26 19:10:49 christos Exp $ */
+
+/*-
+ * Copyright (c) 1991, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)print.c 8.6 (Berkeley) 4/16/94";
+#else
+__RCSID("$NetBSD: print.c,v 1.22 2005/06/26 19:10:49 christos Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "stty.h"
+#include "extern.h"
+
+static void binit(const char *);
+static void bput(const char *);
+static const char *ccval(const struct cchar *, int);
+
+void
+print(struct termios *tp, struct winsize *wp, int ldisc, enum FMT fmt)
+{
+ const struct cchar *p;
+ long tmp;
+ u_char *cc;
+ int cnt, ispeed, ospeed;
+ char buf1[100], buf2[100];
+
+ cnt = 0;
+
+ /* Line discipline. */
+#ifdef TTYDISC
+ if (ldisc != TTYDISC) {
+ switch(ldisc) {
+ case TABLDISC:
+ cnt += printf("tablet disc; ");
+ break;
+ case SLIPDISC:
+ cnt += printf("slip disc; ");
+ break;
+ case PPPDISC:
+ cnt += printf("ppp disc; ");
+ break;
+ case STRIPDISC:
+ cnt += printf("strip disc; ");
+ break;
+ default:
+ cnt += printf("#%d disc; ", ldisc);
+ break;
+ }
+ }
+#endif
+
+ /* Line speed. */
+ ispeed = cfgetispeed(tp);
+ ospeed = cfgetospeed(tp);
+ if (ispeed != ospeed)
+ cnt +=
+ printf("ispeed %d baud; ospeed %d baud;", ispeed, ospeed);
+ else
+ cnt += printf("speed %d baud;", ispeed);
+ if (fmt >= STTY_BSD)
+ cnt += printf(" %d rows; %d columns;", wp->ws_row, wp->ws_col);
+ if (cnt)
+ (void)printf("\n");
+
+#define on(f) ((tmp&f) != 0)
+#define put(n, f, d) \
+ if (fmt >= STTY_BSD || on(f) != d) \
+ bput(n + on(f));
+
+ /* "local" flags */
+ tmp = tp->c_lflag;
+ binit("lflags");
+ put("-icanon", ICANON, 1);
+ put("-isig", ISIG, 1);
+ put("-iexten", IEXTEN, 1);
+ put("-echo", ECHO, 1);
+ put("-echoe", ECHOE, 0);
+ put("-echok", ECHOK, 0);
+ put("-echoke", ECHOKE, 0);
+ put("-echonl", ECHONL, 0);
+ put("-echoctl", ECHOCTL, 0);
+ put("-echoprt", ECHOPRT, 0);
+ put("-altwerase", ALTWERASE, 0);
+ put("-noflsh", NOFLSH, 0);
+ put("-tostop", TOSTOP, 0);
+ put("-flusho", FLUSHO, 0);
+ put("-pendin", PENDIN, 0);
+ put("-nokerninfo", NOKERNINFO, 0);
+ put("-extproc", EXTPROC, 0);
+
+ /* input flags */
+ tmp = tp->c_iflag;
+ binit("iflags");
+ put("-istrip", ISTRIP, 0);
+ put("-icrnl", ICRNL, 1);
+ put("-inlcr", INLCR, 0);
+ put("-igncr", IGNCR, 0);
+ put("-ixon", IXON, 1);
+ put("-ixoff", IXOFF, 0);
+ put("-ixany", IXANY, 1);
+ put("-imaxbel", IMAXBEL, 1);
+ put("-ignbrk", IGNBRK, 0);
+ put("-brkint", BRKINT, 1);
+ put("-inpck", INPCK, 0);
+ put("-ignpar", IGNPAR, 0);
+ put("-parmrk", PARMRK, 0);
+
+ /* output flags */
+ tmp = tp->c_oflag;
+ binit("oflags");
+ put("-opost", OPOST, 1);
+ put("-onlcr", ONLCR, 1);
+ put("-ocrnl", OCRNL, 0);
+ put("-oxtabs", OXTABS, 1);
+ put("-onocr", OXTABS, 0);
+ put("-onlret", OXTABS, 0);
+
+ /* control flags (hardware state) */
+ tmp = tp->c_cflag;
+ binit("cflags");
+ put("-cread", CREAD, 1);
+ switch(tmp&CSIZE) {
+ case CS5:
+ bput("cs5");
+ break;
+ case CS6:
+ bput("cs6");
+ break;
+ case CS7:
+ bput("cs7");
+ break;
+ case CS8:
+ bput("cs8");
+ break;
+ }
+ bput("-parenb" + on(PARENB));
+ put("-parodd", PARODD, 0);
+ put("-hupcl", HUPCL, 1);
+ put("-clocal", CLOCAL, 0);
+ put("-cstopb", CSTOPB, 0);
+ put("-crtscts", CRTSCTS, 0);
+ put("-mdmbuf", MDMBUF, 0);
+ put("-cdtrcts", CDTRCTS, 0);
+
+ /* special control characters */
+ cc = tp->c_cc;
+ if (fmt == STTY_POSIX) {
+ binit("cchars");
+ for (p = cchars1; p->name; ++p) {
+ (void)snprintf(buf1, sizeof(buf1), "%s = %s;",
+ p->name, ccval(p, cc[p->sub]));
+ bput(buf1);
+ }
+ binit(NULL);
+ } else {
+ binit(NULL);
+ for (p = cchars1, cnt = 0; p->name; ++p) {
+ if (fmt != STTY_BSD && cc[p->sub] == p->def)
+ continue;
+#define WD "%-8s"
+ (void)snprintf(buf1 + cnt * 8, 9, WD, p->name);
+ (void)snprintf(buf2 + cnt * 8, 9, WD, ccval(p, cc[p->sub]));
+ if (++cnt == LINELENGTH / 8) {
+ cnt = 0;
+ (void)printf("%s\n", buf1);
+ (void)printf("%s\n", buf2);
+ }
+ }
+ if (cnt) {
+ (void)printf("%s\n", buf1);
+ (void)printf("%s\n", buf2);
+ }
+ }
+}
+
+static int col;
+static const char *label;
+
+static void
+binit(const char *lb)
+{
+
+ if (col) {
+ (void)printf("\n");
+ col = 0;
+ }
+ label = lb;
+}
+
+static void
+bput(const char *s)
+{
+
+ if (col == 0) {
+ col = printf("%s: %s", label, s);
+ return;
+ }
+ if ((col + strlen(s)) > LINELENGTH) {
+ (void)printf("\n\t");
+ col = printf("%s", s) + 8;
+ return;
+ }
+ col += printf(" %s", s);
+}
+
+static const char *
+ccval(const struct cchar *p, int c)
+{
+ static char buf[5];
+ char *bp;
+
+ if (c == _POSIX_VDISABLE)
+ return ("<undef>");
+
+ if (p->sub == VMIN || p->sub == VTIME) {
+ (void)snprintf(buf, sizeof(buf), "%d", c);
+ return (buf);
+ }
+ bp = buf;
+ if (c & 0200) {
+ *bp++ = 'M';
+ *bp++ = '-';
+ c &= 0177;
+ }
+ if (c == 0177) {
+ *bp++ = '^';
+ *bp++ = '?';
+ }
+ else if (c < 040) {
+ *bp++ = '^';
+ *bp++ = c + '@';
+ }
+ else
+ *bp++ = c;
+ *bp = '\0';
+ return (buf);
+}
--- /dev/null
+.\" $NetBSD: stty.1,v 1.41 2012/06/20 14:19:39 wiz Exp $
+.\"
+.\" Copyright (c) 1990, 1993, 1994
+.\" The Regents of the University of California. All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the Institute of Electrical and Electronics Engineers, Inc.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\" may be used to endorse or promote products derived from this software
+.\" without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" @(#)stty.1 8.5 (Berkeley) 6/1/94
+.\"
+.Dd June 16, 2012
+.Dt STTY 1
+.Os
+.Sh NAME
+.Nm stty
+.Nd set options for a terminal device interface
+.Sh SYNOPSIS
+.Nm
+.Op Fl a | Fl e | Fl g
+.Op Fl f Ar file
+.Op operand ...
+.Sh DESCRIPTION
+The
+.Nm
+utility sets or reports on terminal
+characteristics for the device that is its standard input.
+If no options or operands are specified, it reports the settings of a subset
+of characteristics as well as additional ones if they differ from their
+default values.
+Otherwise it modifies
+the terminal state according to the specified arguments.
+Some combinations of arguments are mutually
+exclusive on some terminal types.
+.Pp
+The following options are available:
+.Bl -tag -width XfXfileXX
+.It Fl a
+Display all the current settings for the terminal to standard output
+as per
+.St -p1003.2 .
+.It Fl e
+Display all the current settings for the terminal to standard output
+in the traditional
+.Bx
+.Dq all
+and
+.Dq everything
+formats.
+.It Fl f Ar file
+Open and use the terminal named by
+.Ar file
+rather than using standard input.
+The file is opened using the
+.Dv O_NONBLOCK
+flag of
+.Fn open ,
+making it possible to
+set or display settings on a terminal that might otherwise
+block on the open.
+.It Fl g
+Display all the current settings for the terminal to standard output
+in a form that may be used as an argument to a subsequent invocation of
+.Nm
+to restore the current terminal state as per
+.St -p1003.2 .
+.El
+.Pp
+The following arguments are available to set the terminal
+characteristics:
+.Ss Control Modes
+Control mode flags affect hardware characteristics associated with the
+terminal.
+This corresponds to the
+.Fa c_cflag
+of the
+.Xr termios 4
+structure.
+.Bl -tag -width Fl
+.It Cm parenb Pq Fl parenb
+Enable (disable) parity generation
+and detection.
+.It Cm parodd Pq Fl parodd
+Select odd (even) parity.
+.It Cm cs5 cs6 cs7 cs8
+Select character size, if possible.
+.It Ar number
+Set terminal baud rate to
+.Ar number ,
+if possible.
+If the
+baud rate is set to zero, modem
+control is no longer
+asserted.
+.It Cm ispeed Ar number
+Set terminal input baud rate to
+.Ar number ,
+if possible.
+If the
+input baud rate is set to zero, the
+input baud rate is set to the
+value of the output baud
+rate.
+.It Cm ospeed Ar number
+Set terminal output baud rate to
+.Ar number ,
+if possible.
+If
+the output baud rate is set to
+zero, modem control is
+no longer asserted.
+.It Cm speed Ar number
+This sets both
+.Cm ispeed
+and
+.Cm ospeed
+to
+.Ar number .
+.It Cm hupcl Pq Fl hupcl
+Stop asserting modem control
+(do not stop asserting modem control) on last close.
+.It Cm hup Pq Fl hup
+Same as hupcl
+.Pq Fl hupcl .
+.It Cm cstopb Pq Fl cstopb
+Use two (one) stop bits per character.
+.It Cm cread Pq Fl cread
+Enable (disable) the receiver.
+.It Cm clocal Pq Fl clocal
+Assume a line without (with) modem
+control.
+.It Cm crtscts Pq Fl crtscts
+Enable RTS/CTS flow control.
+.It Cm cdtrcts Pq Fl cdtrcts
+Enable DTR/CTS flow control (if supported).
+.El
+.Ss Input Modes
+This corresponds to the
+.Fa c_iflag
+of the
+.Xr termios 4
+structure.
+.Bl -tag -width Fl
+.It Cm ignbrk Pq Fl ignbrk
+Ignore (do not ignore) break on
+input.
+.It Cm brkint Pq Fl brkint
+Signal (do not signal)
+.Dv INTR
+on
+break.
+.It Cm ignpar Pq Fl ignpar
+Ignore (do not ignore) parity
+errors.
+.It Cm parmrk Pq Fl parmrk
+Mark (do not mark) parity errors.
+.It Cm inpck Pq Fl inpck
+Enable (disable) input parity
+checking.
+.It Cm istrip Pq Fl istrip
+Strip (do not strip) input characters
+to seven bits.
+.It Cm inlcr Pq Fl inlcr
+Map (do not map)
+.Dv NL
+to
+.Dv CR
+on input.
+.It Cm igncr Pq Fl igncr
+Ignore (do not ignore)
+.Dv CR
+on input.
+.It Cm icrnl Pq Fl icrnl
+Map (do not map)
+.Dv CR
+to
+.Dv NL
+on input.
+.It Cm ixon Pq Fl ixon
+Enable (disable)
+.Dv START/STOP
+output
+control.
+Output from the system is
+stopped when the system receives
+.Dv STOP
+and started when the system
+receives
+.Dv START ,
+or if
+.Cm ixany
+is set, any character restarts output.
+.It Cm ixoff Pq Fl ixoff
+Request that the system send (not
+send)
+.Dv START/STOP
+characters when
+the input queue is nearly
+empty/full.
+.It Cm ixany Pq Fl ixany
+Allow any character (allow only
+.Dv START )
+to restart output.
+.It Cm imaxbel Pq Fl imaxbel
+The system imposes a limit of
+.Dv MAX_INPUT
+(currently 255) characters in the input queue.
+If
+.Cm imaxbel
+is set and the input queue limit has been reached,
+subsequent input causes the system to send an ASCII BEL
+character to the output queue (the terminal beeps at you).
+Otherwise,
+if
+.Cm imaxbel
+is unset and the input queue is full, the next input character causes
+the entire input and output queues to be discarded.
+.El
+.Ss Output Modes
+This corresponds to the
+.Fa c_oflag
+of the
+.Xr termios 4
+structure.
+.Bl -tag -width Fl
+.It Cm opost Pq Fl opost
+Post-process output (do not
+post-process output; ignore all other
+output modes).
+.It Cm onlcr Pq Fl onlcr
+Map (do not map)
+.Dv NL
+to
+.Dv CR-NL
+on output.
+.It Cm ocrnl Pq Fl ocrnl
+Map (do not map)
+.Dv CR
+to
+.Dv NL
+on output.
+.It Cm oxtabs Pq Fl oxtabs
+Expand (do not expand) tabs to spaces on output.
+.It Cm onocr Pq Fl onocr
+Do not (do) output CRs at column zero.
+.It Cm onlret Pq Fl onlret
+On the terminal NL performs (does not perform) the CR function.
+.El
+.Ss Local Modes
+Local mode flags (lflags) affect various and sundry characteristics of terminal
+processing.
+Historically the term "local" pertained to new job control features
+implemented by Jim Kulp on a
+.Tn PDP Ns -11/70
+at
+.Tn IIASA .
+Later the driver ran on the first
+.Tn VAX
+at Evans Hall, UC Berkeley, where the job control details
+were greatly modified but the structure definitions and names
+remained essentially unchanged.
+The second interpretation of the
+.Sq l
+in lflag
+is
+.Dq line discipline flag ,
+which corresponds to the
+.Fa c_lflag
+of the
+.Xr termios 4
+structure.
+.Bl -tag -width Fl
+.It Cm isig Pq Fl isig
+Enable (disable) the checking of
+characters against the special control
+characters
+.Dv INTR , QUIT ,
+and
+.Dv SUSP .
+.It Cm icanon Pq Fl icanon
+Enable (disable) canonical input
+.Dv ( ERASE
+and
+.Dv KILL
+processing).
+.It Cm iexten Pq Fl iexten
+Enable (disable) any implementation
+defined special control characters
+not currently controlled by icanon,
+isig, or ixon.
+.It Cm echo Pq Fl echo
+Echo back (do not echo back) every
+character typed.
+.It Cm echoe Pq Fl echoe
+The
+.Dv ERASE
+character shall (shall
+not) visually erase the last character
+in the current line from the
+display, if possible.
+.It Cm echok Pq Fl echok
+Echo (do not echo)
+.Dv NL
+after
+.Dv KILL
+character.
+.It Cm echoke Pq Fl echoke
+The
+.Dv KILL
+character shall (shall
+not) visually erase
+the current line from the
+display, if possible.
+.It Cm echonl Pq Fl echonl
+Echo (do not echo)
+.Dv NL ,
+even if echo
+is disabled.
+.It Cm echoctl Pq Fl echoctl
+If
+.Cm echoctl
+is set, echo control characters as ^X.
+Otherwise control characters echo as themselves.
+.It Cm echoprt Pq Fl echoprt
+For printing terminals.
+If set, echo erased characters backwards within
+.Dq \e
+and
+.Dq / .
+Otherwise, disable this feature.
+.It Cm noflsh Pq Fl noflsh
+Disable (enable) flush after
+.Dv INTR , QUIT , SUSP .
+.It Cm tostop Pq Fl tostop
+Send (do not send)
+.Dv SIGTTOU
+for background output.
+This causes background jobs to stop if they attempt terminal output.
+.It Cm altwerase Pq Fl altwerase
+Use (do not use) an alternative word erase algorithm when processing
+.Dv WERASE
+characters.
+This alternative algorithm considers sequences of
+alphanumeric/underscores as words.
+It also skips the first preceding character in its classification
+(as a convenience since the one preceding character could have been
+erased with simply an
+.Dv ERASE
+character).
+.It Cm mdmbuf Pq Fl mdmbuf
+If set, flow control output based on condition of Carrier Detect.
+Otherwise writes return an error if Carrier Detect is low (and Carrier
+is not being ignored with the
+.Dv CLOCAL
+flag).
+.It Cm flusho Pq Fl flusho
+Indicates output is (is not) being discarded.
+.It Cm pendin Pq Fl pendin
+Indicates input is (is not) pending after a switch from non-canonical
+to canonical mode and will be re-input when a read becomes pending
+or more input arrives.
+.El
+.Ss Control Characters
+.Bl -tag -width Fl
+.It Ar control-character Ar string
+Set
+.Ar control-character
+to string
+.Ar string .
+If the string is a single character,
+then the control character is set to
+that character.
+If the string is the
+two character sequence "^-" or the
+string "undef", then the control character
+is disabled (i.e., set to
+.Bro Dv _POSIX_VDISABLE Brc ) .
+.Pp
+Recognized control characters:
+.Bd -ragged -offset indent
+.Bl -column character Subscript Description
+.It control- Ta "" Ta ""
+.It character Subscript Description
+.It _________ _________ _______________
+.It eof Ta Tn VEOF Ta EOF No character
+.It eol Ta Tn VEOL Ta EOL No character
+.It eol2 Ta Tn VEOL2 Ta EOL2 No character
+.It erase Ta Tn VERASE Ta ERASE No character
+.It werase Ta Tn VWERASE Ta WERASE No character
+.It kill Ta Tn VKILL Ta KILL No character
+.It reprint Ta Tn VREPRINT Ta REPRINT No character
+.It intr Ta Tn VINTR Ta INTR No character
+.It quit Ta Tn VQUIT Ta QUIT No character
+.It susp Ta Tn VSUSP Ta SUSP No character
+.It dsusp Ta Tn VDSUSP Ta DSUSP No character
+.It start Ta Tn VSTART Ta START No character
+.It stop Ta Tn VSTOP Ta STOP No character
+.It lnext Ta Tn VLNEXT Ta LNEXT No character
+.It status Ta Tn VSTATUS Ta STATUS No character
+.It discard Ta Tn VDISCARD Ta DISCARD No character
+.El
+.Ed
+.It Cm min Ar number
+.It Cm time Ar number
+Set the value of min or time to
+.Ar number .
+.Dv MIN
+and
+.Dv TIME
+are used in
+Non-Canonical mode input processing
+(-icanon).
+.El
+.Ss Combination Modes
+.Bl -tag -width Fl
+.It Ar saved settings
+Set the current terminal characteristics to the saved settings
+produced by the
+.Fl g
+option.
+.It Cm evenp No or Cm parity
+Enable parenb and cs7; disable parodd.
+.It Cm oddp
+Enable parenb, cs7, and parodd.
+.It Fl parity , evenp , oddp
+Disable parenb, and set cs8.
+.It Cm \&nl Pq Fl \&nl
+Enable (disable) icrnl.
+In addition
+-nl unsets inlcr and igncr.
+.It Cm ek
+Reset
+.Dv ERASE
+and
+.Dv KILL
+characters back to system defaults.
+.It Cm sane
+Resets all modes to reasonable values for interactive terminal use.
+.It Cm insane
+Sets all modes to random values, which are very likely
+.Pq but not guaranteed
+to be unreasonable for interactive terminal use.
+.It Cm tty
+Set the line discipline to the standard terminal line discipline
+.Dv TTYDISC .
+.It Cm crt Pq Fl crt
+Set (disable) all modes suitable for a CRT display device.
+.It Cm kerninfo Pq Fl kerninfo
+Enable (disable) the system generated status line associated with
+processing a
+.Dv STATUS
+character (usually set to ^T).
+The status line consists of the
+system load average, the current command name, its process ID, the
+event the process is waiting on (or the status of the process), the user
+and system times, percent CPU, and current memory usage.
+.It Cm columns Ar number
+The terminal size is recorded as having
+.Ar number
+columns.
+.It Cm cols Ar number
+An alias for
+.Cm columns .
+.It Cm rows Ar number
+The terminal size is recorded as having
+.Ar number
+rows.
+.It Cm dec
+Set modes suitable for users of Digital Equipment Corporation systems
+.Dv ( ERASE ,
+.Dv KILL ,
+and
+.Dv INTR
+characters are set to ^?, ^U, and ^C;
+.Dv ixany
+is disabled, and
+.Dv crt
+is enabled).
+.It Cm extproc Pq Fl extproc
+If set, this flag indicates that some amount of terminal processing is being
+performed by either the terminal hardware or by the remote side connected
+to a pty.
+.It Cm raw Pq Fl raw
+If set, change the modes of the terminal so that no input or output processing
+is performed.
+If unset, change the modes of the terminal to some reasonable
+state that performs input and output processing.
+Note that since the terminal driver no longer has a single
+.Dv RAW
+bit, it is not possible to intuit what flags were set prior to setting
+.Cm raw .
+This means that unsetting
+.Cm raw
+may not put back all the setting that were previously in effect.
+To set the terminal into a raw state and then accurately restore it, the following
+shell code is recommended:
+.Bd -literal -offset indent
+save_state=$(stty -g)
+stty raw
+\&...
+stty "$save_state"
+.Ed
+.It Cm size
+The size of the terminal is printed as two numbers on a single line,
+first rows, then columns.
+.El
+.Ss Compatibility Modes
+These modes remain for compatibility with the previous version of
+the
+.Nm
+utility.
+.Bl -tag -width Fl
+.It Cm all
+Reports all the terminal modes as with
+.Cm stty Fl a
+except that the control characters are printed in a columnar format.
+.It Cm everything
+Same as
+.Cm all .
+.It Cm cooked
+Same as
+.Cm sane .
+.It Cm cbreak
+If set, enables
+.Cm brkint , ixon , imaxbel , opost ,
+.Cm isig , iexten ,
+and
+.Fl icanon .
+If unset, same as
+.Cm sane .
+.It Cm new
+Same as
+.Cm tty .
+.It Cm old
+Same as
+.Cm tty .
+.It Cm newcrt Pq Fl newcrt
+Same as
+.Cm crt .
+.It Cm pass8
+The converse of
+.Cm parity .
+.It Cm tandem Pq Fl tandem
+Same as
+.Cm ixoff .
+.It Cm decctlq Pq Fl decctlq
+The converse of
+.Cm ixany .
+.It Cm crterase Pq Fl crterase
+Same as
+.Cm echoe .
+.It Cm crtbs Pq Fl crtbs
+Same as
+.Cm echoe .
+.It Cm crtkill Pq Fl crtkill
+Same as
+.Cm echoke .
+.It Cm ctlecho Pq Fl ctlecho
+Same as
+.Cm echoctl .
+.It Cm prterase Pq Fl prterase
+Same as
+.Cm echoprt .
+.It Cm litout Pq Fl litout
+The converse of
+.Cm opost .
+.It Cm tabs Pq Fl tabs
+The converse of
+.Cm oxtabs .
+.It Cm brk Ar value
+Same as the control character
+.Cm eol .
+.It Cm flush Ar value
+Same as the control character
+.Cm discard .
+.It Cm rprnt Ar value
+Same as the control character
+.Cm reprint .
+.El
+.Ss Control operations
+These operations are not modes, but rather commands to be performed by
+the tty layer.
+.Bl -tag -width Fl
+.It Cm ostart
+Performs a "start output" operation, as normally done by an
+incoming START character when
+.Cm ixon
+is set.
+.It Cm ostop
+Performs a "stop output" operation, as normally done by an
+incoming STOP character when
+.Cm ixon
+is set.
+.El
+.Sh EXIT STATUS
+.Ex -std
+.Sh SEE ALSO
+.Xr termios 4 ,
+.Xr tty 4
+.Sh STANDARDS
+The
+.Nm
+utility is expected to be
+.St -p1003.2
+compatible.
+The
+.Fl e
+and
+.Fl f
+flags are
+extensions to the standard, as are the operands mentioned in the control
+operations section.
--- /dev/null
+/* $NetBSD: stty.c,v 1.22 2012/06/20 10:09:43 wiz Exp $ */
+
+/*-
+ * Copyright (c) 1989, 1991, 1993, 1994
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1989, 1991, 1993, 1994\
+ The Regents of the University of California. All rights reserved.");
+#endif /* not lint */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)stty.c 8.3 (Berkeley) 4/2/94";
+#else
+__RCSID("$NetBSD: stty.c,v 1.22 2012/06/20 10:09:43 wiz Exp $");
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "stty.h"
+#include "extern.h"
+
+int main(int, char *[]);
+
+int
+main(int argc, char *argv[])
+{
+ struct info i;
+ enum FMT fmt;
+ int ch;
+
+ setprogname(argv[0]);
+ (void)setlocale(LC_ALL, "");
+
+ fmt = STTY_NOTSET;
+ i.fd = STDIN_FILENO;
+
+ opterr = 0;
+ while (optind < argc &&
+ strspn(argv[optind], "-aefg") == strlen(argv[optind]) &&
+ (ch = getopt(argc, argv, "aef:g")) != -1)
+ switch(ch) {
+ case 'a': /* undocumented: POSIX compatibility */
+ fmt = STTY_POSIX;
+ break;
+ case 'e':
+ fmt = STTY_BSD;
+ break;
+ case 'f':
+ if ((i.fd = open(optarg, O_RDONLY | O_NONBLOCK)) < 0)
+ err(1, "%s", optarg);
+ break;
+ case 'g':
+ fmt = STTY_GFLAG;
+ break;
+ case '?':
+ default:
+ goto args;
+ }
+
+args: argc -= optind;
+ argv += optind;
+
+ if (ioctl(i.fd, TIOCGETD, &i.ldisc) < 0)
+ err(1, "TIOCGETD");
+ if (tcgetattr(i.fd, &i.t) < 0)
+ err(1, "tcgetattr");
+ if (ioctl(i.fd, TIOCGWINSZ, &i.win) < 0)
+ warn("TIOCGWINSZ");
+
+ switch(fmt) {
+ case STTY_NOTSET:
+ if (*argv)
+ break;
+ /* FALLTHROUGH */
+ case STTY_BSD:
+ case STTY_POSIX:
+ print(&i.t, &i.win, i.ldisc, fmt);
+ break;
+ case STTY_GFLAG:
+ gprint(&i.t);
+ break;
+ }
+
+ for (i.set = i.wset = 0; *argv; ++argv) {
+ if (ksearch(&argv, &i))
+ continue;
+
+ if (csearch(&argv, &i))
+ continue;
+
+ if (msearch(&argv, &i))
+ continue;
+
+ if (isdigit((unsigned char)**argv)) {
+ int speed;
+
+ speed = atoi(*argv);
+ cfsetospeed(&i.t, speed);
+ cfsetispeed(&i.t, speed);
+ i.set = 1;
+ continue;
+ }
+
+ if (!strncmp(*argv, "gfmt1", sizeof("gfmt1") - 1)) {
+ gread(&i.t, *argv + sizeof("gfmt1") - 1);
+ i.set = 1;
+ continue;
+ }
+
+ warnx("illegal option -- %s", *argv);
+ usage();
+ }
+
+ if (i.set && tcsetattr(i.fd, 0, &i.t) < 0)
+ err(1, "tcsetattr");
+ if (i.wset && ioctl(i.fd, TIOCSWINSZ, &i.win) < 0)
+ warn("TIOCSWINSZ");
+ exit(0);
+ /* NOTREACHED */
+}
+
+void
+usage(void)
+{
+
+ (void)fprintf(stderr, "usage: %s [-a|-e|-g] [-f file] [operand ...]\n", getprogname());
+ exit(1);
+ /* NOTREACHED */
+}
--- /dev/null
+/* $NetBSD: stty.h,v 1.10 2003/08/07 09:05:42 agc Exp $ */
+
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)stty.h 8.1 (Berkeley) 5/31/93
+ */
+
+#ifndef _STTY_H_
+#define _STTY_H_
+
+#include <sys/ioctl.h>
+#include <termios.h>
+
+struct info {
+ int fd; /* file descriptor */
+ int ldisc; /* line discipline */
+ int off; /* turn off */
+ int set; /* need set */
+ int wset; /* need window set */
+ char *arg; /* argument */
+ struct termios t; /* terminal info */
+ struct winsize win; /* window info */
+};
+
+struct cchar {
+ const char *name;
+ int sub;
+ u_char def;
+};
+
+enum FMT { STTY_NOTSET, STTY_GFLAG, STTY_BSD, STTY_POSIX };
+
+#define LINELENGTH 72
+
+#endif /* !_STTY_H_ */
remsync rget rlogin \
rotate rsh rshd service setup shar \
sleep slip spell sprofalyze sprofdiff srccrc \
- stty svclog svrctl swifi synctree sysenv \
+ svclog svrctl swifi synctree sysenv \
syslogd tail tcpd tcpdp tcpstat telnet \
telnetd term termcap tget time touch \
truncate udpstat umount \
+++ /dev/null
-PROG= stty
-MAN=
-
-.include <bsd.prog.mk>
+++ /dev/null
-/* stty - set terminal mode Author: Andy Tanenbaum */
-
-/*
- Adapted to POSIX 1003.2 by Philip Homburg.
- */
-
-#include <assert.h>
-#include <ctype.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <termios.h>
-#ifdef __minix
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#endif
-#include <unistd.h>
-
-/* Default settings, the Minix ones are defined in <termios.h> */
-
-#ifndef TCTRL_DEF
-#define TCTRL_DEF (PARENB | CREAD | CS7)
-#endif
-
-#ifndef TSPEED_DEF
-#define TSPEED_DEF B1200
-#endif
-
-#ifndef TINPUT_DEF
-#define TINPUT_DEF (BRKINT | IGNPAR | ISTRIP | ICRNL)
-#endif
-
-#ifndef TOUTPUT_DEF
-#define TOUTPUT_DEF OPOST
-#endif
-
-#ifndef TLOCAL_DEF
-#define TLOCAL_DEF (ISIG | IEXTEN | ICANON | ECHO | ECHOE)
-#endif
-
-#ifndef TEOF_DEF
-#define TEOF_DEF '\4' /* ^D */
-#endif
-#ifndef TEOL_DEF
-#ifdef _POSIX_VDISABLE
-#define TEOL_DEF _POSIX_VDISABLE
-#else
-#define TEOL_DEF '\n'
-#endif
-#endif
-#ifndef TERASE_DEF
-#define TERASE_DEF '\10' /* ^H */
-#endif
-#ifndef TINTR_DEF
-#define TINTR_DEF '\177' /* ^? */
-#endif
-#ifndef TKILL_DEF
-#define TKILL_DEF '\25' /* ^U */
-#endif
-#ifndef TQUIT_DEF
-#define TQUIT_DEF '\34' /* ^\ */
-#endif
-#ifndef TSUSP_DEF
-#define TSUSP_DEF '\32' /* ^Z */
-#endif
-#ifndef TSTART_DEF
-#define TSTART_DEF '\21' /* ^Q */
-#endif
-#ifndef TSTOP_DEF
-#define TSTOP_DEF '\23' /* ^S */
-#endif
-#ifndef TMIN_DEF
-#define TMIN_DEF 1
-#endif
-#ifndef TTIME_DEF
-#define TTIME_DEF 0
-#endif
-
-
-
-char *prog_name;
-struct termios termios;
-int column= 0, max_column=80; /* Assume 80 character terminals. */
-#ifdef __minix
-struct winsize winsize;
-#endif
-
-#define PROTO(a) a
-
-int main PROTO(( int argc, char **argv ));
-void report PROTO(( int flags ));
-int option PROTO(( char *opt, char *next ));
-int match PROTO(( char *s1, char *s2 ));
-void prctl PROTO(( int c ));
-speed_t long2speed PROTO(( long num ));
-long speed2long PROTO(( unsigned long speed ));
-void print_flags PROTO(( unsigned long flags, unsigned long flag,
- unsigned long def, char *string, int all ));
-void output PROTO(( char *s ));
-void do_print_char PROTO(( unsigned chr, unsigned def, char *name, int all ));
-void do_print_num PROTO(( unsigned num, unsigned def, char *name, int all ));
-void set_saved_settings PROTO(( char *opt ));
-void set_control PROTO(( int option, char *value ));
-void set_min_tim PROTO(( int option, char *value ));
-
-#define print_char(c,d,n,a) (do_print_char((unsigned)(c),(unsigned)(d),(n),(a)))
-#define print_num(m,d,n,a) (do_print_num((unsigned)(m),(unsigned)(d),(n),(a)))
-
-int main(argc, argv)
-int argc;
-char *argv[];
-{
- int flags, k;
-
- prog_name= argv[0];
- flags= 0;
-
- /* Stty with no arguments just reports on current status. */
- if (tcgetattr(0, &termios) == -1)
- {
- fprintf(stderr, "%s: can't read ioctl parameters from stdin: %s\n",
- prog_name, strerror(errno));
- exit(1);
- }
-#ifdef __minix
- if (ioctl(0, TIOCGWINSZ, &winsize) == -1)
- {
- fprintf(stderr, "%s: can't get screen size from stdin: %s\n",
- prog_name, strerror(errno));
- exit(1);
- }
- if (winsize.ws_col != 0)
- max_column= winsize.ws_col;
-#endif
-
- if (argc == 2)
- {
- if (!strcmp(argv[1], "-a"))
- flags |= 1;
- else if (!strcmp(argv[1], "-g"))
- flags |= 2;
- }
- if (argc == 1 || flags) {
- report(flags);
- exit(0);
- }
-
- /* Process the options specified. */
- for (k= 1; k < argc; k++)
- k += option(argv[k], k+1 < argc ? argv[k+1] : "");
-
-#ifdef __minix
- if (ioctl(0, TIOCSWINSZ, &winsize) == -1)
- {
- fprintf(stderr, "%s: can't set screen size to stdin: %s\n",
- prog_name, strerror(errno));
- exit(1);
- }
-#endif
- if (tcsetattr(0, TCSANOW, &termios) == -1)
- {
- fprintf(stderr, "%s: can't set terminal parameters to stdin: %s\n",
- prog_name, strerror(errno));
- exit(1);
- }
- exit(0);
-}
-
-
-
-void report(flags)
-int flags;
-{
- int i, all;
- tcflag_t c_cflag, c_iflag, c_oflag, c_lflag;
- char line[80];
- speed_t ispeed, ospeed;
-
- if (flags & 2)
- { /* We have to write the termios structure in a encoded form
- * to stdout.
- */
- printf(":%x:%x:%x:%x:%x:%x", termios.c_iflag, termios.c_oflag,
- termios.c_cflag, termios.c_lflag, cfgetispeed(&termios),
- cfgetospeed(&termios));
- for (i= 0; i<NCCS; i++)
- printf(":%x", termios.c_cc[i]);
- printf(":\n");
- return;
- }
-
- all= !!flags;
-
- /* Start with the baud rate. */
- ispeed= cfgetispeed(&termios);
- ospeed= cfgetospeed(&termios);
- if (ispeed != ospeed)
- {
- sprintf(line, "ispeed %lu baud; ospeed %lu baud;",
- speed2long(ispeed), speed2long(ospeed));
- output(line);
- }
- else if (all || ospeed != TSPEED_DEF)
- {
- sprintf(line, "speed %lu baud;", speed2long(ospeed));
- output(line);
- }
-
- /* The control modes. */
-
- c_cflag= termios.c_cflag;
- if (all || (c_cflag & CSIZE) != (TCTRL_DEF & CSIZE))
- {
- switch (c_cflag & CSIZE)
- {
- case CS5: output("cs5"); break;
- case CS6: output("cs6"); break;
- case CS7: output("cs7"); break;
- case CS8: output("cs8"); break;
- default: output("cs??"); break;
- }
- }
- print_flags(c_cflag, PARENB, TCTRL_DEF, "-parenb", all);
- print_flags(c_cflag, PARODD, TCTRL_DEF, "-parodd", all);
- print_flags(c_cflag, HUPCL, TCTRL_DEF, "-hupcl", all);
- print_flags(c_cflag, CSTOPB, TCTRL_DEF, "-cstopb", all);
- print_flags(c_cflag, CREAD, TCTRL_DEF, "-cread", all);
- print_flags(c_cflag, CLOCAL, TCTRL_DEF, "-clocal", all);
-
- if (all)
- {
- printf("\n");
- column= 0;
- }
-
- /* The input flags. */
-
- c_iflag= termios.c_iflag;
-
- print_flags(c_iflag, IGNBRK, TINPUT_DEF, "-ignbrk", all);
- print_flags(c_iflag, BRKINT, TINPUT_DEF, "-brkint", all);
- print_flags(c_iflag, IGNPAR, TINPUT_DEF, "-ignpar", all);
- print_flags(c_iflag, PARMRK, TINPUT_DEF, "-parmrk", all);
- print_flags(c_iflag, INPCK, TINPUT_DEF, "-inpck", all);
- print_flags(c_iflag, ISTRIP, TINPUT_DEF, "-istrip", all);
- print_flags(c_iflag, INLCR, TINPUT_DEF, "-inlcr", all);
- print_flags(c_iflag, IGNCR, TINPUT_DEF, "-igncr", all);
- print_flags(c_iflag, ICRNL, TINPUT_DEF, "-icrnl", all);
- print_flags(c_iflag, IXON, TINPUT_DEF, "-ixon", all);
- print_flags(c_iflag, IXOFF, TINPUT_DEF, "-ixoff", all);
- print_flags(c_iflag, IXANY, TINPUT_DEF, "-ixany", all);
-
- if (all)
- {
- printf("\n");
- column= 0;
- }
-
- /* The output flags. */
-
- c_oflag= termios.c_oflag;
-
- print_flags(c_oflag, OPOST, TOUTPUT_DEF, "-opost", all);
-#ifdef __minix
- print_flags(c_oflag, ONLCR, TOUTPUT_DEF, "-onlcr", all);
- print_flags(c_oflag, XTABS, TOUTPUT_DEF, "-xtabs", all);
- print_flags(c_oflag, ONOEOT, TOUTPUT_DEF, "-onoeot", all);
-#endif
- if (all)
- {
- printf("\n");
- column= 0;
- }
-
- /* The local flags. */
-
- c_lflag= termios.c_lflag;
-
- print_flags(c_lflag, ISIG, TLOCAL_DEF, "-isig", all);
- print_flags(c_lflag, ICANON, TLOCAL_DEF, "-icanon", all);
- print_flags(c_lflag, IEXTEN, TLOCAL_DEF, "-iexten", all);
- print_flags(c_lflag, ECHO, TLOCAL_DEF, "-echo", all);
- print_flags(c_lflag, ECHOE, TLOCAL_DEF, "-echoe", all);
- print_flags(c_lflag, ECHOK, TLOCAL_DEF, "-echok", all);
- print_flags(c_lflag, ECHONL, TLOCAL_DEF, "-echonl", all);
- print_flags(c_lflag, NOFLSH, TLOCAL_DEF, "-noflsh", all);
-#ifdef TOSTOP
- print_flags(c_lflag, TOSTOP, TLOCAL_DEF, "-tostop", all);
-#endif
-#ifdef __minix
- print_flags(c_lflag, LFLUSHO, TLOCAL_DEF, "-lflusho", all);
-#endif
-
- if (all)
- {
- printf("\n");
- column= 0;
- }
-
- /* The special control characters. */
-
- print_char(termios.c_cc[VEOF], TEOF_DEF, "eof", all);
- print_char(termios.c_cc[VEOL], TEOL_DEF, "eol", all);
- print_char(termios.c_cc[VERASE], TERASE_DEF, "erase", all);
- print_char(termios.c_cc[VINTR], TINTR_DEF, "intr", all);
- print_char(termios.c_cc[VKILL], TKILL_DEF, "kill", all);
- print_char(termios.c_cc[VQUIT], TQUIT_DEF, "quit", all);
- print_char(termios.c_cc[VSUSP], TSUSP_DEF, "susp", all);
- print_char(termios.c_cc[VSTART], TSTART_DEF, "start", all);
- print_char(termios.c_cc[VSTOP], TSTOP_DEF, "stop", all);
-#ifdef __minix
- print_char(termios.c_cc[VREPRINT], TREPRINT_DEF, "rprnt", all);
- print_char(termios.c_cc[VLNEXT], TLNEXT_DEF, "lnext", all);
- print_char(termios.c_cc[VDISCARD], TDISCARD_DEF, "flush", all);
-#endif
- print_num(termios.c_cc[VMIN], TMIN_DEF, "min", all);
- print_num(termios.c_cc[VTIME], TTIME_DEF, "time", all);
- if (all)
- {
- printf("\n");
- column= 0;
- }
-
-#ifdef __minix
- /* Screen size */
- if (all || winsize.ws_row != 0 || winsize.ws_col != 0)
- {
- sprintf(line, "%d rows %d columns", winsize.ws_row,
- winsize.ws_col);
- output(line);
- }
-
- if (all || winsize.ws_ypixel != 0 || winsize.ws_xpixel != 0)
- {
- sprintf(line, "%d ypixels %d xpixels", winsize.ws_ypixel,
- winsize.ws_xpixel);
- output(line);
- }
-
- if (all)
- {
- printf("\n");
- column= 0;
- }
-#endif
-
- if (column != 0)
- {
- printf("\n");
- column= 0;
- }
-}
-
-int option(opt, next)
-char *opt, *next;
-{
- char *check;
- speed_t speed;
- long num;
-
- /* The control options. */
-
- if (match(opt, "clocal")) {
- termios.c_cflag |= CLOCAL;
- return 0;
- }
- if (match(opt, "-clocal")) {
- termios.c_cflag &= ~CLOCAL;
- return 0;
- }
-
- if (match(opt, "cread")) {
- termios.c_cflag |= CREAD;
- return 0;
- }
- if (match(opt, "-cread")) {
- termios.c_cflag &= ~CREAD;
- return 0;
- }
-
- if (match(opt, "cs5")) {
- termios.c_cflag &= ~CSIZE;
- termios.c_cflag |= CS5;
- return 0;
- }
- if (match(opt, "cs6")) {
- termios.c_cflag &= ~CSIZE;
- termios.c_cflag |= CS6;
- return 0;
- }
- if (match(opt, "cs7")) {
- termios.c_cflag &= ~CSIZE;
- termios.c_cflag |= CS7;
- return 0;
- }
- if (match(opt, "cs8")) {
- termios.c_cflag &= ~CSIZE;
- termios.c_cflag |= CS8;
- return 0;
- }
-
- if (match(opt, "cstopb")) {
- termios.c_cflag |= CSTOPB;
- return 0;
- }
- if (match(opt, "-cstopb")) {
- termios.c_cflag &= ~CSTOPB;
- return 0;
- }
-
- if (match(opt, "hupcl") || match(opt, "hup")) {
- termios.c_cflag |= HUPCL;
- return 0;
- }
- if (match(opt, "-hupcl") || match(opt, "-hup")) {
- termios.c_cflag &= ~HUPCL;
- return 0;
- }
-
- if (match(opt, "parenb")) {
- termios.c_cflag |= PARENB;
- return 0;
- }
- if (match(opt, "-parenb")) {
- termios.c_cflag &= ~PARENB;
- return 0;
- }
-
- if (match(opt, "parodd")) {
- termios.c_cflag |= PARODD;
- return 0;
- }
- if (match(opt, "-parodd")) {
- termios.c_cflag &= ~PARODD;
- return 0;
- }
-
- num= strtol(opt, &check, 10);
- if (check[0] == '\0')
- {
- speed= long2speed(num);
- if (speed == (speed_t)-1)
- {
- fprintf(stderr, "%s: illegal speed: '%s'\n", prog_name, opt);
- return 0;
- }
- /* Speed OK */
- cfsetispeed(&termios, speed);
- cfsetospeed(&termios, speed);
- return 0;
- }
-
- if (match(opt, "ispeed")) {
- num= strtol(next, &check, 10);
- if (check != '\0')
- {
- speed= long2speed(num);
- if (speed == (speed_t)-1)
- {
- fprintf(stderr, "%s: illegal speed: '%s'\n", prog_name,
- opt);
- return 1;
- }
- cfsetispeed(&termios, speed);
- return 1;
- }
- else
- {
- fprintf(stderr, "%s: invalid argument to ispeed: '%s'\n",
- prog_name, next);
- return 1;
- }
- }
-
- if (match(opt, "ospeed")) {
- num= strtol(next, &check, 10);
- if (check != '\0')
- {
- speed= long2speed(num);
- if (speed == (speed_t)-1)
- {
- fprintf(stderr, "%s: illegal speed: '%s'\n", prog_name,
- opt);
- return 1;
- }
- cfsetospeed(&termios, speed);
- return 1;
- }
- else
- {
- fprintf(stderr, "%s: invalid argument to ospeed: %s\n",
- prog_name, next);
- return 1;
- }
- }
-
- /* Input modes. */
-
- if (match(opt, "brkint")) {
- termios.c_iflag |= BRKINT;
- return 0;
- }
- if (match(opt, "-brkint")) {
- termios.c_iflag &= ~BRKINT;
- return 0;
- }
-
- if (match(opt, "icrnl")) {
- termios.c_iflag |= ICRNL;
- return 0;
- }
- if (match(opt, "-icrnl")) {
- termios.c_iflag &= ~ICRNL;
- return 0;
- }
-
- if (match(opt, "ignbrk")) {
- termios.c_iflag |= IGNBRK;
- return 0;
- }
- if (match(opt, "-ignbrk")) {
- termios.c_iflag &= ~IGNBRK;
- return 0;
- }
-
- if (match(opt, "igncr")) {
- termios.c_iflag |= IGNCR;
- return 0;
- }
- if (match(opt, "-igncr")) {
- termios.c_iflag &= ~IGNCR;
- return 0;
- }
-
- if (match(opt, "ignpar")) {
- termios.c_iflag |= IGNPAR;
- return 0;
- }
- if (match(opt, "-ignpar")) {
- termios.c_iflag &= ~IGNPAR;
- return 0;
- }
-
- if (match(opt, "inlcr")) {
- termios.c_iflag |= INLCR;
- return 0;
- }
- if (match(opt, "-inlcr")) {
- termios.c_iflag &= ~INLCR;
- return 0;
- }
-
- if (match(opt, "inpck")) {
- termios.c_iflag |= INPCK;
- return 0;
- }
- if (match(opt, "-inpck")) {
- termios.c_iflag &= ~INPCK;
- return 0;
- }
-
- if (match(opt, "istrip")) {
- termios.c_iflag |= ISTRIP;
- return 0;
- }
- if (match(opt, "-istrip")) {
- termios.c_iflag &= ~ISTRIP;
- return 0;
- }
-
- if (match(opt, "ixoff")) {
- termios.c_iflag |= IXOFF;
- return 0;
- }
- if (match(opt, "-ixoff")) {
- termios.c_iflag &= ~IXOFF;
- return 0;
- }
-
- if (match(opt, "ixon")) {
- termios.c_iflag |= IXON;
- return 0;
- }
- if (match(opt, "-ixon")) {
- termios.c_iflag &= ~IXON;
- return 0;
- }
-
- if (match(opt, "parmrk")) {
- termios.c_iflag |= PARMRK;
- return 0;
- }
- if (match(opt, "-parmrk")) {
- termios.c_iflag &= ~PARMRK;
- return 0;
- }
-
- if (match(opt, "ixany")) {
- termios.c_iflag |= IXANY;
- return 0;
- }
- if (match(opt, "-ixany")) {
- termios.c_iflag &= ~IXANY;
- return 0;
- }
-
- /* Output modes. */
-
- if (match(opt, "opost")) {
- termios.c_oflag |= OPOST;
- return 0;
- }
- if (match(opt, "-opost")) {
- termios.c_oflag &= ~OPOST;
- return 0;
- }
-#ifdef __minix
- if (match(opt, "onlcr")) {
- termios.c_oflag |= ONLCR;
- return 0;
- }
- if (match(opt, "-onlcr")) {
- termios.c_oflag &= ~ONLCR;
- return 0;
- }
-
- if (match(opt, "xtabs")) {
- termios.c_oflag |= XTABS;
- return 0;
- }
- if (match(opt, "-xtabs")) {
- termios.c_oflag &= ~XTABS;
- return 0;
- }
-
- if (match(opt, "onoeot")) {
- termios.c_oflag |= ONOEOT;
- return 0;
- }
- if (match(opt, "-onoeot")) {
- termios.c_oflag &= ~ONOEOT;
- return 0;
- }
-#endif
-
- /* Local modes. */
-
- if (match(opt, "echo")) {
- termios.c_lflag |= ECHO;
- return 0;
- }
- if (match(opt, "-echo")) {
- termios.c_lflag &= ~ECHO;
- return 0;
- }
-
- if (match(opt, "echoe")) {
- termios.c_lflag |= ECHOE;
- return 0;
- }
- if (match(opt, "-echoe")) {
- termios.c_lflag &= ~ECHOE;
- return 0;
- }
-
- if (match(opt, "echok")) {
- termios.c_lflag |= ECHOK;
- return 0;
- }
- if (match(opt, "-echok")) {
- termios.c_lflag &= ~ECHOK;
- return 0;
- }
-
- if (match(opt, "echonl")) {
- termios.c_lflag |= ECHONL;
- return 0;
- }
- if (match(opt, "-echonl")) {
- termios.c_lflag &= ~ECHONL;
- return 0;
- }
-
- if (match(opt, "icanon")) {
- termios.c_lflag |= ICANON;
- return 0;
- }
- if (match(opt, "-icanon")) {
- termios.c_lflag &= ~ICANON;
- return 0;
- }
-
- if (match(opt, "iexten")) {
- termios.c_lflag |= IEXTEN;
- return 0;
- }
- if (match(opt, "-iexten")) {
- termios.c_lflag &= ~IEXTEN;
- return 0;
- }
-
- if (match(opt, "isig")) {
- termios.c_lflag |= ISIG;
- return 0;
- }
- if (match(opt, "-isig")) {
- termios.c_lflag &= ~ISIG;
- return 0;
- }
-
- if (match(opt, "noflsh")) {
- termios.c_lflag |= NOFLSH;
- return 0;
- }
- if (match(opt, "-noflsh")) {
- termios.c_lflag &= ~NOFLSH;
- return 0;
- }
-
- if (match(opt, "tostop")) {
- termios.c_lflag |= TOSTOP;
- return 0;
- }
- if (match(opt, "-tostop")) {
- termios.c_lflag &= ~TOSTOP;
- return 0;
- }
-
-#ifdef __minix
- if (match(opt, "lflusho")) {
- termios.c_lflag |= LFLUSHO;
- return 0;
- }
- if (match(opt, "-lflusho")) {
- termios.c_lflag &= ~LFLUSHO;
- return 0;
- }
-#endif
-
- /* The special control characters. */
- if (match(opt, "eof")) {
- set_control(VEOF, next);
- return 1;
- }
-
- if (match(opt, "eol")) {
- set_control(VEOL, next);
- return 1;
- }
-
- if (match(opt, "erase")) {
- set_control(VERASE, next);
- return 1;
- }
-
- if (match(opt, "intr")) {
- set_control(VINTR, next);
- return 1;
- }
-
- if (match(opt, "kill")) {
- set_control(VKILL, next);
- return 1;
- }
-
- if (match(opt, "quit")) {
- set_control(VQUIT, next);
- return 1;
- }
-
- if (match(opt, "susp")) {
- set_control(VSUSP, next);
- return 1;
- }
-
- if (match(opt, "start")) {
- set_control(VSTART, next);
- return 1;
- }
-
- if (match(opt, "stop")) {
- set_control(VSTOP, next);
- return 1;
- }
-#ifdef __minix
- if (match(opt, "rprnt")) {
- set_control(VREPRINT, next);
- return 1;
- }
-
- if (match(opt, "lnext")) {
- set_control(VLNEXT, next);
- return 1;
- }
-
- if (match(opt, "flush")) {
- set_control(VDISCARD, next);
- return 1;
- }
-#endif
-
- if (match(opt, "min")) {
- set_min_tim(VMIN, next);
- return 1;
- }
-
- if (match(opt, "time")) {
- set_min_tim(VTIME, next);
- return 1;
- }
-
- /* Special modes. */
- if (opt[0] == ':')
- {
- set_saved_settings(opt);
- return 0;
- }
-
- if (match(opt, "cooked") || match(opt, "raw")) {
- int x = opt[0] == 'c' ? 1 : 0;
-
- option(x + "-icrnl", ""); /* off in raw mode, on in cooked mode */
- option(x + "-ixon", "");
- option(x + "-opost", "");
- option(x + "-onlcr", "");
- option(x + "-isig", "");
- option(x + "-icanon", "");
- option(x + "-iexten", "");
- option(x + "-echo", "");
- return 0;
- }
-
- if (match(opt, "evenp") || match(opt, "parity")) {
- option("parenb", "");
- option("cs7", "");
- option("-parodd", "");
- return 0;
- }
-
- if (match(opt, "oddp")) {
- option("parenb", "");
- option("cs7", "");
- option("parodd", "");
- return 0;
- }
-
- if (match(opt, "-parity") || match(opt, "-evenp") || match(opt, "-oddp")) {
- option("-parenb", "");
- option("cs8", "");
- return 0;
- }
-
- if (match(opt, "nl")) {
- option("icrnl", "");
- return 0;
- }
-
- if (match(opt, "-nl")) {
- option("-icrnl", "");
- option("-inlcr", "");
- option("-igncr", "");
- return 0;
- }
-
- if (match(opt, "ek")) {
- termios.c_cc[VERASE]= TERASE_DEF;;
- termios.c_cc[VKILL]= TKILL_DEF;;
- return 0;
- }
-
- if (match(opt, "sane"))
- {
- /* Reset all terminal attributes to a sane state, except things like
- * line speed and parity, because it can't be known what their sane
- * values are.
- */
- termios.c_iflag= (TINPUT_DEF & ~(IGNPAR|ISTRIP|INPCK))
- | (termios.c_iflag & (IGNPAR|ISTRIP|INPCK));
- termios.c_oflag= (TOUTPUT_DEF & ~(XTABS))
- | (termios.c_oflag & (XTABS));
- termios.c_cflag= (TCTRL_DEF & ~(CLOCAL|CSIZE|CSTOPB|PARENB|PARODD))
- | (termios.c_cflag & (CLOCAL|CSIZE|CSTOPB|PARENB|PARODD));
- termios.c_lflag= (TLOCAL_DEF & ~(ECHOE|ECHOK))
- | (termios.c_lflag & (ECHOE|ECHOK));
- if (termios.c_lflag & ICANON) {
- termios.c_cc[VMIN]= TMIN_DEF;
- termios.c_cc[VTIME]= TTIME_DEF;
- }
- termios.c_cc[VEOF]= TEOF_DEF;
- termios.c_cc[VEOL]= TEOL_DEF;
- termios.c_cc[VERASE]= TERASE_DEF;
- termios.c_cc[VINTR]= TINTR_DEF;
- termios.c_cc[VKILL]= TKILL_DEF;
- termios.c_cc[VQUIT]= TQUIT_DEF;
- termios.c_cc[VSUSP]= TSUSP_DEF;
-#ifdef __minix
- termios.c_cc[VREPRINT]= TREPRINT_DEF;
- termios.c_cc[VLNEXT]= TLNEXT_DEF;
- termios.c_cc[VDISCARD]= TDISCARD_DEF;
-#endif
- termios.c_cc[VSTART]= TSTART_DEF;
- termios.c_cc[VSTOP]= TSTOP_DEF;
- if (!(termios.c_lflag & ICANON)) {
- termios.c_cc[VMIN]= TMIN_DEF;
- termios.c_cc[VTIME]= TTIME_DEF;
- }
- return 0;
- }
-
-#ifdef __minix
- if (match(opt, "cols"))
- {
- num= strtol(next, &check, 0);
- if (check[0] != '\0')
- {
- fprintf(stderr, "%s: illegal parameter to cols: '%s'\n",
- prog_name, next);
- return 1;
- }
- winsize.ws_col= num;
- return 1;
- }
-
- if (match(opt, "rows"))
- {
- num= strtol(next, &check, 0);
- if (check[0] != '\0')
- {
- fprintf(stderr, "%s: illegal parameter to rows: '%s'\n",
- prog_name, next);
- return 1;
- }
- winsize.ws_row= num;
- return 1;
- }
-
- if (match(opt, "xpixels"))
- {
- num= strtol(next, &check, 0);
- if (check[0] != '\0')
- {
- fprintf(stderr, "%s: illegal parameter to xpixels: '%s'\n",
- prog_name, next);
- return 1;
- }
- winsize.ws_xpixel= num;
- return 1;
- }
-
- if (match(opt, "ypixels"))
- {
- num= strtol(next, &check, 0);
- if (check[0] != '\0')
- {
- fprintf(stderr, "%s: illegal parameter to ypixels: '%s'\n",
- prog_name, next);
- return 1;
- }
- winsize.ws_ypixel= num;
- return 1;
- }
-#endif /* __minix */
-
- fprintf(stderr, "%s: unknown mode: %s\n", prog_name, opt);
- return 0;
-}
-
-int match(s1, s2)
-char *s1, *s2;
-{
-
- while (1) {
- if (*s1 == 0 && *s2 == 0) return(1);
- if (*s1 == 0 || *s2 == 0) return (0);
- if (*s1 != *s2) return (0);
- s1++;
- s2++;
- }
-}
-
-void prctl(c)
-char c;
-{
- if (c < ' ')
- printf("^%c", 'A' + c - 1);
- else if (c == 0177)
- printf("^?");
- else
- printf("%c", c);
-}
-
-struct s2s {
- speed_t ts;
- long ns;
-} s2s[] = {
- { B0, 0 },
- { B50, 50 },
- { B75, 75 },
- { B110, 110 },
- { B134, 134 },
- { B150, 150 },
- { B200, 200 },
- { B300, 300 },
- { B600, 600 },
- { B1200, 1200 },
- { B1800, 1800 },
- { B2400, 2400 },
- { B4800, 4800 },
- { B9600, 9600 },
- { B19200, 19200 },
- { B38400, 38400 },
-#ifdef __minix
- { B57600, 57600 },
- { B115200, 115200 },
-#ifdef B230400
- { B230400, 230400 },
-#endif
-#ifdef B460800
- { B460800, 460800 },
-#endif
-#ifdef B921600
- { B921600, 921600 },
-#endif
-#endif
-};
-
-speed_t long2speed(num)
-long num;
-{
- struct s2s *sp;
-
- for (sp = s2s; sp < s2s + (sizeof(s2s) / sizeof(s2s[0])); sp++) {
- if (sp->ns == num) return sp->ts;
- }
- return -1;
-}
-
-long speed2long(speed)
-unsigned long speed;
-{
- struct s2s *sp;
-
- for (sp = s2s; sp < s2s + (sizeof(s2s) / sizeof(s2s[0])); sp++) {
- if (sp->ts == speed) return sp->ns;
- }
- return -1;
-}
-
-void print_flags(flags, flag, def, string, all)
-unsigned long flags;
-unsigned long flag;
-unsigned long def;
-char *string;
-int all;
-{
- if (!(flags & flag))
- {
- if (all || (def & flag))
- output(string);
- return;
- }
- string++;
- if (all || !(def & flag))
- output(string);
-}
-
-void output(s)
-char *s;
-{
- int len;
-
- len= strlen(s);
- if (column + len + 3 >= max_column)
- {
- printf("\n");
- column= 0;
- }
- if (column)
- {
- putchar(' ');
- column++;
- }
- fputs(s, stdout);
- column += len;
-}
-
-void do_print_char(chr, def, name, all)
-unsigned chr;
-unsigned def;
-char *name;
-int all;
-{
- char line[20];
-
- if (!all && chr == def)
- return;
-
-#ifdef _POSIX_VDISABLE
- if (chr == _POSIX_VDISABLE)
- sprintf(line, "%s = <undef>", name);
- else
-#endif
- if (chr < ' ')
- sprintf(line, "%s = ^%c", name, chr + '@');
- else if (chr == 127)
- sprintf(line, "%s = ^?", name);
- else
- sprintf(line, "%s = %c", name, chr);
- output(line);
-}
-
-void do_print_num(num, def, name, all)
-unsigned num;
-unsigned def;
-char *name;
-int all;
-{
- char line[20];
-
- if (!all && num == def)
- return;
- sprintf(line, "%s = %u", name, num);
- output(line);
-}
-
-void set_saved_settings(opt)
-char *opt;
-{
- long num;
- char *check;
- tcflag_t c_oflag, c_cflag, c_lflag, c_iflag;
- cc_t c_cc[NCCS];
- speed_t ispeed, ospeed;
- int i;
-
- check= opt;
- num= strtol(check+1, &check, 16);
- if (check[0] != ':')
- {
- fprintf(stderr, "error in saved settings '%s'\n", opt);
- return;
- }
- c_iflag= num;
-
- num= strtol(check+1, &check, 16);
- if (check[0] != ':')
- {
- fprintf(stderr, "error in saved settings '%s'\n", opt);
- return;
- }
- c_oflag= num;
-
- num= strtol(check+1, &check, 16);
- if (check[0] != ':')
- {
- fprintf(stderr, "error in saved settings '%s'\n", opt);
- return;
- }
- c_cflag= num;
-
- num= strtol(check+1, &check, 16);
- if (check[0] != ':')
- {
- fprintf(stderr, "error in saved settings '%s'\n", opt);
- return;
- }
- c_lflag= num;
-
- num= strtol(check+1, &check, 16);
- if (check[0] != ':')
- {
- fprintf(stderr, "error in saved settings '%s'\n", opt);
- return;
- }
- ispeed= num;
-
- num= strtol(check+1, &check, 16);
- if (check[0] != ':')
- {
- fprintf(stderr, "error in saved settings '%s'\n", opt);
- return;
- }
- ospeed= num;
-
- for(i=0; i<NCCS; i++)
- {
- num= strtol(check+1, &check, 16);
- if (check[0] != ':')
- {
- fprintf(stderr, "error in saved settings '%s'\n", opt);
- return;
- }
- c_cc[i]= num;
- }
- if (check[1] != '\0')
- {
- fprintf(stderr, "error in saved settings '%s'\n", opt);
- return;
- }
- termios.c_iflag= c_iflag;
- termios.c_oflag= c_oflag;
- termios.c_cflag= c_cflag;
- termios.c_lflag= c_lflag;
-
- cfsetispeed(&termios, ispeed);
- cfsetospeed(&termios, ospeed);
-
- for(i=0; i<NCCS; i++)
- termios.c_cc[i]= c_cc[i];
-}
-
-void set_control(option, value)
-int option;
-char *value;
-{
- int chr;
-
- if (match(value, "undef") || match(value, "^-")) {
-#ifdef _POSIX_VDISABLE
- chr= _POSIX_VDISABLE;
-#else
- fprintf(stderr,
- "stty: unable to set option to _POSIX_VDISABLE\n");
- return;
-#endif
- } else if (match(value, "^?"))
- chr= '\177';
- else if (strlen(value) == 2 && value[0] == '^') {
- chr= toupper(value[1]) - '@';
- if (chr < 0 || chr >= 32) {
- fprintf(stderr, "stty: illegal option value: '%s'\n",
- value);
- return;
- }
- } else if (strlen(value) == 1)
- chr= value[0];
- else {
- fprintf(stderr, "stty: illegal option value: '%s'\n", value);
- return;
- }
-
- assert(option >= 0 && option < NCCS);
- termios.c_cc[option]= chr;
-}
-
-void set_min_tim(option, value)
-int option;
-char *value;
-{
- long num;
- char *check;
-
- num= strtol(value, &check, 0);
- if (check[0] != '\0') {
- fprintf(stderr, "stty: illegal option value: '%s'\n", value);
- return;
- }
-
- if ((cc_t)num != num) {
- fprintf(stderr, "stty: illegal option value: '%s'\n", value);
- return;
- }
- assert(option >= 0 && option < NCCS);
- termios.c_cc[option]= num;
-}
-
-/*
- * $PchId: stty.c,v 1.7 2001/05/02 15:04:42 philip Exp $
- */
./bin/setup minix-sys
./bin/sh minix-sys
./bin/shutdown minix-sys obsolete
+./bin/stty minix-sys
./bin/sync minix-sys
./bin/sysenv minix-sys
./bin/tar minix-sys
./usr/bin/stat minix-sys
./usr/bin/strings minix-sys binutils
./usr/bin/strip minix-sys binutils
-./usr/bin/stty minix-sys
+./usr/bin/stty minix-sys obsolete
./usr/bin/su minix-sys
./usr/bin/sum minix-sys
./usr/bin/svclog minix-sys
./usr/include/sys/ioc_tape.h minix-sys
./usr/include/sys/ioctl_compat.h minix-sys
./usr/include/sys/ioctl.h minix-sys
-./usr/include/sys/ioc_tty.h minix-sys
+./usr/include/sys/ioc_tty.h minix-sys obsolete
./usr/include/sys/iostat.h minix-sys
./usr/include/sys/ipc.h minix-sys
./usr/include/sys/jmp_buf.h minix-sys
/* Console unsupport for ARM. Just stubs. */
#include <minix/ipc.h>
-#include <termios.h>
+#include <sys/termios.h>
#include "tty.h"
void
/* Keyboard unsupport for ARM. Just stubs. */
#include <minix/ipc.h>
-#include <termios.h>
+#include <sys/termios.h>
#include "tty.h"
void
static int rs_icancel(tty_t *tp, int try);
static int rs_ocancel(tty_t *tp, int try);
static void rs_ostart(rs232_t *rs);
-static int rs_break(tty_t *tp, int try);
+static int rs_break_on(tty_t *tp, int try);
+static int rs_break_off(tty_t *tp, int try);
static int rs_close(tty_t *tp, int try);
static int rs_open(tty_t *tp, int try);
static void rs232_handler(rs232_t *rs);
switch(baud) {
case B460800: /* Fall through */
case B921600: /* Fall through */
+#if 0
case B1843200: /* Fall through */
- case B3686400: oversampling = 13; break;
+ case B3686400:
+#endif
+ oversampling = 13; break;
default: oversampling = 16;
}
tp->tty_icancel = rs_icancel;
tp->tty_ocancel = rs_ocancel;
tp->tty_ioctl = rs_ioctl;
- tp->tty_break = rs_break;
+ tp->tty_break_on = rs_break_on;
+ tp->tty_break_off = rs_break_off;
tp->tty_open = rs_open;
tp->tty_close = rs_close;
}
static int
-rs_break(tty_t *tp, int UNUSED(dummy))
+rs_break_on(tty_t *tp, int UNUSED(dummy))
{
-/* Generate a break condition by setting the BREAK bit for 0.4 sec. */
+/* Raise break condition */
rs232_t *rs = tp->tty_priv;
unsigned int lsr;
lsr = serial_in(rs, OMAP3_LSR);
serial_out(rs, OMAP3_LSR, lsr | UART_LSR_BI);
- /* XXX */
- /* milli_delay(400); */ /* ouch */
- serial_out(rs, OMAP3_LSR, lsr);
+ return 0; /* dummy */
+}
+
+static int
+rs_break_off(tty_t *tp, int UNUSED(dummy))
+{
+/* Clear break condition */
+ rs232_t *rs = tp->tty_priv;
+ unsigned int lsr;
+
+ lsr = serial_in(rs, OMAP3_LSR);
+ serial_out(rs, OMAP3_LSR, lsr & ~UART_LSR_BI);
return 0; /* dummy */
}
#include <minix/drivers.h>
#include <termios.h>
+#include <assert.h>
#include <sys/ioctl.h>
#include <sys/vm.h>
#include <sys/video.h>
#include <sys/mman.h>
+#include <sys/termios.h>
+#include <minix/callnr.h>
+#include <minix/com.h>
+#include <minix/sys_config.h>
+#include <minix/vm.h>
#include "tty.h"
/* Set this to 1 if you want console output duplicated on the first
#include <sys/time.h>
#include <sys/reboot.h>
#include <sys/select.h>
-#include <termios.h>
+#include <sys/termios.h>
#include <signal.h>
#include <machine/archtypes.h>
#include <minix/callnr.h>
*---------------------------------------------------------------------------*/
#include <minix/drivers.h>
-#include <termios.h>
+#include <sys/termios.h>
#include <signal.h>
#include "tty.h"
#define IS_IDBITS 6
/* Line control bits. */
+#define LC_CS5 0x00 /* LSB0 and LSB1 encoding for CS5 */
+#define LC_CS6 0x01 /* LSB0 and LSB1 encoding for CS6 */
+#define LC_CS7 0x02 /* LSB0 and LSB1 encoding for CS7 */
+#define LC_CS8 0x03 /* LSB0 and LSB1 encoding for CS8 */
#define LC_2STOP_BITS 0x04
#define LC_PARITY 0x08
#define LC_PAREVEN 0x10
static int rs_icancel(tty_t *tp, int try);
static int rs_ocancel(tty_t *tp, int try);
static void rs_ostart(rs232_t *rs);
-static int rs_break(tty_t *tp, int try);
+static int rs_break_on(tty_t *tp, int try);
+static int rs_break_off(tty_t *tp, int try);
static int rs_close(tty_t *tp, int try);
static void out_int(rs232_t *rs);
static void rs232_handler(rs232_t *rs);
line_controls |= LC_PARITY;
if (!(tp->tty_termios.c_cflag & PARODD)) line_controls |= LC_PAREVEN;
}
+
if (divisor >= (UART_FREQ / 110)) line_controls |= LC_2STOP_BITS;
- line_controls |= (tp->tty_termios.c_cflag & CSIZE) >> 2;
+
+ /* which word size is configured? set the bits explicitly. */
+ if((tp->tty_termios.c_cflag & CSIZE) == CS5)
+ line_controls |= LC_CS5;
+ else if((tp->tty_termios.c_cflag & CSIZE) == CS6)
+ line_controls |= LC_CS6;
+ else if((tp->tty_termios.c_cflag & CSIZE) == CS7)
+ line_controls |= LC_CS7;
+ else if((tp->tty_termios.c_cflag & CSIZE) == CS8)
+ line_controls |= LC_CS8;
+ else printf("rs232: warning: no known word size set\n");
/* Select the baud rate divisor registers and change the rate. */
sys_outb(rs->line_ctl_port, LC_ADDRESS_DIVISOR);
tp->tty_icancel = rs_icancel;
tp->tty_ocancel = rs_ocancel;
tp->tty_ioctl = rs_ioctl;
- tp->tty_break = rs_break;
+ tp->tty_break_on = rs_break_on;
+ tp->tty_break_off = rs_break_off;
tp->tty_close = rs_close;
/* Tell external device we are ready. */
}
/*===========================================================================*
- * rs_break *
+ * rs_break_on *
*===========================================================================*/
-static int rs_break(tty_t *tp, int UNUSED(dummy))
+static int rs_break_on(tty_t *tp, int UNUSED(dummy))
{
-/* Generate a break condition by setting the BREAK bit for 0.4 sec. */
+/* Raise break condition. */
rs232_t *rs = tp->tty_priv;
u32_t line_controls;
int s;
if ((s = sys_inb(rs->line_ctl_port, &line_controls)) != OK)
printf("TTY: sys_inb() failed: %d", s);
sys_outb(rs->line_ctl_port, line_controls | LC_BREAK);
- /* XXX */
- /* milli_delay(400); */ /* ouch */
- printf("RS232 break\n");
- sys_outb(rs->line_ctl_port, line_controls);
+ return 0; /* dummy */
+}
+
+/*===========================================================================*
+ * rs_break_off *
+ *===========================================================================*/
+static int rs_break_off(tty_t *tp, int UNUSED(dummy))
+{
+/* Clear break condition. */
+ rs232_t *rs = tp->tty_priv;
+ u32_t line_controls;
+ int s;
+
+ if ((s = sys_inb(rs->line_ctl_port, &line_controls)) != OK)
+ printf("TTY: sys_inb() failed: %d", s);
+ sys_outb(rs->line_ctl_port, line_controls & ~LC_BREAK);
return 0; /* dummy */
}
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), A('/'), C('@') },
K(KP_STAR) = { '*', '*', A('*'), A('*'), A('*'), C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, A('+'), CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, A('1'), CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), A('/'), C('@') },
K(KP_STAR) = { '*', '*', A('*'), A('*'), A('*'), C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, A('+'), CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, A('1'), CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), '/', C('@') },
K(KP_STAR) = { '*', '*', A('*'), '*', '*', C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, '+', CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),C('M'), CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, '1', CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), '/', C('@') },
K(KP_STAR) = { '*', '*', A('*'), '*', '*', C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, '+', CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),C('M'), CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, '1', CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), '/', C('@') },
K(KP_STAR) = { '*', '*', A('*'), '*', '*', C('M') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, '+', CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),C('M'), CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, '1', CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), A('/'), C('@') },
K(KP_STAR) = { '*', '*', A('*'), A('*'), A('*'), C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, A('+'), CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, A('1'), CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), '/', C('/') },
K(KP_STAR) = { '*', '*', A('*'), '*', '*', C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, '+', CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),C('M'), CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, '1', CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), A('/'), C('@') },
K(KP_STAR) = { '*', '*', A('*'), A('*'), A('*'), C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, A('+'), CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, A('1'), CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), '/', C('@') },
K(KP_STAR) = { '*', '*', A('*'), '*', '*', C('M') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, '+', CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),C('M'), CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, '1', CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), A('/'), C('@') },
K(KP_STAR) = { '*', '*', A('*'), A('*'), A('*'), C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, A('+'), CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, A('1'), CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), '/', C('@') },
K(KP_STAR) = { '*', '*', '*', A('*'), '*', C('@') },
- K(KP_DASH) = { '-', '-', '-', AMIN, '-', CMIN },
+ K(KP_DASH) = { '-', '-', '-', AMIN, '-', CNMIN },
K(KP_PLUS) = { '+', '+', '+', APLUS, '+', CPLUS },
K(KP_ENTER) = { C('M'), C('M'), C('M'), CA('M'),C('M'), C('J') },
K(KP_1) = { NEND, '1', END, AEND, '1', CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', '/', A('/'), '/', C('@') },
K(KP_STAR) = { '*', '*', '*', A('*'), '*', C('@') },
- K(KP_DASH) = { '-', '-', '-', AMIN, '-', CMIN },
+ K(KP_DASH) = { '-', '-', '-', AMIN, '-', CNMIN },
K(KP_PLUS) = { '+', '+', '+', APLUS, '+', CPLUS },
K(KP_ENTER) = { C('M'), C('M'), C('M'), CA('M'),C('M'), C('J') },
K(KP_1) = { NEND, '1', END, AEND, '1', CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), '/', C('@') },
K(KP_STAR) = { '*', '*', A('*'), '*', '*', C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, '+', CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),C('M'), CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, '1', CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, C('S') },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), '/', C('@') },
K(KP_STAR) = { '*', '*', A('*'), '*', '*', C('M') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, '-', CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, '+', CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),C('M'), CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, '1', CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), A('/'), C('@') },
K(KP_STAR) = { '*', '*', A('*'), A('*'), A('*'), C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, A('+'), CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, A('1'), CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', '/', A('/'), '/', C('@') },
K(KP_STAR) = { '*', '*', '*', A('*'), '*', C('@') },
- K(KP_DASH) = { '-', '-', '-', AMIN, '-', CMIN },
+ K(KP_DASH) = { '-', '-', '-', AMIN, '-', CNMIN },
K(KP_PLUS) = { '+', '+', '+', APLUS, '+', CPLUS },
K(KP_ENTER) = { C('M'), C('M'), C('M'), CA('M'),C('M'), C('J') },
K(KP_1) = { NEND, '1', END, AEND, '1', CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), A('/'), C('@') },
K(KP_STAR) = { '*', '*', A('*'), A('*'), A('*'), C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, A('+'), CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, A('1'), CEND },
K(NUM_LOCK) = { NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK },
K(KP_SLASH) = { '/', '/', A('/'), A('/'), A('/'), C('@') },
K(KP_STAR) = { '*', '*', A('*'), A('*'), A('*'), C('@') },
- K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CMIN },
+ K(KP_DASH) = { '-', '-', AMIN, AMIN, A('-'), CNMIN },
K(KP_PLUS) = { '+', '+', APLUS, APLUS, A('+'), CPLUS },
K(KP_ENTER) = { C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J') },
K(KP_1) = { NEND, '1', AEND, AEND, A('1'), CEND },
#include <minix/drivers.h>
#include <termios.h>
+#include <assert.h>
+#include <sys/termios.h>
#include <signal.h>
#include "tty.h"
#include <minix/drivers.h>
#include <minix/driver.h>
#include <termios.h>
-#include <sys/ioc_tty.h>
#include <sys/kbdio.h>
+#include <sys/ttycom.h>
+#include <sys/ttydefaults.h>
+#include <sys/fcntl.h>
#include <signal.h>
#include <minix/keymap.h>
#include "tty.h"
/* Default attributes. */
static struct termios termios_defaults = {
- TINPUT_DEF, TOUTPUT_DEF, TCTRL_DEF, TLOCAL_DEF,
- {
- TEOF_DEF, TEOL_DEF, TERASE_DEF, TINTR_DEF, TKILL_DEF, TMIN_DEF,
- TQUIT_DEF, TTIME_DEF, TSUSP_DEF, TSTART_DEF, TSTOP_DEF,
- TREPRINT_DEF, TLNEXT_DEF, TDISCARD_DEF,
- }, TSPEED_DEF, TSPEED_DEF,
+ .c_iflag = TTYDEF_IFLAG,
+ .c_oflag = TTYDEF_OFLAG,
+ .c_cflag = TTYDEF_CFLAG,
+ .c_lflag = TTYDEF_LFLAG,
+ .c_ispeed = TTYDEF_SPEED,
+ .c_ospeed = TTYDEF_SPEED,
+ .c_cc = {
+ [VEOF] = CEOF,
+ [VEOL] = CEOL,
+ [VERASE] = CERASE,
+ [VINTR] = CINTR,
+ [VKILL] = CKILL,
+ [VMIN] = CMIN,
+ [VQUIT] = CQUIT,
+ [VTIME] = CTIME,
+ [VSUSP] = CSUSP,
+ [VSTART] = CSTART,
+ [VSTOP] = CSTOP,
+ [VREPRINT] = CREPRINT,
+ [VLNEXT] = CLNEXT,
+ [VDISCARD] = CDISCARD,
+ [VSTATUS] = CSTATUS
+ }
};
static struct winsize winsize_defaults; /* = all zeroes */
r = OK;
switch (request) {
- case TCGETS:
+ case TIOCGETA:
/* Get the termios attributes. */
r = sys_safecopyto(endpt, grant, 0, (vir_bytes) &tp->tty_termios,
sizeof(struct termios));
break;
- case TCSETSW:
- case TCSETSF:
- case TCDRAIN:
+ case TIOCSETAW:
+ case TIOCSETAF:
+ case TIOCDRAIN:
if (tp->tty_outleft > 0) {
if (flags & CDEV_NONBLOCK)
return EAGAIN;
tp->tty_iogrant = grant;
return EDONTREPLY; /* suspend the caller */
}
- if (request == TCDRAIN) break;
- if (request == TCSETSF) tty_icancel(tp);
+ if (request == TIOCDRAIN) break;
+ if (request == TIOCSETAF) tty_icancel(tp);
/*FALL THROUGH*/
- case TCSETS:
+ case TIOCSETA:
/* Set the termios attributes. */
r = sys_safecopyfrom(endpt, grant, 0, (vir_bytes) &tp->tty_termios,
sizeof(struct termios));
setattr(tp);
break;
- case TCFLSH:
+ case TIOCFLUSH:
r = sys_safecopyfrom(endpt, grant, 0, (vir_bytes) &i, sizeof(i));
if (r != OK) break;
- switch (i) {
- case TCIFLUSH: tty_icancel(tp); break;
- case TCOFLUSH: (*tp->tty_ocancel)(tp, 0); break;
- case TCIOFLUSH: tty_icancel(tp); (*tp->tty_ocancel)(tp, 0); break;
- default: r = EINVAL;
- }
+ if(i & FREAD) { tty_icancel(tp); }
+ if(i & FWRITE) { (*tp->tty_ocancel)(tp, 0); }
break;
-
- case TCFLOW:
- r = sys_safecopyfrom(endpt, grant, 0, (vir_bytes) &i, sizeof(i));
- if (r != OK) break;
- switch (i) {
- case TCOOFF:
- case TCOON:
- tp->tty_inhibited = (i == TCOOFF);
- tp->tty_events = 1;
- break;
- case TCIOFF:
- (*tp->tty_echo)(tp, tp->tty_termios.c_cc[VSTOP]);
- break;
- case TCION:
- (*tp->tty_echo)(tp, tp->tty_termios.c_cc[VSTART]);
- break;
- default:
- r = EINVAL;
- }
+ case TIOCSTART:
+ tp->tty_inhibited = 0;
+ tp->tty_events = 1;
break;
-
- case TCSBRK:
- if (tp->tty_break != NULL) (*tp->tty_break)(tp,0);
+ case TIOCSTOP:
+ tp->tty_inhibited = 1;
+ tp->tty_events = 1;
+ break;
+ case TIOCSBRK: /* tcsendbreak - turn break on */
+ if (tp->tty_break_on != NULL) (*tp->tty_break_on)(tp,0);
+ break;
+ case TIOCCBRK: /* tcsendbreak - turn break off */
+ if (tp->tty_break_off != NULL) (*tp->tty_break_off)(tp,0);
break;
case TIOCGWINSZ:
sizeof(struct winsize));
sigchar(tp, SIGWINCH, 0);
break;
-
case KIOCBELL:
/* Sound bell (only /dev/console). */
if (!isconsole(tp))
ticks++;
beep_x(bell.kb_pitch, ticks);
break;
-
+ case TIOCGETD: /* get line discipline */
+ {
+ int disc = TTYDISC;
+ r = sys_safecopyto(endpt, grant, 0,
+ (vir_bytes) &disc, (vir_bytes) sizeof(disc));
+ break;
+ }
+ case TIOCSETD: /* set line discipline */
+ printf("TTY: TIOCSETD: can't set any other line discipline.\n");
+ r = ENOTTY;
+ break;
case KIOCSMAP:
/* Load a new keymap (only /dev/console). */
if (isconsole(tp)) r = kbd_loadmap(endpt, grant);
}
if (tp->tty_termios.c_lflag & ISIG) {
- /* Check for INTR (^?) and QUIT (^\) characters. */
- if (ch == tp->tty_termios.c_cc[VINTR]
- || ch == tp->tty_termios.c_cc[VQUIT]) {
+ /* Check for INTR, QUIT and STATUS characters. */
+ int sig = -1;
+ if (ch == tp->tty_termios.c_cc[VINTR])
sig = SIGINT;
- if (ch == tp->tty_termios.c_cc[VQUIT]) sig = SIGQUIT;
+ else if(ch == tp->tty_termios.c_cc[VQUIT])
+ sig = SIGQUIT;
+ else if(ch == tp->tty_termios.c_cc[VSTATUS])
+ sig = SIGINFO;
+
+ if(sig >= 0) {
sigchar(tp, sig, 1);
(void) tty_echo(tp, ch);
continue;
/* Best guess for the tab length. */
tablen = TAB_SIZE - (pos & TAB_MASK);
- if ((tp->tty_termios.c_oflag & (OPOST|XTABS))
- == (OPOST|XTABS)) {
+ if ((tp->tty_termios.c_oflag & (OPOST|OXTABS))
+ == (OPOST|OXTABS)) {
/* Tabs must be expanded. */
if (oct >= tablen) {
pos += tablen;
static void dev_ioctl(tp)
tty_t *tp;
{
-/* The ioctl's TCSETSW, TCSETSF and TCDRAIN wait for output to finish to make
+/* The ioctl's TCSETSW, TCSETSF and TIOCDRAIN wait for output to finish to make
* sure that an attribute change doesn't affect the processing of current
* output. Once output finishes the ioctl is executed as in do_ioctl().
*/
if (tp->tty_outleft > 0) return; /* output not finished */
- if (tp->tty_ioreq != TCDRAIN) {
- if (tp->tty_ioreq == TCSETSF) tty_icancel(tp);
+ if (tp->tty_ioreq != TIOCDRAIN) {
+ if (tp->tty_ioreq == TIOCSETAF) tty_icancel(tp);
result = sys_safecopyfrom(tp->tty_iocaller, tp->tty_iogrant, 0,
(vir_bytes) &tp->tty_termios,
(vir_bytes) sizeof(tp->tty_termios));
devfun_t tty_devwrite; /* routine to start actual device output */
devfunarg_t tty_echo; /* routine to echo characters input */
devfun_t tty_ocancel; /* cancel any ongoing device output */
- devfun_t tty_break; /* let the device send a break */
+ devfun_t tty_break_on; /* let the device assert a break */
+ devfun_t tty_break_off; /* let the device de-assert a break */
/* Terminal parameters and status. */
int tty_position; /* current position on the screen for echoing */
#include <string>
#if defined(__minix)
-#include <minix/termios.h>
+#include <sys/termios.h>
#endif /* defined(__minix) */
#include "utils/optional.hpp"
priv.h procfs.h profile.h queryparam.h \
rs.h safecopies.h sched.h sef.h sffs.h \
sound.h spin.h sys_config.h sysinfo.h \
- syslib.h sysutil.h termios.h timers.h type.h \
+ syslib.h sysutil.h timers.h type.h \
u64.h usb.h usb_ch9.h vbox.h \
vboxfs.h vboxif.h vboxtype.h vm.h \
vfsif.h vtreefs.h libminixfs.h netsock.h \
#define L(c) ((c) | HASCAPS) /* Add "Caps Lock has effect" attribute */
#define EXT 0x0100 /* Normal function keys */
-#define CTRL 0x0200 /* Control key */
+#define CTRLKEY 0x0200 /* Control key */
#define SHIFT 0x0400 /* Shift key */
#define ALT 0x0800 /* Alternate key */
#define HASNUM 0x4000 /* Num Lock has effect */
#define HASCAPS 0x8000 /* Caps Lock has effect */
/* The left and right versions for the actual keys in the keymap. */
-#define LCTRL CTRL
-#define RCTRL (CTRL | EXT)
+#define LCTRL CTRLKEY
+#define RCTRL (CTRLKEY | EXT)
#define LSHIFT SHIFT
#define RSHIFT (SHIFT | EXT)
#define LALT ALT
#define AINSRT (0x0C + ALT)
/* Ctrl + Numeric keypad */
-#define CHOME (0x01 + CTRL)
-#define CEND (0x02 + CTRL)
-#define CUP (0x03 + CTRL)
-#define CDOWN (0x04 + CTRL)
-#define CLEFT (0x05 + CTRL)
-#define CRIGHT (0x06 + CTRL)
-#define CPGUP (0x07 + CTRL)
-#define CPGDN (0x08 + CTRL)
-#define CMID (0x09 + CTRL)
-#define CMIN (0x0A + CTRL)
-#define CPLUS (0x0B + CTRL)
-#define CINSRT (0x0C + CTRL)
+#define CHOME (0x01 + CTRLKEY)
+#define CEND (0x02 + CTRLKEY)
+#define CUP (0x03 + CTRLKEY)
+#define CDOWN (0x04 + CTRLKEY)
+#define CLEFT (0x05 + CTRLKEY)
+#define CRIGHT (0x06 + CTRLKEY)
+#define CPGUP (0x07 + CTRLKEY)
+#define CPGDN (0x08 + CTRLKEY)
+#define CMID (0x09 + CTRLKEY)
+#define CNMIN (0x0A + CTRLKEY)
+#define CPLUS (0x0B + CTRLKEY)
+#define CINSRT (0x0C + CTRLKEY)
/* Lock keys */
#define CALOCK (0x0D + EXT) /* caps lock */
#define AF12 (0x1B + ALT)
/* Ctrl+Fn */
-#define CF1 (0x10 + CTRL)
-#define CF2 (0x11 + CTRL)
-#define CF3 (0x12 + CTRL)
-#define CF4 (0x13 + CTRL)
-#define CF5 (0x14 + CTRL)
-#define CF6 (0x15 + CTRL)
-#define CF7 (0x16 + CTRL)
-#define CF8 (0x17 + CTRL)
-#define CF9 (0x18 + CTRL)
-#define CF10 (0x19 + CTRL)
-#define CF11 (0x1A + CTRL)
-#define CF12 (0x1B + CTRL)
+#define CF1 (0x10 + CTRLKEY)
+#define CF2 (0x11 + CTRLKEY)
+#define CF3 (0x12 + CTRLKEY)
+#define CF4 (0x13 + CTRLKEY)
+#define CF5 (0x14 + CTRLKEY)
+#define CF6 (0x15 + CTRLKEY)
+#define CF7 (0x16 + CTRLKEY)
+#define CF8 (0x17 + CTRLKEY)
+#define CF9 (0x18 + CTRLKEY)
+#define CF10 (0x19 + CTRLKEY)
+#define CF11 (0x1A + CTRLKEY)
+#define CF12 (0x1B + CTRLKEY)
/* Shift+Fn */
#define SF1 (0x10 + SHIFT)
+++ /dev/null
-/* The <termios.h> header is used for controlling tty modes. */
-
-#ifndef _TERMIOS_H
-#define _TERMIOS_H
-
-typedef unsigned int tcflag_t;
-typedef unsigned char cc_t;
-typedef unsigned int speed_t;
-
-#define NCCS 20 /* size of cc_c array, some extra space
- * for extensions. */
-
-/* Primary terminal control structure. POSIX Table 7-1. */
-struct termios {
- tcflag_t c_iflag; /* input modes */
- tcflag_t c_oflag; /* output modes */
- tcflag_t c_cflag; /* control modes */
- tcflag_t c_lflag; /* local modes */
- cc_t c_cc[NCCS]; /* control characters */
- speed_t c_ispeed; /* input speed */
- speed_t c_ospeed; /* output speed */
-};
-
-/* Values for termios c_iflag bit map. POSIX Table 7-2. */
-#define BRKINT 0x0001 /* signal interrupt on break */
-#define ICRNL 0x0002 /* map CR to NL on input */
-#define IGNBRK 0x0004 /* ignore break */
-#define IGNCR 0x0008 /* ignore CR */
-#define IGNPAR 0x0010 /* ignore characters with parity errors */
-#define INLCR 0x0020 /* map NL to CR on input */
-#define INPCK 0x0040 /* enable input parity check */
-#define ISTRIP 0x0080 /* mask off 8th bit */
-#define IXOFF 0x0100 /* enable start/stop input control */
-#define IXON 0x0200 /* enable start/stop output control */
-#define PARMRK 0x0400 /* mark parity errors in the input queue */
-
-/* Values for termios c_oflag bit map. POSIX Sec. 7.1.2.3. */
-#define OPOST 0x0001 /* perform output processing */
-
-/* Values for termios c_cflag bit map. POSIX Table 7-3. */
-#define CLOCAL 0x0001 /* ignore modem status lines */
-#define CREAD 0x0002 /* enable receiver */
-#define CSIZE 0x000C /* number of bits per character */
-#define CS5 0x0000 /* if CSIZE is CS5, characters are 5 bits */
-#define CS6 0x0004 /* if CSIZE is CS6, characters are 6 bits */
-#define CS7 0x0008 /* if CSIZE is CS7, characters are 7 bits */
-#define CS8 0x000C /* if CSIZE is CS8, characters are 8 bits */
-#define CSTOPB 0x0010 /* send 2 stop bits if set, else 1 */
-#define HUPCL 0x0020 /* hang up on last close */
-#define PARENB 0x0040 /* enable parity on output */
-#define PARODD 0x0080 /* use odd parity if set, else even */
-
-/* Values for termios c_lflag bit map. POSIX Table 7-4. */
-#define ECHO 0x0001 /* enable echoing of input characters */
-#define ECHOE 0x0002 /* echo ERASE as backspace */
-#define ECHOK 0x0004 /* echo KILL */
-#define ECHONL 0x0008 /* echo NL */
-#define ICANON 0x0010 /* canonical input (erase and kill enabled) */
-#define IEXTEN 0x0020 /* enable extended functions */
-#define ISIG 0x0040 /* enable signals */
-#define NOFLSH 0x0080 /* disable flush after interrupt or quit */
-#define TOSTOP 0x0100 /* send SIGTTOU (job control, not implemented*/
-
-/* Indices into c_cc array. Default values in parentheses. POSIX Table 7-5. */
-#define VEOF 0 /* cc_c[VEOF] = EOF char (^D) */
-#define VEOL 1 /* cc_c[VEOL] = EOL char (undef) */
-#define VERASE 2 /* cc_c[VERASE] = ERASE char (^H) */
-#define VINTR 3 /* cc_c[VINTR] = INTR char (DEL) */
-#define VKILL 4 /* cc_c[VKILL] = KILL char (^U) */
-#define VMIN 5 /* cc_c[VMIN] = MIN value for timer */
-#define VQUIT 6 /* cc_c[VQUIT] = QUIT char (^\) */
-#define VTIME 7 /* cc_c[VTIME] = TIME value for timer */
-#define VSUSP 8 /* cc_c[VSUSP] = SUSP (^Z, ignored) */
-#define VSTART 9 /* cc_c[VSTART] = START char (^S) */
-#define VSTOP 10 /* cc_c[VSTOP] = STOP char (^Q) */
-
-/* Values for the baud rate settings. POSIX Table 7-6. */
-#define B0 0x0000 /* hang up the line */
-#define B50 0x1000 /* 50 baud */
-#define B75 0x2000 /* 75 baud */
-#define B110 0x3000 /* 110 baud */
-#define B134 0x4000 /* 134.5 baud */
-#define B150 0x5000 /* 150 baud */
-#define B200 0x6000 /* 200 baud */
-#define B300 0x7000 /* 300 baud */
-#define B600 0x8000 /* 600 baud */
-#define B1200 0x9000 /* 1200 baud */
-#define B1800 0xA000 /* 1800 baud */
-#define B2400 0xB000 /* 2400 baud */
-#define B4800 0xC000 /* 4800 baud */
-#define B9600 0xD000 /* 9600 baud */
-#define B19200 0xE000 /* 19200 baud */
-#define B38400 0xF000 /* 38400 baud */
-
-/* Optional actions for tcsetattr(). POSIX Sec. 7.2.1.2. */
-#define TCSANOW 1 /* changes take effect immediately */
-#define TCSADRAIN 2 /* changes take effect after output is done */
-#define TCSAFLUSH 3 /* wait for output to finish and flush input */
-
-/* Queue_selector values for tcflush(). POSIX Sec. 7.2.2.2. */
-#define TCIFLUSH 1 /* flush accumulated input data */
-#define TCOFLUSH 2 /* flush accumulated output data */
-#define TCIOFLUSH 3 /* flush accumulated input and output data */
-
-/* Action values for tcflow(). POSIX Sec. 7.2.2.2. */
-#define TCOOFF 1 /* suspend output */
-#define TCOON 2 /* restart suspended output */
-#define TCIOFF 3 /* transmit a STOP character on the line */
-#define TCION 4 /* transmit a START character on the line */
-
-int tcsendbreak(int _fildes, int _duration);
-int tcdrain(int _filedes);
-int tcflush(int _filedes, int _queue_selector);
-int tcflow(int _filedes, int _action);
-speed_t cfgetispeed(const struct termios *_termios_p);
-speed_t cfgetospeed(const struct termios *_termios_p);
-int cfsetispeed(struct termios *_termios_p, speed_t _speed);
-int cfsetospeed(struct termios *_termios_p, speed_t _speed);
-int tcgetattr(int _filedes, struct termios *_termios_p);
-int tcsetattr(int _filedes, int _opt_actions, const struct termios
- *_termios_p);
-
-#ifndef cfgetispeed
-#define cfgetispeed(termios_p) ((termios_p)->c_ispeed)
-#endif
-#ifndef cfgetospeed
-#define cfgetospeed(termios_p) ((termios_p)->c_ospeed)
-#endif
-#ifndef cfsetispeed
-#define cfsetispeed(termios_p, speed) ((termios_p)->c_ispeed = (speed), 0)
-#endif
-#ifndef cfsetospeed
-#define cfsetospeed(termios_p, speed) ((termios_p)->c_ospeed = (speed), 0)
-#endif
-
-/* Here are the local extensions to the POSIX standard for Minix. */
-
-/* Extensions to the termios c_iflag bit map. */
-#define IXANY 0x0800 /* allow any key to continue ouptut */
-
-/* Extensions to the termios c_oflag bit map. They are only active iff
- * OPOST is enabled. */
-#define ONLCR 0x0002 /* Map NL to CR-NL on output */
-#define XTABS 0x0004 /* Expand tabs to spaces */
-#define ONOEOT 0x0008 /* discard EOT's (^D) on output) */
-
-/* Extensions to the termios c_lflag bit map. */
-#define LFLUSHO 0x0200 /* Flush output. */
-
-/* Extensions to the c_cc array. */
-#define VREPRINT 11 /* cc_c[VREPRINT] (^R) */
-#define VLNEXT 12 /* cc_c[VLNEXT] (^V) */
-#define VDISCARD 13 /* cc_c[VDISCARD] (^O) */
-
-/* Non-functional additions */
-#define VDSUSP 14
-#define VWERASE 15
-#define VSTATUS 16
-#define VEOL2 17
-
-/* Extensions to baud rate settings. */
-#if defined(__minix) && defined(_NETBSD_SOURCE)
-#define B57600 0x0100 /* 57600 baud */
-#define B115200 0x0200 /* 115200 baud */
-#define B230400 0x0400 /* 230400 baud */
-#define B460800 0x0800 /* 460800 baud */
-#define B921600 0x1000 /* 921600 baud */
-#define B1843200 0x2000 /* 1843200 baud */
-#define B3000000 0x4000 /* 3000000 baud */
-#define B3686400 0x8000 /* 3686400 baud */
-#endif /* defined(__minix) && defined(_NETBSD_SOURCE) */
-
-/* These are the default settings used by the kernel and by 'stty sane' */
-
-#define TCTRL_DEF (CREAD | CS8 | HUPCL)
-#define TINPUT_DEF (BRKINT | ICRNL | IXON | IXANY)
-#define TOUTPUT_DEF (OPOST | ONLCR)
-#define TLOCAL_DEF (ISIG | IEXTEN | ICANON | ECHO | ECHOE)
-#define TSPEED_DEF B9600
-
-#define TEOF_DEF '\4' /* ^D */
-#define TEOL_DEF _POSIX_VDISABLE
-#define TERASE_DEF '\10' /* ^H */
-#define TINTR_DEF '\3' /* ^C */
-#define TKILL_DEF '\25' /* ^U */
-#define TMIN_DEF 1
-#define TQUIT_DEF '\34' /* ^\ */
-#define TSTART_DEF '\21' /* ^Q */
-#define TSTOP_DEF '\23' /* ^S */
-#define TSUSP_DEF '\32' /* ^Z */
-#define TTIME_DEF 0
-#define TREPRINT_DEF '\22' /* ^R */
-#define TLNEXT_DEF '\26' /* ^V */
-#define TDISCARD_DEF '\17' /* ^O */
-
-/* Window size. This information is stored in the TTY driver but not used.
- * This can be used for screen based applications in a window environment.
- * The ioctls TIOCGWINSZ and TIOCSWINSZ can be used to get and set this
- * information.
- */
-
-struct winsize
-{
- unsigned short ws_row; /* rows, in characters */
- unsigned short ws_col; /* columns, in characters */
- unsigned short ws_xpixel; /* horizontal size, pixels */
- unsigned short ws_ypixel; /* vertical size, pixels */
-};
-
-#endif /* _TERMIOS_H */
# Minix specific system headers
INCS= elf64.h elf_common.h elf_core.h elf_generic.h \
ioc_block.h ioc_disk.h ioc_fb.h ioc_fbd.h ioc_file.h ioc_memory.h \
- ioc_net.h ioc_sound.h ioc_tape.h ioc_tty.h \
+ ioc_net.h ioc_sound.h ioc_tape.h \
kbdio.h \
procfs.h statfs.h svrctl.h video.h vm.h
+++ /dev/null
-/* sys/ioc_tty.h - Terminal ioctl() command codes.
- * Author: Kees J. Bot
- * 23 Nov 2002
- *
- */
-
-#ifndef _S_I_TTY_H
-#define _S_I_TTY_H
-
-#include <minix/ioctl.h>
-
-/* Terminal ioctls. */
-#define TCGETS _IOR('T', 8, struct termios) /* tcgetattr */
-#define TCSETS _IOW('T', 9, struct termios) /* tcsetattr, TCSANOW */
-#define TCSETSW _IOW('T', 10, struct termios) /* tcsetattr, TCSADRAIN */
-#define TCSETSF _IOW('T', 11, struct termios) /* tcsetattr, TCSAFLUSH */
-#define TCSBRK _IOW('T', 12, int) /* tcsendbreak */
-#define TCDRAIN _IO ('T', 13) /* tcdrain */
-#define TCFLOW _IOW('T', 14, int) /* tcflow */
-#define TCFLSH _IOW('T', 15, int) /* tcflush */
-#define TIOCGWINSZ _IOR('T', 16, struct winsize)
-#define TIOCSWINSZ _IOW('T', 17, struct winsize)
-#define TIOCGPGRP _IOW('T', 18, int)
-#define TIOCSPGRP _IOW('T', 19, int)
-#define TIOCSCTTY _IO ('T', 20) /* controlling tty */
-#define TIOCSFON _IOW_BIG(1, u8_t [8192])
-
-/* Keyboard ioctls. */
-#define KIOCBELL _IOW('k', 1, struct kio_bell)
-#define KIOCSLEDS _IOW('k', 2, struct kio_leds)
-#define KIOCSMAP _IOW('k', 3, keymap_t)
-
-/* /dev/video ioctls. */
-#define TIOCMAPMEM _IORW('v', 1, struct mapreqvm)
-#define TIOCUNMAPMEM _IORW('v', 2, struct mapreqvm)
-
-#endif /* _S_I_TTY_H */
int
tcflow(int fd, int action)
{
-#ifdef __minix
- _DIAGASSERT(fd != -1);
- return ioctl(fd, TCFLOW, &action);
-#else /* !__minix */
struct termios term;
u_char c;
return (-1);
}
/* NOTREACHED */
-#endif /* !__minix */
}
int
tcflush(int fd, int which)
{
-#ifdef __minix
- _DIAGASSERT(fd != -1);
- return ioctl(fd, TCFLSH, &which);
-#else /* !__minix */
int com;
_DIAGASSERT(fd != -1);
return (-1);
}
return (ioctl(fd, TIOCFLUSH, &com));
-#endif /* !__minix */
}
#include "namespace.h"
#include <sys/types.h>
-#include <sys/ioctl.h>
-#ifndef __minix
+#ifdef __minix
#include <sys/time.h>
-#endif /* !__minix */
+#endif
+#include <sys/types.h>
+#include <sys/ioctl.h>
#include <assert.h>
#include <errno.h>
int
tcsendbreak(int fd, int len)
{
-#ifdef __minix
- _DIAGASSERT(fd != -1);
- return ioctl(fd, TCSBRK, &len);
-#else /* !__minix */
static const struct timespec sleepytime = { 0, 400000000 };
_DIAGASSERT(fd != -1);
if (ioctl(fd, TIOCCBRK, 0) == -1)
return (-1);
return (0);
-#endif /* !__minix */
}
int
tcsetattr(int fd, int opt, const struct termios *t)
{
-#ifndef __minix
struct termios localterm;
-#endif
_DIAGASSERT(fd != -1);
_DIAGASSERT(t != NULL);
-#ifndef __minix
if (opt & TCSASOFT) {
localterm = *t;
localterm.c_cflag |= CIGNORE;
t = &localterm;
}
-#else /* __minix */
-#define TCSASOFT 0
-#endif /* __minix */
switch (opt & ~TCSASOFT) {
case TCSANOW:
return (ioctl(fd, TIOCSETA, __UNCONST(t)));
}
}
#endif
+#ifndef __minix
#ifdef TIOCGSIZE
{
struct ttysize ts;
*lins = ts.ts_lines;
}
}
+#endif
#endif
return Val(T_co) != *cols || Val(T_li) != *lins;
}
profile.1 ps.1 rcp.1 recwave.1 \
remsync.1 rget.1 rlogin.1 rsh.1 rz.1 \
shar.1 sleep.1 spell.1 \
- stty.1 svc.1 svrctl.1 \
+ svc.1 svrctl.1 \
synctree.1 sysenv.1 sz.1 tail.1 telnet.1 template.1 \
term.1 termcap.1 tget.1 time.1 true.1 \
truncate.1 umount.1 \
+++ /dev/null
-.TH STTY 1
-.SH NAME
-stty \- set terminal parameters
-.SH SYNOPSIS
-.de SP
-.if t .sp 0.4
-.if n .sp
-..
-.in +4n
-.ti -4n
-.B stty
-.RB [ \-ag]
-.SP
-.ti -4n
-.B stty
-.I encoded-form
-.SP
-.ti -4n
-.B stty
-.I speed
-.B ispeed
-.I speed
-.B ospeed
-.I speed
-.B "cs5 cs6 cs7 cs8"
-.RB [ \- ] parenb
-.RB [ \- ] parodd
-.RB [ \- ] hupcl
-.RB [ \- ] cstopb
-.RB [ \- ] cread
-.RB [ \- ] clocal
-.RB [ \- ] ignbrk
-.RB [ \- ] brkint
-.RB [ \- ] ignpar
-.RB [ \- ] parmrk
-.RB [ \- ] inpck
-.RB [ \- ] istrip
-.RB [ \- ] inlcr
-.RB [ \- ] igncr
-.RB [ \- ] icrnl
-.RB [ \- ] ixon
-.RB [ \- ] ixoff
-.RB [ \- ] ixany
-.RB [ \- ] opost
-.RB [ \- ] onlcr
-.RB [ \- ] xtabs
-.RB [ \- ] onoeot
-.RB [ \- ] isig
-.RB [ \- ] icanon
-.RB [ \- ] iexten
-.RB [ \- ] echo
-.RB [ \- ] echoe
-.RB [ \- ] echok
-.RB [ \- ] echonl
-.RB [ \- ] noflsh
-.RB [ \- ] tostop
-.RB [ \- ] lflusho
-.BR eof =\fIc
-.BR eol =\fIc
-.BR erase =\fIc
-.BR erase =\fIc
-.BR intr =\fIc
-.BR kill =\fIc
-.BR quit =\fIc
-.BR susp =\fIc
-.BR start =\fIc
-.BR stop =\fIc
-.BR rprnt =\fIc
-.BR lnext =\fIc
-.BR flush =\fIc
-.BR min =\fIn
-.BR time =\fIn
-.B rows
-.I n
-.B cols
-.I n
-.B xpixels
-.I n
-.B ypixels
-.I n
-.B cooked
-.B raw
-.RB [ \- ] evenp
-.RB [ \- ] parity
-.RB [ \- ] oddp
-.RB [ \- ] nl
-.B ek
-.B sane
-.in -4n
-.SH DESCRIPTION
-.B Stty
-shows or changes the parameters of the terminal connected to standard input.
-.B Stty
-takes a myriad of arguments most of which are mapped directly to
-the flags and special characters described in
-.BR tty (4),
-so we won't describe them here.
-.PP
-.B Stty
-has three forms of operation. First, without any arguments
-.B stty
-shows all terminal attributes that are different from the default state.
-Option
-.B \-a
-makes
-.B stty
-print all terminal attributes, and
-.B \-g
-lets
-.B stty
-print the attributes in a special encoded form, a simple row of colon separated
-hexadecimal numbers.
-.PP
-In the second form of operation
-.B stty
-takes an encoded form as produced by the
-.B \-g
-option and sets the terminals attributes to its decoded value.
-.PP
-In the third form
-.B stty
-interprets a series of flags and parameters settings and modifies the
-terminal attributes accordingly. Flags can be given as
-.B icanon
-or
-.B \-icanon
-for instance, either setting or clearing the
-.B ICANON
-flag.
-Special character values can by set like
-.B "intr=^C"
-for example, which sets the interrupt character to CTRL-C. You can either
-use a real CTRL-C, or the two characters `^' and `C'. In any case
-it is probably necessary to use quotes to guard it from the shell:
-.BR "intr='^C'" .
-.PP
-A number alone is interpreted as a baud rate setting for both the input and
-output rate. The input or the output rate can be set separately with use
-of the
-.B ispeed
-and
-.B ospeed
-prefixes to the number. The character size can be set with
-.BR cs5 ,
-.BR cs6 ,
-.BR cs7
-or
-.BR cs8 .
-.PP
-The
-.B MIN
-and
-.B TIME
-value, the number of rows and columns, and the xpixels and ypixels of the
-window can also be set using one of the keywords
-.BR min ,
-.BR time ,
-.BR rows ,
-.BR cols ,
-.BR xpixels
-or
-.BR ypixels ,
-followed by a decimal number that is the value of the setting.
-.PP
-.B Stty
-accepts several keywords that are not named by corresponding flags or
-parameters in
-.BR tty (4).
-They set several attributes at once:
-.TP
-.B cooked
-Same as
-.BR "icrnl ixon opost onlcr isig icanon iexten echo" ,
-setting all the attributes that are needed for line oriented mode.
-.TP
-.B raw
-Same as
-.BR "\-icrnl \-ixon \-opost \-onlcr \-isig \-icanon \-iexten \-echo" ,
-setting all the attributes for a raw data channel.
-.TP
-.B evenp parity
-These synonyms are equal to
-.BR "cs7 parenb \-parodd" ,
-setting the line to 7 bits even parity.
-.TP
-.B oddp
-Same as
-.BR "cs7 parenb parodd" ,
-setting the line to 7 bits odd parity.
-.TP
-.B "\-parity \-evenp \-oddp"
-All synonyms for
-.BR "cs8 \-parenb" ,
-setting the line to 8 bits, no parity.
-.TP
-.B nl
-Same as
-.BR icrnl ,
-setting carriage return to line feed input translation.
-.TP
-.B \-nl
-Same as
-.BR "\-icrnl \-inlcr \-igncr" ,
-disabling any carriage return or line feed handling.
-.TP
-.B ek
-Set the
-.B ERASE
-and
-.B KILL
-special characters back to the default.
-.TP
-.B sane
-Set all attributes to the default except things like the line speed and
-parity, because their "sane" value is probably what it is right now.
-The default values are compiled into
-.B stty
-from the <termios.h> include file. Use
-.B "stty sane; stty -a"
-to know what they are.
-.SH FILES
-.TP 15n
-.B /etc/ttytab
-The
-.B init
-field of this file may contain an
-.B stty
-command to set the attributes to match an attached RS232 terminal or modem.
-.SH "SEE ALSO"
-.BR tty (4),
-.BR ttytab (5).
-.SH NOTES
-The
-.BR cooked ,
-.BR raw ,
-.BR rows ,
-.BR cols ,
-.BR xpixels
-and
-.BR ypixels
-keywords are MINIX 3 additions beyond the keywords defined by POSIX.
-.B Rows
-and
-.B cols
-are common UNIX extensions, however.
-There are more MINIX 3 specific flags that match the MINIX 3 specific attributes
-described in
-.BR tty (4).
-.SH AUTHOR
-Kees J. Bot <kjb@cs.vu.nl>
2012/10/17 12:00:00,bin/pwd
2011/08/29 14:48:46,bin/rm
2011/08/29 14:49:38,bin/rmdir
+2012/10/17 12:00:00,bin/stty
2012/10/17 12:00:00,bin/sync
2012/10/17 12:00:00,bin/test
2012/10/17 12:00:00,build.sh
#include <stdio.h>
#include <uuid.h>
#include <assert.h>
-#include <minix/termios.h>
+#include <sys/termios.h>
#include "extern.h"
register struct boot_image *ip;
static char core_sigs[] = { SIGQUIT, SIGILL, SIGTRAP, SIGABRT,
SIGEMT, SIGFPE, SIGBUS, SIGSEGV };
- static char ign_sigs[] = { SIGCHLD, SIGWINCH, SIGCONT };
+ static char ign_sigs[] = { SIGCHLD, SIGWINCH, SIGCONT, SIGINFO };
static char noign_sigs[] = { SIGILL, SIGTRAP, SIGEMT, SIGFPE,
SIGBUS, SIGSEGV };
register struct mproc *rmp;
mp->mp_procgrp = rmp->mp_procgrp; /* get process group right */
/* For SIGVTALRM and SIGPROF, see if we need to restart a
- * virtual timer. For SIGINT, SIGWINCH and SIGQUIT, use proc_id 0
+ * virtual timer. For SIGINT, SIGINFO, SIGWINCH and SIGQUIT, use proc_id 0
* to indicate a broadcast to the recipient's process group. For
* SIGKILL, use proc_id -1 to indicate a systemwide broadcast.
*/
case SIGINT:
case SIGQUIT:
case SIGWINCH:
+ case SIGINFO:
id = 0; break; /* broadcast to process group */
case SIGVTALRM:
case SIGPROF:
#include <fcntl.h>
#include <assert.h>
#include <sys/stat.h>
-#include <sys/ioc_tty.h>
+#include <sys/ttycom.h>
#include <minix/callnr.h>
#include <minix/com.h>
#include <minix/endpoint.h>
#define O_RDWR 0x00000002 /* open for reading and writing */
#define O_ACCMODE 0x00000003 /* mask for above modes */
-/* File status flags for open() and fcntl(). POSIX Table 6-5. */
-#define O_APPEND 02000 /* set append mode */
-#define O_NONBLOCK 04000 /* no delay */
-#define O_REOPEN 010000 /* automatically re-open device after driver
- * restart
- */
-#define O_CLOEXEC 020000 /* close on exec */
+/*
+ * Kernel encoding of open mode; separate read and write bits that are
+ * independently testable: 1 greater than the above.
+ *
+ * XXX
+ * FREAD and FWRITE are excluded from the #ifdef _KERNEL so that TIOCFLUSH,
+ * which was documented to use FREAD/FWRITE, continues to work.
+ */
#if defined(_NETBSD_SOURCE)
-#define O_NOSIGPIPE 040000 /* don't deliver sigpipe */
+#define FREAD 0x00000001
+#define FWRITE 0x00000002
#endif
-
-#ifndef __minix /* NOT SUPPORTED! */
+#define O_NONBLOCK 0x00000004 /* no delay */
+#define O_APPEND 0x00000008 /* set append mode */
#if defined(_NETBSD_SOURCE)
#define O_SHLOCK 0x00000010 /* open with shared file lock */
#define O_EXLOCK 0x00000020 /* open with exclusive file lock */
#define O_NOFOLLOW 0x00000100 /* don't follow symlinks on the last */
/* path component */
#endif
-#endif /* !__minix */
+#define O_CREAT 0x00000200 /* create if nonexistent */
+#define O_TRUNC 0x00000400 /* truncate to zero length */
+#define O_EXCL 0x00000800 /* error if already exists */
-/* Oflag values for open(). POSIX Table 6-4. */
-#define O_CREAT 00100 /* creat file if it doesn't exist */
-#define O_EXCL 00200 /* exclusive use flag */
-#define O_NOCTTY 00400 /* do not assign a controlling terminal */
-#define O_TRUNC 01000 /* truncate flag */
+/* defined by POSIX 1003.1; BSD default, but required to be bitwise distinct */
+#define O_NOCTTY 0x00008000 /* don't assign controlling terminal */
-#ifndef __minix /* NOT SUPPORTED! */
#if (_POSIX_C_SOURCE - 0) >= 199309L || (_XOPEN_SOURCE - 0) >= 500 || \
defined(_NETBSD_SOURCE)
#define O_DSYNC 0x00010000 /* write: I/O data completion */
#define O_ALT_IO 0x00040000 /* use alternate i/o semantics */
#define O_DIRECT 0x00080000 /* direct I/O hint */
#endif
-#endif /* !__minix */
+
+#define O_DIRECTORY 0x00200000 /* fail if not a directory */
+#define O_CLOEXEC 0x00400000 /* set close on exec */
+#if defined(_INCOMPLETE_XOPEN_C063) || defined(_KERNEL)
+#define O_SEARCH 0x00800000 /* skip search permission checks */
+#endif
+#if defined(_NETBSD_SOURCE)
+#define O_NOSIGPIPE 0x01000000 /* don't deliver sigpipe */
+#endif
+
+#ifdef __minix
+#define O_REOPEN 0x10000000 /* automatically re-open after driver crash */
+#endif
+
+#ifdef _KERNEL
+/* convert from open() flags to/from fflags; convert O_RD/WR to FREAD/FWRITE */
+#define FFLAGS(oflags) ((oflags) + 1)
+#define OFLAGS(fflags) ((fflags) - 1)
+
+/* all bits settable during open(2) */
+#define O_MASK (O_ACCMODE|O_NONBLOCK|O_APPEND|O_SHLOCK|O_EXLOCK|\
+ O_ASYNC|O_SYNC|O_CREAT|O_TRUNC|O_EXCL|O_DSYNC|\
+ O_RSYNC|O_NOCTTY|O_ALT_IO|O_NOFOLLOW|O_DIRECT|\
+ O_DIRECTORY|O_CLOEXEC|O_NOSIGPIPE)
+
+#define FMARK 0x00001000 /* mark during gc() */
+#define FDEFER 0x00002000 /* defer for next gc pass */
+#define FHASLOCK 0x00004000 /* descriptor holds advisory lock */
+#define FSCAN 0x00100000 /* scan during gc passes */
+#define FSILENT 0x40000000 /* suppress kernel error messages */
+#define FKIOCTL 0x80000000 /* kernel originated ioctl */
+/* bits settable by fcntl(F_SETFL, ...) */
+#define FCNTLFLAGS (FAPPEND|FASYNC|FFSYNC|FNONBLOCK|FDSYNC|FRSYNC|FALTIO|\
+ FDIRECT|FNOSIGPIPE)
+/* bits to save after open(2) */
+#define FMASK (FREAD|FWRITE|FCNTLFLAGS)
+#endif /* _KERNEL */
+
+/*
+ * The O_* flags used to have only F* names, which were used in the kernel
+ * and by fcntl. We retain the F* names for the kernel f_flags field
+ * and for backward compatibility for fcntl.
+ */
+#if defined(_NETBSD_SOURCE)
+#define FAPPEND O_APPEND /* kernel/compat */
+#define FASYNC O_ASYNC /* kernel/compat */
+#define O_FSYNC O_SYNC /* compat */
+#define FNDELAY O_NONBLOCK /* compat */
+#define O_NDELAY O_NONBLOCK /* compat */
+#endif
+#if defined(_KERNEL)
+#define FNOSIGPIPE O_NOSIGPIPE /* kernel */
+#define FNONBLOCK O_NONBLOCK /* kernel */
+#define FFSYNC O_SYNC /* kernel */
+#define FDSYNC O_DSYNC /* kernel */
+#define FRSYNC O_RSYNC /* kernel */
+#define FALTIO O_ALT_IO /* kernel */
+#define FDIRECT O_DIRECT /* kernel */
+#endif
/*
* Constants used for fcntl(2)
*/
/* command values */
-/* These values are used for cmd in fcntl(). POSIX Table 6-1. */
-#define F_DUPFD 0 /* duplicate file descriptor */
-#define F_GETFD 1 /* get file descriptor flags */
-#define F_SETFD 2 /* set file descriptor flags */
-#define F_GETFL 3 /* get file status flags */
-#define F_SETFL 4 /* set file status flags */
-#define F_GETLK 5 /* get record locking information */
-#define F_SETLK 6 /* set record locking information */
-#define F_SETLKW 7 /* set record locking info; wait if blocked */
-#define F_FREESP 8 /* free a section of a regular file */
+#define F_DUPFD 0 /* duplicate file descriptor */
+#define F_GETFD 1 /* get file descriptor flags */
+#define F_SETFD 2 /* set file descriptor flags */
+#define F_GETFL 3 /* get file status flags */
+#define F_SETFL 4 /* set file status flags */
+#if (_POSIX_C_SOURCE - 0) >= 200112L || (_XOPEN_SOURCE - 0) >= 500 || \
+ defined(_NETBSD_SOURCE)
+#define F_GETOWN 5 /* get SIGIO/SIGURG proc/pgrp */
+#define F_SETOWN 6 /* set SIGIO/SIGURG proc/pgrp */
+#endif
+#define F_GETLK 7 /* get record locking information */
+#define F_SETLK 8 /* set record locking information */
+#define F_SETLKW 9 /* F_SETLK; wait if blocked */
#if defined(_NETBSD_SOURCE)
-#define F_GETNOSIGPIPE 9
-#define F_SETNOSIGPIPE 10
+#define F_CLOSEM 10 /* close all fds >= to the one given */
+#define F_MAXFD 11 /* return the max open fd */
+#define F_DUPFD_CLOEXEC 12 /* close on exec duplicated fd */
+#define F_GETNOSIGPIPE 13 /* get SIGPIPE disposition */
+#define F_SETNOSIGPIPE 14 /* set SIGPIPE disposition */
#endif
-/* File descriptor flags used for fcntl(). POSIX Table 6-2. */
-#define FD_CLOEXEC 1 /* close on exec flag for third arg of fcntl */
+#ifdef __minix
+#define F_FREESP 100
+#endif
+
+/* file descriptor flags (F_GETFD, F_SETFD) */
+#define FD_CLOEXEC 1 /* close-on-exec flag */
/* record locking flags (F_GETLK, F_SETLK, F_SETLKW) */
-#define F_RDLCK 1 /* shared or read lock */
-#define F_WRLCK 2 /* exclusive or write lock */
-#define F_UNLCK 3 /* unlock */
+#define F_RDLCK 1 /* shared or read lock */
+#define F_UNLCK 2 /* unlock */
+#define F_WRLCK 3 /* exclusive or write lock */
+#ifdef _KERNEL
+#define F_WAIT 0x010 /* Wait until lock is granted */
+#define F_FLOCK 0x020 /* Use flock(2) semantics for lock */
+#define F_POSIX 0x040 /* Use POSIX semantics for lock */
+#endif
+
+/* Constants for fcntl's passed to the underlying fs - like ioctl's. */
+#if defined(_NETBSD_SOURCE)
+#define F_PARAM_MASK 0xfff
+#define F_PARAM_LEN(x) (((x) >> 16) & F_PARAM_MASK)
+#define F_PARAM_MAX 4095
+#define F_FSCTL (int)0x80000000 /* This fcntl goes to the fs */
+#define F_FSVOID (int)0x40000000 /* no parameters */
+#define F_FSOUT (int)0x20000000 /* copy out parameter */
+#define F_FSIN (int)0x10000000 /* copy in parameter */
+#define F_FSINOUT (F_FSIN | F_FSOUT)
+#define F_FSDIRMASK (int)0x70000000 /* mask for IN/OUT/VOID */
+#define F_FSPRIV (int)0x00008000 /* command is fs-specific */
+
+/*
+ * Define command macros for operations which, if implemented, must be
+ * the same for all fs's.
+ */
+#define _FCN(inout, num, len) \
+ (F_FSCTL | inout | ((len & F_PARAM_MASK) << 16) | (num))
+#define _FCNO(c) _FCN(F_FSVOID, (c), 0)
+#define _FCNR(c, t) _FCN(F_FSIN, (c), (int)sizeof(t))
+#define _FCNW(c, t) _FCN(F_FSOUT, (c), (int)sizeof(t))
+#define _FCNRW(c, t) _FCN(F_FSINOUT, (c), (int)sizeof(t))
+
+/*
+ * Define command macros for fs-specific commands.
+ */
+#define _FCN_FSPRIV(inout, fs, num, len) \
+ (F_FSCTL | F_FSPRIV | inout | ((len & F_PARAM_MASK) << 16) | \
+ (fs) << 8 | (num))
+#define _FCNO_FSPRIV(f, c) _FCN_FSPRIV(F_FSVOID, (f), (c), 0)
+#define _FCNR_FSPRIV(f, c, t) _FCN_FSPRIV(F_FSIN, (f), (c), (int)sizeof(t))
+#define _FCNW_FSPRIV(f, c, t) _FCN_FSPRIV(F_FSOUT, (f), (c), (int)sizeof(t))
+#define _FCNRW_FSPRIV(f, c, t) _FCN_FSPRIV(F_FSINOUT, (f), (c), (int)sizeof(t))
+
+#endif /* _NETBSD_SOURCE */
/*
* Advisory file segment locking data type -
* information passed to system by user
*/
struct flock {
- short l_type; /* type: F_RDLCK, F_WRLCK, or F_UNLCK */
- short l_whence; /* flag for starting offset */
- off_t l_start; /* relative offset in bytes */
- off_t l_len; /* size; if 0, then until EOF */
- pid_t l_pid; /* process id of the locks' owner */
+ off_t l_start; /* starting offset */
+ off_t l_len; /* len = 0 means until end of file */
+ pid_t l_pid; /* lock owner */
+ short l_type; /* lock type: read/write, etc. */
+ short l_whence; /* type of l_start */
};
+
#if defined(_NETBSD_SOURCE)
/* lock operations for flock(2) */
-#define LOCK_SH F_RDLCK /* Shared lock */
-#define LOCK_EX F_WRLCK /* Exclusive lock */
-#define LOCK_NB 0x0080 /* Do not block when locking */
-#define LOCK_UN F_UNLCK /* Unlock */
+#define LOCK_SH 0x01 /* shared file lock */
+#define LOCK_EX 0x02 /* exclusive file lock */
+#define LOCK_NB 0x04 /* don't block when locking */
+#define LOCK_UN 0x08 /* unlock file */
#endif
/* Always ensure that these are consistent with <stdio.h> and <unistd.h>! */
/*
* Constants for X/Open Extended API set 2 (a.k.a. C063)
- * linkat(2) - also part of Posix-2008/XPG7
*/
-#if (_POSIX_C_SOURCE - 0) >= 200809L || (_XOPEN_SOURCE - 0) >= 700 || \
- defined(_NETBSD_SOURCE)
#if defined(_INCOMPLETE_XOPEN_C063) || defined(_KERNEL) || defined(__minix)
#define AT_FDCWD -100 /* Use cwd for relative link target */
-#define AT_EACCESS 0x100 /* Use euid/egid for access checks */
+#define AT_EACCESS 0x100 /* Use euig/egid for access checks */
#define AT_SYMLINK_NOFOLLOW 0x200 /* Do not follow symlinks */
#define AT_SYMLINK_FOLLOW 0x400 /* Follow symlinks */
#define AT_REMOVEDIR 0x800 /* Remove directory only */
#endif
-#endif
#ifndef _KERNEL
#if defined(_NETBSD_SOURCE)
int flock(int, int);
#endif /* _NETBSD_SOURCE */
+int posix_fadvise(int, off_t, off_t, int);
+
+/*
+ * X/Open Extended API set 2 (a.k.a. C063)
+ */
+#if defined(_INCOMPLETE_XOPEN_C063)
+int openat(int, const char *, int oflags, ...);
+#endif
__END_DECLS
-#endif /* _KERNEL */
+#endif /* !_KERNEL */
#endif /* !_SYS_FCNTL_H_ */
* used in each header file are shown in the comment following.
*/
-#include <sys/ioc_tty.h> /* 'T' 't' 'k' */
+#include <sys/ttycom.h> /* 't' */
#include <sys/ioc_net.h> /* 'n' */
#include <sys/ioc_disk.h> /* 'd' */
#include <sys/ioc_file.h> /* 'f' */
#include <sys/ioc_fb.h> /* 'V' */
#include <dev/vndvar.h> /* 'F' */
-#if defined(_NETBSD_SOURCE)
-#define TIOCDRAIN TCDRAIN
-#define TIOCGETA TCGETS
-#define TIOCSETA TCSETS
-#define TIOCSETAW TCSETSW
-#define TIOCSETAF TCSETSF
-#endif
+#define TIOCGSIZE TIOCGWINSZ
+#define TIOCSSIZE TIOCSWINSZ
#endif /* _S_IOCTL_H */
#include <sys/featuretest.h>
#include <sys/sigtypes.h>
-#define _NSIG 26
+#define _NSIG 27
#define NSIG _NSIG
#define SIGWINCH 21 /* window size has changed */
#define SIGVTALRM 24 /* virtual alarm */
#define SIGPROF 25 /* profiler alarm */
+#define SIGINFO 26 /* information request */
/* POSIX requires the following signals to be defined, even if they are
* not supported. Here are the definitions, but they are not supported.
* processes in user-space. Higher-priority signals should be first.
*/
/* Signals delivered by a signal manager. */
-#define SIGSNDELAY 26 /* end of delay for signal delivery */
+#define SIGSNDELAY 27 /* end of delay for signal delivery */
#define SIGS_FIRST SIGHUP /* first system signal */
#define SIGS_LAST SIGSNDELAY /* last system signal */
#define IS_SIGS(signo) (signo>=SIGS_FIRST && signo<=SIGS_LAST)
/* Signals delivered by the kernel. */
-#define SIGKMEM 27 /* kernel memory request pending */
-#define SIGKMESS 28 /* new kernel message */
-#define SIGKSIGSM 29 /* kernel signal pending for signal manager */
-#define SIGKSIG 30 /* kernel signal pending */
+#define SIGKMEM 28 /* kernel memory request pending */
+#define SIGKMESS 29 /* new kernel message */
+#define SIGKSIGSM 30 /* kernel signal pending for signal manager */
+#define SIGKSIG 31 /* kernel signal pending */
#define SIGK_FIRST SIGKMEM /* first kernel signal */
#define SIGK_LAST SIGKSIG /* last kernel signal */
#ifndef _SYS_TERMIOS_H_
#define _SYS_TERMIOS_H_
-#include <sys/cdefs.h>
+#include <sys/ansi.h>
+#include <sys/featuretest.h>
+
+/*
+ * Special Control Characters
+ *
+ * Index into c_cc[] character array.
+ *
+ * Name Subscript Enabled by
+ */
+#define VEOF 0 /* ICANON */
+#define VEOL 1 /* ICANON */
+#if defined(_NETBSD_SOURCE)
+#define VEOL2 2 /* ICANON */
+#endif
+#define VERASE 3 /* ICANON */
+#if defined(_NETBSD_SOURCE)
+#define VWERASE 4 /* ICANON */
+#endif
+#define VKILL 5 /* ICANON */
+#if defined(_NETBSD_SOURCE)
+#define VREPRINT 6 /* ICANON */
+#endif
+/* 7 spare 1 */
+#define VINTR 8 /* ISIG */
+#define VQUIT 9 /* ISIG */
+#define VSUSP 10 /* ISIG */
+#if defined(_NETBSD_SOURCE)
+#define VDSUSP 11 /* ISIG */
+#endif
+#define VSTART 12 /* IXON, IXOFF */
+#define VSTOP 13 /* IXON, IXOFF */
+#if defined(_NETBSD_SOURCE)
+#define VLNEXT 14 /* IEXTEN */
+#define VDISCARD 15 /* IEXTEN */
+#endif
+#define VMIN 16 /* !ICANON */
+#define VTIME 17 /* !ICANON */
+#if defined(_NETBSD_SOURCE)
+#define VSTATUS 18 /* ICANON */
+/* 19 spare 2 */
+#endif
+#define NCCS 20
+
+#define _POSIX_VDISABLE __CAST(unsigned char, '\377')
+
+#if defined(_NETBSD_SOURCE)
+#define CCEQ(val, c) (c == val ? val != _POSIX_VDISABLE : 0)
+#endif
-#include <minix/termios.h>
+/*
+ * Input flags - software input processing
+ */
+#define IGNBRK 0x00000001 /* ignore BREAK condition */
+#define BRKINT 0x00000002 /* map BREAK to SIGINT */
+#define IGNPAR 0x00000004 /* ignore (discard) parity errors */
+#define PARMRK 0x00000008 /* mark parity and framing errors */
+#define INPCK 0x00000010 /* enable checking of parity errors */
+#define ISTRIP 0x00000020 /* strip 8th bit off chars */
+#define INLCR 0x00000040 /* map NL into CR */
+#define IGNCR 0x00000080 /* ignore CR */
+#define ICRNL 0x00000100 /* map CR to NL (ala CRMOD) */
+#define IXON 0x00000200 /* enable output flow control */
+#define IXOFF 0x00000400 /* enable input flow control */
+#if defined(_NETBSD_SOURCE)
+#define IXANY 0x00000800 /* any char will restart after stop */
+#endif
+#if defined(_NETBSD_SOURCE)
+#define IMAXBEL 0x00002000 /* ring bell on input queue full */
+#endif
+
+#ifdef __minix
+#define SCANCODES 0x00001000 /* send scancodes */
+#endif
+
+/*
+ * Output flags - software output processing
+ */
+#define OPOST 0x00000001 /* enable following output processing */
+#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE)
+#define ONLCR 0x00000002 /* map NL to CR-NL (ala CRMOD) */
+#endif
+#if defined(_NETBSD_SOURCE)
+#define OXTABS 0x00000004 /* expand tabs to spaces */
+#define ONOEOT 0x00000008 /* discard EOT's (^D) on output */
+#endif
+#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE)
+#define OCRNL 0x00000010 /* map CR to NL */
+#define ONOCR 0x00000020 /* discard CR's when on column 0 */
+#define ONLRET 0x00000040 /* move to column 0 on CR */
+#endif /* defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) */
+
+/*
+ * Control flags - hardware control of terminal
+ */
+#if defined(_NETBSD_SOURCE)
+#define CIGNORE 0x00000001 /* ignore control flags */
+#endif
+#define CSIZE 0x00000300 /* character size mask */
+#define CS5 0x00000000 /* 5 bits (pseudo) */
+#define CS6 0x00000100 /* 6 bits */
+#define CS7 0x00000200 /* 7 bits */
+#define CS8 0x00000300 /* 8 bits */
+#define CSTOPB 0x00000400 /* send 2 stop bits */
+#define CREAD 0x00000800 /* enable receiver */
+#define PARENB 0x00001000 /* parity enable */
+#define PARODD 0x00002000 /* odd parity, else even */
+#define HUPCL 0x00004000 /* hang up on last close */
+#define CLOCAL 0x00008000 /* ignore modem status lines */
+#if defined(_NETBSD_SOURCE)
+#define CRTSCTS 0x00010000 /* RTS/CTS full-duplex flow control */
+#define CRTS_IFLOW CRTSCTS /* XXX compat */
+#define CCTS_OFLOW CRTSCTS /* XXX compat */
+#define CDTRCTS 0x00020000 /* DTR/CTS full-duplex flow control */
+#define MDMBUF 0x00100000 /* DTR/DCD hardware flow control */
+#define CHWFLOW (MDMBUF|CRTSCTS|CDTRCTS) /* all types of hw flow control */
+#endif
+
+
+/*
+ * "Local" flags - dumping ground for other state
+ *
+ * Warning: some flags in this structure begin with
+ * the letter "I" and look like they belong in the
+ * input flag.
+ */
+
+#if defined(_NETBSD_SOURCE)
+#define ECHOKE 0x00000001 /* visual erase for line kill */
+#endif
+#define ECHOE 0x00000002 /* visually erase chars */
+#define ECHOK 0x00000004 /* echo NL after line kill */
+#define ECHO 0x00000008 /* enable echoing */
+#define ECHONL 0x00000010 /* echo NL even if ECHO is off */
+#if defined(_NETBSD_SOURCE)
+#define ECHOPRT 0x00000020 /* visual erase mode for hardcopy */
+#define ECHOCTL 0x00000040 /* echo control chars as ^(Char) */
+#endif /* defined(_NETBSD_SOURCE) */
+#define ISIG 0x00000080 /* enable signals INT, QUIT, [D]SUSP */
+#define ICANON 0x00000100 /* canonicalize input lines */
+#if defined(_NETBSD_SOURCE)
+#define ALTWERASE 0x00000200 /* use alternate WERASE algorithm */
+#endif /* defined(_NETBSD_SOURCE) */
+#define IEXTEN 0x00000400 /* enable DISCARD and LNEXT */
+#if defined(_NETBSD_SOURCE)
+#define EXTPROC 0x00000800 /* external processing */
+#endif /* defined(_NETBSD_SOURCE) */
+#define TOSTOP 0x00400000 /* stop background jobs on output */
+#if defined(_NETBSD_SOURCE)
+#define FLUSHO 0x00800000 /* output being flushed (state) */
+#define NOKERNINFO 0x02000000 /* no kernel output from VSTATUS */
+#define PENDIN 0x20000000 /* re-echo input buffer at next read */
+#endif /* defined(_NETBSD_SOURCE) */
+#define NOFLSH 0x80000000 /* don't flush output on signal */
+
+typedef unsigned int tcflag_t;
+typedef unsigned char cc_t;
+typedef unsigned int speed_t;
+
+struct termios {
+ tcflag_t c_iflag; /* input flags */
+ tcflag_t c_oflag; /* output flags */
+ tcflag_t c_cflag; /* control flags */
+ tcflag_t c_lflag; /* local flags */
+ cc_t c_cc[NCCS]; /* control chars */
+ int c_ispeed; /* input speed */
+ int c_ospeed; /* output speed */
+};
+
+/*
+ * Commands passed to tcsetattr() for setting the termios structure.
+ */
+#define TCSANOW 0 /* make change immediate */
+#define TCSADRAIN 1 /* drain output, then change */
+#define TCSAFLUSH 2 /* drain output, flush input */
+#if defined(_NETBSD_SOURCE)
+#define TCSASOFT 0x10 /* flag - don't alter h.w. state */
+#endif
+
+/*
+ * Standard speeds
+ */
+#define B0 0
+#define B50 50
+#define B75 75
+#define B110 110
+#define B134 134
+#define B150 150
+#define B200 200
+#define B300 300
+#define B600 600
+#define B1200 1200
+#define B1800 1800
+#define B2400 2400
+#define B4800 4800
+#define B9600 9600
+#define B19200 19200
+#define B38400 38400
+#if defined(_NETBSD_SOURCE)
+#define B7200 7200
+#define B14400 14400
+#define B28800 28800
+#define B57600 57600
+#define B76800 76800
+#define B115200 115200
+#define B230400 230400
+#define B460800 460800
+#define B921600 921600
+#define EXTA 19200
+#define EXTB 38400
+#endif /* defined(_NETBSD_SOURCE) */
+
+#ifndef _KERNEL
+
+#define TCIFLUSH 1
+#define TCOFLUSH 2
+#define TCIOFLUSH 3
+#define TCOOFF 1
+#define TCOON 2
+#define TCIOFF 3
+#define TCION 4
+
+#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE)
+#ifndef pid_t
+typedef __pid_t pid_t;
+#define pid_t __pid_t
+#endif
+#endif /* _XOPEN_SOURCE || _NETBSD_SOURCE */
+#include <sys/cdefs.h>
__BEGIN_DECLS
+speed_t cfgetispeed(const struct termios *);
+speed_t cfgetospeed(const struct termios *);
+int cfsetispeed(struct termios *, speed_t);
+int cfsetospeed(struct termios *, speed_t);
+int tcgetattr(int, struct termios *);
+int tcsetattr(int, int, const struct termios *);
+int tcdrain(int);
+int tcflow(int, int);
+int tcflush(int, int);
+int tcsendbreak(int, int);
+#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE)
+pid_t tcgetsid(int);
+#endif /* defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) */
+
+
#if defined(_NETBSD_SOURCE)
void cfmakeraw(struct termios *);
int cfsetspeed(struct termios *, speed_t);
#endif /* defined(_NETBSD_SOURCE) */
__END_DECLS
+#endif /* !_KERNEL */
+
+#if defined(_NETBSD_SOURCE)
+
+/*
+ * Include tty ioctl's that aren't just for backwards compatibility
+ * with the old tty driver. These ioctl definitions were previously
+ * in <sys/ioctl.h>.
+ */
+#include <sys/ttycom.h>
+#endif
+
+/*
+ * END OF PROTECTED INCLUDE.
+ */
#endif /* !_SYS_TERMIOS_H_ */
#if defined(_NETBSD_SOURCE)
*
* @(#)ttycom.h 8.1 (Berkeley) 3/28/94
*/
-#include <minix/termios.h>
-
-/* LSC FIXME: Wouldn't it be simpler to use that instead of including here
- termios? for now disabled, pending investigation. */
-#define _SYS_TTYCOM_H_
#ifndef _SYS_TTYCOM_H_
#define _SYS_TTYCOM_H_
#define STRIPDISC 6 /* metricom wireless IP discipline */
#define HDLCDISC 9 /* HDLC discipline */
+#ifdef __minix
+
+#include <minix/ioctl.h>
+
+/* Terminal ioctls. Use big T. */
+#define TIOCSFON _IOW_BIG(1, u8_t [8192]) /* new font */
+
+/* Keyboard ioctls. */
+#define KIOCBELL _IOW('k', 1, struct kio_bell)
+#define KIOCSLEDS _IOW('k', 2, struct kio_leds)
+#define KIOCSMAP _IOW('k', 3, keymap_t)
+
+/* /dev/video ioctls. */
+#define TIOCMAPMEM _IORW('v', 1, struct mapreqvm)
+#define TIOCUNMAPMEM _IORW('v', 2, struct mapreqvm)
+#endif
+
#endif /* !_SYS_TTYCOM_H_ */
#define TTYDEF_OFLAG (OPOST | ONLCR )
#define TTYDEF_LFLAG (ECHO | ICANON | ISIG | IEXTEN | ECHOE)
#define TTYDEF_CFLAG (CREAD | CS8 | HUPCL)
+#ifdef __minix
+#define TTYDEF_SPEED (B115200)
+#else
#define TTYDEF_SPEED (B9600)
+#endif
/*
* Control Character Defaults
#include <term.h>
#include <unistd.h>
-/* Specifically needed on MINIX, as struct winsize in not defined elsewhere */
-#include <minix/termios.h>
+#ifdef __minix
+#include <sys/ttycom.h>
+#endif
#define SW 8
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/uio.h>
-#ifdef __minix
-#include <minix/termios.h>
-#endif
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
+#ifdef __minix
+#include <sys/ttycom.h>
+#endif
+
#include "defs.h"
#include "extern.h"
#include <dirent.h>
#include <assert.h>
-#include <sys/ioc_tty.h>
+#include <sys/ttycom.h>
#include <sys/times.h>
#include <sys/types.h>
#include <sys/time.h>