projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
4.4BSD snapshot (revision 8.1); add 1993 to copyright
[unix-history]
/
usr
/
src
/
libexec
/
getty
/
main.c
diff --git
a/usr/src/libexec/getty/main.c
b/usr/src/libexec/getty/main.c
index
b9fcd3c
..
486f44b
100644
(file)
--- a/
usr/src/libexec/getty/main.c
+++ b/
usr/src/libexec/getty/main.c
@@
-1,34
+1,40
@@
-/*
- * Copyright (c) 1980 Regents of the University of California.
- * All rights reserved. The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+/*-
+ * Copyright (c) 1980 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
*/
#ifndef lint
char copyright[] =
*/
#ifndef lint
char copyright[] =
-"@(#) Copyright (c) 1980 Regents of the University of California.\n\
+"@(#) Copyright (c) 1980
The
Regents of the University of California.\n\
All rights reserved.\n";
All rights reserved.\n";
-#endif
not lint
+#endif
/* not lint */
#ifndef lint
#ifndef lint
-static char sccsid[] = "@(#)main.c
5.2
(Berkeley) %G%";
-#endif
not lint
+static char sccsid[] = "@(#)main.c
8.1
(Berkeley) %G%";
+#endif
/* not lint */
-/*
- * getty -- adapt to terminal speed on dialup, and call login
- *
- * Melbourne getty, June 83, kre.
- */
+#define USE_OLD_TTY
-#include <sgtty.h>
-#include <signal.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+
+#include <ctype.h>
#include <ctype.h>
#include <ctype.h>
+#include <fcntl.h>
#include <setjmp.h>
#include <setjmp.h>
+#include <sgtty.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
#include <syslog.h>
#include <syslog.h>
-#include <
sys/fil
e.h>
-#include
"gettytab.h"
+#include <
tim
e.h>
+#include
<unistd.h>
-extern char **environ;
+#include "gettytab.h"
+#include "pathnames.h"
+#include "extern.h"
struct sgttyb tmode = {
0, 0, CERASE, CKILL, 0
struct sgttyb tmode = {
0, 0, CERASE, CKILL, 0
@@
-42,15
+48,11
@@
struct ltchars ltc = {
CFLUSH, CWERASE, CLNEXT
};
CFLUSH, CWERASE, CLNEXT
};
-int crmod;
-int upper;
-int lower;
-int digit;
+int crmod, digit, lower, upper;
-char hostname[
32
];
+char hostname[
MAXHOSTNAMELEN
];
char name[16];
char name[16];
-char dev[] = "/dev/";
-char ctty[] = "/dev/console";
+char dev[] = _PATH_DEV;
char ttyn[32];
char *portselector();
char *ttyname();
char ttyn[32];
char *portselector();
char *ttyname();
@@
-59,9
+61,7
@@
char *ttyname();
#define TABBUFSIZ 512
char defent[TABBUFSIZ];
#define TABBUFSIZ 512
char defent[TABBUFSIZ];
-char defstrs[TABBUFSIZ];
char tabent[TABBUFSIZ];
char tabent[TABBUFSIZ];
-char tabstrs[TABBUFSIZ];
char *env[128];
char *env[128];
@@
-90,6
+90,7
@@
char partab[] = {
jmp_buf timeout;
jmp_buf timeout;
+static void
dingdong()
{
dingdong()
{
@@
-100,6
+101,7
@@
dingdong()
jmp_buf intrupt;
jmp_buf intrupt;
+static void
interrupt()
{
interrupt()
{
@@
-107,9
+109,20
@@
interrupt()
longjmp(intrupt, 1);
}
longjmp(intrupt, 1);
}
+static int getname __P((void));
+static void oflush __P((void));
+static void prompt __P((void));
+static void putchr __P((int));
+static void putf __P((char *));
+static void putpad __P((char *));
+static void puts __P((char *));
+
+int
main(argc, argv)
main(argc, argv)
+ int argc;
char *argv[];
{
char *argv[];
{
+ extern char **environ;
char *tname;
long allflags;
int repcnt = 0;
char *tname;
long allflags;
int repcnt = 0;
@@
-130,42
+143,48
@@
main(argc, argv)
* J. Gettys - MIT Project Athena.
*/
if (argc <= 2 || strcmp(argv[2], "-") == 0)
* J. Gettys - MIT Project Athena.
*/
if (argc <= 2 || strcmp(argv[2], "-") == 0)
-
strcpy(ttyn, ttyname(0));
+ strcpy(ttyn, ttyname(0));
else {
else {
- strcpy(ttyn, dev);
- strncat(ttyn, argv[2], sizeof(ttyn)-sizeof(dev));
+ int i;
+
+ strcpy(ttyn, dev);
+ strncat(ttyn, argv[2], sizeof(ttyn)-sizeof(dev));
+ if (strcmp(argv[0], "+") != 0) {
chown(ttyn, 0, 0);
chown(ttyn, 0, 0);
- chmod(ttyn, 0622);
- while (open(ttyn, O_RDWR) != 0) {
+ chmod(ttyn, 0600);
+ revoke(ttyn);
+ /*
+ * Delay the open so DTR stays down long enough to be detected.
+ */
+ sleep(2);
+ while ((i = open(ttyn, O_RDWR)) == -1) {
if (repcnt % 10 == 0) {
if (repcnt % 10 == 0) {
- syslog(LOG_
FAIL
, "%s: %m", ttyn);
+ syslog(LOG_
ERR
, "%s: %m", ttyn);
closelog();
}
repcnt++;
sleep(60);
}
closelog();
}
repcnt++;
sleep(60);
}
- signal(SIGHUP, SIG_IGN);
- vhangup();
- (void) open(ttyn, O_RDWR);
- close(0);
- dup(1);
- dup(0);
- signal(SIGHUP, SIG_DFL);
+ login_tty(i);
+ }
}
}
- gettable("default", defent
, defstrs
);
+ gettable("default", defent);
gendefaults();
tname = "default";
if (argc > 1)
tname = argv[1];
for (;;) {
gendefaults();
tname = "default";
if (argc > 1)
tname = argv[1];
for (;;) {
- int
ldisp = OTTYDISC
;
+ int
off
;
- gettable(tname, tabent
, tabstrs
);
+ gettable(tname, tabent);
if (OPset || EPset || APset)
APset++, OPset++, EPset++;
setdefaults();
if (OPset || EPset || APset)
APset++, OPset++, EPset++;
setdefaults();
- ioctl(0, TIOCFLUSH, 0); /* clear out the crap */
+ off = 0;
+ ioctl(0, TIOCFLUSH, &off); /* 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);
else if (SP)
if (IS)
tmode.sg_ispeed = speed(IS);
else if (SP)
@@
-178,7
+197,6
@@
main(argc, argv)
ioctl(0, TIOCSETP, &tmode);
setchars();
ioctl(0, TIOCSETC, &tc);
ioctl(0, TIOCSETP, &tmode);
setchars();
ioctl(0, TIOCSETC, &tc);
- ioctl(0, TIOCSETD, &ldisp);
if (HC)
ioctl(0, TIOCHPCL, 0);
if (AB) {
if (HC)
ioctl(0, TIOCHPCL, 0);
if (AB) {
@@
-211,6
+229,10
@@
main(argc, argv)
oflush();
alarm(0);
signal(SIGALRM, SIG_DFL);
oflush();
alarm(0);
signal(SIGALRM, SIG_DFL);
+ if (name[0] == '-') {
+ puts("user names may not start with '-'.");
+ continue;
+ }
if (!(upper || lower || digit))
continue;
allflags = setflags(2);
if (!(upper || lower || digit))
continue;
allflags = setflags(2);
@@
-229,7
+251,14
@@
main(argc, argv)
for (i = 0; environ[i] != (char *)0; i++)
env[i] = environ[i];
makeenv(&env[i]);
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);
execle(LO, "login", "-p", name, (char *) 0, env);
execle(LO, "login", "-p", name, (char *) 0, env);
+ syslog(LOG_ERR, "%s: %m", LO);
exit(1);
}
alarm(0);
exit(1);
}
alarm(0);
@@
-240,10
+269,11
@@
main(argc, argv)
}
}
}
}
+static int
getname()
{
getname()
{
+ register int c;
register char *np;
register char *np;
- register c;
char cs;
/*
char cs;
/*
@@
-264,14
+294,11
@@
getname()
PF = 0;
}
ioctl(0, TIOCSETP, &tmode);
PF = 0;
}
ioctl(0, TIOCSETP, &tmode);
- crmod = 0;
- upper = 0;
- lower = 0;
- digit = 0;
+ crmod = digit = lower = upper = 0;
np = name;
for (;;) {
oflush();
np = name;
for (;;) {
oflush();
- if (read(
0
, &cs, 1) <= 0)
+ if (read(
STDIN_FILENO
, &cs, 1) <= 0)
exit(0);
if ((c = cs&0177) == 0)
return (0);
exit(0);
if ((c = cs&0177) == 0)
return (0);
@@
-281,10
+308,10
@@
getname()
putf("\r\n");
break;
}
putf("\r\n");
break;
}
- if (
c >= 'a' && c <= 'z'
)
- lower
++
;
- else if (
c >= 'A' && c <= 'Z'
)
- upper
++
;
+ if (
islower(c)
)
+ lower
= 1
;
+ else if (
isupper(c)
)
+ upper
= 1
;
else if (c == ERASE || c == '#' || c == '\b') {
if (np > name) {
np--;
else if (c == ERASE || c == '#' || c == '\b') {
if (np > name) {
np--;
@@
-305,7
+332,7
@@
getname()
prompt();
np = name;
continue;
prompt();
np = name;
continue;
- } else if (
c >= '0' && c <= '9'
)
+ } else if (
isdigit(c)
)
digit++;
if (IG && (c <= ' ' || c > 0176))
continue;
digit++;
if (IG && (c <= ' ' || c > 0176))
continue;
@@
-315,7
+342,7
@@
getname()
signal(SIGINT, SIG_IGN);
*np = 0;
if (c == '\r')
signal(SIGINT, SIG_IGN);
*np = 0;
if (c == '\r')
- crmod
++
;
+ crmod
= 1
;
if (upper && !lower && !LC || UC)
for (np = name; *np; np++)
if (isupper(*np))
if (upper && !lower && !LC || UC)
for (np = name; *np; np++)
if (isupper(*np))
@@
-328,6
+355,7
@@
short tmspc10[] = {
0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5, 15
};
0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5, 15
};
+static void
putpad(s)
register char *s;
{
putpad(s)
register char *s;
{
@@
-358,11
+386,10
@@
putpad(s)
return;
/*
return;
/*
- * Round up by a half a character frame,
- * and then do the delay.
+ * Round up by a half a character frame, and then do the delay.
* Too bad there are no user program accessible programmed delays.
* Too bad there are no user program accessible programmed delays.
- * Transmitting pad characters slows many
- *
terminals down and also
loads the system.
+ * Transmitting pad characters slows many
terminals down and also
+ * loads the system.
*/
mspc10 = tmspc10[tmode.sg_ospeed];
pad += mspc10 / 2;
*/
mspc10 = tmspc10[tmode.sg_ospeed];
pad += mspc10 / 2;
@@
-370,10
+397,10
@@
putpad(s)
putchr(*PC);
}
putchr(*PC);
}
+static void
puts(s)
register char *s;
{
puts(s)
register char *s;
{
-
while (*s)
putchr(*s++);
}
while (*s)
putchr(*s++);
}
@@
-381,29
+408,35
@@
puts(s)
char outbuf[OBUFSIZ];
int obufcnt = 0;
char outbuf[OBUFSIZ];
int obufcnt = 0;
+static void
putchr(cc)
putchr(cc)
+ int cc;
{
char c;
c = cc;
{
char c;
c = cc;
- c |= partab[c&0177] & 0200;
- if (OP)
- c ^= 0200;
+ if (!NP) {
+ c |= partab[c&0177] & 0200;
+ if (OP)
+ c ^= 0200;
+ }
if (!UB) {
outbuf[obufcnt++] = c;
if (obufcnt >= OBUFSIZ)
oflush();
} else
if (!UB) {
outbuf[obufcnt++] = c;
if (obufcnt >= OBUFSIZ)
oflush();
} else
- write(
1
, &c, 1);
+ write(
STDOUT_FILENO
, &c, 1);
}
}
+static void
oflush()
{
if (obufcnt)
oflush()
{
if (obufcnt)
- write(
1
, outbuf, obufcnt);
+ write(
STDOUT_FILENO
, outbuf, obufcnt);
obufcnt = 0;
}
obufcnt = 0;
}
+static void
prompt()
{
prompt()
{
@@
-412,13
+445,13
@@
prompt()
putchr('\n');
}
putchr('\n');
}
+static void
putf(cp)
register char *cp;
{
putf(cp)
register char *cp;
{
- char *ttyn, *slash;
- char datebuffer[60];
extern char editedhost[];
extern char editedhost[];
- extern char *ttyname(), *rindex();
+ time_t t;
+ char *slash, db[100];
while (*cp) {
if (*cp != '%') {
while (*cp) {
if (*cp != '%') {
@@
-428,8
+461,7
@@
putf(cp)
switch (*++cp) {
case 't':
switch (*++cp) {
case 't':
- ttyn = ttyname(0);
- slash = rindex(ttyn, '/');
+ slash = strrchr(ttyn, '/');
if (slash == (char *) 0)
puts(ttyn);
else
if (slash == (char *) 0)
puts(ttyn);
else
@@
-440,10
+472,15
@@
putf(cp)
puts(editedhost);
break;
puts(editedhost);
break;
- case 'd':
- get_date(datebuffer);
- puts(datebuffer);
+ case 'd': {
+ 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;
break;
+ }
case '%':
putchr('%');
case '%':
putchr('%');