Initial checkin. These sources match those used to build the version

of the util shipped with GNO v2.0.4.
This commit is contained in:
gdr-ftp 1998-03-09 15:50:56 +00:00
parent 31e9970070
commit 451e159fb7
27 changed files with 3546 additions and 0 deletions

5
usr.sbin/cron/Makefile Normal file
View File

@ -0,0 +1,5 @@
cron.root: cron.c
compile -p cron.c keep=cron
cron: cron.root
link -p cron keep=cron

5
usr.sbin/cron/README Normal file
View File

@ -0,0 +1,5 @@
I converted cron to use syslog(). In my /etc/syslog.conf file, LOG_CRON
messages are configured to go in /var/log/cronlog. I modifed cron as a
demonstration of this.
- Phillip Vandry

48
usr.sbin/cron/cron.8 Normal file
View File

@ -0,0 +1,48 @@
CRON(8) UNIX Programmer's Manual CRON(8)
NAME
cron - clock daemon
SYNOPSIS
/usr/sbin/cron
DESCRIPTION
Cron executes commands at specified dates and times accord-
ing to the instructions in the file /etc/crontab (if it exists).
Since cron never exits, it should only be executed once. This
is best done by running cron from the initialization process
through the file /etc/inittab; see init(8).
The crontab file consists of lines of seven fields each.
The fields are separated by spaces or tabs. The first five
are integer patterns to specify:
o+ minute (0-59)
o+ hour (0-23)
o+ day of the month (1-31)
o+ month of the year (1-12)
o+ day of the week (1-7 with 1 = Monday)
Each of these patterns may contain:
o+ a number in the range above
o+ two numbers separated by a minus meaning a range inclusive
o+ a list of numbers separated by commas meaning any of the
numbers
o+ an asterisk meaning all legal values
The sixth field is a user name: the command will be run with
that user's uid and permissions. The seventh field consists
of all the text on a line following the sixth field, includ-
ing spaces and tabs; this text is treated as a command which
is executed by the Shell at the specified times. A percent
character (``%'') in this field is translated to a new-line
character.
The crontab file is checked by cron every minute, on the
minute.
FILES
/etc/crontab

324
usr.sbin/cron/cron.c Normal file
View File

@ -0,0 +1,324 @@
/* Converted to use syslog() by Phillip Vandry
#define NO_SYSLOG to get the old version */
#pragma stacksize 768
#pragma optimize -1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gno/gno.h>
#include <ctype.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <sys/syslog.h>
#include "pathnames.h"
#define DEBUG(x)
/* #define DEBUG(x) x */
#define MAX_INTLIST 10
#define IT_ITEM 0
#define IT_RANGE 1
#define IT_LIST 2
#define IT_ALL 3
#ifdef __ORCAC__
#define NL 13
#else
#define NL 10
#endif
typedef struct intlist {
int itype;
int count;
int intarr[MAX_INTLIST];
} intlist;
typedef struct ctentry {
struct ctentry *next;
intlist minute;
intlist hour;
intlist day;
intlist month;
intlist weekday;
char *user;
char *cmd;
} ctentry;
struct ctentry *crontab = NULL;
#ifdef NO_SYSLOG
FILE *cl;
void cronlog(char *s)
{
time_t t;
char *s1;
time(&t);
s1 = ctime(&t);
s1[strlen(s1)-1] = 0;
fprintf(cl,"%s: %s\n",s1,s);
}
#endif
void disposecrontab(void)
{
struct ctentry *x = crontab,*x2;
while (x) {
free(x->user);
free(x->cmd);
x2 = x->next;
free(x);
x = x2;
}
crontab = NULL;
}
char rcbuf[256];
int scanws(int i)
{
while (!(isspace(rcbuf[i]))) i++;
while (isspace(rcbuf[i])) i++;
return i;
}
int scan2ws(int i)
{
while ( !( isspace(rcbuf[i++]) ) );
return i;
}
int scandig(int i)
{
while ( isdigit(rcbuf[i])) i++;
return i;
}
int parseItem(int ind, struct intlist *i)
{
int nind;
int count;
if (rcbuf[ind] == '*')
i->itype = IT_ALL;
else {
i->itype = IT_ITEM;
sscanf(rcbuf+ind,"%d",&i->intarr[0]);
nind = scandig(ind);
if (rcbuf[nind] == ',') {
ind = nind;
count = 1;
while (rcbuf[ind] == ',') {
sscanf(rcbuf+ind+1,"%d",&i->intarr[count]);
ind = scandig(ind+1);
count++;
}
i->itype = IT_LIST;
i->count = count;
}
else if (rcbuf[nind] == '-') {
sscanf(rcbuf+nind+1,"%d",&i->intarr[1]);
ind = nind;
i->itype = IT_RANGE;
}
}
return scanws(ind);
}
void readcrontab(void)
{
FILE *ct;
ctentry *n;
int ind,nind;
if (crontab) disposecrontab();
retry:
ct = fopen(PATH_crontab,"r");
if (ct == NULL) {
#ifndef NO_SYSLOG
syslog(LOG_ERR, "couldn't open crontab");
#else
perror("couldn't open crontab");
cronlog("couldn't open crontab");
#endif
sleep(30);
goto retry;
}
while (!feof(ct)) {
if (fgets(rcbuf,255,ct) == NULL) break;
DEBUG(fprintf(stderr,"gotline %s",rcbuf));
if (rcbuf[0] == '#') continue;
if (strlen(rcbuf) < 2) continue;
rcbuf[strlen(rcbuf)-1] = 0;
n = malloc(sizeof(ctentry));
if (crontab) n->next = crontab;
else n->next = NULL;
crontab = n;
ind = parseItem(0,&n->minute);
ind = parseItem(ind,&n->hour);
ind = parseItem(ind,&n->day);
ind = parseItem(ind,&n->month);
ind = parseItem(ind,&n->weekday);
nind = scan2ws(ind);
n->user = malloc(nind-ind+1);
memcpy(n->user,rcbuf+ind,nind-ind);
n->user[nind-ind] = 0;
ind = scanws(ind);
n->cmd = malloc(strlen(rcbuf)-ind+1);
strcpy(n->cmd,rcbuf+ind);
for (ind = 0; ind < strlen(n->cmd); ind++)
if (n->cmd[ind] == '%') n->cmd[ind] = NL;
rcbuf[0] = rcbuf[1] = 0;
}
fclose(ct);
}
int matchItem(struct intlist *i,int t)
{
int p;
if (i->itype == IT_ALL) return 1;
else if (i->itype == IT_ITEM) {
if (t == i->intarr[0]) return 1;
else return 0;
}
else if (i->itype == IT_RANGE) {
if ((t >= i->intarr[0]) && (t <= i->intarr[1]))
return 1;
else return 0;
}
else if (i->itype == IT_LIST) {
for (p = 0; p < i->count; p++)
if (i->intarr[p] == t) return 1;
return 0;
}
}
int matchTime(ctentry *x,struct tm *t)
{
if (matchItem(&x->minute,t->tm_min) &&
matchItem(&x->hour,t->tm_hour) &&
matchItem(&x->day,t->tm_mday) &&
matchItem(&x->month,t->tm_mon) /* &&
matchItem(&x->weekday,t->tm_wday) */ )
return 1;
return 0;
}
void printItem(struct intlist *i)
{
int p;
if (i->itype == IT_ALL) fprintf(stderr,"* ");
else if (i->itype == IT_ITEM)
fprintf(stderr,"%d ",i->intarr[0]);
else if (i->itype == IT_RANGE)
fprintf(stderr,"%d-%d",i->intarr[0],i->intarr[1]);
else if (i->itype == IT_LIST) {
fprintf(stderr,"%d",i->intarr[0]);
for (p = 1; p < i->count; p++)
fprintf(stderr,",%d",i->intarr[p]);
}
}
void docrontab(void)
{
struct tm *t;
time_t t1;
ctentry *x = crontab;
char *cmdpath;
word ind = 0;
t1 = time(NULL);
t = localtime(&t1);
if (x == NULL) { /* syslog(LOG_NOTICE, "crontab empty");*/ return; }
while (x) {
DEBUG(printItem(&x->minute));
DEBUG(printItem(&x->hour));
DEBUG(printItem(&x->day));
DEBUG(printItem(&x->month));
DEBUG(printItem(&x->weekday));
DEBUG(fprintf(stderr,":%s \n",x->cmd));
if (matchTime(x,t)) {
DEBUG(fprintf(stderr,"matched!\n"));
ind = strpos(x->cmd,' ');
if (ind == -1) ind = strlen(x->cmd);
cmdpath = malloc(ind+1);
memcpy(cmdpath,x->cmd,ind);
cmdpath[ind] = 0;
exec(cmdpath,x->cmd);
}
x = x->next;
}
}
int main(int argc, char *argv[])
{
time_t ct_mod,start_time;
unsigned int i;
struct tm *exptime;
static struct stat sb;
int sl;
/* Previously this was a for. ORCA/C didn't compile that right, though.
This generates more efficient code anyway */
i = 3;
while (++i < 20) close(i);
#ifndef NO_SYSLOG
openlog(NULL, 0, LOG_CRON);
#else
cl = fopen(PATH_cronlog,"a");
if (!cl) {
perror("cron: couldn't open cronlog file");
exit(1);
}
#endif
/* turn off buffering so cronlog is up-to-date in the event of a
* system crash
*/
#ifdef NO_SYSLOG
setvbuf(cl,NULL,_IONBF,0l);
cronlog("cron started up");
#else
syslog(LOG_INFO, "cron started up");
#endif
/*
* start cron sessions on or near an exact minute
* (giving 2 seconds leeway for 'bounce')
*/
start_time = time(NULL);
exptime = localtime(&start_time);
sleep(62 - exptime->tm_sec);
#pragma optimize 0 /* ORCA/C has problems... */
ct_mod = 0l;
while (1) {
DEBUG(fprintf(stderr,"loop\n"));
stat(PATH_crontab,&sb);
if (sb.st_mtime != ct_mod) {
ct_mod = sb.st_mtime;
readcrontab();
}
#pragma optimize 1
docrontab();
/*
* account for the time we spent loading/parsing/executing
*/
start_time = time(NULL);
exptime = localtime(&start_time);
sl = 61-exptime->tm_sec;
/*while (sl < 0) sl+=60;*/
DEBUG(fprintf(stderr,"sleep: %d\n",sl));
sleep(sl);
}
}

