getty(8): Sync with FreeBSD.
authorSascha Wildner <saw@online.de>
Sat, 7 Apr 2018 19:37:05 +0000 (21:37 +0200)
committerSascha Wildner <saw@online.de>
Sat, 7 Apr 2018 19:37:05 +0000 (21:37 +0200)
* Change gettytab's 'he' capability to accept a POSIX extended regexp
  to mess with the system's hostname better (r313107).

* Add a new 'iM' capability to specify a program to be run that
  generates the banner message displayed before the login prompt.
  This extends the functionality of 'im'.

* Do not loop indefinitely if the device node doesn't exist (think
  USB serial adapters e.g.).

* Various bug fixes and minor issue adjustments.

libexec/getty/Makefile
libexec/getty/chat.c
libexec/getty/extern.h
libexec/getty/getty.8
libexec/getty/gettytab.5
libexec/getty/gettytab.h
libexec/getty/init.c
libexec/getty/main.c
libexec/getty/pathnames.h
libexec/getty/subr.c
libexec/getty/ttys.5

index ed85691..554dbb3 100644 (file)
@@ -1,6 +1,5 @@
 #      from: @(#)Makefile      8.1 (Berkeley) 6/4/93
-# $FreeBSD: src/libexec/getty/Makefile,v 1.9.2.1 2001/04/25 10:40:52 ru Exp $
-# $DragonFly: src/libexec/getty/Makefile,v 1.2 2003/06/17 04:27:07 dillon Exp $
+# $FreeBSD: head/libexec/getty/Makefile 329724 2018-02-21 15:57:24Z trasz $
 
 PROG=  getty
 SRCS=  main.c init.c subr.c chat.c
index f16f1c0..b7435a3 100644 (file)
  * Modem chat module - send/expect style functions for getty
  * For semi-intelligent modem handling.
  *
- * $FreeBSD: src/libexec/getty/chat.c,v 1.6 1999/08/28 00:09:34 peter Exp $
- * $DragonFly: src/libexec/getty/chat.c,v 1.6 2007/11/25 18:10:06 swildner Exp $
+ * $FreeBSD: head/libexec/getty/chat.c 329724 2018-02-21 15:57:24Z trasz $
  */
 
-#include <sys/param.h>
-#include <sys/stat.h>
+#include <sys/types.h>
 #include <sys/ioctl.h>
-#include <sys/resource.h>
-#include <sys/ttydefaults.h>
 #include <sys/utsname.h>
+
 #include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <libutil.h>
-#include <locale.h>
-#include <setjmp.h>
 #include <signal.h>
 #include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
-#include <time.h>
-#include <termios.h>
 #include <unistd.h>
-#include <sys/socket.h>
 
 #include "gettytab.h"
 #include "extern.h"
@@ -67,15 +56,15 @@ static int chat_alarm = CHAT_DEFAULT_TIMEOUT; /* Default */
 static volatile int alarmed = 0;
 
 
-static void   chat_alrm (int);
-static int    chat_unalarm (void);
-static int    getdigit (unsigned char **, int, int);
-static char   **read_chat (char **);
-static char   *cleanchr (char **, unsigned char);
-static char   *cleanstr (const unsigned char *, int);
-static const char *result (int);
-static int    chat_expect (const char *);
-static int    chat_send (char const *);
+static void   chat_alrm(int);
+static int    chat_unalarm(void);
+static int    getdigit(unsigned char **, int, int);
+static char   **read_chat(char **);
+static char   *cleanchr(char **, unsigned char);
+static const char *cleanstr(const unsigned char *, int);
+static const char *result(int);
+static int    chat_expect(const char *);
+static int    chat_send(char const *);
 
 
 /*
@@ -86,7 +75,7 @@ static int    chat_send (char const *);
  */
 
 static void
