Implement two new keywords and status flags for entries in /etc/ttys;

TTY_NETWORK (network), TTY_DIALUP (dialup), which determine a basic
connection type. TTY_DIALUP in particular will replace the old out of
date heuristic "tty[dD]*" in login.c (and better than the current
hard-coded method).
This commit is contained in:
David Nugent 1997-04-13 15:16:03 +00:00
parent c8207e03ba
commit b06ebb3255
2 changed files with 70 additions and 4 deletions

View File

@ -40,6 +40,9 @@
.Nm setttyent ,
.Nm endttyent
.Nd get ttys file entry
.Nm isdialuptty ,
.Nm isnetworktty
.Nd determine tty type from ttys file entry
.Sh SYNOPSIS
.Fd #include <ttyent.h>
.Ft struct ttyent *
@ -50,6 +53,10 @@
.Fn setttyent void
.Ft int
.Fn endttyent void
.Ft int
.Fn isdialuptty "const char *name"
.Ft int
.Fn isnetworktty "const char *name"
.Sh DESCRIPTION
The
.Fn getttyent ,
@ -66,6 +73,8 @@ struct ttyent {
char *ty_type; /* terminal type for termcap */
#define TTY_ON 0x01 /* enable logins (start ty_getty program) */
#define TTY_SECURE 0x02 /* allow uid of 0 to login */
#define TTY_DIALUP 0x04 /* is a dialup tty */
#define TTY_NETWORK 0x08 /* is a network tty */
int ty_status; /* status flags */
char *ty_window; /* command to start up window manager */
char *ty_comment; /* comment field */
@ -87,7 +96,7 @@ The name of the default terminal type connected to this tty line.
A mask of bit fields which indicate various actions allowed on this
tty line.
The possible flags are as follows:
.Bl -tag -width TTY_SECURE
.Bl -tag -width TTY_NETWORK
.It Dv TTY_ON
Enables logins (i.e.,
.Xr init 8
@ -96,6 +105,16 @@ will start the command referenced by
on this entry).
.It Dv TTY_SECURE
Allow users with a uid of 0 to login on this terminal.
.It Dv TTY_DIALUP
Identifies a tty as a dialin line.
If this flag is set, then
.Fn isdialuptty
will return a non-zero value.
.It Dv TTY_NETWORK
Identifies a tty used for network connections.
If this flag is set, then
.Fn isnetworktty
will return a non-zero value.
.El
.It Fa ty_window
The command to execute for a window system associated with the line.
@ -155,6 +174,14 @@ function
and
.Fn endttyent
return 0 on failure and 1 on success.
.Pp
The routines
.Fn isdialuptty
and
.Fn isnetworktty
return non-zero if the dialup or network flag is set for the
tty entry relating to the tty named by the parameter, and
zero otherwise.
.Sh FILES
.Bl -tag -width /etc/ttys -compact
.It Pa /etc/ttys

View File

@ -57,6 +57,8 @@ getttynam(tty)
{
register struct ttyent *t;
if (strnchr(tty, "/dev/", 5) == 0)
tty += 5;
setttyent();
while ( (t = getttyent()) )
if (!strcmp(tty, t->ty_name))
@ -96,6 +98,9 @@ getttyent()
break;
}
#define scmp(e) !strncmp(p, e, sizeof(e) - 1) && isspace(p[sizeof(e) - 1])
#define vcmp(e) !strncmp(p, e, sizeof(e) - 1) && p[sizeof(e) - 1] == '='
zapchar = 0;
tty.ty_name = p;
p = skip(p);
@ -105,15 +110,19 @@ getttyent()
p = skip(p);
if (!*(tty.ty_type = p))
tty.ty_type = NULL;
else
else {
/* compatibility kludge: handle network/dialup specially */
if (scmp(_TTYS_DIALUP))
tty.ty_status |= TTY_DIALUP;
else if (scmp(_TTYS_NETWORK))
tty.ty_status |= TTY_NETWORK;
p = skip(p);
}
}
tty.ty_status = 0;
tty.ty_window = NULL;
tty.ty_group = _TTYS_NOGROUP;
#define scmp(e) !strncmp(p, e, sizeof(e) - 1) && isspace(p[sizeof(e) - 1])
#define vcmp(e) !strncmp(p, e, sizeof(e) - 1) && p[sizeof(e) - 1] == '='
for (; *p; p = skip(p)) {
if (scmp(_TTYS_OFF))
tty.ty_status &= ~TTY_ON;
@ -123,6 +132,10 @@ getttyent()
tty.ty_status |= TTY_SECURE;
else if (scmp(_TTYS_INSECURE))
tty.ty_status &= ~TTY_SECURE;
else if (scmp(_TTYS_DIALUP))
tty.ty_status |= TTY_DIALUP;
else if (scmp(_TTYS_NETWORK))
tty.ty_status |= TTY_NETWORK;
else if (vcmp(_TTYS_WINDOW))
tty.ty_window = value(p);
else if (vcmp(_TTYS_GROUP))
@ -223,3 +236,29 @@ endttyent()
}
return (1);
}
static int
isttystat(tty, flag)
const char *tty;
int flag;
{
register struct ttyent *t;
return ((t = getttynam(tty)) == NULL) ? 0 : !!(t->ty_status & flag);
}
int
isdialuptty(tty)
const char *tty;
{
return isttystat(tty, TTY_DIALUP);
}
int isnettty(tty)
const char *tty;
{
return isttystat(tty, TTY_NETWORK);
}