3
usr.sbin/cron/cronlog Normal file
View File

@ -0,0 +1,3 @@
Sat Jan 30 06:30:26 1993: cron started up
Sat Jan 30 06:30:33 1993: cron started up
Sun Jan 31 07:43:51 1993: cron started up

BIN
usr.sbin/cron/crontab Normal file

Binary file not shown.

View File

@ -0,0 +1,2 @@
#define PATH_crontab "/etc/crontab"
#define PATH_cronlog "/etc/cronlog"

17
usr.sbin/getty/Makefile Normal file
View File

@ -0,0 +1,17 @@
main.a: main.c pathnames.h
compile -i main.c keep=main
init.a: init.c pathnames.h
compile -i init.c keep=init
subr.a: subr.c
compile -i subr.c keep=subr
gettytab.a: gettytab.c pathnames.h
compile -i +w gettytab.c keep=gettytab
ttydflts.a: ttydefaults.c
compile -i ttydefaults.c keep=ttydflts
getty: main.c init.c subr.c gettytab.c ttydefaults.c
compile linkfile

View File

@ -0,0 +1,145 @@
GNO Manual Addendum
-------------------
This file contains information on parts of GNO that changed after
the documentation was printed.
Known Bugs
----------
The default gshrc file created by the installer generates a $HOME
directory that uses colon delimiters (e.g., :hd1:gno:user:root). A bug
in handling the ~ character causes attempts to, for example, "ls ~/foo"
to fail, because that gets interpreted as "ls :hd1:gno:user:root/foo",
where the system interprets "root/foo" as a single filename. You should
either change the gshrc file to use '/' delimiters, or use the ':'
delimiter when also using ~ (i.e., "ls ~:foo")
Getty (2.0.3)
-------------
The 'getty' program provided with GNO 2.0.3 and later has a new feature and
a fixed bug.
o Getty used to overrun its stack space in ways that were hard to
detect; this has been fixed
o There is a new type of entry in the gettytab file:
P|8bit.9600|9600-baud-8bit|8bit:\
:sp#9600:p8:tt=vt100:hu#8:
The 'hu#' entry represents the RS232 signal line that is to be
used as carrier detect, and thus will cause a SIGHUP signal to
be sent to the processes running on that port. In this example,
'8' indicates a '1' in bit 3 of the following byte:
[7] break/abort
[6] tx underrun
* [5] DSR (input handshake line)
[4] reserved
* [3] DCD (general purpose input line)
[2] tx buff empty
[1] reserved
[0] rx char available
The only lines that have any meaning are marked with '*'s. The
default line is #5 (value 32) due to the strange wiring of some
modem cables. Setting this value to zero (0) turns off hangup
checking completely.
How to Control Serial Ports with stty
-------------------------------------
'stty' is short for 'set tty parameters', and can be used to control
various aspects of the serial ports and other terminal devices.
stty modifies the parameters of the terminal that stty's standard input
references; e.g., to modify .ttya parameters, do something like this:
stty ... < .ttya
To set the baud rate, simply enter the baud rate you want on the command line.
e.g., to set the printer port's baud rate to 19200 baud, do
stty 19200 <.ttyb
The various other parameters that stty supports are described in the tty(4)
manual page.
How to use the Multi-User package
---------------------------------
If you choose to install the multi-user package, the nature of the GNO
system changes quite a bit. First off, instead of GNO simply being a shell
on your IIGS's screen, the console becomes a terminal through which you
can log into the system.
When you start GNO after installing the MU package, you'll see some intro
text (terminal name, and name of the computer), and then a 'login' prompt.
At this prompt, users type in their unique user names (and normally a
password) to gain entry to your computer. GNO comes with one user already
configured : 'root'. To get into GNO the first time, type 'root' at the
login prompt. No password is set by default, so you won't be asked for one.
If you want to protect entry to your computer with a password, use the 'passwd'
command to change your password.
% passwd
You'll be prompted for your old password, which is nothing - so hit return.
Then you type in the new password - twice, to make sure you entered it
correctly. This is done because, sensibly, when entering a password the
keys you type are not echoed on the screen.
Don't forget your password! If you do, you'll have to manually edit the
/etc/passwd file, and delete the second field; the one right after the username
and a colon (:), and that looks like gibberish because it's encrypted. Delete
everything between the two colons to remove the password.
There are two ways to exit GNO with the MU package installed; simply typing
'exit' at the shell will only return to the login prompt.
'init 5' at the shell will cause GNO to shut down and return to the program
launcher you used to run GNO (usually the Finder).
'init 0' will shut down GNO and will reboot your computer.
There is a file that contains a log of activity on the system, including
bad attempts to log in. This file is /var/adm/syslog. Typing
'more /var/adm/syslog' from the shell will display the contents of this file.
Other applications may also use the syslog file to record notable events.
How to use the line printer daemon
(or, lpr is your friend)
----------------------------------
The print spooling system included with GNO is very versatile because it
takes advantage of GNO's multitasking capabilities. Anyone can write a program
that communicates with lpd (line printer daemon) to spool a print job. At
this time the communication specification is not yet available; contact Procyon
for more information.
You must start lpd differently depending on whether you're using the MU package
or using GNO in single-user mode. For single-user, simply type
/usr/sbin/lpd &
To start the spooler process.
With MU, simply uncomment (remove the '#') the line in the /etc/inittab file
corresponding to lpd. Then, lpd will be started automatically whenever you
run GNO. Note that either way you start lpd, it is currently limited to
using the printer baud rate specified in the IIGS control panel, and to
using serial printers. lpd does not work with laser printers hooked up via
an AppleTalk network. It also requires you to use the printer port.
There are currently two programs that use lpd; lpr, and FilePort. lpr is
the standard UNIX 'print a text file' program. Typing
lpr file1 file2 ...
will print the text files you list, adding headers and page numbers.
FilePort is a GS/OS printer driver that works with desktop applications.
To turn it on, use the Control Panel NDA, select 'DC Printer', and choose
your printer type and 'FilePort' (for 'Port').
From then on, whenever you print from a desktop program in GNO, the output
will be spooled. If you wish to print from outside GNO, you will have to
choose the regular port driver again in the Control Panel NDA (usually
'Printer').

127
usr.sbin/getty/getty.8 Normal file
View File

@ -0,0 +1,127 @@
.\" Copyright (c) 1980, 1991 Regents of the University of California.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
.\" This product includes software developed by the University of
.\" California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)getty.8 6.6 (Berkeley) 4/25/91
.\"
.Dd April 25, 1991
.Dt GETTY 8
.Os BSD 4
.Sh NAME
.Nm getty
.Nd set terminal mode
.Sh SYNOPSIS
.Nm getty
.Oo
.Ar type
.Op Ar tty
.Oc
.Sh DESCRIPTION
The
.Nm getty
program
is called by
.Xr init 8
to open and initialize the tty line, read a login name, and invoke
.Xr login 1 .
.Pp
The argument
.Ar tty
is the special device file in
.Pa /dev
to open for the terminal (for example, ``ttyh0'').
If there is no argument or the argument is
.Ql Fl ,
the tty line is assumed to be open as file descriptor 0.
.Pp
The
.Ar type
argument can be used to make
.Nm getty
treat the terminal line specially.
This argument is used as an index into the
.Nm gettytab 5
database, to determine the characteristics of the line.
If there is no argument, or there is no such table, the
.Em default
table is used.
If there is no
.Pa /etc/gettytab
a set of system defaults is used.
If indicated by the table located,
.Nm getty
will clear the terminal screen,
print a banner heading,
and prompt for a login name.
Usually either the banner or the login prompt will include
the system hostname.
.Pp
Most of the default actions of
.Nm getty
can be circumvented, or modified, by a suitable
.Nm gettytab
table.
.Pp
The
.Nm getty
program
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 DIAGNOSTICS
.Bl -diag
.It "ttyxx: No such device or address."
.It "ttyxx: No such file or address."
A terminal which is turned
on in the
.Xr ttys
file cannot be opened, likely because the requisite
lines are either not configured into the system, the associated device
was not attached during boot-time system configuration,
or the special file in
.Pa /dev
does not exist.
.El
.Sh FILES
.Bl -tag -width /etc/gettytab -compact
.It Pa /etc/gettytab
.El
.Sh SEE ALSO
.Xr gettytab 5 ,
.Xr init 8 ,
.Xr login 1 ,
.Xr ioctl 2 ,
.Xr tty 4 ,
.Xr ttys 5
.Sh HISTORY
A
.Nm getty
program appeared in
.At v6 .

323
usr.sbin/getty/gettytab.5 Normal file
View File