-chat_alrm(int signo)
+chat_alrm(int signo __unused)
 {
        int on = 1;
 
@@ -281,7 +270,7 @@ cleanchr(char **buf, unsigned char ch)
  * clean a string for display (ctrl/meta characters)
  */
 
-static char *
+static const char *
 cleanstr(const unsigned char *s, int l)
 {
        static unsigned char * tmp = NULL;
@@ -292,7 +281,7 @@ cleanstr(const unsigned char *s, int l)
 
        if (tmp == NULL) {
                tmplen = 0;
-               return (char *)"(mem alloc error)";
+               return "(mem alloc error)";
        } else {
                int i = 0;
                char * p = tmp;
@@ -307,7 +296,7 @@ cleanstr(const unsigned char *s, int l)
 
 
 /*
- * return result as an pseudo-english word
+ * return result as a pseudo-english word
  */
 
 static const char *
index b7f0237..77dcb8d 100644 (file)
@@ -1,4 +1,6 @@
-/*
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
  * Copyright (c) 1993
  *     The Regents of the University of California.  All rights reserved.
  *
  * SUCH DAMAGE.
  *
  *     from: @(#)extern.h      8.1 (Berkeley) 6/4/93
- * $FreeBSD: src/libexec/getty/extern.h,v 1.7 2000/01/28 07:12:02 bde Exp $
- * $DragonFly: src/libexec/getty/extern.h,v 1.3 2003/11/14 03:54:30 dillon Exp $
+ * $FreeBSD: head/libexec/getty/extern.h 328858 2018-02-04 19:05:13Z trasz $
  */
 
 struct delayval;
 struct termios;
-struct gettyflags;
-struct gettynums;
-struct gettystrs;
 
+extern char **environ;
+extern char editedhost[];
 extern char hostname[];
-extern int hopcount;
 extern struct termios tmode, omode;
 extern struct gettyflags gettyflags[];
 extern struct gettynums gettynums[];
 extern struct gettystrs gettystrs[];
 
-int     adelay (int, struct delayval *);
-const char *autobaud (void);
-int     delaybits (void);
-void    edithost (const char *);
-void    gendefaults (void);
-void    gettable (const char *, char *);
-void    makeenv (char *[]);
-const char *portselector (void);
-void    set_ttydefaults (int);
-void    setchars (void);
-void    setdefaults (void);
-void    set_flags (int);
-int     speed (int);
-int     getty_chat (char *, int, int);
+int     adelay(int, struct delayval *);
+const char *autobaud(void);
+int     delaybits(void);
+void    edithost(const char *);
+void    gendefaults(void);
+void    gettable(const char *, char *);
+void    makeenv(char *[]);
+const char *portselector(void);
+void    set_ttydefaults(int);
+void    setchars(void);
+void    setdefaults(void);
+void    set_flags(int);
+int     speed(int);
+int     getty_chat(char *, int, int);
index 3bec2f4..83c73ad 100644 (file)
 .\" SUCH DAMAGE.
 .\"
 .\"     from: @(#)getty.8      8.1 (Berkeley) 6/4/93
-.\" $FreeBSD: src/libexec/getty/getty.8,v 1.10.2.3 2001/08/16 10:44:15 ru Exp $
-.\" $DragonFly: src/libexec/getty/getty.8,v 1.4 2006/02/17 19:33:31 swildner Exp $
-.\" "
-.Dd June 4, 1993
+.\" $FreeBSD: head/libexec/getty/getty.8 330277 2018-03-02 14:16:19Z trasz $
+.\"
+.Dd April 7, 2018
 .Dt GETTY 8
 .Os
 .Sh NAME
@@ -44,8 +43,7 @@
 .Sh DESCRIPTION
 The
 .Nm
-program
-is called by
+utility is called by
 .Xr init 8
 to open and initialize the tty line, read a login name, and invoke
 .Xr login 1 .
@@ -89,8 +87,7 @@ table.
 .Pp
 The
 .Nm
-program
-can be set to timeout after some interval,
+utility can be set to timeout after some interval,
 which will cause dial up lines to hang up
 if the login name is not entered reasonably quickly.
 .Sh FILES
@@ -119,9 +116,10 @@ does not exist.
 .Xr tty 4 ,
 .Xr gettytab 5 ,
 .Xr ttys 5 ,
-.Xr init 8
+.Xr init 8 ,
+.Xr pstat 8
 .Sh HISTORY
 A
 .Nm
-program appeared in
+utility appeared in
 .At v6 .
index f77b806..20d5c70 100644 (file)
@@ -26,9 +26,9 @@
 .\" SUCH DAMAGE.
 .\"
 .\"     from: @(#)gettytab.5   8.4 (Berkeley) 4/19/94
-.\" $FreeBSD: src/libexec/getty/gettytab.5,v 1.21.2.10 2003/02/06 11:45:31 sobomax Exp $
+.\" $FreeBSD: head/libexec/getty/gettytab.5 330022 2018-02-26 17:51:18Z trasz $
 .\"
-.Dd April 19, 1994
+.Dd April 7, 2018
 .Dt GETTYTAB 5
 .Os
 .Sh NAME
@@ -54,10 +54,10 @@ Each entry in the data base
 is used to describe one class of terminals.
 .Pp
 There is a default terminal class,
-.Em default ,
+.Va default ,
 that is used to set global defaults for all other classes.
 (That is, the
-.Em default
+.Va default
 entry is read, then the entry for the class required
 is used to override particular settings.)
 .Sh CAPABILITIES
@@ -65,10 +65,10 @@ Refer to
 .Xr termcap 5
 for a description of the file layout.
 The
-.Em default
+.Va default
 column below lists defaults obtained if there is
 no entry in the table obtained, nor one in the special
-.Em default
+.Va default
 table.
 .Bl -column Name Type /usr/bin/login
 .It Sy "Name   Type    Default Description"
@@ -86,32 +86,33 @@ table.
 .It "co        bool    false   console - add"
 .Ql \en
 after login prompt
-.It "ct        num     10      chat timeout for ac/ic scripts"
+.It "ct        num     10      chat timeout for"
+.Va \&ac
+and
+.Va \&ic
+scripts
 .It "dc        num     0       chat debug bitmask"
 .It "de        num     0       delay secs and flush input before writing first prompt"
 .It "df        str     %+      the" Xr strftime 3 "format used for \&%d in the banner message"
-.It "ds        str" Ta So Li ^Y Sc Ta
-.No "delayed suspend character"
+.It "ds        str" Ta So Li ^Y
+.Sc Ta No "delayed suspend character"
 .It "dx        bool    false   set"
 .Dv DECCTLQ
 .It "ec        bool    false   leave echo"
-.Tn OFF
+.Em OFF
 .It "ep        bool    false   terminal uses even parity"
-.It "er        str" Ta So Li ^? Sc Ta
-.No "erase character"
-.It "et        str" Ta So Li ^D Sc Ta
-.No "end of text"
+.It "er        str" Ta So Li ^?
+.Sc Ta No "erase character"
+.It "et        str" Ta So Li ^D
+.Sc Ta No "end of text"
 .Pq Dv EOF
 character
 .It "ev        str" Ta Dv NULL Ta
 .No "initial environment"
-.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 "fl        str" Ta So Li ^O Sc Ta
-.No "output flush character"
+.It "fl        str" Ta So Li ^O
+.Sc Ta No "output flush character"
 .It "hc        bool    false   do"
-.Tn NOT
+.Em NOT
 hangup line on last close
 .It "he        str" Ta Dv NULL Ta
 .No "hostname editing string"
@@ -126,60 +127,64 @@ hangup line on last close
 .It "ig        bool    false   ignore garbage characters in login name"
 .It "im        str" Ta Dv NULL Ta
 .No "initial (banner) message"
-.It "in        str" Ta So Li ^C Sc Ta
-.No "interrupt character"
+.It "iM        str" Ta Dv NULL Ta
+.No "execute named file to generate initial (banner) message"
+.It "in        str" Ta So Li ^C
+.Sc Ta No "interrupt character"
 .It "is        num     unused  input speed"
-.It "kl        str" Ta So Li ^U Sc Ta
-.No "kill character"
+.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 "lm        str     login:  login prompt"
-.It "ln        str" Ta So Li ^V Sc Ta
-.No "``literal next'' character"
+.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 "mb        bool    false   do flow control based on carrier"
 .It "nc        bool    false   terminal does not supply carrier (set clocal)"
 .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 "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
-.No "pad character"
+.It "pc        str" Ta So Li \e0
+.Sc Ta No "pad character"
 .It "pe        bool    false   use printer (hard copy) erase algorithm"
 .It "pf        num     0       delay"
 between first prompt and following flush (seconds)
-.It "pp        str     unused  PPP authentication program"
-.It "pl        bool    false   don't detect PPP sequence, but start PPP login"
-program referenced by pp automatically
+.It "pl        bool    false   start PPP login program unconditionally if"
+.Va \&pp
+is specified
+.It "pp        str     unused  PPP login program"
 .It "ps        bool    false   line connected to a"
 .Tn MICOM
 port selector
-.It "qu        str" Ta So Li \&^\e Sc Ta
-.No "quit character"
-.It "rp        str" Ta So Li ^R Sc Ta
-.No "line retype character"
-.It "rt        num     unused  ring timeout when using ac"
+.It "qu        str" Ta So Li \&^\e
+.Sc Ta No "quit character"
+.It "rp        str" Ta So Li ^R
+.Sc Ta No "line retype character"
+.It "rt        num     unused  ring timeout when using"
+.Va \&ac
 .It "rw        bool    false   do"
-.Tn NOT
+.Em NOT
 use raw for input, use cbreak
 .It "sp        num     unused  line speed (input and output)"
-.It "su        str" Ta So Li ^Z Sc Ta
-.No "suspend character"
+.It "su        str" Ta So Li ^Z
+.Sc Ta No "suspend character"
 .It "tc        str     none    table continuation"
 .It "to        num     0       timeout (seconds)"
 .It "tt        str" Ta Dv NULL Ta
 .No "terminal type (for environment)"
 .It "ub        bool    false   do unbuffered output (of prompts etc)"
-.It "we        str" Ta So Li ^W Sc Ta
-.No "word erase character"
+.It "we        str" Ta So Li ^W
+.Sc Ta No "word erase character"
 .It "xc        bool    false   do"
-.Tn NOT
+.Em NOT
 echo control chars as
 .Ql ^X
 .It "xf        str" Ta So Li ^S Sc Ta Dv XOFF
@@ -190,11 +195,14 @@ echo control chars as
 .El
 .Pp
 The following capabilities are no longer supported by
-.Xr getty 8 Ns :
+.Xr getty 8 :
 .Bl -column Name Type /usr/bin/login
 .It "bd        num     0       backspace delay"
 .It "cb        bool    false   use crt backspace mode"
 .It "cd        num     0       carriage-return delay"
+.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 "lc        bool    false   terminal has lower case"
 .It "nd        num     0       newline (line-feed) delay"
@@ -213,48 +221,39 @@ 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 \&c0 ,
-.Em \&c1 ,
-.Em \&c2 ,
-.Em \&i0 ,
-.Em \&i1 ,
-.Em \&i2 ,
-.Em \&l0 ,
-.Em \&l1 ,
-.Em \&l2 ,
-.Em \&o0 ,
-.Em \&o1 ,
+.Va \&c0 ,
+.Va \&c1 ,
+.Va \&c2 ,
+.Va \&i0 ,
+.Va \&i1 ,
+.Va \&i2 ,
+.Va \&l0 ,
+.Va \&l1 ,
+.Va \&l2 ,
+.Va \&o0 ,
+.Va \&o1 ,
 or
-.Em \&o2
+.Va \&o2
 numeric specifications, which can be used to specify
 (usually in octal, with a leading '0')
 the exact values of the flags.
 These flags correspond to the termios
-.Em c_cflag ,
-.Em c_iflag ,
-.Em c_lflag ,
+.Va c_cflag ,
+.Va c_iflag ,
+.Va 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.
+.Va c_oflag
+fields, respectively.
+Each these sets must be completely specified to be effective.
 .Pp
 Should
 .Xr getty 8
 receive a null character
 (presumed to indicate a line break)
 it will restart using the table indicated by the
-.Em nx
-entry. If there is none, it will re-use its original table.
+.Va \&nx
+entry.
+If there is none, it will re-use its original table.
 .Pp
 Delays are specified in milliseconds, the nearest possible
 delay available in the tty driver will be used.
@@ -263,17 +262,17 @@ with values 0, 1, 2, and 3 are interpreted as
 choosing that particular delay algorithm from the driver.
 .Pp
 The
-.Em \&cl
+.Va \&cl
 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 .
+.Va \&pc .
 .Pp
 The initial message, login message, and initial file;
-.Em \&im ,
-.Em \&lm
+.Va \&im ,
+.Va \&lm
 and
-.Em \&if
+.Va \&if
 may include any of the following character sequences, which expand to
 information about the environment in which
 .Xr getty 8
@@ -281,31 +280,26 @@ is running.
 .Bl -tag -offset indent -width \&%xxxxxxxxxxxxxx
 .It \&%d
 The current date and time formatted according to the
-.Em \&Lo
+.Va \&Lo
 and
-.Em \&df
+.Va \&df
 strings.
 .It \&%h
 The hostname of the machine, which is normally obtained from the
 system using
 .Xr gethostname 3 ,
 but may also be overridden by the
-.Em \&hn
+.Va \&hn
 table entry.
 In either case it may be edited with the
-.Em \&he
-string.
-A '@' in the
-.Em \&he
-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
-to be skipped.
-Each character that
-is neither '@' nor '#' is copied into the final hostname.
-Surplus '@' and '#' characters are ignored.
+.Va \&he
+POSIX
+.Dq extended
+regular expression, which is matched against the hostname.
+If there are no parenthesized subexpressions in the pattern,
+the entire matched string is used as the final hostname;
+otherwise, the first matched subexpression is used instead.
+If the pattern does not match, the original hostname is not modified.
 .It \&%t
 The tty name.
 .It "\&%m, \&%r, \&%s, \&%v"
@@ -321,24 +315,24 @@ character.
 .Pp
 When getty execs the login process, given
 in the
-.Em \&lo
+.Va \&lo
 string (usually
 .Dq Pa /usr/bin/login ) ,
 it will have set
 the environment to include the terminal type, as indicated
 by the
-.Em \&tt
+.Va \&tt
 string (if it exists).
 The
-.Em \&ev
+.Va \&ev
 string, can be used to enter additional data into
 the environment.
 It is a list of comma separated strings, each of which
 will presumably be of the form
-.Em name=value .
+.Li name=value .
 .Pp
 If a non-zero timeout is specified, with
-.Em \&to ,
+.Va \&to ,
 then getty will exit within the indicated
 number of seconds, either having
 received a login name and passed control
@@ -350,29 +344,40 @@ This may be useful to hangup dial in lines.
 Output from
 .Xr getty 8
 is even parity unless
-.Em \&op
+.Va \&op
 or
-.Em \&np
+.Va \&np
 is specified.
 The
-.Em \&op
+.Va \&op
 string
 may be specified with
-.Em \&ap
+.Va \&ap
 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 8
-does not check parity of input characters in
+The
+.Xr getty 8
+utility does not check parity of input characters in
 .Dv RAW
 mode.
 .Pp
-If
-.Em \&pp
-string is specified and a PPP link bring up sequence is recognized,
-getty will invoke the program referenced by the pp option.  This
-can be used to handle incoming PPP calls.
+If a
+.Va \&pp
+string is specified and a PPP link bring-up sequence is recognized,
+getty will invoke the program referenced by the
+.Va \&pp
+option.
+This can be used to handle incoming PPP calls.
+If the
+.Va \&pl
+option is true as well,
+.Xr getty 8
+will skip the user name prompt and the PPP detection phase, and will
+invoke the program specified by
+.Va \&pp
+instantly.
 .Pp
 .Nm Getty
 provides some basic intelligent modem handling by providing a chat
@@ -428,7 +433,7 @@ Hexadecimal values are, at most, 2 hex digits long, and octal
 values are a maximum of 3 octal digits.
 .Pp
 The
-.Em \&ic
+.Va \&ic
 chat sequence is used to initialize a modem or similar device.
 A typical example of an init chat script for a modem with a
 hayes compatible command set might look like this:
@@ -465,10 +470,11 @@ like:
 This causes the modem to answer the call via the "ATA" command,
 then scans input for a "CONNECT" string.
 If this is received before a
-.Em \&ct timeout, then a normal login sequence commences.
+.Va \&ct
+timeout, then a normal login sequence commences.
 .Pp
 The
-.Em \&ct
+.Va \&ct
 capability specifies a timeout for all send and expect strings.
 This timeout is set individually for each expect wait and send
 string and must be at least as long as the time it takes for
@@ -477,7 +483,7 @@ modem (usually around 10 seconds).
 .Pp
 In most situations, you will want to flush any additional
 input after the connection has been detected, and the
-.Em \&de
+.Va \&de
 capability may be used to do that, as well as delay for a
 short time after the connection has been established during
 which all of the connection data has been sent by the modem.
@@ -508,10 +514,6 @@ of the delay algorithms are not implemented.
 The terminal driver should support sane delay settings.
 .Pp
 The
-.Em \&he
-capability is stupid.
-.Pp
-The
 .Xr termcap 5
 format is horrid, something more rational should
 have been chosen.
index cf4f4bb..91bf5e2 100644 (file)
@@ -1,4 +1,6 @@
-/*
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
  * Copyright (c) 1983, 1993, 1994
  *     The Regents of the University of California.  All rights reserved.
  *
@@ -27,8 +29,7 @@
  * SUCH DAMAGE.
  *
  *     from: @(#)gettytab.h    8.2 (Berkeley) 3/30/94
- * $FreeBSD: src/libexec/getty/gettytab.h,v 1.10.2.3 2003/02/06 11:45:31 sobomax Exp $
- * $DragonFly: src/libexec/getty/gettytab.h,v 1.2 2003/06/17 04:27:07 dillon Exp $
+ * $FreeBSD: head/libexec/getty/gettytab.h 326025 2017-11-20 19:49:47Z pfg $
  */
 
 /*
@@ -89,6 +90,7 @@ struct gettyflags {
 #define AC     gettystrs[28].value
 #define AL     gettystrs[29].value
 #define DF     gettystrs[30].value
+#define IMP    gettystrs[31].value
 
 /*
  * Numeric definitions.
@@ -167,6 +169,7 @@ struct gettyflags {
 #define AB     gettyflags[19].value
 #define DX     gettyflags[20].value
 #define        NP      gettyflags[21].value
+#define        NPset   gettyflags[21].set
 #define        MB      gettyflags[22].value
 #define        HW      gettyflags[23].value
 #define        NC      gettyflags[24].value
index fff9157..876d324 100644 (file)
@@ -1,4 +1,6 @@
-/*
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
  * Copyright (c) 1983, 1993
  *     The Regents of the University of California.  All rights reserved.
  *
@@ -27,8 +29,7 @@
  * SUCH DAMAGE.
  *
  * @(#)from: init.c    8.1 (Berkeley) 6/4/93
- * $FreeBSD: src/libexec/getty/init.c,v 1.11.2.3 2003/02/06 11:45:31 sobomax Exp $
- * $DragonFly: src/libexec/getty/init.c,v 1.3 2005/05/07 20:00:20 corecode Exp $
+ * $FreeBSD: head/libexec/getty/init.c 328846 2018-02-04 13:58:31Z trasz $
  */
 
 /*
@@ -36,6 +37,7 @@
  *
  * Melbourne getty.
  */
+#include <stdio.h>
 #include <termios.h>
 #include "gettytab.h"
 #include "extern.h"
@@ -46,101 +48,104 @@ static char nullstr[] = "";
 static char loginprg[] = _PATH_LOGIN;
 static char datefmt[] = "%+";
 
+#define M(a) (&omode.c_cc[a])
+
 struct gettystrs gettystrs[] = {
-       { "nx" },                       /* next table */
-       { "cl" },                       /* screen clear characters */
-       { "im" },                       /* initial message */
-       { "lm", loginmsg },             /* login message */
-       { "er", &tmode.c_cc[VERASE] },  /* erase character */
-       { "kl", &tmode.c_cc[VKILL] },   /* kill character */
-       { "et", &tmode.c_cc[VEOF] },    /* eof chatacter (eot) */
-       { "pc", nullstr },              /* pad character */
-       { "tt" },                       /* terminal type */
-       { "ev" },                       /* enviroment */
-       { "lo", loginprg },             /* login program */
-       { "hn", hostname },             /* host name */
-       { "he" },                       /* host name edit */
-       { "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 */
-       { "Lo" },                       /* locale for strftime() */
-       { "pp" },                       /* ppp login program */
-       { "if" },                       /* sysv-like 'issue' filename */
-       { "ic" },                       /* modem init-chat */
-       { "ac" },                       /* modem answer-chat */
-       { "al" },                       /* user to auto-login */
-       { "df", datefmt},               /* format for strftime() */
-       { 0 }
+       { "nx", NULL, NULL },           /* next table */
+       { "cl", NULL, NULL },           /* screen clear characters */
+       { "im", NULL, NULL },           /* initial message */
+       { "lm", loginmsg, NULL },       /* login message */
+       { "er", M(VERASE), NULL },      /* erase character */
+       { "kl", M(VKILL), NULL },       /* kill character */
+       { "et", M(VEOF), NULL },        /* eof chatacter (eot) */
+       { "pc", nullstr, NULL },        /* pad character */
+       { "tt", NULL, NULL },           /* terminal type */
+       { "ev", NULL, NULL },           /* environment */
+       { "lo", loginprg, NULL },       /* login program */
+       { "hn", hostname, NULL },       /* host name */
+       { "he", NULL, NULL },           /* host name edit */
+       { "in", M(VINTR), NULL },       /* interrupt char */
+       { "qu", M(VQUIT), NULL },       /* quit char */
+       { "xn", M(VSTART), NULL },      /* XON (start) char */
+       { "xf", M(VSTOP), NULL },       /* XOFF (stop) char */
+       { "bk", M(VEOL), NULL },        /* brk char (alt \n) */
+       { "su", M(VSUSP), NULL },       /* suspend char */
+       { "ds", M(VDSUSP), NULL },      /* delayed suspend */
+       { "rp", M(VREPRINT), NULL },    /* reprint char */
+       { "fl", M(VDISCARD), NULL },    /* flush output */
+       { "we", M(VWERASE), NULL },     /* word erase */
+       { "ln", M(VLNEXT), NULL },      /* literal next */
+       { "Lo", NULL, NULL },           /* locale for strftime() */
+       { "pp", NULL, NULL },           /* ppp login program */
+       { "if", NULL, NULL },           /* sysv-like 'issue' filename */
+       { "ic", NULL, NULL },           /* modem init-chat */
+       { "ac", NULL, NULL },           /* modem answer-chat */
+       { "al", NULL, NULL },           /* user to auto-login */
+       { "df", datefmt, NULL },        /* format for strftime() */
+       { "iM" , NULL, NULL },          /* initial message program */
+       { NULL, NULL, NULL }
 };
 
 struct gettynums gettynums[] = {
-       { "is" },                       /* input speed */
-       { "os" },                       /* output speed */
-       { "sp" },                       /* both speeds */
-       { "nd" },                       /* newline delay */
-       { "cd" },                       /* carriage-return delay */
-       { "td" },                       /* tab delay */
-       { "fd" },                       /* form-feed delay */
-       { "bd" },                       /* backspace delay */
-       { "to" },                       /* timeout */
-       { "f0" },                       /* output flags */
-       { "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 */
-       { "de" },                       /* delay before sending 1st prompt */
-       { "rt" },                       /* reset timeout */
-       { "ct" },                       /* chat script timeout */
-       { "dc" },                       /* debug chat script value */
-       { 0 }
+       { "is", 0, 0, 0 },              /* input speed */
+       { "os", 0, 0, 0 },              /* output speed */
+       { "sp", 0, 0, 0 },              /* both speeds */
+       { "nd", 0, 0, 0 },              /* newline delay */
+       { "cd", 0, 0, 0 },              /* carriage-return delay */
+       { "td", 0, 0, 0 },              /* tab delay */
+       { "fd", 0, 0, 0 },              /* form-feed delay */
+       { "bd", 0, 0, 0 },              /* backspace delay */
+       { "to", 0, 0, 0 },              /* timeout */
+       { "f0", 0, 0, 0 },              /* output flags */
+       { "f1", 0, 0, 0 },              /* input flags */
+       { "f2", 0, 0, 0 },              /* user mode flags */
+       { "pf", 0, 0, 0 },              /* delay before flush at 1st prompt */
+       { "c0", 0, 0, 0 },              /* output c_flags */
+       { "c1", 0, 0, 0 },              /* input c_flags */
+       { "c2", 0, 0, 0 },              /* user mode c_flags */
+       { "i0", 0, 0, 0 },              /* output i_flags */
+       { "i1", 0, 0, 0 },              /* input i_flags */
+       { "i2", 0, 0, 0 },              /* user mode i_flags */
+       { "l0", 0, 0, 0 },              /* output l_flags */
+       { "l1", 0, 0, 0 },              /* input l_flags */
+       { "l2", 0, 0, 0 },              /* user mode l_flags */
+       { "o0", 0, 0, 0 },              /* output o_flags */
+       { "o1", 0, 0, 0 },              /* input o_flags */
+       { "o2", 0, 0, 0 },              /* user mode o_flags */
+       { "de", 0, 0, 0 },              /* delay before sending 1st prompt */
+       { "rt", 0, 0, 0 },              /* reset timeout */
+       { "ct", 0, 0, 0 },              /* chat script timeout */
+       { "dc", 0, 0, 0 },              /* debug chat script value */
+       { NULL, 0, 0, 0 }
 };
   
 
 struct gettyflags gettyflags[] = {
-       { "ht", 0 },                    /* has tabs */
-       { "nl", 1 },                    /* has newline char */
-       { "ep", 0 },                    /* even parity */
-       { "op", 0 },                    /* odd parity */
-       { "ap", 0 },                    /* any parity */
-       { "ec", 1 },                    /* no echo */
-       { "co", 0 },                    /* console special */
-       { "cb", 0 },                    /* crt backspace */
-       { "ck", 0 },                    /* crt kill */
-       { "ce", 0 },                    /* crt erase */
-       { "pe", 0 },                    /* printer erase */
-       { "rw", 1 },                    /* don't use raw */
-       { "xc", 1 },                    /* don't ^X ctl chars */
-       { "lc", 0 },                    /* terminal las lower case */
-       { "uc", 0 },                    /* terminal has no lower case */
-       { "ig", 0 },                    /* ignore garbage */
-       { "ps", 0 },                    /* do port selector speed select */
-       { "hc", 1 },                    /* don't set hangup on close */
-       { "ub", 0 },                    /* unbuffered output */
-       { "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 */
-       { "hw", 0 },                    /* do CTSRTS flow control */
-       { "nc", 0 },                    /* set clocal (no carrier) */
-       { "pl", 0 },                    /* use PPP instead of login(1) */
-       { 0 }
+       { "ht", 0, 0, 0, 0 },           /* has tabs */
+       { "nl", 1, 0, 0, 0 },           /* has newline char */
+       { "ep", 0, 0, 0, 0 },           /* even parity */
+       { "op", 0, 0, 0, 0 },           /* odd parity */
+       { "ap", 0, 0, 0, 0 },           /* any parity */
+       { "ec", 1, 0, 0, 0 },           /* no echo */
+       { "co", 0, 0, 0, 0 },           /* console special */
+       { "cb", 0, 0, 0, 0 },           /* crt backspace */
+       { "ck", 0, 0, 0, 0 },           /* crt kill */
+       { "ce", 0, 0, 0, 0 },           /* crt erase */
+       { "pe", 0, 0, 0, 0 },           /* printer erase */
+       { "rw", 1, 0, 0, 0 },           /* don't use raw */
+       { "xc", 1, 0, 0, 0 },           /* don't ^X ctl chars */
+       { "lc", 0, 0, 0, 0 },           /* terminal las lower case */
+       { "uc", 0, 0, 0, 0 },           /* terminal has no lower case */
+       { "ig", 0, 0, 0, 0 },           /* ignore garbage */
+       { "ps", 0, 0, 0, 0 },           /* do port selector speed select */
+       { "hc", 1, 0, 0, 0 },           /* don't set hangup on close */
+       { "ub", 0, 0, 0, 0 },           /* unbuffered output */
+       { "ab", 0, 0, 0, 0 },           /* auto-baud detect with '\r' */
+       { "dx", 0, 0, 0, 0 },           /* set decctlq */
+       { "np", 0, 0, 0, 0 },           /* no parity at all (8bit chars) */
+       { "mb", 0, 0, 0, 0 },           /* do MDMBUF flow control */
+       { "hw", 0, 0, 0, 0 },           /* do CTSRTS flow control */
+       { "nc", 0, 0, 0, 0 },           /* set clocal (no carrier) */
+       { "pl", 0, 0, 0, 0 },           /* use PPP instead of login(1) */
+       { NULL, 0, 0, 0, 0 }
 };
index b9a241b..b05e8e9 100644 (file)
@@ -1,4 +1,6 @@
 /*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
  * Copyright (c) 1980, 1993
  *     The Regents of the University of California.  All rights reserved.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * @(#) Copyright (c) 1980, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)from: main.c    8.1 (Berkeley) 6/20/93
- * $FreeBSD: src/libexec/getty/main.c,v 1.28.2.4 2003/02/06 11:45:31 sobomax Exp $
+ * $FreeBSD: head/libexec/getty/main.c 329992 2018-02-25 20:15:06Z trasz $
  */
 
 #include <sys/param.h>
-#include <sys/stat.h>
 #include <sys/ioctl.h>
+#include <sys/time.h>
 #include <sys/resource.h>
+#include <sys/stat.h>
 #include <sys/ttydefaults.h>
 #include <sys/utsname.h>
+
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <locale.h>
 #include <libutil.h>
-#include <signal.h>
 #include <setjmp.h>
+#include <signal.h>
 #include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
@@ -52,8 +55,8 @@
 #include <unistd.h>
 
 #include "gettytab.h"
-#include "pathnames.h"
 #include "extern.h"
+#include "pathnames.h"
 
 /*
  * Set the amount of running time that getty should accumulate
 #define PPP_LCP_HI          0xc0  /* LCP protocol - high byte */
 #define PPP_LCP_LOW         0x21  /* LCP protocol - low byte */
 
-struct termios tmode, omode;
+/* original mode; flags've been reset using values from <sys/ttydefaults.h> */
+struct termios omode;
+/* current mode */
+struct termios tmode;
 
-int crmod, digit, lower, upper;
+static int crmod, digit, lower, upper;
 
 char   hostname[MAXHOSTNAMELEN];
-char   name[MAXLOGNAME*3];
-char   dev[] = _PATH_DEV;
-char   ttyn[32];
+static char    name[MAXLOGNAME*3];
+static char    dev[] = _PATH_DEV;
+static char    ttyn[32];
 
 #define        OBUFSIZ         128
 #define        TABBUFSIZ       512
 
-char   defent[TABBUFSIZ];
-char   tabent[TABBUFSIZ];
+static char    defent[TABBUFSIZ];
+static char    tabent[TABBUFSIZ];
+static const char      *tname;
 
-char   *env[128];
+static char    *env[128];
 
-char partab[] = {
+static char partab[] = {
        0001,0201,0201,0001,0201,0001,0001,0201,
        0202,0004,0003,0205,0005,0206,0201,0001,
        0201,0001,0001,0201,0001,0201,0201,0001,
@@ -116,7 +123,9 @@ char partab[] = {
 
 #define        puts    Gputs
 
+static void    defttymode(void);
 static void    dingdong(int);
+static void    dogettytab(void);
 static int     getname(void);
 static void    interrupt(int);
 static void    oflush(void);
@@ -127,23 +136,22 @@ static void       putpad(const char *);
 static void    puts(const char *);
 static void    timeoverrun(int);
 static char    *get_line(int);
-static void    setttymode(const char *, int);
-static void    setdefttymode(const char *);
+static void    setttymode(int);
 static int     opentty(const char *, int);
 
-jmp_buf timeout;
+static jmp_buf timeout;
 
 static void
-dingdong(int signo)
+dingdong(int signo __unused)
 {
        alarm(0);
        longjmp(timeout, 1);
 }
 
-jmp_buf        intrupt;
+static jmp_buf intrupt;
 
 static void
-interrupt(int signo)
+interrupt(int signo __unused)
 {
        longjmp(intrupt, 1);
 }
@@ -152,17 +160,16 @@ interrupt(int signo)
  * Action to take when getty is running too long.
  */
 static void
-timeoverrun(int signo)
+timeoverrun(int signo __unused)
 {
+
        syslog(LOG_ERR, "getty exiting due to excessive running time");
        exit(1);
 }
 
 int
-main(int argc, char **argv)
+main(int argc, char *argv[])
 {
-       extern  char **environ;
-       const char *tname;
        int first_sleep = 1, first_time = 1;
        struct rlimit limit;
        int rval;
@@ -207,14 +214,25 @@ main(int argc, char **argv)
                chmod(ttyn, 0600);
                revoke(ttyn);
 
-               gettable(tname, tabent);
+               /*
+                * Do the first scan through gettytab.
+                * Terminal mode parameters will be wrong until
+                * defttymode() called, but they're irrelevant for
+                * the initial setup of the terminal device.
+                */
+               dogettytab();
 
-               /* Init modem sequence has been specified
+               /*
+                * Init or answer modem sequence has been specified.
                 */
-               if (IC) {
+               if (IC || AC) {
                        if (!opentty(ttyn, O_RDWR|O_NONBLOCK))
                                exit(1);
-                       setdefttymode(tname);
+                       defttymode();
+                       setttymode(1);
+               }
+
+               if (IC) {
                        if (getty_chat(IC, CT, DC) > 0) {
                                syslog(LOG_ERR, "modem init problem on %s", ttyn);
                                (void)tcsetattr(STDIN_FILENO, TCSANOW, &tmode);
@@ -223,17 +241,15 @@ main(int argc, char **argv)
                }
 
                if (AC) {
-                       int i, rfds;
-                       struct timeval timeout;
+                       fd_set rfds;
+                       struct timeval to;
+                       int i;
 
-                       if (!opentty(ttyn, O_RDWR|O_NONBLOCK))
-                               exit(1);
-                       setdefttymode(tname);
-                       rfds = 1 << 0;  /* FD_SET */
-                       timeout.tv_sec = RT;
-                       timeout.tv_usec = 0;
-                       i = select(32, (fd_set*)&rfds, NULL,
-                                      NULL, RT ? &timeout : NULL);
+                       FD_ZERO(&rfds);
+                       FD_SET(0, &rfds);
+                       to.tv_sec = RT;
+                       to.tv_usec = 0;
+                       i = select(32, &rfds, NULL, NULL, RT ? &to : NULL);
                        if (i < 0) {
                                syslog(LOG_ERR, "select %s: %m", ttyn);
                        } else if (i == 0) {
@@ -254,29 +270,11 @@ main(int argc, char **argv)
            }
        }
 
-       /* Start with default tty settings */
-       if (tcgetattr(STDIN_FILENO, &tmode) < 0) {
-               syslog(LOG_ERR, "tcgetattr %s: %m", ttyn);
-               exit(1);
-       }
-       /*
-        * Don't rely on the driver too much, and initialize crucial
-        * things according to <sys/ttydefaults.h>.  Avoid clobbering
-        * the c_cc[] settings however, the console drivers might wish
-        * to leave their idea of the preferred VERASE key value
-        * there.
-        */
-       tmode.c_iflag = TTYDEF_IFLAG;
-       tmode.c_oflag = TTYDEF_OFLAG;
-       tmode.c_lflag = TTYDEF_LFLAG;
-       tmode.c_cflag = TTYDEF_CFLAG;
-       tmode.c_cflag |= (NC ? CLOCAL : 0);
-       omode = tmode;
-
+       defttymode();
        for (;;) {
 
                /*
-                * if a delay was specified then sleep for that 
+                * if a delay was specified then sleep for that
                 * number of seconds before writing the initial prompt
                 */
                if (first_sleep && DE) {
@@ -286,13 +284,15 @@ main(int argc, char **argv)
                }
                first_sleep = 0;
 
-               setttymode(tname, 0);
+               setttymode(0);
                if (AB) {
                        tname = autobaud();
+                       dogettytab();
                        continue;
                }
                if (PS) {
                        tname = portselector();
+                       dogettytab();
                        continue;
                }
                if (CL && *CL)
@@ -315,6 +315,8 @@ main(int argc, char **argv)
                }
                first_time = 0;
 
+               if (IMP && *IMP && !(PL && PP))
+                       system(IMP);
                if (IM && *IM && !(PL && PP))
                        putf(IM);
                if (setjmp(timeout)) {
@@ -327,6 +329,8 @@ main(int argc, char **argv)
                        signal(SIGALRM, dingdong);
                        alarm(TO);
                }
+
+               rval = 0;
                if (AL) {
                        const char *p = AL;
                        char *q = name;
@@ -337,7 +341,7 @@ main(int argc, char **argv)
                                else if (islower(*p))
                                        lower = 1;
                                else if (isdigit(*p))
-                                       digit++;
+                                       digit = 1;
                                *q++ = *p++;
                        }
                } else if (!(PL && PP))
@@ -357,12 +361,20 @@ main(int argc, char **argv)
                        oflush();
                        alarm(0);
                        signal(SIGALRM, SIG_DFL);
+                       if (name[0] == '\0')
+                               continue;
                        if (name[0] == '-') {
                                puts("user names may not start with '-'.");
                                continue;
                        }
-                       if (!(upper || lower || digit))
-                               continue;
+                       if (!(upper || lower || digit)) {
+                               if (AL) {
+                                       syslog(LOG_ERR,
+                                           "invalid auto-login name: %s", AL);
+                                       exit(1);
+                               } else
+                                       continue;
+                       }
                        set_flags(2);
                        if (crmod) {
                                tmode.c_iflag |= ICRNL;
@@ -394,71 +406,78 @@ main(int argc, char **argv)
                alarm(0);
                signal(SIGALRM, SIG_DFL);
                signal(SIGINT, SIG_IGN);
-               if (NX && *NX)
+               if (NX && *NX) {
                        tname = NX;
+                       dogettytab();
+               }
        }
 }
 
 static int
-opentty(const char *ttyn, int flags)
+opentty(const char *tty, int flags)
 {
-       int i, j = 0;
-       int failopenlogged = 0;
+       int failopenlogged = 0, i, saved_errno;
 
-       while (j < 10 && (i = open(ttyn, flags)) == -1)
+       while ((i = open(tty, flags)) == -1)
        {
-               if (((j % 10) == 0) && (errno != ENXIO || !failopenlogged)) {
-                       syslog(LOG_ERR, "open %s: %m", ttyn);
+               saved_errno = errno;
+               if (!failopenlogged) {
+                       syslog(LOG_ERR, "open %s: %m", tty);
                        failopenlogged = 1;
                }
-               j++;
+               if (saved_errno == ENOENT)
+                       return 0;
                sleep(60);
        }
-       if (i == -1) {
-               syslog(LOG_ERR, "open %s: %m", ttyn);
-               return 0;
-       }
-       else {
-               if (login_tty(i) < 0) { 
-                       if (daemon(0,0) < 0) {
-                               syslog(LOG_ERR,"daemon: %m");
-                               close(i);
-                               return 0;
-                       }
-                       if (login_tty(i) < 0) {
-                               syslog(LOG_ERR, "login_tty %s: %m", ttyn);
-                               close(i);
-                               return 0;
-                       }
+       if (login_tty(i) < 0) {
+               if (daemon(0,0) < 0) {
+                       syslog(LOG_ERR,"daemon: %m");
+                       close(i);
+                       return 0;
+               }
+               if (login_tty(i) < 0) {
+                       syslog(LOG_ERR, "login_tty %s: %m", tty);
+                       close(i);
+                       return 0;
                }
-               return 1;
        }
+       return 1;
 }
 
 static void
-setdefttymode(const char *tname)
+defttymode(void)
 {
+       struct termios def;
+
+       /* Start with default tty settings. */
        if (tcgetattr(STDIN_FILENO, &tmode) < 0) {
                syslog(LOG_ERR, "tcgetattr %s: %m", ttyn);
                exit(1);
        }
-       tmode.c_iflag = TTYDEF_IFLAG;
-        tmode.c_oflag = TTYDEF_OFLAG;
-        tmode.c_lflag = TTYDEF_LFLAG;
-        tmode.c_cflag = TTYDEF_CFLAG;
-        omode = tmode;
-       setttymode(tname, 1);
+       omode = tmode; /* fill c_cc for dogettytab() */
+       dogettytab();
+       /*
+        * Don't rely on the driver too much, and initialize crucial
+        * things according to <sys/ttydefaults.h>.  Avoid clobbering
+        * the c_cc[] settings however, the console drivers might wish
+        * to leave their idea of the preferred VERASE key value
+        * there.
+        */
+       cfmakesane(&def);
+       tmode.c_iflag = def.c_iflag;
+       tmode.c_oflag = def.c_oflag;
+       tmode.c_lflag = def.c_lflag;
+       tmode.c_cflag = def.c_cflag;
+       if (NC)
+               tmode.c_cflag |= CLOCAL;
+       omode = tmode;
 }
 
 static void
-setttymode(const char *tname, int raw)
+setttymode(int raw)
 {
        int off = 0;
 
-       gettable(tname, tabent);
-       if (OPset || EPset || APset)
-               APset++, OPset++, EPset++;
-       setdefaults();
        (void)tcflush(STDIN_FILENO, TCIOFLUSH); /* clear out the crap */
        ioctl(STDIN_FILENO, FIONBIO, &off);     /* turn off non-blocking mode */
        ioctl(STDIN_FILENO, FIOASYNC, &off);    /* ditto for async mode */
@@ -547,7 +566,7 @@ getname(void)
                }
 
                if (c == EOT || c == CTRL('d'))
-                       exit(1);
+                       exit(0);
                if (c == '\r' || c == '\n' || np >= &name[sizeof name-1]) {
                        putf("\r\n");
                        break;
@@ -573,10 +592,11 @@ getname(void)
                        else if (np > name)
                                puts("                                     \r");
                        prompt();
+                       digit = lower = upper = 0;
                        np = name;
                        continue;
                } else if (isdigit(c))
-                       digit++;
+                       digit = 1;
                if (IG && (c <= ' ' || c > 0176))
                        continue;
                *np++ = c;
@@ -597,9 +617,7 @@ static void
 putpad(const char *s)
 {
        int pad = 0;
-       speed_t ospeed;
-
-       ospeed = cfgetospeed(&tmode);
+       speed_t ospeed = cfgetospeed(&tmode);
 
        if (isdigit(*s)) {
                while (isdigit(*s)) {
@@ -639,8 +657,8 @@ puts(const char *s)
                putchr(*s++);
 }
 
-char   outbuf[OBUFSIZ];
-int    obufcnt = 0;
+static char    outbuf[OBUFSIZ];
+static int     obufcnt = 0;
 
 static void
 putchr(int cc)
@@ -672,6 +690,7 @@ oflush(void)
 static void
 prompt(void)
 {
+
        putf(LM);
        if (CO)
                putchr('\n');
@@ -681,7 +700,7 @@ prompt(void)
 static char *
 get_line(int fd)
 {
-       int i = 0;
+       size_t i = 0;
        static char linebuf[512];
 
        /*
@@ -705,7 +724,6 @@ get_line(int fd)
 static void
 putf(const char *cp)
 {
-       extern char editedhost[];
        time_t t;
        char *slash, db[100];
 
@@ -766,3 +784,24 @@ putf(const char *cp)
                cp++;
        }
 }
+
+/*
+ * Read a gettytab database entry and perform necessary quirks.
+ */
+static void
+dogettytab(void)
+{
+       /* Read the database entry. */
+       gettable(tname, tabent);
+
+       /*
+        * Avoid inheriting the parity values from the default entry
+        * if any of them is set in the current entry.
+        * Mixing different parity settings is unreasonable.
+        */
+       if (OPset || EPset || APset || NPset)
+               OPset = EPset = APset = NPset = 1;
+
+       /* Fill in default values for unset capabilities. */
+       setdefaults();
+}
index 5e90101..8d95c52 100644 (file)
@@ -1,4 +1,6 @@
-/*
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
  * Copyright (c) 1989, 1993
  *     The Regents of the University of California.  All rights reserved.
  *
@@ -27,8 +29,7 @@
  * SUCH DAMAGE.
  *
  *     from: @(#)pathnames.h   8.1 (Berkeley) 6/4/93
- * $FreeBSD: src/libexec/getty/pathnames.h,v 1.7 1999/08/28 00:09:36 peter Exp $
- * $DragonFly: src/libexec/getty/pathnames.h,v 1.2 2003/06/17 04:27:07 dillon Exp $
+ * $FreeBSD: head/libexec/getty/pathnames.h 326025 2017-11-20 19:49:47Z pfg $
  */
 
 #include <paths.h>
index b3e8fc8..e0dde38 100644 (file)
@@ -1,4 +1,6 @@
-/*
+/*-
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
  * Copyright (c) 1983, 1993
  *     The Regents of the University of California.  All rights reserved.
  *
  * SUCH DAMAGE.
  *
  * @(#)from: subr.c    8.1 (Berkeley) 6/4/93
- * $FreeBSD: src/libexec/getty/subr.c,v 1.16.2.1 2001/05/12 10:16:51 kris Exp $
+ * $FreeBSD: head/libexec/getty/subr.c 329724 2018-02-21 15:57:24Z trasz $
  */
 
 /*
  * Melbourne getty.
  */
-#define COMPAT_43
-#ifdef DEBUG
-#include <stdio.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-#include <termios.h>
-#include <unistd.h>
 #include <sys/ioctl.h>
 #include <sys/param.h>
 #include <sys/time.h>
+
+#include <poll.h>
+#include <regex.h>
+#include <stdlib.h>
+#include <string.h>
 #include <syslog.h>
+#include <termios.h>
+#include <unistd.h>
 
 #include "gettytab.h"
 #include "pathnames.h"
 #include "extern.h"
 
-
-#ifdef COMPAT_43
-static void    compatflags (long);
-#endif
-
 /*
  * Get a table entry.
  */
@@ -67,12 +63,13 @@ gettable(const char *name, char *buf)
        long n;
        int l;
        char *p;
-       char *msg = NULL;
-       const char *dba[2];
+       static char path_gettytab[PATH_MAX];
+       char *dba[2];
 
        static int firsttime = 1;
 
-       dba[0] = _PATH_GETTYTAB;
+       strlcpy(path_gettytab, _PATH_GETTYTAB, sizeof(path_gettytab));
+       dba[0] = path_gettytab;
        dba[1] = NULL;
 
        if (firsttime) {
@@ -100,32 +97,28 @@ gettable(const char *name, char *buf)
                firsttime = 0;
        }
 
-       switch (cgetent(&buf, (char **)dba, (char *)name)) {
+       switch (cgetent(&buf, dba, name)) {
        case 1:
-               msg = "%s: couldn't resolve 'tc=' in gettytab '%s'";
+               syslog(LOG_ERR, "getty: couldn't resolve 'tc=' in gettytab '%s'", name);
+               return;
        case 0:
                break;
        case -1:
-               msg = "%s: unknown gettytab entry '%s'";
-               break;
+               syslog(LOG_ERR, "getty: unknown gettytab entry '%s'", name);
+               return;
        case -2:
-               msg = "%s: retrieving gettytab entry '%s': %m";
-               break;
+               syslog(LOG_ERR, "getty: retrieving gettytab entry '%s': %m", name);
+               return;
        case -3:
-               msg = "%s: recursive 'tc=' reference gettytab entry '%s'";
-               break;
+               syslog(LOG_ERR, "getty: recursive 'tc=' reference gettytab entry '%s'", name);
+               return;
        default:
-               msg = "%s: unexpected cgetent() error for entry '%s'";
-               break;
-       }
-
-       if (msg != NULL) {
-               syslog(LOG_ERR, msg, "getty", name);
+               syslog(LOG_ERR, "getty: unexpected cgetent() error for entry '%s'", name);
                return;
        }
 
        for (sp = gettystrs; sp->field; sp++) {
-               if ((l = cgetstr(buf, (char*)sp->field, &p)) >= 0) {
+               if ((l = cgetstr(buf, sp->field, &p)) >= 0) {
                        if (sp->value) {
                                /* prefer existing value */
                                if (strcmp(p, sp->value) != 0)
@@ -143,7 +136,7 @@ gettable(const char *name, char *buf)
        }
 
        for (np = gettynums; np->field; np++) {
-               if (cgetnum(buf, (char*)np->field, &n) == -1)
+               if (cgetnum(buf, np->field, &n) == -1)
                        np->set = 0;
                else {
                        np->set = 1;
@@ -152,24 +145,13 @@ gettable(const char *name, char *buf)
        }
 
        for (fp = gettyflags; fp->field; fp++) {
-               if (cgetcap(buf, (char *)fp->field, ':') == NULL)
+               if (cgetcap(buf, fp->field, ':') == NULL)
                        fp->set = 0;
                else {
                        fp->set = 1;
                        fp->value = 1 ^ fp->invrt;
                }
        }
-
-#ifdef DEBUG
-       printf("name=\"%s\", buf=\"%s\"\r\n", name, buf);
-       for (sp = gettystrs; sp->field; sp++)
-               printf("cgetstr: %s=%s\r\n", sp->field, sp->value);
-       for (np = gettynums; np->field; np++)
-               printf("cgetnum: %s=%d\r\n", np->field, np->value);
-       for (fp = gettyflags; fp->field; fp++)
-               printf("cgetflags: %s='%c' set='%c'\r\n", fp->field, 
-                      fp->value + '0', fp->set + '0');
-#endif /* DEBUG */
 }
 
 void
@@ -251,28 +233,6 @@ set_flags(int n)
 {
        tcflag_t iflag, oflag, cflag, lflag;
 
-#ifdef COMPAT_43
-       switch (n) {
-       case 0:
-               if (F0set) {
-                       compatflags(F0);
-                       return;
-               }
-               break;
-       case 1:
-               if (F1set) {
-                       compatflags(F1);
-                       return;
-               }
-               break;
-       default:
-               if (F2set) {
-                       compatflags(F2);
-                       return;
-               }
-               break;
-       }
-#endif
 
        switch (n) {
        case 0:
@@ -428,130 +388,6 @@ out:
        tmode.c_lflag = lflag;
 }
 
-#ifdef COMPAT_43
-/*
- * Old TTY => termios, snatched from <sys/kern/tty_compat.c>
- */
-void
-compatflags(long flags)
-{
-       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 {
@@ -626,42 +462,48 @@ adelay(int ms, struct delayval *dp)
 char   editedhost[MAXHOSTNAMELEN];
 
 void
-edithost(const char *pat)
+edithost(const char *pattern)
 {
-       const char *host = HN;
-       char *res = editedhost;
-
-       if (!pat)
-               pat = "";
-       while (*pat) {
-               switch (*pat) {
-
-               case '#':
-                       if (*host)
-                               host++;
-                       break;
-
-               case '@':
-                       if (*host)
-                               *res++ = *host++;
-                       break;
+       regex_t regex;
+       regmatch_t *match;
+       int found;
+
+       if (pattern == NULL || *pattern == '\0')
+               goto copyasis;
+       if (regcomp(&regex, pattern, REG_EXTENDED) != 0)
+               goto copyasis;
+
+       match = calloc(regex.re_nsub + 1, sizeof(*match));
+       if (match == NULL) {
+               regfree(&regex);
+               goto copyasis;
+       }
 
-               default:
-                       *res++ = *pat;
-                       break;
+       found = !regexec(&regex, HN, regex.re_nsub + 1, match, 0);
+       if (found) {
+               size_t subex, totalsize;
 
-               }
-               if (res == &editedhost[sizeof editedhost - 1]) {
-                       *res = '\0';
-                       return;
-               }
-               pat++;
+               /*
+                * We found a match.  If there were no parenthesized
+                * subexpressions in the pattern, use entire matched
+                * string as ``editedhost''; otherwise use the first
+                * matched subexpression.
+                */
+               subex = !!regex.re_nsub;
+               totalsize = match[subex].rm_eo - match[subex].rm_so + 1;
+               strlcpy(editedhost, HN + match[subex].rm_so, totalsize >
+                   sizeof(editedhost) ? sizeof(editedhost) : totalsize);
        }
-       if (*host)
-               strncpy(res, host, sizeof editedhost - (res - editedhost) - 1);
-       else
-               *res = '\0';
-       editedhost[sizeof editedhost - 1] = '\0';
+       free(match);
+       regfree(&regex);
+       if (found)
+               return;
+       /*
+        * In case of any errors, or if the pattern did not match, pass
+        * the original hostname as is.
+        */
+ copyasis:
+       strlcpy(editedhost, HN, sizeof(editedhost));
 }
 
 static struct speedtab {
@@ -689,7 +531,7 @@ static struct speedtab {
        { 57600, B57600 },
        { 115200, B115200 },
        { 230400, B230400 },
-       { 0 }
+       { 0, 0 }
 };
 
 int
@@ -738,7 +580,7 @@ makeenv(char *env[])
  * baud rate. This string indicates the user's actual speed.
  * The routine below returns the terminal type mapped from derived speed.
  */
-struct portselect {
+static struct  portselect {
        const char      *ps_baud;
        const char      *ps_type;
 } portspeeds[] = {
@@ -752,7 +594,7 @@ struct      portselect {
        { "B4800",      "std.4800" },
        { "B9600",      "std.9600" },
        { "B19200",     "std.19200" },
-       { 0 }
+       { NULL, NULL }
 };
 
 const char *
@@ -761,7 +603,7 @@ portselector(void)
        char c, baud[20];
        const char *type = "default";
        struct portselect *ps;
-       int len;
+       size_t len;
 
        alarm(5*60);
        for (len = 0; len < sizeof (baud) - 1; len++) {
@@ -792,22 +634,21 @@ portselector(void)
 const char *
 autobaud(void)
 {
-       int rfds;
-       struct timeval timeout;
+       struct pollfd set[1];
+       struct timespec timeout;
        char c;
        const char *type = "9600-baud";
 
        (void)tcflush(0, TCIOFLUSH);
-       rfds = 1 << 0;
-       timeout.tv_sec = 5;
-       timeout.tv_usec = 0;
-       if (select(32, (fd_set *)&rfds, NULL, NULL, &timeout) <= 0)
+       set[0].fd = STDIN_FILENO;
+       set[0].events = POLLIN;
+       if (poll(set, 1, 5000) <= 0)
                return (type);
        if (read(STDIN_FILENO, &c, sizeof(char)) != sizeof(char))
                return (type);
        timeout.tv_sec = 0;
-       timeout.tv_usec = 20;
-       (void) select(32, NULL, NULL, NULL, &timeout);
+       timeout.tv_nsec = 20000;
+       (void)nanosleep(&timeout, NULL);
        (void)tcflush(0, TCIOFLUSH);
        switch (c & 0377) {
 
index c59935f..b7927f0 100644 (file)
 .\" SUCH DAMAGE.
 .\"
 .\"     from: @(#)ttys.5       8.1 (Berkeley) 6/4/93
-.\" $FreeBSD: src/libexec/getty/ttys.5,v 1.11.2.3 2001/08/16 10:44:15 ru Exp $
-.\" $DragonFly: src/libexec/getty/ttys.5,v 1.3 2006/02/17 19:33:31 swildner Exp $
-.\" "
-.Dd November 17, 1996
+.\" $FreeBSD: head/libexec/getty/ttys.5 330277 2018-03-02 14:16:19Z trasz $
+.\"
+.Dd April 7, 2018
 .Dt TTYS 5
 .Os
 .Sh NAME
@@ -99,13 +98,13 @@ ttys as a group.
 .Pp
 As flag values, the strings ``on'' and ``off'' specify that
 .Xr init 8
-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.
+should (should not) execute the command given in the second field.
 The flag ``ifconsole'' disables the tty entry if it is not the console.
 That is, you can construct a tty entry, set to 'on', that you intend to
 only be active if that tty is the console.
+The flag ``secure'' (if the console is enabled) allows users with a
+uid of 0 to login on
+this line.
 The flag ``dialup'' indicates that a tty entry describes a dialup
 line, and ``network'' indicates that a tty entry provides a
 network connection.
@@ -150,7 +149,7 @@ ttyh0       "/usr/libexec/getty std.9600"   hp2621-nl       on group=dialup # 457 Evans
 # John's terminal: vt100
 ttyh1  "/usr/libexec/getty std.9600"   vt100   on group=dialup         # 459 Evans
 # terminal emulate/window system
-ttyv0  "/usr/new/xterm -L :0"          vs100   on window="/usr/new/Xvs100 0"
+ttyv0  "/usr/local/bin/xterm -display :0"      xterm   on window="/usr/local/bin/X :0"
 # Network pseudo ttys -- don't enable getty
 ttyp0  none    network         group=pty
 ttyp1  none    network off     group=pty
@@ -163,8 +162,8 @@ ttyp1       none    network off     group=pty
 .Xr login.conf 5 ,
 .Xr termcap 5 ,
 .Xr getty 8 ,
-.Xr init 8
-.\".Xr init 8 ,
+.Xr init 8 ,
+.Xr pstat 8
 .\".Xr ttyflags 8
 .Sh HISTORY
 A