summaryrefslogtreecommitdiffstats
path: root/libexec/getty
diff options
context:
space:
mode:
authorjoerg <joerg@FreeBSD.org>1996-04-13 15:33:16 +0000
committerjoerg <joerg@FreeBSD.org>1996-04-13 15:33:16 +0000
commit2e5912fe126c08734bf3d160c1983e32b5faf293 (patch)
treef1361033dc19d9a011d8dcc27b9356a3960352f6 /libexec/getty
parent79ebee9a84c8605e8f138e79e03bf82c8257b679 (diff)
downloadFreeBSD-src-2e5912fe126c08734bf3d160c1983e32b5faf293.zip
FreeBSD-src-2e5912fe126c08734bf3d160c1983e32b5faf293.tar.gz
Import NetBSD's termios'ed getty into a vendor branch.
Obtained from: NetBSD 1.1R
Diffstat (limited to 'libexec/getty')
-rw-r--r--libexec/getty/Makefile12
-rw-r--r--libexec/getty/extern.h5
-rw-r--r--libexec/getty/getty.83
-rw-r--r--libexec/getty/gettytab.5130
-rw-r--r--libexec/getty/gettytab.h28
-rw-r--r--libexec/getty/init.c50
-rw-r--r--libexec/getty/main.c147
-rw-r--r--libexec/getty/pathnames.h3
-rw-r--r--libexec/getty/subr.c383
-rw-r--r--libexec/getty/ttys.518
10 files changed, 550 insertions, 229 deletions
diff --git a/libexec/getty/Makefile b/libexec/getty/Makefile
index 7f2eabe..a201e62 100644
--- a/libexec/getty/Makefile
+++ b/libexec/getty/Makefile
@@ -1,10 +1,10 @@
-# @(#)Makefile 8.1 (Berkeley) 6/4/93
+# from: @(#)Makefile 8.1 (Berkeley) 6/4/93
+# $Id: Makefile,v 1.7 1994/12/22 10:27:06 cgd Exp $
PROG= getty
-SRCS= main.c init.c subr.c ttydefaults.c
-DPADD= ${LIBUTIL}
-LDADD= -lutil
-MAN5= gettytab.0 ttys.0
-MAN8= getty.0
+SRCS= main.c init.c subr.c
+DPADD+= ${LIBUTIL}
+LDADD+= -lutil
+MAN= getty.8 gettytab.5 ttys.5
.include <bsd.prog.mk>
diff --git a/libexec/getty/extern.h b/libexec/getty/extern.h
index 644f93f..3663166 100644
--- a/libexec/getty/extern.h
+++ b/libexec/getty/extern.h
@@ -30,7 +30,8 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * @(#)extern.h 8.1 (Berkeley) 6/4/93
+ * from: @(#)extern.h 8.1 (Berkeley) 6/4/93
+ * $Id: extern.h,v 1.2 1994/08/17 20:10:29 pk Exp $
*/
struct delayval;
@@ -50,7 +51,7 @@ char *portselector __P((void));
void set_ttydefaults __P((int));
void setchars __P((void));
void setdefaults __P((void));
-long setflags __P((int));
+void setflags __P((int));
int speed __P((int));
int login_tty __P((int)); /* From libutil. */
diff --git a/libexec/getty/getty.8 b/libexec/getty/getty.8
index ffd5060..1b00ae5 100644
--- a/libexec/getty/getty.8
+++ b/libexec/getty/getty.8
@@ -29,7 +29,8 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)getty.8 8.1 (Berkeley) 6/4/93
+.\" from: @(#)getty.8 8.1 (Berkeley) 6/4/93
+.\" $Id: getty.8,v 1.3 1994/08/17 20:10:30 pk Exp $
.\"
.Dd June 4, 1993
.Dt GETTY 8
diff --git a/libexec/getty/gettytab.5 b/libexec/getty/gettytab.5
index e5de06b..2c25899 100644
--- a/libexec/getty/gettytab.5
+++ b/libexec/getty/gettytab.5
@@ -29,9 +29,10 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)gettytab.5 8.5 (Berkeley) 6/1/94
+.\" from: @(#)gettytab.5 8.4 (Berkeley) 4/19/94
+.\" $Id: gettytab.5,v 1.12 1994/09/24 00:56:05 mycroft Exp $
.\"
-.Dd June 1, 1994
+.Dd April 19, 1994
.Dt GETTYTAB 5
.Os BSD 4.2
.Sh NAME
@@ -76,10 +77,10 @@ table.
.Bl -column Namexx /usr/bin/login Default
.It Sy Name Type Default Description
.It "ap bool false terminal uses any parity"
-.It "bd num 0 backspace delay"
.It "bk str 0377 alternate end of line character (input break)"
-.It "cb bool false use crt backspace mode"
-.It "cd num 0 carriage-return delay"
+.It "c0 num unused tty control flags to write messages"
+.It "c1 num unused tty control flags to read login name"
+.It "c2 num unused tty control flags to leave terminal as"
.It "ce bool false use crt erase algorithm"
.It "ck bool false use crt kill algorithm"
.It "cl str" Ta Dv NULL Ta
@@ -105,7 +106,6 @@ character
.It "f0 num unused tty mode flags to write messages"
.It "f1 num unused tty mode flags to read login name"
.It "f2 num unused tty mode flags to leave terminal as"
-.It "fd num 0 form-feed (vertical motion) delay"
.It "fl str" Ta So Li ^O Sc Ta
.No "output flush character"
.It "hc bool false do"
@@ -115,6 +115,9 @@ hangup line on last close
.No "hostname editing string"
.It "hn str hostname hostname"
.It "ht bool false terminal has real tabs"
+.It "i0 num unused tty input flags to write messages"
+.It "i1 num unused tty input flags to read login name"
+.It "i2 num unused tty input flags to leave terminal as"
.It "ig bool false ignore garbage characters in login name"
.It "im str" Ta Dv NULL Ta
.No "initial (banner) message"
@@ -123,16 +126,22 @@ hangup line on last close
.It "is num unused input speed"
.It "kl str" Ta So Li ^U Sc Ta
.No "kill character"
+.It "l0 num unused tty local flags to write messages"
+.It "l1 num unused tty local flags to read login name"
+.It "l2 num unused tty local flags to leave terminal as"
.It "lc bool false terminal has lower case"
.It "lm str login: login prompt"
.It "ln str" Ta So Li ^V Sc Ta
.No "``literal next'' character"
.It "lo str" Ta Pa /usr/bin/login Ta
.No "program to exec when name obtained"
-.It "nd num 0 newline (line-feed) delay"
+.It "mb bool false do flow control based on carrier"
.It "nl bool false terminal has (or might have) a newline character"
.It "np bool false terminal uses no parity (i.e. 8-bit characters)"
.It "nx str default next table (for auto speed selection)"
+.It "o0 num unused tty output flags to write messages"
+.It "o1 num unused tty output flags to read login name"
+.It "o2 num unused tty output flags to leave terminal as"
.It "op bool false terminal uses odd parity"
.It "os num unused output speed"
.It "pc str" Ta So Li \e0 Sc Ta
@@ -158,7 +167,6 @@ use raw for input, use cbreak
.It "tt str" Ta Dv NULL Ta
.No "terminal type (for environment)"
.It "ub bool false do unbuffered output (of prompts etc)"
-.It "uc bool false terminal is known upper case only"
.It "we str" Ta So Li ^W Sc Ta
.No "word erase character"
.It "xc bool false do
@@ -171,6 +179,16 @@ echo control chars as
(start output) character
.El
.Pp
+The following capabilities are no longer supported by getty(8):
+.Bl -column Namexx /usr/bin/login Default
+.It "bd num 0 backspace delay"
+.It "cb bool false use crt backspace mode"
+.It "cd num 0 carriage-return delay"
+.It "fd num 0 form-feed (vertical motion) delay"
+.It "nd num 0 newline (line-feed) delay"
+.It "uc bool false terminal is known upper case only"
+.El
+.Pp
If no line speed is specified, speed will not be altered
from that which prevails when getty is entered.
Specifying an input or output speed will override
@@ -183,18 +201,43 @@ are derived from the boolean flags specified.
If the derivation should prove inadequate,
any (or all) of these three may be overridden
with one of the
-.Em \&f0 ,
-.Em \&f1 ,
+.Em \&c0 ,
+.Em \&c1 ,
+.Em \&c2 ,
+.Em \&i0 ,
+.Em \&i1 ,
+.Em \&i2 ,
+.Em \&l0 ,
+.Em \&l1 ,
+.Em \&l2 ,
+.Em \&o0 ,
+.Em \&o1 ,
or
-.Em \&f2
+.Em \&o2
numeric specifications, which can be used to specify
(usually in octal, with a leading '0')
the exact values of the flags.
-Local (new tty) flags are set in the top 16 bits
-of this (32 bit) value.
+These flags correspond to the termios
+.Em c_cflag ,
+.Em c_iflag ,
+.Em c_lflag ,
+and
+.Em c_oflag
+fields, respectively. Each these sets must be completely specified to be
+effective.
+The
+.Em \&f0 ,
+.Em \&f1 ,
+and
+.Em \&f2
+are excepted for backwards compatibility with a previous incarnation of
+the TTY sub-system. In these flags the bottom 16 bits of the (32 bits)
+value contain the sgttyb
+.Em sg_flags
+field, while the top 16 bits represent the local mode word.
.Pp
Should
-.Xr getty
+.Xr getty 8
receive a null character
(presumed to indicate a line break)
it will restart using the table indicated by the
@@ -213,39 +256,52 @@ screen clear string may be preceded by a (decimal) number
of milliseconds of delay required (a la termcap).
This delay is simulated by repeated use of the pad character
.Em \&pc .
-.pl -1
.Pp
The initial message, and login message,
.Em \&im
and
.Em \&lm
-may include the character sequence
-.Em \&%h
-or
-.Em \&%t
-to obtain
-the hostname or tty name respectively.
-.Pf ( Em %%
-obtains a single '%' character.)
-The hostname is normally obtained from the system,
-but may be set by the
+may include any of the following character sequences, which expand to
+information about the environment in which
+.Xr getty 8
+is running.
+.Pp
+.Bl -tag -width \&%xxx -compact
+.It \&%d
+The current date.
+.It \&%h
+The hostname of the machine, which is normally obtained from the
+system using
+.Xr gethostname 2 ,
+but may also be overridden by the
.Em \&hn
table entry.
-In either case it may be edited with
-.Em \&he .
-The
+In either case it may be edited with the
.Em \&he
-string is a sequence of characters, each character that
-is neither '@' nor '#' is copied into the final hostname.
+string.
A '@' in the
.Em \&he
-string, causes one character from the real hostname to
+string causes one character from the real hostname to
be copied to the final hostname.
A '#' in the
.Em \&he
-string, causes the next character of the real hostname
+string causes the next character of the real hostname
to be skipped.
+Each character that
+is neither '@' nor '#' is copied into the final hostname.
Surplus '@' and '#' characters are ignored.
+.It \&%t
+The tty name.
+.It "\&%m, \&%r, \&%s, \&%v"
+The type of machine, release of the operating system, name of the
+operating system, and version of the kernel, respectively, as
+returned by
+.Xr uname 2 .
+.It \&%%
+A
+.Dq %
+character.
+.El
.Pp
When getty execs the login process, given
in the
@@ -271,14 +327,16 @@ then getty will exit within the indicated
number of seconds, either having
received a login name and passed control
to
-.Xr login ,
+.Xr login 1 ,
or having received an alarm signal, and exited.
This may be useful to hangup dial in lines.
.Pp
Output from
-.Xr getty
+.Xr getty 8
is even parity unless
.Em \&op
+or
+.Em \&np
is specified.
The
.Em \&op
@@ -289,12 +347,14 @@ to allow any parity on input, but generate odd parity output.
Note: this only applies while getty is being run,
terminal driver limitations prevent a more complete
implementation.
-.Xr Getty
+.Xr Getty 8
does not check parity of input characters in
.Dv RAW
mode.
.Sh SEE ALSO
.Xr login 1 ,
+.Xr gethostname 2 ,
+.Xr uname 2 ,
.Xr termcap 5 ,
.Xr getty 8 .
.Sh BUGS
diff --git a/libexec/getty/gettytab.h b/libexec/getty/gettytab.h
index fb2b14f..a712e43 100644
--- a/libexec/getty/gettytab.h
+++ b/libexec/getty/gettytab.h
@@ -30,7 +30,8 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * @(#)gettytab.h 8.2 (Berkeley) 3/30/94
+ * from: @(#)gettytab.h 8.2 (Berkeley) 3/30/94
+ * $Id: gettytab.h,v 1.7 1994/08/17 20:10:34 pk Exp $
*/
/*
@@ -104,6 +105,30 @@ struct gettyflags {
#define F2 gettynums[11].value
#define F2set gettynums[11].set
#define PF gettynums[12].value
+#define C0 gettynums[13].value
+#define C0set gettynums[13].set
+#define C1 gettynums[14].value
+#define C1set gettynums[14].set
+#define C2 gettynums[15].value
+#define C2set gettynums[15].set
+#define I0 gettynums[16].value
+#define I0set gettynums[16].set
+#define I1 gettynums[17].value
+#define I1set gettynums[17].set
+#define I2 gettynums[18].value
+#define I2set gettynums[18].set
+#define L0 gettynums[19].value
+#define L0set gettynums[19].set
+#define L1 gettynums[20].value
+#define L1set gettynums[20].set
+#define L2 gettynums[21].value
+#define L2set gettynums[21].set
+#define O0 gettynums[22].value
+#define O0set gettynums[22].set
+#define O1 gettynums[23].value
+#define O1set gettynums[23].set
+#define O2 gettynums[24].value
+#define O2set gettynums[24].set
/*
* Boolean values.
@@ -133,6 +158,7 @@ struct gettyflags {
#define AB gettyflags[19].value
#define DX gettyflags[20].value
#define NP gettyflags[21].value
+#define MB gettyflags[22].value
int getent __P((char *, char *));
long getnum __P((char *));
diff --git a/libexec/getty/init.c b/libexec/getty/init.c
index 835acd7..f3e78c0 100644
--- a/libexec/getty/init.c
+++ b/libexec/getty/init.c
@@ -32,7 +32,8 @@
*/
#ifndef lint
-static char sccsid[] = "@(#)init.c 8.1 (Berkeley) 6/4/93";
+/*static char sccsid[] = "from: @(#)init.c 8.1 (Berkeley) 6/4/93";*/
+static char rcsid[] = "$Id: init.c,v 1.6 1994/08/17 20:10:35 pk Exp $";
#endif /* not lint */
/*
@@ -40,13 +41,11 @@ static char sccsid[] = "@(#)init.c 8.1 (Berkeley) 6/4/93";
*
* Melbourne getty.
*/
-#include <sgtty.h>
+#include <termios.h>
#include "gettytab.h"
#include "pathnames.h"
-extern struct sgttyb tmode;
-extern struct tchars tc;
-extern struct ltchars ltc;
+extern struct termios tmode;
extern char hostname[];
struct gettystrs gettystrs[] = {
@@ -54,26 +53,26 @@ struct gettystrs gettystrs[] = {
{ "cl" }, /* screen clear characters */
{ "im" }, /* initial message */
{ "lm", "login: " }, /* login message */
- { "er", &tmode.sg_erase }, /* erase character */
- { "kl", &tmode.sg_kill }, /* kill character */
- { "et", &tc.t_eofc }, /* eof chatacter (eot) */
+ { "er", &tmode.c_cc[VERASE] }, /* erase character */
+ { "kl", &tmode.c_cc[VKILL] }, /* kill character */
+ { "et", &tmode.c_cc[VEOF] }, /* eof chatacter (eot) */
{ "pc", "" }, /* pad character */
{ "tt" }, /* terminal type */
{ "ev" }, /* enviroment */
{ "lo", _PATH_LOGIN }, /* login program */
{ "hn", hostname }, /* host name */
{ "he" }, /* host name edit */
- { "in", &tc.t_intrc }, /* interrupt char */
- { "qu", &tc.t_quitc }, /* quit char */
- { "xn", &tc.t_startc }, /* XON (start) char */
- { "xf", &tc.t_stopc }, /* XOFF (stop) char */
- { "bk", &tc.t_brkc }, /* brk char (alt \n) */
- { "su", &ltc.t_suspc }, /* suspend char */
- { "ds", &ltc.t_dsuspc }, /* delayed suspend */
- { "rp", &ltc.t_rprntc }, /* reprint char */
- { "fl", &ltc.t_flushc }, /* flush output */
- { "we", &ltc.t_werasc }, /* word erase */
- { "ln", &ltc.t_lnextc }, /* literal next */
+ { "in", &tmode.c_cc[VINTR] }, /* interrupt char */
+ { "qu", &tmode.c_cc[VQUIT] }, /* quit char */
+ { "xn", &tmode.c_cc[VSTART] }, /* XON (start) char */
+ { "xf", &tmode.c_cc[VSTOP] }, /* XOFF (stop) char */
+ { "bk", &tmode.c_cc[VEOL] }, /* brk char (alt \n) */
+ { "su", &tmode.c_cc[VSUSP] }, /* suspend char */
+ { "ds", &tmode.c_cc[VDSUSP] }, /* delayed suspend */
+ { "rp", &tmode.c_cc[VREPRINT] },/* reprint char */
+ { "fl", &tmode.c_cc[VDISCARD] },/* flush output */
+ { "we", &tmode.c_cc[VWERASE] }, /* word erase */
+ { "ln", &tmode.c_cc[VLNEXT] }, /* literal next */
{ 0 }
};
@@ -91,6 +90,18 @@ struct gettynums gettynums[] = {
{ "f1" }, /* input flags */
{ "f2" }, /* user mode flags */
{ "pf" }, /* delay before flush at 1st prompt */
+ { "c0" }, /* output c_flags */
+ { "c1" }, /* input c_flags */
+ { "c2" }, /* user mode c_flags */
+ { "i0" }, /* output i_flags */
+ { "i1" }, /* input i_flags */
+ { "i2" }, /* user mode i_flags */
+ { "l0" }, /* output l_flags */
+ { "l1" }, /* input l_flags */
+ { "l2" }, /* user mode l_flags */
+ { "o0" }, /* output o_flags */
+ { "o1" }, /* input o_flags */
+ { "o2" }, /* user mode o_flags */
{ 0 }
};
@@ -117,5 +128,6 @@ struct gettyflags gettyflags[] = {
{ "ab", 0 }, /* auto-baud detect with '\r' */
{ "dx", 0 }, /* set decctlq */
{ "np", 0 }, /* no parity at all (8bit chars) */
+ { "mb", 0 }, /* do MDMBUF flow control */
{ 0 }
};
diff --git a/libexec/getty/main.c b/libexec/getty/main.c
index c27ddf4..0539b17 100644
--- a/libexec/getty/main.c
+++ b/libexec/getty/main.c
@@ -38,20 +38,23 @@ static char copyright[] =
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/20/93";
+/*static char sccsid[] = "from: @(#)main.c 8.1 (Berkeley) 6/20/93";*/
+static char rcsid[] = "$Id: main.c,v 1.15 1995/08/13 04:08:27 cgd Exp $";
#endif /* not lint */
-#define USE_OLD_TTY
-
#include <sys/param.h>
#include <sys/stat.h>
+#include <termios.h>
+#include <sys/ioctl.h>
#include <sys/resource.h>
-
-#include <ctype.h>
+#include <sys/utsname.h>
+#include <errno.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <time.h>
#include <ctype.h>
#include <fcntl.h>
#include <setjmp.h>
-#include <sgtty.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
@@ -69,21 +72,12 @@ static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/20/93";
*/
#define GETTY_TIMEOUT 60 /* seconds */
-struct sgttyb tmode = {
- 0, 0, CERASE, CKILL, 0
-};
-struct tchars tc = {
- CINTR, CQUIT, CSTART,
- CSTOP, CEOF, CBRK,
-};
-struct ltchars ltc = {
- CSUSP, CDSUSP, CRPRNT,
- CFLUSH, CWERASE, CLNEXT
-};
+struct termios tmode, omode;
int crmod, digit, lower, upper;
char hostname[MAXHOSTNAMELEN];
+struct utsname kerninfo;
char name[16];
char dev[] = _PATH_DEV;
char ttyn[32];
@@ -117,9 +111,9 @@ char partab[] = {
0000,0200,0200,0000,0200,0000,0000,0201
};
-#define ERASE tmode.sg_erase
-#define KILL tmode.sg_kill
-#define EOT tc.t_eofc
+#define ERASE tmode.c_cc[VERASE]
+#define KILL tmode.c_cc[VKILL]
+#define EOT tmode.c_cc[VEOF]
jmp_buf timeout;
@@ -170,17 +164,18 @@ main(argc, argv)
extern char **environ;
char *tname;
long allflags;
- int repcnt = 0;
+ int repcnt = 0, failopenlogged = 0;
struct rlimit limit;
signal(SIGINT, SIG_IGN);
/*
signal(SIGQUIT, SIG_DFL);
*/
- openlog("getty", LOG_ODELAY|LOG_CONS, LOG_AUTH);
+ openlog("getty", LOG_ODELAY|LOG_CONS|LOG_PID, LOG_AUTH);
gethostname(hostname, sizeof(hostname));
if (hostname[0] == '\0')
strcpy(hostname, "Amnesiac");
+ uname(&kerninfo);
/*
* Limit running time to deal with broken or dead lines.
@@ -213,9 +208,11 @@ main(argc, argv)
*/
sleep(2);
while ((i = open(ttyn, O_RDWR)) == -1) {
- if (repcnt % 10 == 0) {
+ if ((repcnt % 10 == 0) &&
+ (errno != ENXIO || !failopenlogged)) {
syslog(LOG_ERR, "%s: %m", ttyn);
closelog();
+ failopenlogged = 1;
}
repcnt++;
sleep(60);
@@ -224,6 +221,13 @@ main(argc, argv)
}
}
+ /* Start with default tty settings */
+ if (tcgetattr(0, &tmode) < 0) {
+ syslog(LOG_ERR, "%s: %m", ttyn);
+ exit(1);
+ }
+ omode = tmode;
+
gettable("default", defent);
gendefaults();
tname = "default";
@@ -237,23 +241,24 @@ main(argc, argv)
APset++, OPset++, EPset++;
setdefaults();
off = 0;
- ioctl(0, TIOCFLUSH, &off); /* clear out the crap */
+ (void)tcflush(0, TCIOFLUSH); /* clear out the crap */
ioctl(0, FIONBIO, &off); /* turn off non-blocking mode */
ioctl(0, FIOASYNC, &off); /* ditto for async mode */
+
if (IS)
- tmode.sg_ispeed = speed(IS);
+ cfsetispeed(&tmode, IS);
else if (SP)
- tmode.sg_ispeed = speed(SP);
+ cfsetispeed(&tmode, SP);
if (OS)
- tmode.sg_ospeed = speed(OS);
+ cfsetospeed(&tmode, OS);
else if (SP)
- tmode.sg_ospeed = speed(SP);
- tmode.sg_flags = setflags(0);
- ioctl(0, TIOCSETP, &tmode);
+ cfsetospeed(&tmode, SP);
+ setflags(0);
setchars();
- ioctl(0, TIOCSETC, &tc);
- if (HC)
- ioctl(0, TIOCHPCL, 0);
+ if (tcsetattr(0, TCSANOW, &tmode) < 0) {
+ syslog(LOG_ERR, "%s: %m", ttyn);
+ exit(1);
+ }
if (AB) {
extern char *autobaud();
@@ -270,8 +275,8 @@ main(argc, argv)
if (IM && *IM)
putf(IM);
if (setjmp(timeout)) {
- tmode.sg_ispeed = tmode.sg_ospeed = 0;
- ioctl(0, TIOCSETP, &tmode);
+ tmode.c_ispeed = tmode.c_ospeed = 0;
+ (void)tcsetattr(0, TCSANOW, &tmode);
exit(1);
}
if (TO) {
@@ -290,28 +295,26 @@ main(argc, argv)
}
if (!(upper || lower || digit))
continue;
- allflags = setflags(2);
- tmode.sg_flags = allflags & 0xffff;
- allflags >>= 16;
- if (crmod || NL)
- tmode.sg_flags |= CRMOD;
+ setflags(2);
+ if (crmod) {
+ tmode.c_iflag |= ICRNL;
+ tmode.c_oflag |= ONLCR;
+ }
+#if XXX
if (upper || UC)
tmode.sg_flags |= LCASE;
if (lower || LC)
tmode.sg_flags &= ~LCASE;
- ioctl(0, TIOCSETP, &tmode);
- ioctl(0, TIOCSLTC, &ltc);
- ioctl(0, TIOCLSET, &allflags);
+#endif
+ if (tcsetattr(0, TCSANOW, &tmode) < 0) {
+ syslog(LOG_ERR, "%s: %m", ttyn);
+ exit(1);
+ }
signal(SIGINT, SIG_DFL);
for (i = 0; environ[i] != (char *)0; i++)
env[i] = environ[i];
makeenv(&env[i]);
- /*
- * this is what login was doing anyway.
- * soon we rewrite getty completely.
- */
- set_ttydefaults(0);
limit.rlim_max = RLIM_INFINITY;
limit.rlim_cur = RLIM_INFINITY;
(void)setrlimit(RLIMIT_CPU, &limit);
@@ -342,16 +345,17 @@ getname()
return (0);
}
signal(SIGINT, interrupt);
- tmode.sg_flags = setflags(0);
- ioctl(0, TIOCSETP, &tmode);
- tmode.sg_flags = setflags(1);
+ setflags(1);
prompt();
if (PF > 0) {
oflush();
sleep(PF);
PF = 0;
}
- ioctl(0, TIOCSETP, &tmode);
+ if (tcsetattr(0, TCSANOW, &tmode) < 0) {
+ syslog(LOG_ERR, "%s: %m", ttyn);
+ exit(1);
+ }
crmod = digit = lower = upper = 0;
np = name;
for (;;) {
@@ -373,7 +377,7 @@ getname()
else if (c == ERASE || c == '#' || c == '\b') {
if (np > name) {
np--;
- if (tmode.sg_ospeed >= B1200)
+ if (cfgetospeed(&tmode) >= 1200)
puts("\b \b");
else
putchr(cs);
@@ -382,7 +386,7 @@ getname()
} else if (c == KILL || c == '@') {
putchr(cs);
putchr('\r');
- if (tmode.sg_ospeed < B1200)
+ if (cfgetospeed(&tmode) < 1200)
putchr('\n');
/* this is the way they do it down under ... */
else if (np > name)
@@ -408,17 +412,12 @@ getname()
return (1);
}
-static
-short tmspc10[] = {
- 0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5, 15
-};
-
static void
putpad(s)
register char *s;
{
register pad = 0;
- register mspc10;
+ speed_t ospeed = cfgetospeed(&tmode);
if (isdigit(*s)) {
while (isdigit(*s)) {
@@ -437,10 +436,7 @@ putpad(s)
* If no delay needed, or output speed is
* not comprehensible, then don't try to delay.
*/
- if (pad == 0)
- return;
- if (tmode.sg_ospeed <= 0 ||
- tmode.sg_ospeed >= (sizeof tmspc10 / sizeof tmspc10[0]))
+ if (pad == 0 || ospeed <= 0)
return;
/*
@@ -449,9 +445,8 @@ putpad(s)
* Transmitting pad characters slows many terminals down and also
* loads the system.
*/
- mspc10 = tmspc10[tmode.sg_ospeed];
- pad += mspc10 / 2;
- for (pad /= mspc10; pad > 0; pad--)
+ pad = (pad * ospeed + 50000) / 100000;
+ while (pad--)
putchr(*PC);
}
@@ -531,13 +526,29 @@ putf(cp)
break;
case 'd': {
- static char fmt[] = "%l:% %P on %A, %d %B %Y";
+ static char fmt[] = "%l:% %p on %A, %d %B %Y";
fmt[4] = 'M'; /* I *hate* SCCS... */
(void)time(&t);
(void)strftime(db, sizeof(db), fmt, localtime(&t));
puts(db);
break;
+
+ case 's':
+ puts(kerninfo.sysname);
+ break;
+
+ case 'm':
+ puts(kerninfo.machine);
+ break;
+
+ case 'r':
+ puts(kerninfo.release);
+ break;
+
+ case 'v':
+ puts(kerninfo.version);
+ break;
}
case '%':
diff --git a/libexec/getty/pathnames.h b/libexec/getty/pathnames.h
index 714a9cc..5cfe73d 100644
--- a/libexec/getty/pathnames.h
+++ b/libexec/getty/pathnames.h
@@ -30,7 +30,8 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * @(#)pathnames.h 8.1 (Berkeley) 6/4/93
+ * from: @(#)pathnames.h 8.1 (Berkeley) 6/4/93
+ * $Id: pathnames.h,v 1.3 1994/08/17 20:10:39 pk Exp $
*/
#include <paths.h>
diff --git a/libexec/getty/subr.c b/libexec/getty/subr.c
index 4a2abb3..8c55e37 100644
--- a/libexec/getty/subr.c
+++ b/libexec/getty/subr.c
@@ -32,25 +32,27 @@
*/
#ifndef lint
-static char sccsid[] = "@(#)subr.c 8.1 (Berkeley) 6/4/93";
+/*static char sccsid[] = "from: @(#)subr.c 8.1 (Berkeley) 6/4/93";*/
+static char rcsid[] = "$Id: subr.c,v 1.18 1995/10/05 08:51:31 mycroft Exp $";
#endif /* not lint */
/*
* Melbourne getty.
*/
-#define USE_OLD_TTY
+#define COMPAT_43
#include <stdlib.h>
-#include <sgtty.h>
-#include <string.h>
#include <unistd.h>
+#include <string.h>
+#include <termios.h>
+#include <sys/ioctl.h>
#include "gettytab.h"
-#include "extern.h"
#include "pathnames.h"
+#include "extern.h"
+
+extern struct termios tmode, omode;
-extern struct sgttyb tmode;
-extern struct tchars tc;
-extern struct ltchars ltc;
+static void compatflags __P((long));
/*
* Get a table entry.
@@ -70,7 +72,7 @@ gettable(name, buf)
if (cgetent(&buf, dba, name) != 0)
return;
- for (sp = gettystrs; sp->field; sp++)
+ for (sp = gettystrs; sp->field; sp++)
cgetstr(buf, sp->field, &sp->value);
for (np = gettynums; np->field; np++) {
if (cgetnum(buf, np->field, &n) == -1)
@@ -147,11 +149,11 @@ charnames[] = {
static char *
charvars[] = {
- &tmode.sg_erase, &tmode.sg_kill, &tc.t_intrc,
- &tc.t_quitc, &tc.t_startc, &tc.t_stopc,
- &tc.t_eofc, &tc.t_brkc, &ltc.t_suspc,
- &ltc.t_dsuspc, &ltc.t_rprntc, &ltc.t_flushc,
- &ltc.t_werasc, &ltc.t_lnextc, 0
+ &tmode.c_cc[VERASE], &tmode.c_cc[VKILL], &tmode.c_cc[VINTR],
+ &tmode.c_cc[VQUIT], &tmode.c_cc[VSTART], &tmode.c_cc[VSTOP],
+ &tmode.c_cc[VEOF], &tmode.c_cc[VEOL], &tmode.c_cc[VSUSP],
+ &tmode.c_cc[VDSUSP], &tmode.c_cc[VREPRINT], &tmode.c_cc[VDISCARD],
+ &tmode.c_cc[VWERASE], &tmode.c_cc[VLNEXT], 0
};
void
@@ -165,86 +167,320 @@ setchars()
if (p && *p)
*charvars[i] = *p;
else
- *charvars[i] = '\377';
+ *charvars[i] = _POSIX_VDISABLE;
}
}
-long
+/* Macros to clear/set/test flags. */
+#define SET(t, f) (t) |= (f)
+#define CLR(t, f) (t) &= ~(f)
+#define ISSET(t, f) ((t) & (f))
+
+void
setflags(n)
int n;
{
- register long f;
+ register tcflag_t iflag, oflag, cflag, lflag;
+#ifdef COMPAT_43
switch (n) {
case 0:
- if (F0set)
- return(F0);
+ if (F0set) {
+ compatflags(F0);
+ return;
+ }
break;
case 1:
- if (F1set)
- return(F1);
+ if (F1set) {
+ compatflags(F1);
+ return;
+ }
break;
default:
- if (F2set)
- return(F2);
+ if (F2set) {
+ compatflags(F2);
+ return;
+ }
break;
}
+#endif
- f = 0;
+ switch (n) {
+ case 0:
+ if (C0set && I0set && L0set && O0set) {
+ tmode.c_cflag = C0;
+ tmode.c_iflag = I0;
+ tmode.c_lflag = L0;
+ tmode.c_oflag = O0;
+ return;
+ }
+ break;
+ case 1:
+ if (C1set && I1set && L1set && O1set) {
+ tmode.c_cflag = C1;
+ tmode.c_iflag = I1;
+ tmode.c_lflag = L1;
+ tmode.c_oflag = O1;
+ return;
+ }
+ break;
+ default:
+ if (C2set && I2set && L2set && O2set) {
+ tmode.c_cflag = C2;
+ tmode.c_iflag = I2;
+ tmode.c_lflag = L2;
+ tmode.c_oflag = O2;
+ return;
+ }
+ break;
+ }
- if (AP)
- f |= ANYP;
- else if (OP)
- f |= ODDP;
- else if (EP)
- f |= EVENP;
+ iflag = omode.c_iflag;
+ oflag = omode.c_oflag;
+ cflag = omode.c_cflag;
+ lflag = omode.c_lflag;
+
+ if (NP) {
+ CLR(cflag, CSIZE|PARENB);
+ SET(cflag, CS8);
+ CLR(iflag, ISTRIP|INPCK|IGNPAR);
+ } else if (AP || EP || OP) {
+ CLR(cflag, CSIZE);
+ SET(cflag, CS7|PARENB);
+ SET(iflag, ISTRIP);
+ if (OP && !EP) {
+ SET(iflag, INPCK|IGNPAR);
+ SET(cflag, PARODD);
+ if (AP)
+ CLR(iflag, INPCK);
+ } else if (EP && !OP) {
+ SET(iflag, INPCK|IGNPAR);
+ CLR(cflag, PARODD);
+ if (AP)
+ CLR(iflag, INPCK);
+ } else if (AP || EP && OP) {
+ CLR(iflag, INPCK|IGNPAR);
+ CLR(cflag, PARODD);
+ }
+ } /* else, leave as is */
+#if 0
if (UC)
f |= LCASE;
+#endif
- if (NL)
- f |= CRMOD;
-
- f |= delaybits();
+ if (HC)
+ SET(cflag, HUPCL);
+ else
+ CLR(cflag, HUPCL);
- if (n == 1) { /* read mode flags */
- if (RW)
- f |= RAW;
- else
- f |= CBREAK;
- return (f);
+ if (MB)
+ SET(cflag, MDMBUF);
+ else
+ CLR(cflag, MDMBUF);
+
+ if (NL) {
+ SET(iflag, ICRNL);
+ SET(oflag, ONLCR|OPOST);
+ } else {
+ CLR(iflag, ICRNL);
+ CLR(oflag, ONLCR);
}
if (!HT)
- f |= XTABS;
+ SET(oflag, OXTABS|OPOST);
+ else
+ CLR(oflag, OXTABS);
+
+#ifdef XXX_DELAY
+ SET(f, delaybits());
+#endif
+
+ if (n == 1) { /* read mode flags */
+ if (RW) {
+ iflag = 0;
+ CLR(oflag, OPOST);
+ CLR(cflag, CSIZE|PARENB);
+ SET(cflag, CS8);
+ lflag = 0;
+ } else {
+ CLR(lflag, ICANON);
+ }
+ goto out;
+ }
if (n == 0)
- return (f);
+ goto out;
+#if 0
if (CB)
- f |= CRTBS;
+ SET(f, CRTBS);
+#endif
if (CE)
- f |= CRTERA;
+ SET(lflag, ECHOE);
+ else
+ CLR(lflag, ECHOE);
if (CK)
- f |= CRTKIL;
+ SET(lflag, ECHOKE);
+ else
+ CLR(lflag, ECHOKE);
if (PE)
- f |= PRTERA;
+ SET(lflag, ECHOPRT);
+ else
+ CLR(lflag, ECHOPRT);
if (EC)
- f |= ECHO;
+ SET(lflag, ECHO);
+ else
+ CLR(lflag, ECHO);
if (XC)
- f |= CTLECH;
+ SET(lflag, ECHOCTL);
+ else
+ CLR(lflag, ECHOCTL);
if (DX)
- f |= DECCTQ;
+ SET(lflag, IXANY);
+ else
+ CLR(lflag, IXANY);
- return (f);
+out:
+ tmode.c_iflag = iflag;
+ tmode.c_oflag = oflag;
+ tmode.c_cflag = cflag;
+ tmode.c_lflag = lflag;
}
+#ifdef COMPAT_43
+/*
+ * Old TTY => termios, snatched from <sys/kern/tty_compat.c>
+ */
+void
+compatflags(flags)
+register long flags;
+{
+ register tcflag_t iflag, oflag, cflag, lflag;
+
+ iflag = BRKINT|ICRNL|IMAXBEL|IXON|IXANY;
+ oflag = OPOST|ONLCR|OXTABS;
+ cflag = CREAD;
+ lflag = ICANON|ISIG|IEXTEN;
+
+ if (ISSET(flags, TANDEM))
+ SET(iflag, IXOFF);
+ else
+ CLR(iflag, IXOFF);
+ if (ISSET(flags, ECHO))
+ SET(lflag, ECHO);
+ else
+ CLR(lflag, ECHO);
+ if (ISSET(flags, CRMOD)) {
+ SET(iflag, ICRNL);
+ SET(oflag, ONLCR);
+ } else {
+ CLR(iflag, ICRNL);
+ CLR(oflag, ONLCR);
+ }
+ if (ISSET(flags, XTABS))
+ SET(oflag, OXTABS);
+ else
+ CLR(oflag, OXTABS);
+
+
+ if (ISSET(flags, RAW)) {
+ iflag &= IXOFF;
+ CLR(lflag, ISIG|ICANON|IEXTEN);
+ CLR(cflag, PARENB);
+ } else {
+ SET(iflag, BRKINT|IXON|IMAXBEL);
+ SET(lflag, ISIG|IEXTEN);
+ if (ISSET(flags, CBREAK))
+ CLR(lflag, ICANON);
+ else
+ SET(lflag, ICANON);
+ switch (ISSET(flags, ANYP)) {
+ case 0:
+ CLR(cflag, PARENB);
+ break;
+ case ANYP:
+ SET(cflag, PARENB);
+ CLR(iflag, INPCK);
+ break;
+ case EVENP:
+ SET(cflag, PARENB);
+ SET(iflag, INPCK);
+ CLR(cflag, PARODD);
+ break;
+ case ODDP:
+ SET(cflag, PARENB);
+ SET(iflag, INPCK);
+ SET(cflag, PARODD);
+ break;
+ }
+ }
+
+ /* Nothing we can do with CRTBS. */
+ if (ISSET(flags, PRTERA))
+ SET(lflag, ECHOPRT);
+ else
+ CLR(lflag, ECHOPRT);
+ if (ISSET(flags, CRTERA))
+ SET(lflag, ECHOE);
+ else
+ CLR(lflag, ECHOE);
+ /* Nothing we can do with TILDE. */
+ if (ISSET(flags, MDMBUF))
+ SET(cflag, MDMBUF);
+ else
+ CLR(cflag, MDMBUF);
+ if (ISSET(flags, NOHANG))
+ CLR(cflag, HUPCL);
+ else
+ SET(cflag, HUPCL);
+ if (ISSET(flags, CRTKIL))
+ SET(lflag, ECHOKE);
+ else
+ CLR(lflag, ECHOKE);
+ if (ISSET(flags, CTLECH))
+ SET(lflag, ECHOCTL);
+ else
+ CLR(lflag, ECHOCTL);
+ if (!ISSET(flags, DECCTQ))
+ SET(iflag, IXANY);
+ else
+ CLR(iflag, IXANY);
+ CLR(lflag, TOSTOP|FLUSHO|PENDIN|NOFLSH);
+ SET(lflag, ISSET(flags, TOSTOP|FLUSHO|PENDIN|NOFLSH));
+
+ if (ISSET(flags, RAW|LITOUT|PASS8)) {
+ CLR(cflag, CSIZE);
+ SET(cflag, CS8);
+ if (!ISSET(flags, RAW|PASS8))
+ SET(iflag, ISTRIP);
+ else
+ CLR(iflag, ISTRIP);
+ if (!ISSET(flags, RAW|LITOUT))
+ SET(oflag, OPOST);
+ else
+ CLR(oflag, OPOST);
+ } else {
+ CLR(cflag, CSIZE);
+ SET(cflag, CS7);
+ SET(iflag, ISTRIP);
+ SET(oflag, OPOST);
+ }
+
+ tmode.c_iflag = iflag;
+ tmode.c_oflag = oflag;
+ tmode.c_cflag = cflag;
+ tmode.c_lflag = lflag;
+}
+#endif
+
+#ifdef XXX_DELAY
struct delayval {
unsigned delay; /* delay in ms */
int bits;
@@ -314,6 +550,7 @@ adelay(ms, dp)
dp++;
return (dp->bits);
}
+#endif
char editedhost[32];
@@ -357,47 +594,6 @@ edithost(pat)
editedhost[sizeof editedhost - 1] = '\0';
}
-struct speedtab {
- int speed;
- int uxname;
-} speedtab[] = {
- { 50, B50 },
- { 75, B75 },
- { 110, B110 },
- { 134, B134 },
- { 150, B150 },
- { 200, B200 },
- { 300, B300 },
- { 600, B600 },
- { 1200, B1200 },
- { 1800, B1800 },
- { 2400, B2400 },
- { 4800, B4800 },
- { 9600, B9600 },
- { 19200, EXTA },
- { 19, EXTA }, /* for people who say 19.2K */
- { 38400, EXTB },
- { 38, EXTB },
- { 7200, EXTB }, /* alternative */
- { 0 }
-};
-
-int
-speed(val)
- int val;
-{
- register struct speedtab *sp;
-
- if (val <= 15)
- return (val);
-
- for (sp = speedtab; sp->speed; sp++)
- if (sp->speed == val)
- return (sp->uxname);
-
- return (B300); /* default in impossible cases */
-}
-
void
makeenv(env)
char *env[];
@@ -488,9 +684,8 @@ autobaud()
int rfds;
struct timeval timeout;
char c, *type = "9600-baud";
- int null = 0;
- ioctl(0, TIOCFLUSH, &null);
+ (void)tcflush(0, TCIOFLUSH);
rfds = 1 << 0;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
@@ -503,7 +698,7 @@ autobaud()
timeout.tv_usec = 20;
(void) select(32, (fd_set *)NULL, (fd_set *)NULL,
(fd_set *)NULL, &timeout);
- ioctl(0, TIOCFLUSH, &null);
+ (void)tcflush(0, TCIOFLUSH);
switch (c & 0377) {
case 0200: /* 300-baud */
diff --git a/libexec/getty/ttys.5 b/libexec/getty/ttys.5
index cbbdbb6..5928782 100644
--- a/libexec/getty/ttys.5
+++ b/libexec/getty/ttys.5
@@ -29,7 +29,8 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.\" @(#)ttys.5 8.1 (Berkeley) 6/4/93
+.\" from: @(#)ttys.5 8.1 (Berkeley) 6/4/93
+.\" $Id: ttys.5,v 1.6 1994/08/17 20:10:41 pk Exp $
.\"
.Dd June 4, 1993
.Dt TTYS 5
@@ -96,6 +97,18 @@ should (should not) execute the command given in the second field,
while ``secure'' (if ``on'' is also specified) allows users with a
uid of 0 to login on
this line.
+The flags ``local'', ``rtscts'', ``mdmbuf'', and ``softcar''
+modify the default behaviour of the terminal line, and their actions
+are driver dependent.
+The ``local'' flag causes the driver to
+treat the line as if it locally connected.
+The ``rtscts'' flag
+instructs the driver to use RTS/CTS hardware flow control, if
+possible.
+The ``mdmbuf'' flag instructs the driver to use
+DTR/DCD flow control, if possible.
+The ``softcar'' flag causes the driver to ignore
+hardware carrier on the line.
These flag fields should not be quoted.
.Pp
The string ``window='' may be followed by a quoted command
@@ -131,7 +144,8 @@ ttyp1 none network off
.Xr gettytab 5 ,
.Xr termcap 5 ,
.Xr getty 8 ,
-.Xr init 8
+.Xr init 8 ,
+.Xr ttyflags 8
.Sh HISTORY
A
.Nm
OpenPOWER on IntegriCloud