@ -0,0 +1,323 @@
.\" Copyright (c) 1983, 1991 The Regents of the University of California.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
.\" This product includes software developed by the University of
.\" California, Berkeley and its contributors.
.\" 4. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)gettytab.5 6.7 (Berkeley) 5/10/91
.\"
.Dd May 10, 1991
.Dt GETTYTAB 5
.Os BSD 4.2
.Sh NAME
.Nm gettytab
.Nd terminal configuration data base
.Sh SYNOPSIS
.Nm gettytab
.Sh DESCRIPTION
The
.Nm gettytab
file
is a simplified version of the
.Xr termcap 5
data base
used to describe terminal lines.
The initial terminal login process
.Xr getty 8
accesses the
.Nm gettytab
file each time it starts, allowing simpler
reconfiguration of terminal characteristics.
Each entry in the data base
is used to describe one class of terminals.
.Pp
There is a default terminal class,
.Em default ,
that is used to set global defaults for all other classes.
(That is, the
.Em default
entry is read, then the entry for the class required
is used to override particular settings.)
.Sh CAPABILITIES
Refer to
.Xr termcap 5
for a description of the file layout.
The
.Em default
column below lists defaults obtained if there is
no entry in the table obtained, nor one in the special
.Em default
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 "ce bool false use crt erase algorithm"
.It "ck bool false use crt kill algorithm"
.It "cl str" Ta Dv NULL Ta
.No "screen clear sequence"
.It "co bool false console - add"
.Ql \en
after login prompt
.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
.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"
.Pq Dv EOF
character
.It "ev str" Ta Dv NULL Ta
.No "initial enviroment"
.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"
.Tn NOT
hangup line on last close
.It "he str" Ta Dv NULL Ta
.No "hostname editing string"
.It "hn str hostname hostname"
.It "ht bool false terminal has real tabs"
.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 "is num unused input speed"
.It "kl str" Ta So Li ^U Sc Ta
.No "kill character"
.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 "nl bool false terminal has (or might have) a newline character"
.It "nx str default next table (for auto speed selection)"
.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 "pe bool false use printer (hard copy) erase algorithm"
.It "pf num 0 delay"
between first prompt and following flush (seconds)
.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 "rw bool false do"
.Tn 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 "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 "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
.Tn NOT
echo control chars as
.Ql ^X
.It "xf str" Ta So Li ^S Sc Ta Dv XOFF
(stop output) character
.It "xn str" Ta So Li ^Q Sc Ta Dv XON
(start output) character
.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
line speed for stated direction only.
.Pp
Terminal modes to be used for the output of the message,
for input of the login name,
and to leave the terminal set as upon completion,
are derived from the boolean flags specified.
If the derivation should prove inadequate,
any (or all) of these three may be overriden
with one of the
.Em \&f0 ,
.Em \&f1 ,
or
.Em \&f2
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.
.Pp
Should
.Xr getty
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.
.Pp
Delays are specified in milliseconds, the nearest possible
delay available in the tty driver will be used.
Should greater certainty be desired, delays
with values 0, 1, 2, and 3 are interpreted as
choosing that particular delay algorithm from the driver.
.Pp
The
.Em \&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 .
.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
.Em \&hn
table entry.
In either case it may be edited with
.Em \&he .
The
.Em \&he
string is a sequence of characters, each character that
is neither '@' nor '#' is copied into the final hostname.
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.
Surplus '@' and '#' characters are ignored.
.Pp
When getty execs the login process, given
in the
.Em \&lo
string (usually
.Dq Pa /usr/bin/login ) ,
it will have set
the enviroment to include the terminal type, as indicated
by the
.Em \&tt
string (if it exists).
The
.Em \&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 .
.Pp
If a non-zero timeout is specified, with
.Em \&to ,
then getty will exit within the indicated
number of seconds, either having
received a login name and passed control
to
.Xr login ,
or having received an alarm signal, and exited.
This may be useful to hangup dial in lines.
.Pp
Output from
.Xr getty
is even parity unless
.Em \&op
is specified.
The
.Em \&op
string
may be specified with
.Em \&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
does not check parity of input characters in
.Dv RAW
mode.
.Sh SEE ALSO
.Xr login 1 ,
.Xr termcap 5 ,
.Xr getty 8 .
.Sh BUGS
The special characters (erase, kill, etc.) are reset to system defaults
by
.Xr login 1 .
In
.Em all
cases, '#' or '^H' typed in a login name will be treated as
an erase character, and '@' will be treated as a kill character.
.Pp
The delay stuff is a real crock.
Apart form its general lack of flexibility, some
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
format is horrid, something more rational should
have been chosen.
.Sh HISTORY
The
.Nm gettytab
file format appeared in 4.2BSD.

354
usr.sbin/getty/gettytab.c Normal file
View File

@ -0,0 +1,354 @@
/*#pragma debug 25*/
/*#define BUG(__s) {fprintf(stderr,"%s\n",__s);}*/
#define BUG(__s)
#pragma optimize 31
/*
* Copyright (c) 1983 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef lint
static char sccsid[] = "@(#)gettytab.c 5.5 (Berkeley) 2/25/91";
#endif /* not lint */
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "pathnames.h"
#define TABBUFSIZ 512
static char *tbuf;
int hopcount; /* detect infinite loops in termcap, init 0 */
char *skip();
char *getstr();
char *decode();
/*
* Get an entry for terminal name in buffer bp,
* from the termcap file. Parse is very rudimentary;
* we just notice escaped newlines.
*/
getent(bp, name)
char *bp, *name;
{
register char *cp;
register int c;
register int i = 0, cnt = 0;
static char ibuf[TABBUFSIZ];
char *cp2;
int tf;
tbuf = bp;
tf = open(_PATH_GETTYTAB, O_RDONLY);
if (tf < 0)
return (-1);
for (;;) {
cp = bp;
for (;;) {
if (i == cnt) {
cnt = read(tf, ibuf, TABBUFSIZ);
if (cnt <= 0) {
close(tf);
return (0);
}
i = 0;
}
c = ibuf[i++];
if (c == '\n' || c == '\r') {
if (cp > bp && cp[-1] == '\\'){
cp--;
continue;
}
break;
}
if (cp >= bp+TABBUFSIZ) {
write(STDERR_FILENO,"Gettytab entry too long\n", 24);
break;
} else
*cp++ = c;
}
*cp = 0;
/*
* The real work for the match.
*/
if (namatch(name)) {
close(tf);
return(nchktc());
}
}
}
/*
* tnchktc: check the last entry, see if it's tc=xxx. If so,
* recursively find xxx and append that entry (minus the names)
* to take the place of the tc=xxx entry. This allows termcap
* entries to say "like an HP2621 but doesn't turn on the labels".
* Note that this works because of the left to right scan.
*/
#define MAXHOP 32
nchktc()
{
register char *p, *q;
char tcname[16]; /* name of similar terminal */
char *tcbuf;
/*char tcbuf[TABBUFSIZ];*/
char *holdtbuf = tbuf;
int l;
tcbuf = malloc(TABBUFSIZ);
p = tbuf + strlen(tbuf) - 2; /* before the last colon */
while (*--p != ':')
if (p<tbuf) {
write(STDERR_FILENO, "Bad gettytab entry\n", 19);
free(tcbuf);
return (0);
}
p++;
/* p now points to beginning of last field */
if (p[0] != 't' || p[1] != 'c') {
free(tcbuf);
return(1);
}
strcpy(tcname,p+3);
q = tcname;
while (q && *q != ':')
q++;
*q = 0;
if (++hopcount > MAXHOP) {
write(STDERR_FILENO, "Getty: infinite tc= loop\n", 25);
free(tcbuf);
return (0);
}
if (getent(tcbuf, tcname) != 1) {
free(tcbuf);
return(0);
}
for (q=tcbuf; *q != ':'; q++)
;
l = p - holdtbuf + strlen(q);
if (l > TABBUFSIZ) {
write(STDERR_FILENO, "Gettytab entry too long\n", 24);
q[TABBUFSIZ - (p-tbuf)] = 0;
}
strcpy(p, q+1);
tbuf = holdtbuf;
free(tcbuf);
return(1);
}
/*
* Tnamatch deals with name matching. The first field of the termcap
* entry is a sequence of names separated by |'s, so we compare
* against each such name. The normal : terminator after the last
* name (before the first field) stops us.
*/
namatch(char *np)
{
register char *Np, *Bp;
Bp = tbuf;
if (*Bp == '#')
return(0);
for (;;) {
for (Np = np; *Np && *Bp == *Np; Bp++, Np++)
continue;
if (*Np == 0 && (*Bp == '|' || *Bp == ':' || *Bp == 0))
return (1);
while (*Bp && *Bp != ':' && *Bp != '|')
Bp++;
if (*Bp == 0 || *Bp == ':')
return (0);
Bp++;
}
}
/*
* Skip to the next field. Notice that this is very dumb, not
* knowing about \: escapes or any such. If necessary, :'s can be put
* into the termcap file in octal.
*/
static char *
skip(bp)
register char *bp;
{
while (*bp && *bp != ':')
bp++;
if (*bp == ':')
bp++;
return (bp);
}
/*
* Return the (numeric) option id.
* Numeric options look like
* li#80
* i.e. the option string is separated from the numeric value by
* a # character. If the option is not found we return -1.
* Note that we handle octal numbers beginning with 0.
*/
long
getnum(id)
char *id;
{
register long i, base;
register char *bp = tbuf;
for (;;) {
bp = skip(bp);
if (*bp == 0)
return (-1);
if (*bp++ != id[0] || *bp == 0 || *bp++ != id[1])
continue;
if (*bp == '@')
return(-1);
if (*bp != '#')
continue;
bp++;
base = 10;
if (*bp == '0')
base = 8;
i = 0;
while (isdigit(*bp))
i *= base, i += *bp++ - '0';
return (i);
}
}
/*
* Handle a flag option.
* Flag options are given "naked", i.e. followed by a : or the end
* of the buffer. Return 1 if we find the option, or 0 if it is
* not given.
*/
getflag(id)
char *id;
{
register char *bp = tbuf;
for (;;) {
bp = skip(bp);
if (!*bp)
return (-1);
if (*bp++ == id[0] && *bp != 0 && *bp++ == id[1]) {
if (!*bp || *bp == ':')
return (1);
else if (*bp == '!')
return (0);
else if (*bp == '@')
return(-1);
}
}
}
/*
* Get a string valued option.
* These are given as
* cl=^Z
* Much decoding is done on the strings, and the strings are
* placed in area, which is a ref parameter which is updated.
* No checking on area overflow.
*/
char *
getstr(id, area)
char *id, **area;
{
register char *bp = tbuf;
for (;;) {
bp = skip(bp);
if (!*bp)
return (0);
if (*bp++ != id[0] || *bp == 0 || *bp++ != id[1])
continue;
if (*bp == '@')
return(0);
if (*bp != '=')
continue;
bp++;
return (decode(bp, area));
}
}
/*
* Tdecode does the grung work to decode the
* string capability escapes.
*/
static char *
decode(str, area)
register char *str;
char **area;
{
register char *cp;
register int c;
register char *dp;
int i;
cp = *area;
while ((c = *str++) && c != ':') {
switch (c) {
case '^':
c = *str++ & 037;
break;
case '\\':
dp = "E\033^^\\\\::n\nr\rt\tb\bf\f";
c = *str++;
nextc:
if (*dp++ == c) {
c = *dp++;
break;
}
dp++;
if (*dp)
goto nextc;
if (isdigit(c)) {
c -= '0', i = 2;
do
c <<= 3, c |= *str++ - '0';
while (--i && isdigit(*str));
}
break;
}
*cp++ = c;
}
*cp++ = 0;
str = *area;
*area = cp;
return (str);
}

147
usr.sbin/getty/gettytab.h Normal file
View File

@ -0,0 +1,147 @@
/*
* Copyright (c) 1983 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)gettytab.h 5.5 (Berkeley) 3/27/91
*/
/*
* Getty description definitions.
*/
struct gettystrs {
char *field; /* name to lookup in gettytab */
char *defalt; /* value we find by looking in defaults */
char *value; /* value that we find there */
};
struct gettynums {
char *field; /* name to lookup */
long defalt; /* number we find in defaults */
long value; /* number we find there */
int set; /* we actually got this one */
};
struct gettyflags {
char *field; /* name to lookup */
char invrt; /* name existing in gettytab --> false */
char defalt; /* true/false in defaults */
char value; /* true/false flag */
char set; /* we found it */
};
/*
* String values.
*/
#define NX gettystrs[0].value
#define CL gettystrs[1].value
#define IM gettystrs[2].value
#define LM gettystrs[3].value
#define ER gettystrs[4].value
#define KL gettystrs[5].value
#define ET gettystrs[6].value
#define PC gettystrs[7].value
#define TT gettystrs[8].value
#define EV gettystrs[9].value
#define LO gettystrs[10].value
#define HN gettystrs[11].value
#define HE gettystrs[12].value
#define IN gettystrs[13].value
#define QU gettystrs[14].value
#define XN gettystrs[15].value
#define XF gettystrs[16].value
#define BK gettystrs[17].value
#define SU gettystrs[18].value
#define DS gettystrs[19].value
#define RP gettystrs[20].value
#define FL gettystrs[21].value
#define WE gettystrs[22].value
#define LN gettystrs[23].value
/*
* Numeric definitions.
*/
#define IS gettynums[0].value
#define OS gettynums[1].value
#define SP gettynums[2].value
#define ND gettynums[3].value
#define CD gettynums[4].value
#define TD gettynums[5].value
#define FD gettynums[6].value
#define BD gettynums[7].value
#define TO gettynums[8].value
#define F0 gettynums[9].value
#define F0set gettynums[9].set
#define F1 gettynums[10].value
#define F1set gettynums[10].set
#define F2 gettynums[11].value
#define F2set gettynums[11].set
#define PF gettynums[12].value
#define HU gettynums[13].value
#define HUset gettynums[13].set
/*
* Boolean values.
*/
#define HT gettyflags[0].value
#define NL gettyflags[1].value
#define EP gettyflags[2].value
#define EPset gettyflags[2].set
#define OP gettyflags[3].value
#define OPset gettyflags[2].set
#define AP gettyflags[4].value
#define APset gettyflags[2].set
#define EC gettyflags[5].value
#define CO gettyflags[6].value
#define CB gettyflags[7].value
#define CK gettyflags[8].value
#define CE gettyflags[9].value
#define PE gettyflags[10].value
#define RW gettyflags[11].value
#define XC gettyflags[12].value
#define LC gettyflags[13].value
#define UC gettyflags[14].value
#define IG gettyflags[15].value
#define PS gettyflags[16].value
#define HC gettyflags[17].value
#define UB gettyflags[18].value
#define AB gettyflags[19].value
#define DX gettyflags[20].value
#define NP gettyflags[21].value
int getent();
long getnum();
int getflag();
char *getstr();
extern struct gettyflags gettyflags[];
extern struct gettynums gettynums[];
extern struct gettystrs gettystrs[];
extern int hopcount;

122
usr.sbin/getty/init.c Normal file
View File

@ -0,0 +1,122 @@
/*
* Copyright (c) 1983 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef lint
static char sccsid[] = "@(#)init.c 5.6 (Berkeley) 3/27/91";
#endif /* not lint */
/*
* Getty table initializations.
*
* Melbourne getty.
*/
#include <sgtty.h>
#include "gettytab.h"
#include "pathnames.h"
extern struct sgttyb tmode;
extern struct tchars tc;
extern struct ltchars ltc;
extern char hostname[];
struct gettystrs gettystrs[] = {
{ "nx" }, /* next table */
{ "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) */
{ "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 */
{ 0 }
};
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 */
{ "hu" }, /* sighup control value */
{ 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) */
{ 0 }
};

192
usr.sbin/getty/init.disasm Normal file
View File

@ -0,0 +1,192 @@
DumpOBJ 2.0
Byte count : $00000382 898
Reserved space: $00000000 0
Length : $00000165 357
Label length : $00 0
Number length : $04 4
Version : $02 2
Bank size : $00010000 65536
Kind : $0000 0 (code,static)
Org : $00000000 0
Alignment : $00000000 0
Number sex : $00 0
Segment number: $0000 0
Segment entry : $00000000 0
Disp to names : $0030 48
Disp to body : $0044 68
Load name :
Segment name : login_tty
000044 000000 | LONGA ON
000044 000000 | LONGI ON
000044 000000 | login_tty START
000044 000000 | TSC
000046 000001 | SEC
000047 000002 | SBC #$0008
00004A 000005 | TCS
00004B 000006 | PHD
00004C 000007 | TCD
00004D 000008 | TSC
00004E 000009 | STA $07
000050 00000B | LDA $07
000052 00000D | PHA
000053 00000E | PEA ((login_tty+$0000010A)|$FFFFFFF0)
000062 000011 | PEA (login_tty+$0000010A)
00006C 000014 | JSL printf
000079 000018 | BRK $00
00007C 00001A | LDA $0C
00007E 00001C | PHA
00007F 00001D | JSL tcnewpgrp
00008E 000021 | LDX #$0000
000092 000024 | CMP #$FFFF
000095 000027 | BNE (login_tty+$0000002A)
0000A2 000029 | INX
0000A4 00002A | TXA
0000A6 00002B | BNE (login_tty+$00000030)
0000B3 00002D | BRL (login_tty+$0000003A)
0000C1 000030 | PEA (((login_tty+$0000010A)+$00000010)|$FFFFFFF0)
0000D7 000033 | PEA ((login_tty+$0000010A)+$00000010)
0000E7 000036 | JSL printf
0000F4 00003A | LDA $0C
0000F7 00003C | PHA
0000F8 00003D | JSL settpgrp
000106 000041 | LDA #$FFFF
00010A 000044 | LDX #$0000
00010D 000047 | TAY
00010E 000048 | BPL (login_tty+$0000004B)
00011B 00004A | DEX
00011D 00004B | LDY #$0001
000121 00004E | CMP $01,S
000123 000050 | BEQ (login_tty+$00000053)
000130 000052 | DEY
000132 000053 | TXA
000134 000054 | CMP $03,S
000136 000056 | BEQ (login_tty+$0000005B)
000143 000058 | LDY #$0000
000147 00005B | PLA
000149 00005C | PLA
00014A 00005D | TYA
00014B 00005E | BNE (login_tty+$00000063)
000158 000060 | BRL (login_tty+$0000006D)
000166 000063 | PEA (((login_tty+$0000010A)+$00000022)|$FFFFFFF0)
00017C 000066 | PEA ((login_tty+$0000010A)+$00000022)
00018C 000069 | JSL printf
000199 00006D | PEA $0000
00019D 000070 | PEA $0000
0001A0 000073 | PEA $2000
0001A3 000076 | PEA $7461
0001A6 000079 | LDA $0C
0001A8 00007B | PHA
0001A9 00007C | JSL ioctl
0001B4 000080 | LDX #$0000
0001B8 000083 | CMP #$FFFF
0001BB 000086 | BNE (login_tty+$00000089)
0001C8 000088 | INX
0001CA 000089 | TXA
0001CC 00008A | BNE (login_tty+$0000008F)
0001D9 00008C | BRL (login_tty+$000000A1)
0001E7 00008F | PEA (((login_tty+$0000010A)+$00000033)|$FFFFFFF0)
0001FD 000092 | PEA ((login_tty+$0000010A)+$00000033)
00020D 000095 | JSL printf
00021A 000099 | LDA #$FFFF
00021E 00009C | STA $01
000220 00009E | BRL (login_tty+$000000F7)
00022D 0000A1 | LDA #$0001
000231 0000A4 | PHA
000232 0000A5 | LDA $0C
000234 0000A7 | PHA
000235 0000A8 | JSL dup2
00023F 0000AC | LDA #$0002
000243 0000AF | PHA
000244 0000B0 | LDA $0C
000246 0000B2 | PHA
000247 0000B3 | JSL dup2
000251 0000B7 | LDA #$0003
000255 0000BA | PHA
000256 0000BB | LDA $0C
000258 0000BD | PHA
000259 0000BE | JSL dup2
000263 0000C2 | LDA $0C
000266 0000C4 | LDX #$0001
000269 0000C7 | SEC
00026A 0000C8 | SBC #$0003
00026D 0000CB | BEQ (login_tty+$000000D4)
00027A 0000CD | BVS (login_tty+$000000D2)
000288 0000CF | EOR #$8000
00028C 0000D2 | BMI (login_tty+$000000D5)
00029A 0000D4 | DEX
00029C 0000D5 | TXA
00029E 0000D6 | BNE (login_tty+$000000DB)
0002AB 0000D8 | BRL (login_tty+$000000E2)
0002B9 0000DB | LDA $0C
0002BC 0000DD | PHA
0002BD 0000DE | JSL close
0002C8 0000E2 | TSC
0002CA 0000E3 | STA $07
0002CC 0000E5 | LDA $07
0002CE 0000E7 | PHA
0002CF 0000E8 | PEA (((login_tty+$0000010A)+$0000004B)|$FFFFFFF0)
0002E4 0000EB | PEA ((login_tty+$0000010A)+$0000004B)
0002F4 0000EE | JSL printf
000301 0000F2 | STZ $01
000304 0000F4 | BRL (login_tty+$000000F7)
000311 0000F7 | LDA $0A
000314 0000F9 | STA $0C
000316 0000FB | LDA $09
000318 0000FD | STA $0B
00031A 0000FF | LDY $01
00031C 000101 | PLD
00031D 000102 | TSC
00031E 000103 | CLC
00031F 000104 | ADC #$000A
000322 000107 | TCS
000323 000108 | TYA
000324 000109 | RTL
000325 00010A | ADC ($74,S),Y
000328 00010C | ADC ($63,X)
00032A 00010E | RTL
00032B 00010F | JSR $7369
00032E 000112 | DEC A
00032F 000113 | JSR $3025
000332 000116 | BIT $58,X
000334 000118 | ASL A
000335 000119 | BRK $74
000337 00011B | ADC $6E,S
000339 00011D | ADC $77
00033B 00011F | BVS *+$69
00033D 000121 | ADC ($70)
00033F 000123 | JSR $6166
000342 000126 | ADC #$656C
000345 000129 | STZ $0A
000347 00012B | BRK $73
000349 00012D | ADC $74
00034B 00012F | STZ $70,X
00034D 000131 | ADC [$72]
00034F 000133 | BVS *+$22
000351 000135 | ROR $61
000353 000137 | ADC #$656C
000356 00013A | STZ $0A
000358 00013C | BRK $69
00035A 00013E | ADC >$6C7463
00035E 000142 | AND >$4F4954
000362 000146 | EOR $53,S
000364 000148 | EOR $54,S
000366 00014A | MVN $59,$20
000369 00014D | ROR $61
00036B 00014F | ADC #$656C
00036E 000152 | STZ $0A
000370 000154 | BRK $73
000372 000156 | STZ $61,X
000374 000158 | ADC $6B,S
000376 00015A | JSR $7369
000379 00015D | DEC A
00037A 00015E | JSR $3025
00037D 000161 | BIT $58,X
00037F 000163 | ASL A
000380 000164 | BRK ???
000382 000166 |
000383 000166 | END

8
usr.sbin/getty/linkfile Executable file
View File

@ -0,0 +1,8 @@
main
init
subr
gettytab
ttydflts
../strftime/strftime
2/libgno
keep=getty

554
usr.sbin/getty/main.c Normal file
View File

@ -0,0 +1,554 @@
/*#define BUG(__s) {fprintf(stderr,"%s\n",__s);}*/
#pragma optimize 31
#pragma stacksize 1024
#define BUG(__s)
#define rindex strrchr
/*-
* Copyright (c) 1980 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef lint
char copyright[] =
"@(#) Copyright (c) 1980 The Regents of the University of California.\n\
All rights reserved.\n";
#endif /* not lint */
#ifndef lint
static char sccsid[] = "@(#)main.c 5.16 (Berkeley) 3/27/91";
#endif /* not lint */
#define USE_OLD_TTY
#include <stdio.h>
#include <gno/gno.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <signal.h>
#include <fcntl.h>
#include <sgtty.h>
#include <time.h>
#include <ctype.h>
#include <setjmp.h>
#include <sys/syslog.h>
#include <unistd.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "gettytab.h"
#include "pathnames.h"
#ifndef HOSTNAME
#define MAXHOSTNAMELEN 10
gethostname(char *name, int namelen)
{
strncpy(name,"apple",namelen);
return 0;
}
#endif
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
};
int crmod, digit, lower, upper;
char hostname[MAXHOSTNAMELEN];
char name[16];
char dev[] = _PATH_DEV;
char ttyn[32];
char *portselector();
#ifdef __ORCAC__
char *ttyname(int fino);
#else
char *ttyname();
#endif
#define OBUFSIZ 128
#define TABBUFSIZ 512
char defent[TABBUFSIZ];
char defstrs[TABBUFSIZ];
char tabent[TABBUFSIZ];
char tabstrs[TABBUFSIZ];
#ifndef __ORCAC__
char *env[128];
#endif
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,
0001,0201,0201,0001,0201,0001,0001,0201,
0200,0000,0000,0200,0000,0200,0200,0000,
0000,0200,0200,0000,0200,0000,0000,0200,
0000,0200,0200,0000,0200,0000,0000,0200,
0200,0000,0000,0200,0000,0200,0200,0000,
0200,0000,0000,0200,0000,0200,0200,0000,
0000,0200,0200,0000,0200,0000,0000,0200,
0000,0200,0200,0000,0200,0000,0000,0200,
0200,0000,0000,0200,0000,0200,0200,0000,
0000,0200,0200,0000,0200,0000,0000,0200,
0200,0000,0000,0200,0000,0200,0200,0000,
0200,0000,0000,0200,0000,0200,0200,0000,
0000,0200,0200,0000,0200,0000,0000,0201
};
#define ERASE tmode.sg_erase
#define KILL tmode.sg_kill
#define EOT tc.t_eofc
jmp_buf timeout;
static void
dingdong(int sig, int code)
{
alarm(0);
signal(SIGALRM, SIG_DFL);
longjmp(timeout, 1);
}
jmp_buf intrupt;
static void
interrupt(int sig, int code)
{
signal(SIGINT, interrupt);
longjmp(intrupt, 1);
}
main(argc, argv)
int argc;
char **argv;
{
#ifndef __ORCAC__
extern char **environ;
#endif
char *tname;
long allflags;
int repcnt = 0;
int tmp;
signal(SIGINT, SIG_IGN);
/*
signal(SIGQUIT, SIG_DFL);
*/
openlog("getty", LOG_ODELAY|LOG_CONS, LOG_AUTH);
gethostname(hostname, sizeof(hostname));
if (hostname[0] == '\0')
strcpy(hostname, "Amnesiac");
/*
* The following is a work around for vhangup interactions
* which cause great problems getting window systems started.
* If the tty line is "-", we do the old style getty presuming
* that the file descriptors are already set up for us.
* J. Gettys - MIT Project Athena.
*/
if (argc <= 2 || strcmp(argv[2], "-") == 0) {
char *temp = ttyname(STDIN_FILENO);
if (temp) strcpy(ttyn, temp); else *ttyn = 0;
} else {
int i;
#ifdef __ORCAC__
strcpy(ttyn,argv[2]);
#else
strcpy(ttyn, dev);
strncat(ttyn, argv[2], sizeof(ttyn)-sizeof(dev));
#endif
if (strcmp(argv[0], "+") != 0) {
/* chown(ttyn, 0, 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) {
syslog(LOG_ERR, "%s: %m", ttyn);
closelog();
}
repcnt++;
sleep(60);
}
login_tty(i); /* ??? */
}
}
gettable("default", defent, defstrs);
gendefaults();
tname = "default";
if (argc > 1)
tname = argv[1];
for (;;) {
int ldisp = OTTYDISC;
int off = 0;
gettable(tname, tabent, tabstrs);
if (OPset || EPset || APset)
APset++, OPset++, EPset++;
setdefaults();
ioctl(STDIN_FILENO, TIOCFLUSH, 0); /* clear out the crap */
ioctl(STDIN_FILENO, FIONBIO, &off); /* turn off non-blocking mode */
ioctl(STDIN_FILENO, FIOASYNC, &off); /* ditto for async mode */
if (IS)
tmode.sg_ispeed = speed(IS);
else if (SP)
tmode.sg_ispeed = speed(SP);
if (OS)
tmode.sg_ospeed = speed(OS);
else if (SP)
tmode.sg_ospeed = speed(SP);
tmode.sg_flags = setflags(0);
ioctl(STDIN_FILENO, TIOCSETP, &tmode);
setchars();
ioctl(STDIN_FILENO, TIOCSETC, &tc);
if (HUset)
ioctl(STDIN_FILENO, TIOCSHUP, &HU);
if (HC)
ioctl(STDIN_FILENO, TIOCHPCL, 0);
if (AB) {
extern char *autobaud();
tname = autobaud();
continue;
}
if (PS) {
tname = portselector();
continue;
}
if (CL && *CL)
putpad(CL);
edithost(HE);
if (IM && *IM)
putf(IM);
if (setjmp(timeout)) {
tmode.sg_ispeed = tmode.sg_ospeed = 0;
ioctl(STDIN_FILENO, TIOCSETP, &tmode);
exit(1);
}
if (TO) {
signal(SIGALRM, dingdong);
alarm(TO);
}
tmp = getname();
/*printf("\r\n\t\t\ttmp: %d\n\r",tmp);*/
fflush(stdout);
if (tmp) {
/*if (getname()) {*/
#ifndef __ORCAC__
register int i;
#endif
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);
tmode.sg_flags = allflags & 0xffff;
allflags >>= 16;
if (crmod || NL)
tmode.sg_flags |= CRMOD;
if (upper || UC)
tmode.sg_flags |= LCASE;
if (lower || LC)
tmode.sg_flags &= ~LCASE;
tmode.sg_erase = 0x7f;
ioctl(STDIN_FILENO, TIOCSETP, &tmode);
ioctl(STDIN_FILENO, TIOCSLTC, &ltc);
ioctl(STDIN_FILENO, TIOCLSET, &allflags);
signal(SIGINT, SIG_DFL);
#ifdef __ORCAC__
BUG("making environment");
makeenv();
BUG("made environment");
#else
for (i = 0; environ[i] != (char *)0; i++)
env[i] = environ[i];
makeenv(&env[i]);
#endif
/*
* this is what login was doing anyway.
* soon we rewrite getty completely.
*/
set_ttydefaults(STDIN_FILENO);
#ifdef __ORCAC__
{
static char temp[256];
sprintf(temp,"login -p %s",name);
execve(LO,temp);
}
#else
execle(LO, "login", "-p", name, (char *) 0, env);
#endif
syslog(LOG_ERR, "%s: %m", LO);
exit(1);
}
alarm(0);
signal(SIGALRM, SIG_DFL);
signal(SIGINT, SIG_IGN);
if (NX && *NX)
tname = NX;
}
}
getname()
{
register int c;
register char *np;
char cs;
/*
* Interrupt may happen if we use CBREAK mode
*/
if (setjmp(intrupt)) {
signal(SIGINT, SIG_IGN);
return (0);
}
signal(SIGINT, interrupt);
tmode.sg_flags = setflags(0);
ioctl(STDIN_FILENO, TIOCSETP, &tmode);
tmode.sg_flags = setflags(1);
/*printf("flags: %04X\n",tmode.sg_flags);*/
prompt();
if (PF > 0) {
oflush();
sleep(PF);
PF = 0;
}
ioctl(STDIN_FILENO, TIOCSETP, &tmode);
crmod = digit = lower = upper = 0;
np = name;
for (;;) {
oflush();
if (read(STDIN_FILENO, &cs, 1) <= 0)
exit(0);
if ((c = cs&0177) == 0)
return (0);
if (c == EOT)
exit(1);
if (c == '\r' || c == '\n' || np >= &name[sizeof name]) {
putf("\r\n");
break;
}
if (islower(c))
lower = 1;
else if (isupper(c))
upper = 1;
else if (c == ERASE || c == '#' || c == '\b' || c == 0x7f) {
if (np > name) {
np--;
if (tmode.sg_ospeed >= B1200)
puts("\b \b");
else
putchr(cs);
}
continue;
} else if (c == KILL || c == '@') {
putchr(cs);
putchr('\r');
if (tmode.sg_ospeed < B1200)
putchr('\n');
/* this is the way they do it down under ... */
else if (np > name)
puts(" \r");
prompt();
np = name;
continue;
} else if (isdigit(c))
digit++;
if (IG && (c <= ' ' || c > 0176))
continue;
*np++ = c;
putchr(cs);
}
signal(SIGINT, SIG_IGN);
*np = 0;
if (c == '\r')
crmod = 1;
if (upper && !lower && !LC || UC)
for (np = name; *np; np++)
if (isupper(*np))
*np = tolower(*np);
return (1);
}
static
short tmspc10[] = {
0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5, 15
};
putpad(char *s)
{
register pad = 0;
register mspc10;
if (isdigit(*s)) {
while (isdigit(*s)) {
pad *= 10;
pad += *s++ - '0';
}
pad *= 10;
if (*s == '.' && isdigit(s[1])) {
pad += s[1] - '0';
s += 2;
}
}
puts(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]))
return;
/*
* Round up by a half a character frame, and then do the delay.
* Too bad there are no user program accessible programmed delays.
* 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--)
putchr(*PC);
}
/* odd, another prototyping bug */
puts(char *s)
/*register char *s;*/
{
while (*s)
putchr(*s++);
}
char outbuf[OBUFSIZ];
int obufcnt = 0;
putchr(cc)
{
char c;
c = cc;
if (!NP) {
c |= partab[c&0177] & 0200;
if (OP)
c ^= 0200;
}
if (!UB) {
outbuf[obufcnt++] = c;
if (obufcnt >= OBUFSIZ)
oflush();
} else
write(STDOUT_FILENO, &c, 1);
}
oflush()
{
if (obufcnt)
write(STDOUT_FILENO, outbuf, obufcnt);
obufcnt = 0;
}
prompt()
{
putf(LM);
if (CO)
putchr('\n');
}
putf(char *cp)
{
extern char editedhost[];
time_t t;
char *slash;
static char db[100];
while (*cp) {
if (*cp != '%') {
putchr(*cp++);
continue;
}
switch (*++cp) {
case 't':
slash = rindex(ttyn, '/');
if (slash == NULL)
puts(ttyn);
else
puts(&slash[1]);
break;
case 'h':
puts(editedhost);
break;
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;
}
case '%':
putchr('%');
break;
}
cp++;
}
}

View File

@ -0,0 +1,37 @@
/*
* Copyright (c) 1989 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)pathnames.h 5.3 (Berkeley) 6/1/90
*/
#include <paths.h>

578
usr.sbin/getty/subr.c Normal file
View File

@ -0,0 +1,578 @@
/*#pragma debug 25 */
/*#define BUG(__s) {fprintf(stderr,"%s\n",__s);} */
#define BUG(__s)
#pragma optimize 31
#define index strchr
/*
* Copyright (c) 1983 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef lint
static char sccsid[] = "@(#)subr.c 5.10 (Berkeley) 2/26/91";
#endif /* not lint */
/*
* Melbourne getty.
*/
#define USE_OLD_TTY
#include <stddef.h>
#include <gno/gno.h> /* sleep... */
#include <sgtty.h>
#include <unistd.h>
#include <shell.h>
#include <string.h>
#include <fcntl.h>
#include "gettytab.h"
extern struct sgttyb tmode;
extern struct tchars tc;
extern struct ltchars ltc;
/*
* Get a table entry.
*/
gettable(name, buf, area)
char *name, *buf, *area;
{
register struct gettystrs *sp;
register struct gettynums *np;
register struct gettyflags *fp;
register n;
hopcount = 0; /* new lookup, start fresh */
if (getent(buf, name) != 1)
return;
for (sp = gettystrs; sp->field; sp++)
sp->value = getstr(sp->field, &area);
for (np = gettynums; np->field; np++) {
n = getnum(np->field);
if (n == -1)
np->set = 0;
else {
np->set = 1;
np->value = n;
}
}
for (fp = gettyflags; fp->field; fp++) {
n = getflag(fp->field);
if (n == -1)
fp->set = 0;
else {
fp->set = 1;
fp->value = n ^ fp->invrt;
}
}
}
gendefaults()
{
register struct gettystrs *sp;
register struct gettynums *np;
register struct gettyflags *fp;
for (sp = gettystrs; sp->field; sp++)
if (sp->value)
sp->defalt = sp->value;
for (np = gettynums; np->field; np++)
if (np->set)
np->defalt = np->value;
for (fp = gettyflags; fp->field; fp++)
if (fp->set)
fp->defalt = fp->value;
else
fp->defalt = fp->invrt;
}
setdefaults()
{
register struct gettystrs *sp;
register struct gettynums *np;
register struct gettyflags *fp;
for (sp = gettystrs; sp->field; sp++)
if (!sp->value)
sp->value = sp->defalt;
for (np = gettynums; np->field; np++)
if (!np->set)
np->value = np->defalt;
for (fp = gettyflags; fp->field; fp++)
if (!fp->set)
fp->value = fp->defalt;
}
static char **
charnames[] = {
&ER, &KL, &IN, &QU, &XN, &XF, &ET, &BK,
&SU, &DS, &RP, &FL, &WE, &LN, 0
};
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
};
setchars()
{
register int i;
register char *p;
for (i = 0; charnames[i]; i++) {
p = *charnames[i];
if (p && *p)
*charvars[i] = *p;
else
*charvars[i] = '\377';
}
}
long
setflags(n)
{
register long f;
switch (n) {
case 0:
if (F0set)
return(F0);
break;
case 1:
if (F1set)
return(F1);
break;
default:
if (F2set)
return(F2);
break;
}
f = 0;
if (AP)
f |= ANYP;
else if (OP)
f |= ODDP;
else if (EP)
f |= EVENP;
if (UC)
f |= LCASE;
if (NL)
f |= CRMOD;
f |= delaybits();
if (n == 1) { /* read mode flags */
if (RW)
f |= RAW;
else
f |= CBREAK;
return (f);
}
if (!HT)
f |= XTABS;
if (n == 0)
return (f);
if (CB)
f |= CRTBS;
if (CE)
f |= CRTERA;
if (CK)
f |= CRTKIL;
if (PE)
f |= PRTERA;
if (EC)
f |= ECHO;
if (XC)
f |= CTLECH;
if (DX)
f |= DECCTQ;
return (f);
}
struct delayval {
unsigned delay; /* delay in ms */
int bits;
};
/*
* below are random guesses, I can't be bothered checking
*/
struct delayval crdelay[] = {
1, CR1,
2, CR2,
3, CR3,
83, CR1,
166, CR2,
0, CR3,
};
struct delayval nldelay[] = {
1, NL1, /* special, calculated */
2, NL2,
3, NL3,
100, NL2,
0, NL3,
};
struct delayval bsdelay[] = {
1, BS1,
0, 0,
};
struct delayval ffdelay[] = {
1, FF1,
1750, FF1,
0, FF1,
};
struct delayval tbdelay[] = {
1, TAB1,
2, TAB2,
3, XTABS, /* this is expand tabs */
100, TAB1,
0, TAB2,
};
delaybits()
{
register f;
f = adelay(CD, crdelay);
f |= adelay(ND, nldelay);
f |= adelay(FD, ffdelay);
f |= adelay(TD, tbdelay);
f |= adelay(BD, bsdelay);
return (f);
}
adelay(long ms, struct delayval *dp)
{
if (ms == 0)
return (0);
while (dp->delay && ms > dp->delay)
dp++;
return (dp->bits);
}
char editedhost[32];
edithost(char *pat)
{
register char *host = HN;
register char *res = editedhost;
if (pat == NULL)
pat = "";
while (*pat) {
switch (*pat) {
case '#':
if (*host)
host++;
break;
case '@':
if (*host)
*res++ = *host++;
break;
default:
*res++ = *pat;
break;
}
if (res == &editedhost[sizeof editedhost - 1]) {
*res = '\0';
return;
}
pat++;
}
if (*host)
strncpy(res, host, sizeof editedhost - (res - editedhost) - 1);
else
*res = '\0';
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
};
speed(long 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 */
}
#ifdef __ORCAC__
void addenv(char *vdef)
{
char *q,*vdef2;
static Set_VarPB setp;
static ExportPB exp;
if (q = index(vdef,'=')) {
vdef2 = q + 1;
{
char *a,*p;
char sz;
sz = strlen(vdef2);
p = vdef2 + sz;
for (a=p;a>vdef2;*(a--) = *(--p));
*a = sz;
sz = q - vdef;
for (a=q;a>vdef;*(a--) = *(--q));
*a = sz;
}
setp.var_name = vdef;
setp.value = vdef2;
SET_VAR(setp);
exp.name = vdef;
exp.flags = 1;
EXPORT(&exp);
}
}
void makeenv(void)
{
#ifdef __ORCAC__
static char termbuf[128] = "TERM";
#else
static char termbuf[128] = "TERM=";
#endif
char *p, *q;
PUSH_VARIABLES(&p);
if (TT && *TT) {
strcat(termbuf, TT);
addenv(termbuf);
}
if (p = EV) {
q = p;
while (q = index(q, ',')) {
*q++ = '\0';
addenv(p);
p = q;
}
if (*p)
addenv(p);
}
}
#else
makeenv(env)
char *env[];
{
static char termbuf[128] = "TERM=";
register char *p, *q;
register char **ep;
/* char *index(); */
ep = env;
if (TT && *TT) {
strcat(termbuf, TT);
*ep++ = termbuf;
}
if (p = EV) {
q = p;
while (q = index(q, ',')) {
*q++ = '\0';
*ep++ = p;
p = q;
}
if (*p)
*ep++ = p;
}
*ep = (char *)0;
}
#endif
/*
* This speed select mechanism is written for the Develcon DATASWITCH.
* The Develcon sends a string of the form "B{speed}\n" at a predefined
* baud rate. This string indicates the user's actual speed.
* The routine below returns the terminal type mapped from derived speed.
*/
struct portselect {
char *ps_baud;
char *ps_type;
} portspeeds[] = {
{ "B110", "std.110" },
{ "B134", "std.134" },
{ "B150", "std.150" },
{ "B300", "std.300" },
{ "B600", "std.600" },
{ "B1200", "std.1200" },
{ "B2400", "std.2400" },
{ "B4800", "std.4800" },
{ "B9600", "std.9600" },
{ "B19200", "std.19200" },
{ 0 }
};
char *
portselector()
{
char c, baud[20], *type = "default";
register struct portselect *ps;
int len;
alarm(5*60);
for (len = 0; len < sizeof (baud) - 1; len++) {
if (read(STDIN_FILENO, &c, 1) <= 0)
break;
c &= 0177;
if (c == '\n' || c == '\r')
break;
if (c == 'B')
len = 0; /* in case of leading garbage */
baud[len] = c;
}
baud[len] = '\0';
for (ps = portspeeds; ps->ps_baud; ps++)
if (strcmp(ps->ps_baud, baud) == 0) {
type = ps->ps_type;
break;
}
sleep(2); /* wait for connection to complete */
return (type);
}
/*
* This auto-baud speed select mechanism is written for the Micom 600
* portselector. Selection is done by looking at how the character '\r'
* is garbled at the different speeds.
*/
#ifdef SYS_TIME
#include <sys/time.h>
#endif
char *
autobaud()
{
char c, *type = "9600-baud";
#ifdef SYS_TIME
int null = 0;
int rfds;
struct timeval timeout;
ioctl(STDIN_FILENO, TIOCFLUSH, &null);
rfds = 1 << 0;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
if (select(32, (fd_set *)&rfds, (fd_set *)NULL,
(fd_set *)NULL, &timeout) <= 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, (fd_set *)NULL, (fd_set *)NULL,
(fd_set *)NULL, &timeout);
ioctl(STDIN_FILENO, TIOCFLUSH, &null);
switch (c & 0377) {
case 0200: /* 300-baud */
type = "300-baud";
break;
case 0346: /* 1200-baud */
type = "1200-baud";
break;
case 015: /* 2400-baud */
case 0215:
type = "2400-baud";
break;
default: /* 4800-baud */
type = "4800-baud";
break;
case 0377: /* 9600-baud */
type = "9600-baud";
break;
}
#endif
return (type);
}

View File

@ -0,0 +1,70 @@
/*-
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef lint
static char sccsid[] = "@(#)ttydefaults.c 5.1 (Berkeley) 1/19/91";
#endif /* not lint */
#ifdef TERMIOS
#include <sys/termios.h>
#else
#include <sgtty.h>
#endif
set_ttydefaults(fd)
int fd;
{
#ifdef TERMIOS
struct termios term;
tcgetattr(fd, &term);
term.c_iflag = TTYDEF_IFLAG;
term.c_oflag = TTYDEF_OFLAG;
term.c_lflag = TTYDEF_LFLAG;
term.c_cflag = TTYDEF_CFLAG;
tcsetattr(fd, TCSAFLUSH, &term);
#else
struct sgttyb sg;
long localmode;
/* we could do ioctl equiv here */
gtty(fd,&sg);
sg.sg_flags = ECHO | CRMOD | LCRTERA;
sg.sg_erase = 0x7f;
stty(fd,&sg);
ioctl(fd,TIOCLGET,&localmode);
localmode |= LCRTERA;
localmode |= LCTLECH;
ioctl(fd,TIOCLSET,&localmode);
#endif
}

7
usr.sbin/newuser/README Normal file
View File

@ -0,0 +1,7 @@
After running the 'install' program, you need to create the files
/var/adm/newuser/newid and /var/adm/newuser/gshrc. The latter is simply
a template gshrc file that all new users will be given. The former is
a file with a single integer (1-5 digits) and *nothing else*. New users
will be assigned the userid found in this file each time newuser is run,
and the userid will be automatically incremented by newuser. So you only
have to set it up once.

View File

@ -0,0 +1,9 @@
echo "Moving files to appropriate places..."
echo
mv -vi newuser /usr/sbin
mv -vi newuserv /usr/sbin
mv -vi newuser.1 /usr/man/man1/
echo
echo "Make sure the directory /var/adm/newuser exists, and has as"
echo "template 'gshrc' file in it. Also required in that directory"
echo "is the 'newid' file, which holds the next available userid."

View File

@ -0,0 +1,52 @@
.TH NEWUSER 8
.SH NAME
.nf
newuser - add a new user to the system
newuserv - add a new user to the system, subject to validation
.fi
.LP
.SH DESCRIPTION
This is
.B newuser
for GNO/ME. Its basic intent is
to let people add themselves to the system without requiring the system
administrator to do it all manually.
.LP
.B newuser
will ask for real name, account name, terminal type and password (verifying
the password once) and then create the directory /user/(account name) and
copy a template
.B gshrc
into that directory. Then it will add the user to
.B /etc/passwd
and exit.
.PP
If the
.B -v
(verify) flag is selected, everything is done as normal, except
that the new entry is appended to
.B /var/adm/newuser/newusers
instead of being appended to
.BR /etc/passwd ". "
.LP
.SH FILES
.nf
.BR /var/adm/newuser/newid " -- This file holds the next available"
userID. newuser will increment it as necessary.
.BR /var/adm/newuser/gshrc " -- This is the 'template' gshrc file"
that all new users will get. In addition to this, newuser will append
'set' commands to set $home and $user.
.BR /etc/passwd " -- Not required if you use -v. But what's the point"
in newuser if you don't have it? :)
.BR /user/ " -- Has to exist. This is where the user's home directories"
go.
.fi
.LP
.B newuser
will time out after 60 seconds of operation.
.LP
.SH AUTHOR
.nf
James Brookes
jamesb@cscihp.ecst.csuchico.edu
.fi

View File

@ -0,0 +1,52 @@
.TH NEWUSER 8
.SH NAME
.nf
newuser - add a new user to the system
newuserv - add a new user to the system, subject to validation
.fi
.LP
.SH DESCRIPTION
This is
.B newuser
for GNO/ME. Its basic intent is
to let people add themselves to the system without requiring the system
administrator to do it all manually.
.LP
.B newuser
will ask for real name, account name, terminal type and password (verifying
the password once) and then create the directory /user/(account name) and
copy a template
.B gshrc
into that directory. Then it will add the user to
.B /etc/passwd
and exit.
.PP
If the
.B -v
(verify) flag is selected, everything is done as normal, except
that the new entry is appended to
.B /var/adm/newuser/newusers
instead of being appended to
.BR /etc/passwd ". "
.LP
.SH FILES
.nf
.BR /var/adm/newuser/newid " -- This file holds the next available"
userID. newuser will increment it as necessary.
.BR /var/adm/newuser/gshrc " -- This is the 'template' gshrc file"
that all new users will get. In addition to this, newuser will append
'set' commands to set $home and $user.
.BR /etc/passwd " -- Not required if you use -v. But what's the point"
in newuser if you don't have it? :)
.BR /user/ " -- Has to exist. This is where the user's home directories"
go.
.fi
.LP
.B newuser
will time out after 60 seconds of operation.
.LP
.SH AUTHOR
.nf
James Brookes
jamesb@cscihp.ecst.csuchico.edu
.fi

340
usr.sbin/newuser/newuser.c Normal file
View File

@ -0,0 +1,340 @@
/* */
/* newuser - add a new user to the system, v1.1 -- James Brookes */
/* */
/* Changes from 1.0 */
/* */
/* * Removed code to add "set $home/$user" stuff to new user's gshrc */
/* file, per request of Phil Vandry. */
/* * Added restriction that the new password entered must be greater */
/* than four characters. */
/* * Newuser will now try multiple times to open up the /etc/passwd */
/* file, just as passwd itself does. */
/* */
/* Some code borrowed from Eric Shepard's passwd source. */
/* */
/* files: /var/adm/newuser/newid */
/* /var/adm/newuser/newusers */
/* /var/adm/newuser/gshrc */
/* /user/ */
/* */
/*#pragma optimize -1 */
#pragma stacksize 512
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <signal.h>
#include <sgtty.h>
#include <gno/gno.h>
#include <pwd.h>
#include <unistd.h>
#pragma lint -1
char *getpass(char *prompt);
char *crypt(char *key, char *salt);
void time_out(void);
void makesalt(char *salt, long seed);
int get_next_uid(void);
void getpassword(char *password, char *salt, char *passstring);
int bad_name(char *acct_name);
void myfgets(char *string, int maxchar, FILE *FilePtr);
FILE *smartopen(char *file, char *mode);
#define NEWID_FILE "/var/adm/newuser/newid"
#define NEWUSERS_FILE "/var/adm/newuser/newusers"
#define NEWGSHRC_FILE "/var/adm/newuser/gshrc"
#define DEFAULT_GID 2 /* default group ID assigned to new user */
#define ACCT_NAME_LEN 8 /* max # of chars in account name */
#define REAL_NAME_LEN 30 /* max # of chars in real name */
#define TERM_TYPE_LEN 8 /* max # of chars in terminal type */
#define MAX_TRIES 3 /* max # of trials for opening passwd file */
#ifndef FALSE
#define FALSE 0
#define TRUE 1
#endif
static char acct_name[ACCT_NAME_LEN+1],
buffer[80],
name[REAL_NAME_LEN+1],
pass1[14], pass2[14],
salt[3],
scratch[256],
term_type[TERM_TYPE_LEN+1];
static unsigned char salttab[] = /* table of chars for salt */
"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
void time_out(void)
{
printf("\nnewuser timed out after 60 seconds.\n");
exit(1);
}
/* Borrowed from Eric's passwd.cc */
void makesalt(char *salt, long seed)
{
int num = 2;
while (--num >= 0)
{
*salt++ = salttab[seed&0x3f];
seed >= 6;
}
}
int get_next_uid(void)
{
FILE *FPtr;
int uid;
FPtr = fopen(NEWID_FILE,"r+");
fscanf(FPtr,"%d\n",&uid);
rewind(FPtr);
fprintf(FPtr,"%d\n",uid+1);
fclose(FPtr);
return(uid);
}
void getpassword(char *password, char *salt, char *passstring)
{
char *pass, *passcode;
pass = getpass(passstring);
passcode = crypt(pass,salt);
strcpy(password,passcode);
}
int bad_name(char *acct_name)
{
if (!isalpha(*acct_name++))
return(TRUE);
while (*acct_name != '\0')
if (!isalnum(*acct_name++))
return(TRUE);
return(FALSE);
}
void myfgets(char *string, int maxchar, FILE *FilePtr)
{
int last_char;
char *tmp_buf;
tmp_buf = (char *) malloc (256);
maxchar++;
fgets(tmp_buf,maxchar,FilePtr);
if (*tmp_buf == 0x00) /* ^D */
exit(1);
last_char = strlen(tmp_buf)-1;
/* remove terminating \n if necessary */
if ((tmp_buf[last_char] == '\n') || (tmp_buf[last_char] == '\r'))
tmp_buf[last_char] = '\0';
strcpy(string,tmp_buf);
fflush(stdin);
free(tmp_buf);
}
/* try multiple times to open /etc/passwd file */
FILE *smartopen(char *file, char *mode)
{
FILE *FOutPtr;
int i;
for (i = 0; i < MAX_TRIES; i++)
{
FOutPtr = fopen(file,mode);
if (FOutPtr == NULL)
sleep(1);
else
break;
}
return(FOutPtr);
}
int main (int argc, char **argv)
{
int validate, uid;
FILE *FInPtr, *FOutPtr;
struct sgttyb *s;
s = (struct sgttyb *) malloc (sizeof(struct sgttyb));
signal(SIGINT,SIG_IGN);
signal(SIGHUP,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGALRM,time_out);
/* Set proper erase character */
gtty(STDIN_FILENO,s);
s->sg_erase = 0x7f;
stty(STDIN_FILENO,s);
free(s);
validate = FALSE;
if (argc == 2 && !strcmp(argv[1],"-v"))
validate = TRUE;
else if (argc == 1);
else
exit(1);
/* Make sure all required files exist before going any further */
if ((FInPtr = fopen(NEWID_FILE,"r+")) == NULL)
{
fprintf(stderr,"unable to open %s; exiting.\n",NEWID_FILE);
exit(1);
}
fclose(FInPtr);
if ((FInPtr = fopen(NEWGSHRC_FILE,"r+")) == NULL)
{
fprintf(stderr,"unable to open %s; exiting.\n",NEWGSHRC_FILE);
exit(1);
}
fclose(FInPtr);
/* Get information */
printf("\nReal Name: ");
myfgets(name,REAL_NAME_LEN,stdin);
/* Get login name. If the login name is duplicate, prompt for */
/* a new login name. If the login name would call for the */
/* creation of a bogus directory, prompt for a new login name. */
/* Note that I'm using the restrictions of the ProDOS FST, */
/* since HFS is less restrictive. In other words, the username */
/* must start with a character and may only contain letters */
/* and numbers. */
while(1)
{
printf("Login Name: ");
myfgets(acct_name,ACCT_NAME_LEN,stdin);
printf("\n\n(login name: '%s')\n\n",acct_name);
if (getpwnam(acct_name) != NULL)
printf("Duplicate username: please choose another.\n");
else if (bad_name(acct_name))
{
printf("\n** Invalid username: please choose a name comprised of\n");
printf(" alphanumeric characters which starts with an alphabetic\n");
printf(" character.\n");
}
else
break;
}
printf("Terminal Type: ");
myfgets(term_type,TERM_TYPE_LEN,stdin);
/* Get password of > 4 chars, with verification */
makesalt(salt, rand());
while(1)
{
getpassword(pass1,salt,"Password: ");
getpassword(pass2,salt,"Verify: ");
if (!strcmp(pass1,pass2) && (strlen(pass1) > 4))
break;
else
printf("*** Failed verification.\n");
}
uid = get_next_uid(); /* get and update next free ID# */
/* make home directory */
sprintf(scratch,"mkdir -s /user/%s",acct_name);
exec("/bin/mkdir",scratch);
sleep(2);
/* and copy default gshrc to it */
sprintf(scratch,"/user/%s/gshrc",acct_name);
FOutPtr = fopen(scratch,"w");
FInPtr = fopen(NEWGSHRC_FILE,"r");
while(fgets(buffer,80,FInPtr) != NULL)
fputs(buffer,FOutPtr);
fclose(FInPtr);
/* update default gshrc to have correct $home, $user, and $term */
/* Phil asked that this be removed, so... :)
fprintf(FOutPtr,"set home=/user/%s\n",acct_name);
fprintf(FOutPtr,"set user=%s\n",acct_name);
*/
fprintf(FOutPtr,"set term=%s\n",term_type);
/*
fprintf(FOutPtr,"export home user term\n");
*/
fprintf(FOutPtr,"export term\n");
fclose(FOutPtr);
if (!validate) /* no validation, so append new entry to /etc/passwd */
{
FOutPtr = smartopen("/etc/passwd","a");
if (FOutPtr == NULL)
{
fprintf(stderr,"Trouble opening /etc/passwd file.\nExiting\n");
exit(1);
}
fprintf(FOutPtr,"%s:%s:%d:%d:%s:/user/%s:/bin/gsh\n",acct_name,pass1,
uid,DEFAULT_GID,name,acct_name);
fclose(FOutPtr);
printf("You may now log in.\n");
}
else /* validation selected -- so append new entry to NEWUSERS_FILE */
{
FOutPtr = fopen(NEWUSERS_FILE,"a");
fprintf(FOutPtr,"%s:%s:%d:0:%s:/user/%s:/bin/gsh\n",acct_name,pass1,
uid,name,acct_name);
fclose(FOutPtr);
printf("Try back in 24 hours.\n");
}
exit(0);
}

View File

@ -0,0 +1,16 @@
#pragma optimize -1
#pragma stacksize 256
/* */
/* newverify.c - a simple program to launch newuser with the -v option */
/* */
#include<stdio.h>
#include<stdlib.h>
#include<gno/gno.h>
int main(int argc, char **argv)
{
execve("/usr/sbin/newuser","newuser -v");
}

View File

@ -0,0 +1,9 @@
#include <stdio.h>
#include <orca.h>
int main(int argc, char *argv[])
{
setenv("user","root");
setenv("home",":user:root");
execve("/bin/gsh","gsh");
}