libcompat_minix-centric cleanup

remove some old minix-userland-specific stuff

	. /etc/ttytab as a file, and minix-compat function (fftyslot()),
	  replaced by /etc/ttys and new libc functions
	. also remove minix-specific nlist(), cuserid(), fttyslot(), v8 regex
	  functions and <compat/regex.h>
	. and remaining minix-only utilities that use them
	. also unused <compat/pwd.h> and <compat/syslog.h> and
	  redundant <sys/sigcontext.h>
This commit is contained in:
Ben Gras 2012-03-16 16:03:49 +01:00
parent 9290237811
commit 6af9856d4a
42 changed files with 15 additions and 3014 deletions

View file

@ -4,7 +4,7 @@
SUBDIR= add_route arp ash at awk \
backup badblocks banner basename \
btrace cal calendar \
btrace cal \
cawf cd cdprobe checkhier cpp \
chmod chown chroot ci cksum cleantmp clear cmp co \
comm compress cp crc cron crontab cut \
@ -14,16 +14,16 @@ SUBDIR= add_route arp ash at awk \
find finger fingerd fix fold format fortune fsck.mfs \
ftp101 gcore gcov-pull getty grep head hexdump host \
hostaddr id ifconfig ifdef install \
intr ipcrm ipcs irdpd isoread join kill last leave \
intr ipcrm ipcs irdpd isoread join kill last \
less lex loadkeys loadramdisk logger login look lp \
lpd ls lspci mail make MAKEDEV \
mdb mesg mined mkfifo mkfs.mfs mknod \
mkproto modem mount mt netconf newroot nice acknm nohup \
mkproto mount mt netconf newroot nice acknm nohup \
nonamed od paste patch pax \
ping postinstall poweroff pr prep printf printroot \
profile progressbar proto pr_routes ps pwd pwdauth \
ramdisk rarpd rawspeed rcp rdate readall readclock \
reboot remsync rev rget rlogin rlogind \
reboot remsync rev rget rlogin \
rotate rsh rshd sed service setup shar acksize \
sleep slip sort spell split srccrc \
stty su sum svclog swifi sync synctree sysenv \

View file

@ -1,4 +0,0 @@
PROG= calendar
MAN=
.include <bsd.prog.mk>

View file

@ -1,236 +0,0 @@
/* calendar - reminder service Authors: S. & K. Hirabayashi */
/* Permission is hereby granted for nonprofit use. */
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#ifdef __NBSD_LIBC
#include <compat/regexp.h>
#else
#include <regexp.h>
#endif
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <termcap.h>
#include <unistd.h>
#include <utime.h>
#include <stdio.h>
/* Change these two lines for your system needs. */
#define MAIL1 "/usr/bin/mail"
#define MAIL2 "/bin/mail"
#define PASSWD "/etc/passwd" /* system password file */
#define MAX_EXP 4 /* see date_exp() function */
char *mail; /* mail command path ("/bin/mail" etc) */
regexp *exp[MAX_EXP]; /* date expressions */
int nexp; /* # of the date expressions */
char calfile[PATH_MAX]; /* calendar file for the user */
int rflg; /* consult aged 'calendar' file and touch */
int mflg; /* mail (multi user) service */
char *cmd; /* the name of this command */
char buf[BUFSIZ];
_PROTOTYPE(int main, (int argc, char **argv));
_PROTOTYPE(void calendar, (void));
_PROTOTYPE(char *getstr, (char *s, int n));
_PROTOTYPE(int newaccess, (char *file));
_PROTOTYPE(void grep, (char *file, char *user));
_PROTOTYPE(int date_exp, (void));
_PROTOTYPE(char *date_pat, (time_t t));
/*
_PROTOTYPE(void regerror, (char *s));
*/
_PROTOTYPE(void error, (char *s, char *t));
int main(argc, argv)
int argc;
char **argv;
{
char *s;
cmd = *argv;
while (--argc > 0 && (*++argv)[0] == '-') {
s = argv[0] + 1;
if (*s == '\0')
mflg++; /* mail service */
else if (strcmp(s, "r") == 0)
rflg++, mflg++;
}
if (mflg) { /* check mailing agent */
if (access(MAIL1, X_OK) == 0)
mail = MAIL1;
else if (access(MAIL2, X_OK) == 0)
mail = MAIL2;
else
error("cannot find %s", MAIL1);
}
nexp = date_exp();
calendar();
exit(0);
}
void calendar()
{
int i;
char *s;
FILE *fp;
if (!mflg) {
grep("calendar", "");
return;
}
/* Mail sevice */
if ((fp = fopen(PASSWD, "r")) == (FILE *) NULL)
error("cannot open %s", PASSWD);
while (fgets(buf, BUFSIZ, fp) != (char *) NULL) {
for (i = 0, s = buf; *s && *s != '\n'; s++)
if (*s == ':') i++;
*s = '\0';
if (i != 6) error("illegal '/etc/passwd' format: %s", buf);
/* Calendar file = ${HOME}/calendar */
sprintf(calfile, "%s/%s", getstr(buf, 5), "calendar");
if ((access(calfile, R_OK) != 0) || (rflg && !newaccess(calfile)))
continue;
grep(calfile, getstr(buf, 0));
}
fclose(fp);
}
char *getstr(s, n)
char *s;
int n;
{
/* Returns the string value of the n-th field in the record (s) */
int i;
char *t;
static char str[512];
for (i = 0; i < n && *s; s++)
if (*s == ':') i++; /* field separator */
for (i = 0, t = str; *s && *s != ':' && i < 511; i++) *t++ = *s++;
*t = '\0';
return str;
}
int newaccess(file)
char *file; /* file name */
{
/* Check whether the file has been touched today. */
int r = 0;
struct tm *tm;
struct stat stbuf;
time_t clk;
char newdate[8], olddate[8];
time(&clk);
tm = localtime(&clk);
sprintf(newdate, "%02d%02d%02d", tm->tm_year, tm->tm_mon + 1, tm->tm_mday);
if (stat(file, &stbuf) == -1) error("cannot stat %s", file);
tm = localtime(&stbuf.st_mtime);
sprintf(olddate, "%02d%02d%02d", tm->tm_year, tm->tm_mon + 1, tm->tm_mday);
if (strcmp(newdate, olddate) != 0) {
utime(file, NULL); /* touch */
r++;
}
return r;
}
void grep(file, user)
char *file, *user;
{ /* grep 'exp[]' [| mail user] */
int i;
char command[128]; /* mail command */
FILE *ifp, *ofp;
if ((ifp = fopen(file, "r")) == (FILE *) NULL)
error("cannot open %s", file);
if (*user != '\0') {
sprintf(command, "%s %s", mail, user);
ofp = (FILE *) NULL;
} else {
ofp = stdout;
}
while (fgets(buf, BUFSIZ, ifp) != (char *) NULL) {
for (i = 0; i < nexp; i++) {
if (regexec(exp[i], buf, 1)) {
if ((ofp == (FILE *) NULL) &&
(ofp = popen(command, "w")) == (FILE *) NULL)
error("cannot popen %s", mail);
fputs(buf, ofp);
break;
}
}
}
fclose(ifp);
if (ofp == stdout)
fflush(ofp);
else if (ofp != (FILE *) NULL)
pclose(ofp);
}
int date_exp()
{
/* Set compiled regular expressions into the exp[] array. */
static int n[] = {2, 2, 2, 2, 2, 4, 3};
int i, r, wday;
time_t clk;
time(&clk);
wday = localtime(&clk)->tm_wday;
r = n[wday];
if (r > MAX_EXP) error("too many date expressions", "");
for (i = 0; i < r; i++) {
exp[i] = regcomp(date_pat(clk));
clk += 60 * 60 * 24L; /* 24 hours */
}
return(r);
}
char *date_pat(t)
time_t t;
{ /* returns date expression for the time (t) */
static char *month[] = {
"[Jj]an", "[Ff]eb", "[Mm]ar", "[Aa]pr", "[Mm]ay", "[Jj]un",
"[Jj]ul", "[Aa]ug", "[Ss]ep", "[Oo]ct", "[Nn]ov", "[Dd]ec"
};
static char str[512];
struct tm *tm;
tm = localtime(&t);
sprintf(str,
"(^|[ \t(,;])(((%s[^ \t]*[ \t])|0*%d/|\\*/)(0*%d|\\*))([^0123456789]|$)",
month[tm->tm_mon], tm->tm_mon + 1, tm->tm_mday);
return str;
}
void regerror(s)
const char *s;
{ /* regcomp() needs this */
error("REGULAR EXPRESSION ERROR (%s)", (char *) s);
}
void error(s, t)
char *s, *t;
{
fprintf(stderr, "%s: ", cmd);
fprintf(stderr, s, t);
fprintf(stderr, "\n");
exit(1);
}

View file

@ -1,4 +0,0 @@
PROG= leave
MAN=
.include <bsd.prog.mk>

View file

@ -1,210 +0,0 @@
/* Usage: leave [ [+] hh[:]mm ]
*
* Author: Terrence W. Holm
*
* Revision:
* Fred van Kempen, MINIX User Group Holland
* -adapted to MSS
* -adapted to new utmp database
* -adapted to POSIX (MINIX 1.5)
* Michael Temari, <temari@ix.netcom.com>
* -use localtime/mktime to fix bug with DST
*/
#include <sys/types.h>
#include <signal.h>
#include <time.h>
#include <utmp.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#define Min(a,b) ((a<b) ? a : b)
#define STRING 80 /* lots of room for an argument */
#define MIN 60L /* seconds per minute */
#define HOUR (60L*60L) /* seconds per hour */
/* Set the following to your personal preferences for the
* time and contents of warnings.
*/
#define INTERVALS 13 /* size of intervals[] */
#define WARNINGS 4 /* size of warnings[] */
static char *Version = "@(#) LEAVE 1.4 (01/09/90)";
static int intervals[INTERVALS] = {
-5 * MIN,
-1 * MIN,
0,
MIN,
2 * MIN,
3 * MIN,
4 * MIN,
5 * MIN,
6 * MIN,
7 * MIN,
8 * MIN,
9 * MIN,
10 * MIN
};
static char *warnings[WARNINGS] = {
"You have to leave within 5 minutes",
"Just one more minute!",
"Time to leave!",
"You're going to be late!" /* for all subsequent warnings */
};
_PROTOTYPE(int main, (int argc, char **argv));
_PROTOTYPE(void Usage, (void));
_PROTOTYPE(void Get_Hour_Min, (char *when, int *hour, int *min));
_PROTOTYPE(int Still_Logged_On, (char *user, char *tty));
void Usage()
{
fprintf(stderr, "Usage: leave [[+]hh[:]mm]\n");
exit(1);
}
void Get_Hour_Min(when, hour, min)
char *when;
int *hour;
int *min;
{
int hour_min;
int just_min = 0;
switch (sscanf(when, "%d:%d", &hour_min, &just_min)) {
case 1:
*hour = hour_min / 100;
*min = hour_min % 100;
break;
case 2:
*hour = hour_min;
*min = just_min;
break;
default:
Usage();
}
if (hour_min < 0 || just_min < 0 || *min > 59) Usage();
}
int Still_Logged_On(user, tty)
char *user;
char *tty;
{
FILE *f;
struct utmp login;
if ((f = fopen(UTMP, "r")) == NULL)
/* no login/logout records kept */
return(1);
while (fread(&login, sizeof(struct utmp), (size_t)1, f) == 1) {
if (!strncmp(login.ut_line, tty, (size_t)8))
if (!strncmp(login.ut_name, user, (size_t)8)) {
fclose(f);
return(1);
} else {
fclose(f);
return(0);
}
}
fclose(f);
return(0);
}
int main(argc, argv)
int argc;
char *argv[];
{
char when[STRING];
time_t now = time((time_t *)0);
time_t leave, delta;
struct tm *tm;
int hour, min;
int pid, i;
char *user = cuserid( (char *)NULL);
char *tty = ttyname(0) + 5;
/* get the argument string "when" either from stdin, or argv */
if (argc <= 1) {
printf("When do you have to leave? ");
fflush(stdout);
if (fgets(when, STRING, stdin) == NULL || when[0] == '\n') exit(0);
} else {
strcpy(when, argv[1]);
if (argc > 2) strcat(when, argv[2]);
}
/* determine the leave time from the current time and "when" */
tm = localtime(&now);
if (when[0] == '+') {
Get_Hour_Min(&when[1], &hour, &min);
tm->tm_hour += hour;
tm->tm_min += min;
leave = mktime(tm);
} else {
/* user entered an absolute time */
Get_Hour_Min(&when[0], &hour, &min);
tm->tm_hour = hour;
tm->tm_min = min;
leave = mktime(tm);
if (leave < now) {
printf("That time has already passed!\n");
exit(1);
}
}
printf("Alarm set for %s", ctime(&leave));
if ((pid = fork()) == -1) {
fprintf(stderr, "leave: can not fork\n");
exit(1);
}
if (pid != 0) exit(0);
/* only the child continues on */
if (user == NULL || tty == NULL) {
fprintf(stderr, "leave: Can not determine user and terminal name\n");
exit(1);
}
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGTERM, SIG_IGN);
for (;;) {
if (!Still_Logged_On(user, tty)) exit(0);
/* how much longer until the leave time? */
/* XXX - use difftime all over. */
delta = leave - time((time_t *)0);
/* which interval are we currently in? */
for (i = 0; i < INTERVALS; ++i)
if (delta + intervals[i] > 0) break;
/* if we are within intervals[0] then print a warning If
* there are more intervals than messages, then use/
* warnings[WARNINGS-1] for all subsequent messages. */
if (i > 0)
printf("\007\r%s\r\n",
warnings[i > WARNINGS ? WARNINGS - 1 : i - 1]);
if (i == INTERVALS) {
printf("That was the last time I'll tell you. Bye.\r\n");
exit(0);
}
/* Sleep until the next interval. For long periods, wake up
* every hour to check if the user is still on (also required
* because 16 bit ints don't allow long waits). */
sleep((unsigned) Min(delta + intervals[i], HOUR));
}
}

View file

@ -1,4 +0,0 @@
PROG= modem
MAN=
.include <bsd.prog.mk>

View file

@ -1,253 +0,0 @@
/* modem - Put modem into DIALIN or DIALOUT mode. Author: F. van Kempen */
/* Exit: 0 OK, suspended/restarted GETTY
* 1 UNIX error
* 2 Process busy
* Version: 1.3 12/30/89
*
* Author: F. van Kempen, MicroWalt Corporation
*
* All fancy stuff removed, see getty.c. Kees J. Bot.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <utmp.h>
#include <errno.h>
#include <paths.h>
char PATH_UTMP[] = _PATH_UTMP; /* current logins */
_PROTOTYPE(void usage , (void));
_PROTOTYPE(int main , (int argc , char *argv []));
_PROTOTYPE(void sendcodes , (char *tty, char *codes));
void usage()
{
fprintf(stderr,
"Usage: modem [-sio] [-I in-codes] [-O out-codes] line [command args ...]\n");
exit(1);
}
main(argc, argv)
int argc;
char *argv[];
{
struct utmp entry;
char devtty[1024], *tty;
char **command;
int ex_code = 0;
int fd, i, slot, getty;
struct stat st;
enum { TOGGLE, DIALIN, DIALOUT } mode= TOGGLE;
int silent = 0;
_PROTOTYPE(void (*hsig), (int));
_PROTOTYPE(void (*isig), (int));
_PROTOTYPE(void (*qsig), (int));
_PROTOTYPE(void (*tsig), (int));
pid_t pid;
int r, status;
uid_t uid = getuid();
gid_t gid = getgid();
char *in_codes, *out_codes;
i = 1;
while (i < argc && argv[i][0] == '-') {
char *opt = argv[i++] + 1;
if (opt[0] == '-' && opt[1] == 0) break;
while (*opt != 0) {
switch (*opt++) {
case 's': /* silent mode */
silent = 1;
break;
case 'i': /* DIAL-IN mode: suspend GETTY */
mode = DIALIN;
break;
case 'o': /* DIAL-OUT mode: restart GETTY */
mode = DIALOUT;
break;
case 'I': /* code to switch modem to dial-in */
if (*opt == 0) {
if (i == argc) usage();
opt = argv[i++];
}
in_codes = opt;
opt = "";
break;
case 'O': /* code to switch modem to dial-out */
if (*opt == 0) {
if (i == argc) usage();
opt = argv[i++];
}
out_codes = opt;
opt = "";
break;
default:
usage();
}
}
}
if (i == argc) usage();
tty = argv[i++]; /* Modem line */
if (mode != TOGGLE && i != argc) usage();
command = argv + i; /* Command to execute (if any). */
if (strchr(tty, '/') == NULL) {
strcpy(devtty, "/dev/");
strncat(devtty, tty, 1024 - 6);
tty = devtty;
}
if (stat(tty, &st) < 0) {
fprintf(stderr, "modem: %s: %s\n", tty, strerror(errno));
exit(1);
}
if (!S_ISCHR(st.st_mode)) {
fprintf(stderr, "%s is not a tty\n", tty);
exit(1);
}
/* Find the utmp slot number for the line. */
if ((fd= open(tty, O_RDONLY)) < 0 || (slot= fttyslot(fd)) == 0) {
fprintf(stderr, "modem: %s: %s\n", tty, strerror(errno));
exit(1);
}
close(fd);
/* Read the UTMP file to find out the PID and STATUS of the GETTY. */
entry.ut_type= 0;
if ((fd = open(PATH_UTMP, O_RDONLY)) < 0
|| lseek(fd, (off_t) slot * sizeof(entry), SEEK_SET) < 0
|| read(fd, &entry, sizeof(entry)) < 0
) {
fprintf(stderr, "modem: cannot read UTMP !\n");
exit(1);
}
close(fd);
hsig= signal(SIGHUP, SIG_IGN);
isig= signal(SIGINT, SIG_IGN);
qsig= signal(SIGQUIT, SIG_IGN);
tsig= signal(SIGTERM, SIG_IGN);
/* Process the terminal entry if we got one. */
switch (entry.ut_type) {
case LOGIN_PROCESS: /* getty waiting for a call */
getty = 1;
break;
case USER_PROCESS: /* login or user-shell */
if (!silent) fprintf(stderr, "modem: line is busy.\n");
exit(2);
break;
default:
getty = 0;
}
for (i = (mode == TOGGLE) ? 0 : 1; i < 2; i++) {
/* Now perform the desired action (DIALIN or DIALOUT). */
switch (mode) {
case DIALOUT:
case TOGGLE:
if (getty) kill(entry.ut_pid, SIGUSR1); /* suspend getty */
chown(tty, uid, st.st_gid); /* give line to user */
chmod(tty, 0600);
if (out_codes != NULL) sendcodes(tty, out_codes);
if (!silent) printf("modem on %s set for dialout.\n", tty);
break;
case DIALIN:
if (in_codes != NULL) sendcodes(tty, in_codes);
chown(tty, 0, st.st_gid); /* revoke access */
chmod(tty, 0600);
if (getty) kill(entry.ut_pid, SIGUSR2); /* restart getty */
if (!silent) printf("modem on %s set for dialin.\n", tty);
}
if (mode == TOGGLE) {
/* Start the command to run */
pid_t pid;
int status;
switch ((pid = fork())) {
case -1:
fprintf(stderr, "modem: fork(): %s\n", strerror(errno));
ex_code= 1;
break;
case 0:
setgid(gid);
setuid(uid);
(void) signal(SIGHUP, hsig);
(void) signal(SIGINT, isig);
(void) signal(SIGQUIT, qsig);
(void) signal(SIGTERM, tsig);
execvp(command[0], command);
fprintf(stderr, "modem: %s: %s\n",
command[0], strerror(errno));
_exit(127);
default:
while ((r= wait(&status)) != pid) {
if (r == -1 && errno != EINTR) break;
}
if (r == -1 || status != 0) ex_code = 1;
}
mode = DIALIN;
}
}
exit(ex_code);
}
void sendcodes(tty, codes)
char *tty, *codes;
{
int fd;
int c;
char buf[1024], *bp = buf;
if ((fd = open(tty, O_RDWR|O_NONBLOCK)) < 0) {
fprintf(stderr, "modem: can't send codes to %s: %s\n",
tty, strerror(errno));
return;
}
while ((c = *codes++) != 0) {
fprintf(stderr, "%d\n", __LINE__);
if (c == '\\') {
if ((c = *codes++) == 0) break;
if (c == 'r') c= '\r';
if (c == 'n') c= '\n';
}
*bp++ = c;
if (bp == buf + sizeof(buf) || c == '\r' || c == '\n') {
fprintf(stderr, "%d\n", __LINE__);
write(fd, buf, bp - buf);
fprintf(stderr, "%d\n", __LINE__);
do {sleep(1);
fprintf(stderr, "%d\n", __LINE__);
fprintf(stderr, "%d\n", read(fd, buf, sizeof(buf)));
}while (read(fd, buf, sizeof(buf)) > 0);
fprintf(stderr, "%d\n", __LINE__);
bp = buf;
}
}
if (bp > buf) {
fprintf(stderr, "%d\n", __LINE__);
write(fd, buf, bp - buf);
fprintf(stderr, "%d\n", __LINE__);
do sleep(1); while (read(fd, buf, sizeof(buf)) > 0);
fprintf(stderr, "%d\n", __LINE__);
}
close(fd);
}

View file

@ -1,7 +0,0 @@
# Makefile for rlogind.
PROG= in.rlogind
SRCS= rlogind.c setup.c
MAN=
.include <bsd.prog.mk>

View file

@ -1,455 +0,0 @@
/*
rlogind.c
Created: by Philip Homburg <philip@cs.vu.nl>
Log: Utmp improvement by Kees Bot <kjb@cs.vu.nl>
Split to compile easier on i86 by kjb
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
#include <time.h>
#include <unistd.h>
#include <utmp.h>
#include <net/hton.h>
#define EXTERN
#include "rlogind.h"
char pty_str[]= "/dev/ptyXX";
char tty_str[]= "/dev/ttyXX";
char hex_str[16]= "0123456789abcdef";
char PATH_UTMP[] = "/etc/utmp"; /* current logins */
char PATH_WTMP[] = "/usr/adm/wtmp"; /* login/logout history */
char term[64]= "TERM=";
#define ENVSIZE (sizeof("TERM=")-1) /* skip null for concatenation. */
int confirmed= 0;
char *env[2];
char *args[10];
static void do_child(int tty_fd, char *tty_str);
static void dealloc_term(int slot, char *tty_str, int pid);
static void wtmp(char *user, char *id, char *line, int pid, int type, int slot);
static void setup_term(int fd);
static speed_t num2speed(int num);
static int do_control(char *buf, int cnt);
static void readall(char *buf, int cnt);
int main(int argc, char *argv[])
{
int error;
int i, j= 0;
int tty_fd, pty_fd;
int login_pid, write_pid;
int count, bytes, tmp_count;
char *lp= 0, *cp;
struct stat struct_stat;
int slot;
prog_name= argv[0];
/* Check if the remote user is allowed in. */
authenticate();
write(1, "", 1); /* Send the '\0' */
confirmed= 1;
/* We try to convince the other side not the do ^S/^Q, the rlogin
* protocol indicates the we only send this when XOFF is turned off
* but we don't know when this happens so we tell the other side that
* it is turned off.
*/
tcp_urg(1, 1);
write(1, "\220", 1);
tcp_urg(1, 0);
/* Let's look for a pty. */
pty_fd= -1;
for (i= 'p'; i <= 'z'; i++)
{
pty_str[sizeof(pty_str)-3]= i;
pty_str[sizeof(pty_str)-2]= '0';
error= stat(pty_str, &struct_stat);
if (error == -1)
continue;
for (j= 0; j < 16; j++)
{
pty_str[sizeof(pty_str)-2]= hex_str[j];
pty_fd= open(pty_str, O_RDWR);
if (pty_fd != -1)
break;
}
if (pty_fd != -1)
break;
}
if (pty_fd == -1)
{
printf("%s: out of ptys\r\n", prog_name);
exit(1);
}
tty_str[sizeof(pty_str)-3]= i;
tty_str[sizeof(pty_str)-2]= hex_str[j];
tty_fd= open(tty_str, O_RDWR);
if (tty_fd == -1)
{
printf("%s: unable to open '%s': %s\r\n", prog_name, tty_str,
strerror(errno));
exit(1);
}
slot= fttyslot(tty_fd);
login_pid= fork();
if (login_pid == -1)
{
printf("%s: unable to fork: %s\r\n", prog_name,
strerror(errno));
exit(1);
}
if (login_pid == 0)
{
close(pty_fd);
wtmp("", "", tty_str, login_pid, LOGIN_PROCESS, slot);
do_child(tty_fd, tty_str);
}
close(tty_fd);
write_pid= fork();
if (write_pid == -1)
{
printf("%s: unable to fork: %s\r\n", prog_name,
strerror(errno));
exit(1);
}
if (write_pid == 0)
{
dup2(pty_fd, 0);
count= 0;
for (;;)
{
if (!count)
{
count= read(0, line, sizeof(line));
if (count <= 0)
break;
lp= line;
}
bytes= write(1, lp, count);
if (bytes <= 0 || bytes > count)
break;
lp += bytes;
count -= bytes;
}
kill(getppid(), SIGKILL);
dealloc_term(slot, tty_str, login_pid);
_exit(1);
}
dup2(pty_fd, 1);
count= 0;
for (;;)
{
if (!count)
{
count= read(0, line, sizeof(line));
if (count <= 0)
break;
lp= line;
}
tmp_count= count;
cp= memchr(lp, 255, count);
if (cp)
{
tmp_count= cp-lp;
if (tmp_count == 0)
{
tmp_count= do_control(lp, count);
if (tmp_count)
{
lp += tmp_count;
count -= tmp_count;
continue;
}
}
}
bytes= write(1, lp, tmp_count);
if (bytes <= 0 || bytes > count)
break;
lp += bytes;
count -= bytes;
}
kill(write_pid, SIGKILL);
dealloc_term(slot, tty_str, login_pid);
return(0);
}
static void do_child(int tty_fd, char *tty_str)
{
int ctty_fd, tst_fd;
FILE *tty_file;
int sav_errno;
char **argp;
/* Set up the terminal attributes. */
setup_term(tty_fd);
/* Let's start the new session. */
setsid();
ctty_fd= open(tty_str, O_RDWR);
if (ctty_fd == -1)
{
printf("%s(do_child): unable to open '%s': %s\r\n",
prog_name, tty_str, strerror(errno));
exit(1);
}
/* Test if we really got a controlling tty. */
tst_fd= open("/dev/tty", O_RDWR);
if (tst_fd == -1)
{
printf(
"%s(do_child): '%s' didn't result in a controlling tty (%s)\r\n",
prog_name, tty_str, strerror(errno));
exit(1);
}
argp= args;
*argp++= "login";
*argp++= "-p";
*argp++= "-h";
*argp++= hostname;
if (authenticated)
*argp++= "-f";
if (lusername[0] != '\0')
*argp++= lusername;
/* We reached the point of no return. */
close(tst_fd);
close(tty_fd);
if (ctty_fd != 0)
{
dup2(ctty_fd, 0);
close(ctty_fd);
ctty_fd= 0;
}
dup2(ctty_fd, 1);
#if DEBUG
fprintf(stderr, "execing login\r\n");
#endif
dup2(ctty_fd, 2);
execve("/bin/login", args, env);
if (errno == ENOENT) execve("/usr/bin/login", args, env);
sav_errno= errno;
tty_file= fdopen(2, "w");
if (tty_file)
{
fprintf(tty_file, "%s(do_child): unable to exec login: %s\r\n",
prog_name, strerror(sav_errno));
fflush(tty_file);
}
_exit(1);
}
static void dealloc_term(int slot, char *tty_str, int pid)
{
wtmp("", "", tty_str, pid, DEAD_PROCESS, slot);
/* Finally we reset the owner and mode of the terminal. */
chown(tty_str, 0, 0);
chmod(tty_str, 0666);
}
static void wtmp(
char *user, /* name of user */
char *id, /* inittab ID */
char *line, /* TTY name */
int pid, /* PID of process */
int type, /* TYPE of entry */
int slot) /* slot number in UTMP */
{
/* Log an event into the UTMP and WTMP files. */
struct utmp utmp; /* UTMP/WTMP User Accounting */
int fd= -1;
int log = 1; /* log in wtmp */
char *p;
/* Strip the /dev part of the TTY name. */
p = strrchr(line, '/');
if (p != 0)
line= p+1;
if (type == DEAD_PROCESS) {
/* Don't add a logout entry for just a dying login. */
if ((fd = open(PATH_UTMP, O_RDONLY)) < 0) return;
if (lseek(fd, (off_t) slot * sizeof(utmp), SEEK_SET) != -1
&& read(fd, (void *) &utmp, sizeof(utmp)) == sizeof(utmp))
{
if (utmp.ut_type != INIT_PROCESS
&& utmp.ut_type != USER_PROCESS)
log= 0;
}
close(fd);
}
if (type == LOGIN_PROCESS) log= 0; /* and don't log this one */
/* Clear the utmp record. */
memset((void *) &utmp, 0, sizeof(utmp));
/* Enter new values. */
strncpy(utmp.ut_name, user, sizeof(utmp.ut_name));
strncpy(utmp.ut_id, id, sizeof(utmp.ut_id));
strncpy(utmp.ut_line, line, sizeof(utmp.ut_line));
strncpy(utmp.ut_host, hostname, sizeof(utmp.ut_host));
utmp.ut_pid = pid;
utmp.ut_type = type;
utmp.ut_time = time((time_t *)0);
if (log) {
if ((fd = open(PATH_WTMP, O_WRONLY | O_APPEND)) < 0) return;
write(fd, (char *) &utmp, sizeof(struct utmp));
close(fd);
}
/* write entry to utmp */
if ((fd = open(PATH_UTMP, O_WRONLY)) < 0) return;
if (lseek(fd, (off_t) slot * sizeof(utmp), SEEK_SET) != -1)
write(fd, (char *) &utmp, sizeof(struct utmp));
close(fd);
}
void fatal(int fd, char *msg, int err)
{
int len;
char buf[80], *bp;
bp= buf;
if (!confirmed)
*bp++= '\1';
if (err)
len= sprintf(bp, "rlogind: %s: %s.\r\n", msg, strerror(err));
else
len= sprintf(bp, "rlogind: %s.\r\n", msg);
write(fd, buf, bp+len-buf);
exit(1);
}
static void setup_term(int fd)
{
char *cp, *speed;
struct termios tt;
speed_t spd;
int num;
char *check;
cp= strchr(term, '/');
if (cp)
{
tcgetattr(fd, &tt);
*cp++= '\0';
speed= cp;
cp= strchr(speed, '/');
if (cp)
*cp++= '\0';
num= strtol(speed, &check, 0);
spd= num2speed(num);
if (spd != B0 && check[0] == '\0')
{
cfsetospeed(&tt, spd);
cfsetispeed(&tt, spd);
}
tcsetattr(fd, TCSANOW, &tt);
}
env[0]= term;
env[1]= 0;
}
static speed_t num2speed(int num)
{
static struct
{
int num;
speed_t value;
} speed_table[]=
{
{ 0, B0, }, { 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, B19200, }, { 38400, B38400, },
{ -1, -1 },
};
int i;
for (i= 0; speed_table[i].num != -1; i++)
{
if (speed_table[i].num == num)
return (speed_table[i].value);
}
return B0;
}
static int do_control(char *cp, int cnt)
{
char buf[20];
struct winsize winsize;
if (cnt > sizeof(buf))
cnt= sizeof(buf);
memcpy(buf, cp, cnt);
/* Let's fetch the first 2 bytes. */
if (cnt < 2)
readall(buf+cnt, 2-cnt);
if ((unsigned char)buf[1] != 255)
return 0;
/* Let's fetch the first 4 bytes. */
if (cnt < 4)
readall(buf+cnt, 4-cnt);
if (buf[2] != 's' || buf[3] != 's')
return 0;
/* Let's fetch a winsize structure. */
if (cnt < 4 + sizeof(winsize))
readall(buf+cnt, 4 + sizeof(winsize) - cnt);
memcpy(&winsize, buf+4, sizeof(winsize));
winsize.ws_row= ntohs(winsize.ws_row);
winsize.ws_col= ntohs(winsize.ws_col);
winsize.ws_xpixel= ntohs(winsize.ws_xpixel);
winsize.ws_ypixel= ntohs(winsize.ws_ypixel);
#if DEBUG
fprintf(stderr, "setting window size to %d, %d\r\n", winsize.ws_row,
winsize.ws_col);
#endif
ioctl(1, TIOCSWINSZ, &winsize);
return 4 + sizeof(winsize);
}
static void readall(char *buf, int cnt)
{
int res;
while(cnt)
{
res= read(0, buf, cnt);
if (res <= 0)
return;
buf += cnt;
cnt -= res;
}
}

View file

@ -1,24 +0,0 @@
/*
in.rld.h
*/
#define NMAX 30
#ifndef EXTERN
#define EXTERN extern
#endif
EXTERN char *prog_name;
EXTERN char hostname[256+1];
EXTERN char line[1024];
EXTERN char lusername[NMAX+1], rusername[NMAX+1];
EXTERN char term[64];
EXTERN int authenticated;
/* in.rld.c: */
void fatal(int fd, char *msg, int err);
/* setup.c: */
void authenticate(void);
int do_rlogin(void);
void tcp_urg(int fd, int on);

View file

@ -1,92 +0,0 @@
/*
setup.c
*/
#include <sys/types.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/netlib.h>
#include <net/gen/in.h>
#include <net/gen/inet.h>
#include <net/gen/tcp.h>
#include <net/gen/tcp_io.h>
#include <net/gen/netdb.h>
#include <net/gen/socket.h>
#include "rlogind.h"
static void getstr(char *buf, int cnt, char *errmsg);
void authenticate(void)
{
int result;
struct nwio_tcpconf tcpconf;
struct hostent *hostent;
char c;
/* Let's lookup the hostname for the connection. */
result= ioctl (0, NWIOGTCPCONF, &tcpconf);
if (result<0)
{
fprintf(stderr, "%s: ioctl(NWIOTCPCONF): %s\r\n",
prog_name, strerror(errno));
exit(1);
}
hostent= gethostbyaddr((char *)&tcpconf.nwtc_remaddr,
sizeof(tcpconf.nwtc_remaddr), AF_INET);
if (hostent)
{
strncpy(hostname, hostent->h_name, sizeof(hostname)-1);
hostname[sizeof(hostname)-1]= '\0';
}
else
{
strcpy(hostname, inet_ntoa(tcpconf.nwtc_remaddr));
}
authenticated = 0;
getstr(&c, 1, "protocol violation");
getstr(rusername, sizeof(rusername), "remuser too long");
getstr(lusername, sizeof(lusername), "locuser too long");
strcpy(term, "TERM=");
getstr(term+5, sizeof(term)-5, "Terminal type too long");
#if DEBUG
fprintf(stderr, "got lu= %s, ru= %s, te= %s\r\n", lusername, rusername,
term);
#endif
if (iruserok(tcpconf.nwtc_remaddr, 0, rusername, lusername) == 0)
authenticated = 1;
}
static void getstr(char *buf, int cnt, char *errmsg)
{
char c;
errno= 0;
do
{
if (read(0, &c, 1) != 1)
fatal(1, "read failed", errno);
cnt--;
if (cnt < 0)
fatal(1, errmsg, 0);
*buf++= c;
} while(c != 0);
}
void tcp_urg(int fd, int on)
{
struct nwio_tcpopt tcpopt;
tcpopt.nwto_flags= on ? (NWTO_BSD_URG | NWTO_SND_URG) : NWTO_SND_NOTURG;
if (ioctl(1, NWIOSTCPOPT, &tcpopt) == -1)
{
fprintf(stderr, "rlogind: NWIOSTCPOPT failed: %s\r\n",
strerror(errno));
}
}

View file

@ -3,7 +3,7 @@ USR=/usr/
USRETC=/usr/etc/
DEFAULTS=/etc/defaults
FILES1=group hostname.file inet.conf motd.install mtab profile \
protocols rc services termcap ttytab utmp rc.cd \
protocols rc services termcap utmp rc.cd \
syslog.conf rc.daemons.dist \
rs.inet rs.single make.conf system.conf ttys resolv.conf rc.conf \
rc.subr rc.subr.minix man.conf shells boot.cfg.default

View file

@ -1,5 +1,4 @@
daemonize talkd
daemonize tcpd shell in.rshd
daemonize tcpd login in.rlogind
daemonize tcpd telnet in.telnetd
daemonize tcpd ftp in.ftpd

View file

@ -1,41 +0,0 @@
# ttytab - terminals
#
# Device Type Program Init
console minix getty
ttyc1 minix getty
ttyc2 minix getty
ttyc3 minix getty
tty00 unknown
tty01 unknown
ttyp0 network
ttyp1 network
ttyp2 network
ttyp3 network
ttyp4 network
ttyp5 network
ttyp6 network
ttyp7 network
ttyp8 network
ttyp9 network
ttypa network
ttypb network
ttypc network
ttypd network
ttype network
ttypf network
ttyq0 network
ttyq1 network
ttyq2 network
ttyq3 network
ttyq4 network
ttyq5 network
ttyq6 network
ttyq7 network
ttyq8 network
ttyq9 network
ttyqa network
ttyqb network
ttyqc network
ttyqd network
ttyqe network
ttyqf network

View file

@ -13,7 +13,6 @@
#include <signal.h>
#include <machine/vm.h>
#include <sys/sigcontext.h>
#include <minix/u64.h>
#include "archconst.h"

View file

@ -8,7 +8,6 @@
#include <minix/safecopies.h>
#include <machine/archtypes.h>
#include <sys/sigcontext.h>
#include <a.out.h>
/* Struct declarations. */

View file

@ -42,7 +42,6 @@
#include <assert.h>
#include <signal.h>
#include <unistd.h>
#include <sys/sigcontext.h>
#include <minix/endpoint.h>
#include <minix/safecopies.h>

View file

@ -10,7 +10,6 @@
#include "kernel/system.h"
#include <string.h>
#include <machine/cpu.h>
#include <sys/sigcontext.h>
#if USE_SIGRETURN

View file

@ -11,7 +11,6 @@
#include "kernel/system.h"
#include <signal.h>
#include <string.h>
#include <sys/sigcontext.h>
#if USE_SIGSEND

View file

@ -9,28 +9,15 @@ MACHINE_ARCH= ${ARCH}
# std_err()
SRCS+= stderr.c
# V8 regexp (incompatible with BSD regexp)
SRCS+= v8regerror.c v8regexp.c v8regsub.c
# Configfile Library.
SRCS+= configfile.c
# ACK a.out format.
SRCS+= nlist.c
# Minix 'mtab' handling functions.
#
# These should be changed when we switch to
# NetBSD's 'mtab' format.
SRCS+= mtab.c
# fttyslot(fd), a Minix-specific extension
SRCS+= fttyslot.c
# cuserid()
# Now considered "compat" feature in NetBSD.
SRCS+= cuserid.c
.include "include/Makefile.inc"
.include <bsd.own.mk>

View file

@ -1,33 +0,0 @@
/* cuserid(3)
*
* Author: Terrence W. Holm Sept. 1987
*/
#include <lib.h>
#include <pwd.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#ifndef L_cuserid
#define L_cuserid 9
#endif
char *cuserid(user_name)
char *user_name;
{
PRIVATE char userid[L_cuserid];
struct passwd *pw_entry;
if (user_name == (char *)NULL) user_name = userid;
pw_entry = getpwuid(geteuid());
if (pw_entry == (struct passwd *)NULL) {
*user_name = '\0';
return((char *)NULL);
}
strcpy(user_name, pw_entry->pw_name);
return(user_name);
}

View file

@ -1,50 +0,0 @@
/*
ttyslot.c
Return the index in the utmp file for the current user's terminal. The
current user's terminal is the first file descriptor in the range 0..2
for which ttyname() returns a name. The index is the line number in the
/etc/ttytab file. 0 will be returned in case of an error.
Created: Oct 11, 1992 by Philip Homburg
*/
#include <sys/types.h>
#include <ttyent.h>
#include <string.h>
#include <unistd.h>
int fttyslot(fd)
int fd;
{
char *tname;
int lineno;
struct ttyent *ttyp;
tname= ttyname(fd);
if (tname == NULL) return 0;
/* Assume that tty devices are in /dev */
if (strncmp(tname, "/dev/", 5) != 0)
return 0; /* Malformed tty name. */
tname += 5;
/* Scan /etc/ttytab. */
lineno= 1;
while ((ttyp= getttyent()) != NULL)
{
if (strcmp(tname, ttyp->ty_name) == 0)
{
endttyent();
return lineno;
}
lineno++;
}
/* No match */
endttyent();
return 0;
}
/*
* $PchHeader: /mount/hd2/minix/lib/misc/RCS/ttyslot.c,v 1.3 1994/12/22 13:49:12 philip Exp $
*/

View file

@ -3,8 +3,6 @@
INCSDIR= /usr/include
INCS+= configfile.h
INCS+= compat/a.out.h compat/regexp.h compat/syslog.h \
compat/pwd.h
INCS+= compat/a.out.h
INCS+= net/gen/netdb.h net/gen/resolv.h net/gen/nameser.h
INCS+= sys/jmp_buf.h ${MACHINE_ARCH}/compat_jmp_buf.h
INCS+= sys/sigcontext.h

View file

@ -1,34 +0,0 @@
/* The <pwd.h> header defines the items in the password file. */
#ifndef _PWD_H
#define _PWD_H
#ifndef _TYPES_H
#include <minix/types.h>
#endif
struct passwd {
char *pw_name; /* login name */
uid_t pw_uid; /* uid corresponding to the name */
gid_t pw_gid; /* gid corresponding to the name */
char *pw_dir; /* user's home directory */
char *pw_shell; /* name of the user's shell */
/* The following members are not defined by POSIX. */
char *pw_passwd; /* password information */
char *pw_gecos; /* just in case you have a GE 645 around */
};
/* Function Prototypes. */
_PROTOTYPE( struct passwd *getpwnam, (const char *_name) );
_PROTOTYPE( struct passwd *getpwuid, (uid_t _uid) );
#ifdef _MINIX
_PROTOTYPE( void endpwent, (void) );
_PROTOTYPE( struct passwd *getpwent, (void) );
_PROTOTYPE( int setpwent, (void) );
_PROTOTYPE( void setpwfile, (const char *_file) );
_PROTOTYPE( const char *user_from_uid, (uid_t, int) );
#endif
#endif /* _PWD_H */

View file

@ -1,37 +0,0 @@
/* The <regexp.h> header is used by the (V8-compatible) regexp(3) routines. */
/* NOTE: Obsoleted by the POSIX regex(3) library. */
#ifndef _REGEXP_H
#define _REGEXP_H
#include <sys/cdefs.h>
#define CHARBITS 0377
#define NSUBEXP 10
typedef struct regexp {
const char *startp[NSUBEXP];
const char *endp[NSUBEXP];
char regstart; /* Internal use only. */
char reganch; /* Internal use only. */
char *regmust; /* Internal use only. */
int regmlen; /* Internal use only. */
char program[1]; /* Unwarranted chumminess with compiler. */
} regexp;
/* Keep these functions away from the POSIX versions. */
#define regcomp _v8_regcomp
#define regexec _v8_regexec
#define regsub _v8_regsub
#define regerror _v8_regerror
/* Function Prototypes. */
regexp *regcomp(const char *_exp);
int regexec(regexp *_prog, const char *_string, int _bolflag);
void regsub(regexp *_prog, char *_source, char *_dest);
void regerror(const char *_message) ;
#endif /* _REGEXP_H */
/*
* $PchId: regexp.h,v 1.4 1996/04/10 21:43:17 philip Exp $
*/

View file

@ -1,8 +0,0 @@
#ifndef _COMPAT_SYSLOG_H
#define _COMPAT_SYSLOG_H
#include <syslog.h>
#define FacNames facilitynames
#define PriNames prioritynames
#endif

View file

@ -1,8 +0,0 @@
#ifndef COMPAT_SYS_SIGCONTEXT_H
#define COMPAT_SYS_SIGCONTEXT_H
/* Minix legacy compatibility header. */
#include <sys/signal.h>
#include <sys/siginfo.h>
#endif

View file

@ -1,71 +0,0 @@
/*
* "nlist.c", Peter Valkenburg, january 1989.
*/
#include <lib.h>
#include <string.h>
#include <a.out.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#define fail(fp) (fclose(fp), -1) /* ret. exp. when nlist fails */
_PROTOTYPE( int nlist, (char *file, struct nlist nl[]));
/*
* Nlist fills fields n_sclass and n_value of array nl with values found in
* non-stripped executable file. Entries that are not found have their
* n_value/n_sclass fields set to 0. Nl ends with a 0 or nul string n_name.
* The return value is -1 on failure, else the number of entries not found.
*/
int nlist(file, nl)
char *file;
struct nlist nl[];
{
int nents, nsrch, nfound, i;
struct nlist nlent;
FILE *fp;
struct exec hd;
/* open executable with namelist */
if ((fp = fopen(file, "r")) == NULL)
return -1;
/* get header and seek to start of namelist */
if (fread((char *) &hd, sizeof(struct exec), 1, fp) != 1 ||
BADMAG(hd) || fseek(fp, A_SYMPOS(hd), SEEK_SET) != 0)
return fail(fp);
/* determine number of entries searched for & reset fields */
nsrch = 0;
while (nl[nsrch].n_name != NULL && *(nl[nsrch].n_name) != '\0') {
nl[nsrch].n_sclass = 0;
nl[nsrch].n_value = 0;
nl[nsrch].n_type = 0; /* for compatability */
nsrch++;
}
/* loop through namelist & fill in user array */
nfound = 0;
for (nents = (hd.a_syms & 0xFFFF) / sizeof(struct nlist);
nents > 0; nents--) {
if (nsrch == nfound)
break; /* no need to look further */
if (fread((char *) &nlent, sizeof(struct nlist), 1, fp) != 1)
return fail(fp);
for (i = 0; i < nsrch; i++)
if (nl[i].n_sclass == 0 &&
strncmp(nl[i].n_name, nlent.n_name,
sizeof(nlent.n_name)) == 0) {
nl[i] = nlent;
nfound++;
break;
}
}
(void) fclose(fp);
return nsrch - nfound;
}

View file

@ -1,15 +0,0 @@
/* regerror() - Default regexp error report Author: Kees J. Bot
* 12 Jun 1999
*
* A better version of this routine should be supplied by the user in
* the program using regexps.
*/
#include <stdio.h>
#define const /* avoid "const poisoning" */
#include <compat/regexp.h>
#undef const
void regerror(char *message)
{
fprintf(stderr, "regexp error: %s\n", message);
}

File diff suppressed because it is too large Load diff

View file

@ -1,90 +0,0 @@
/* regsub
*
* Copyright (c) 1986 by University of Toronto.
* Written by Henry Spencer. Not derived from licensed software.
*
* Permission is granted to anyone to use this software for any
* purpose on any computer system, and to redistribute it freely,
* subject to the following restrictions:
*
* 1. The author is not responsible for the consequences of use of
* this software, no matter how awful, even if they arise
* from defects in it.
*
* 2. The origin of this software must not be misrepresented, either
* by explicit claim or by omission.
*
* 3. Altered versions must be plainly marked as such, and must not
* be misrepresented as being the original software.
*/
#include <string.h>
#include <stdio.h>
#define const /* avoid "const poisoning" */
#include <compat/regexp.h>
#undef const
/* The first byte of the regexp internal "program" is actually this magic
* number; the start node begins in the second byte.
*/
#define MAGIC 0234
#define CHARBITS 0377
#ifndef CHARBITS
#define UCHARAT(p) ((int)*(unsigned char *)(p))
#else
#define UCHARAT(p) ((int)*(p)&CHARBITS)
#endif
/*
- regsub - perform substitutions after a regexp match
*/
void regsub(prog, source, dest)
regexp *prog;
char *source;
char *dest;
{
register char *src;
register char *dst;
register char c;
register int no;
register int len;
if (prog == (regexp *)NULL || source == (char *)NULL || dest == (char *)NULL) {
regerror("NULL parm to regsub");
return;
}
if (UCHARAT(prog->program) != MAGIC) {
regerror("damaged regexp fed to regsub");
return;
}
src = source;
dst = dest;
while ((c = *src++) != '\0') {
if (c == '&')
no = 0;
else if (c == '\\' && '0' <= *src && *src <= '9')
no = *src++ - '0';
else
no = -1;
if (no < 0) { /* Ordinary character. */
if (c == '\\' && (*src == '\\' || *src == '&')) c = *src++;
*dst++ = c;
} else
if (prog->startp[no] != (char *)NULL && prog->endp[no] != (char *)NULL) {
len = (int) (prog->endp[no] - prog->startp[no]);
strncpy(dst, prog->startp[no], len);
dst += len;
if (len != 0 && *(dst - 1) == '\0') { /* strncpy hit NUL. */
regerror("damaged match string");
return;
}
}
}
*dst++ = '\0';
}
/*
* $PchId: regsub.c,v 1.3 1995/11/27 20:18:16 philip Exp $
*/

View file

@ -1,6 +1,5 @@
MAN= ash.1 at.1 banner.1 basename.1 \
bsfilt.1 cal.1 \
calendar.1 cawf.1 chgrp.1 \
bsfilt.1 cal.1 cawf.1 chgrp.1 \
chmod.1 cksum.1 clear.1 cmp.1 comm.1 compress.1 \
cp.1 crc.1 crontab.1 ctags.1 dd.1 dev2name.1 \
df.1 dhrystone.1 dosdir.1 dosread.1 doswrite.1 \
@ -9,10 +8,10 @@ MAN= ash.1 at.1 banner.1 basename.1 \
finger.1 flexdoc.1 fmt.1 fold.1 format.1 fortune.1 \
fsck.mfs.1 head.1 host.1 hostaddr.1 ifdef.1 \
install.1 isodir.1 isoinfo.1 isoread.1 join.1 kill.1 \
last.1 leave.1 loadfont.1 loadkeys.1 logger.1 login.1 \
last.1 loadfont.1 loadkeys.1 logger.1 login.1 \
look.1 lp.1 ls.1 lspci.1 mail.1 \
mesg.1 mixer.1 mkfs.1 \
mkproto.1 modem.1 mount.1 mt.1 nice.1 nm.1 nohup.1 od.1 \
mkproto.1 mount.1 mt.1 nice.1 nm.1 nohup.1 od.1 \
paste.1 ping.1 playwave.1 pr.1 prep.1 \
profile.1 ps.1 pwd.1 rcp.1 readall.1 recwave.1 \
ref.1 remsync.1 rget.1 rlogin.1 rsh.1 rz.1 \

View file

@ -1,44 +0,0 @@
.TH CALENDAR 1
.SH NAME
calendar \- reminder service
.SH SYNOPSIS
\fBcalendar [\fB\-\fR] [\fB\-r\fR]\fR
.br
.de FL
.TP
\\fB\\$1\\fR
\\$2
..
.de EX
.TP 20
\\fB\\$1\\fR
# \\$2
..
.SH OPTIONS
.FL "\-" "Work for every user and send mail to him"
.FL "\-r" "Restrict multiple execution on the same day"
.SH EXAMPLES
.EX "calendar" "Check \fIcalendar\fR file in current directory"
.EX "calendar" "Normary used under the control of cron(8)"
.EX "calendar \-r" " Normary used in /etc/rc file"
.SH DESCRIPTION
.PP
Basically \fIcalendar\fR program consults the file \fIcalendar\fR in the
current directory and display lines which contain today's or tomorrow's date.
Month-day formats such
as '12/25', 'Dec. 25', 'december 25', '*/25', '12/*', '*/*' are
recognized. The asterisk
means 'all' days or 'all' months. On weekends 'tomorrow' extends through
next Monday without any consideration about holidays.
To prevent ambiguity, the formats '25 Dec.' and '25/12' are not recognized.
.PP
When an argument \fB\-\fR is present, \fIcalendar\fR works for all users
with a file \fIcalendar\fR in their login directories and sends them mail.
Normally this is done daily under the control of \fIcron\fR.
.PP
The \fB\-r\fR option does its the same job as \fB\-\fR option, but touches
the \fIcalendar\fR to prevents further access on the same day.
Normally this is done in the \fI/etc/rc\fR file on a machine which may be
booted several times in one day.
.SH "SEE ALSO"
.BR cron (8).

View file

@ -1,26 +0,0 @@
.TH LEAVE 1
.SH NAME
leave \- warn when it is time to go home
.SH SYNOPSIS
\fBleave\fR [\fR [\fB+\fR] \fIhh\fR[\fB:\fR]\fImm\fR]\fR
.br
.de FL
.TP
\\fB\\$1\\fR
\\$2
..
.de EX
.TP 20
\\fB\\$1\\fR
# \\$2
..
.SH EXAMPLES
.EX "leave 1500" "Issue a warning at 2:55 p.m."
.EX "leave 10:00" "Issue a warning at 9:55 a.m."
.EX "leave + 30" "Issue a warning in 25 minutes"
.SH DESCRIPTION
.PP
\fILeave\fR sets an alarm clock to a specified time and issues a warning
5 minutes before, 1 minute before, and at the time to leave.
It then keeps issuing warnings every minute for 10 minutes, then quits.
If no time is provided, the program prompts for one.

View file

@ -1,39 +0,0 @@
.TH MODEM 1
.SH NAME
modem \- switch the modem and getty state
.SH SYNOPSIS
\fBmodem \fR[\fB\-o\fR] [\fB\-i \fInum\fR] \fBtty\fIn\fR\fR
.br
.de FL
.TP
\\fB\\$1\\fR
\\$2
..
.de EX
.TP 20
\\fB\\$1\\fR
# \\$2
..
.SH OPTIONS
.FL "\-o" "Turn getty off and set modem to dialout"
.FL "\-i" "Set line to dialin"
.SH EXAMPLES
.EX "modem \-o tty00" "Set tty00 to dialout"
.EX "modem \-i2 tty00" "Set tty00 to dialin (2 rings)"
.SH DESCRIPTION
.PP
The \fIgetty\fR program allows a terminal port to be used for both dialin and
dialout.
This little program switches the getty state, and also sends
some commands to the modem attached to the specified line.
If the \fB\-o\fR flag is presnt, \fImodem\fR will put the
getty process (if any) connected to the specified line into
SUSPEND state, which means that it
will not pay attention to that line until it is reset to RESTART state.
Also, \fImodem\fR will send some (Hayes)
commands to the attached modem to disable the auto-nanswer mode.
The \fB\-i\fR flag specifies the number of times the telephone has to
ring before the modem may answer the call (to give the operator a chance).
.SH "SEE ALSO"
.BR term (1),
.BR getty (8).

View file

@ -6,7 +6,7 @@ MAN= add_route.8 backup.8 badblocks.8 boot.8 btrace.8 \
mknod.8 netconf.8 newroot.8 nonamed.8 \
ossdevlinks.8 part.8 partition.8 \
poweroff.8 printroot.8 pr_routes.8 pwdauth.8 rarpd.8 \
rdate.8 readclock.8 reboot.8 repartition.8 rlogind.8 \
rdate.8 readclock.8 reboot.8 repartition.8 \
rshd.8 screendump.8 serial-ip.8 service.8 \
setup.8 shutdown.8 slip.8 srccrc.8 sync.8 syslogd.8 tcpd.8 \
unix.8 update.8 usage.8

View file

@ -1,103 +0,0 @@
.\" Copyright (c) 1983 Regents of the University of California.
.\" All rights reserved. The Berkeley software License Agreement
.\" specifies the terms and conditions for redistribution.
.\"
.\" @(#)rlogind.8c 6.3 (Berkeley) 5/24/86
.\"
.TH RLOGIND 8 "May 24, 1986"
.UC 5
.SH NAME
rlogind, in.rlogind \- remote login server
.SH SYNOPSIS
.B "login stream tcp nowait root /usr/sbin/in.rlogind in.rlogind"
.br
.B "tcpd login /usr/sbin/in.rlogind"
.SH DESCRIPTION
.B Rlogind
is the server for the
.BR rlogin (1)
program. The server provides a remote login facility
with authentication based on privileged port numbers from trusted hosts.
.PP
.B Rlogind
listens for service requests at the port indicated in
the ``login'' service specification; see
.BR services (5).
When a service request is received the following protocol
is initiated:
.IP 1)
The server checks the client's source port.
If the port is not in the range 0-1023, the server
aborts the connection.
.IP 2)
The server checks the client's source address
and requests the corresponding host name (see
.BR gethostbyaddr (3),
.BR hosts (5)
and
.BR named (8)).
If the hostname cannot be determined,
the dot-notation representation of the host address is used.
.PP
Once the source port and address have been checked,
.B rlogind
allocates a pseudo terminal (see
.BR tty (4)),
and manipulates file descriptors so that the slave
half of the pseudo terminal becomes the
.B stdin ,
.B stdout ,
and
.B stderr
for a login process.
The login process is an instance of the
.BR login (1)
program, invoked with the
.B \-r
option. The login process then proceeds with the authentication
process as described in
.BR rshd (8),
but if automatic authentication fails, it reprompts the user
to login as one finds on a standard terminal line.
.PP
The parent of the login process manipulates the master side of
the pseduo terminal, operating as an intermediary
between the login process and the client instance of the
.B rlogin
program. In normal operation, the packet protocol described
in
.BR tty (4)
is invoked to provide ^S/^Q type facilities and propagate
interrupt signals to the remote programs. The login process
propagates the client terminal's baud rate and terminal type,
as found in the environment variable, ``TERM''; see
.BR environ (7).
The screen or window size of the terminal is requested from the client,
and window size changes from the client are propagated to the pseudo terminal.
.SH "SEE ALSO"
.BR rlogin (1).
.SH DIAGNOSTICS
All diagnostic messages are returned on the connection
associated with the
.BR stderr ,
after which any network connections are closed.
An error is indicated by a leading byte with a value of 1.
.PP
.B ``Try again.''
.br
A
.B fork
by the server failed.
.PP
.B ``/bin/sh: ...''
.br
The user's login shell could not be started.
.SH BUGS
The authentication procedure used here assumes the integrity
of each client machine and the connecting medium. This is
insecure, but is useful in an ``open'' environment.
.PP
A facility to allow all data exchanges to be encrypted should be
present.
.PP
A more extensible protocol should be used.

View file

@ -28,7 +28,6 @@
#include <minix/vm.h>
#include <signal.h>
#include <sys/resource.h>
#include <sys/sigcontext.h>
#include <string.h>
#include "mproc.h"
#include "param.h"

View file

@ -14,7 +14,7 @@
#include <minix/sysutil.h>
#include <minix/syslib.h>
#include <minix/bitmap.h>
#include <sys/sigcontext.h>
#include <sys/signal.h>
#include <errno.h>
#include <env.h>

View file

@ -132,37 +132,28 @@ void test11b()
void test11c()
{
/* Test getlogin() and cuserid(). This test MUST run setuid root. */
/* Test getlogin(). This test MUST run setuid root. */
int n, etc_uid;
uid_t ruid, euid;
char *lnamep, *cnamep, *p;
char *lnamep, *p;
#define MAXLINELEN 200
char array[MAXLINELEN], save[L_cuserid], save2[L_cuserid];
char array[MAXLINELEN], save[L_cuserid];
FILE *stream;
subtest = 3;
errno = -2000; /* None of these calls set errno. */
array[0] = '@';
array[1] = '0';
save[0] = '#';
save[1] = '0';
ruid = getuid();
euid = geteuid();
lnamep = getlogin();
strcpy(save, lnamep);
cnamep = cuserid(array);
strcpy(save2, cnamep);
/* Because we are setuid root, cuser == array == 'root'; login != 'root' */
/* Because we are setuid, login != 'root' */
if (euid != 0) e(1);
if (ruid == 0) e(2);
if (strcmp(cnamep, "root") != 0) e(3);
if (strcmp(array, "root") != 0) e(4);
if ( (n = strlen(save)) == 0) e(5);
if (strcmp(save, cnamep) == 0) e(6); /* they must be different */
cnamep = cuserid(NULL);
if (strcmp(cnamep, save2) != 0) e(7);
/* Check login against passwd file. First lookup login in /etc/passwd. */
if (n == 0) return; /* if login not found, don't look it up */

View file

@ -2,9 +2,6 @@
#include <sys/types.h>
#include <sys/times.h>
#ifdef _MINIX
#include <sys/sigcontext.h>
#endif
#include <sys/wait.h>
#include <errno.h>
#include <signal.h>

View file

@ -5,7 +5,6 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/sigcontext.h>
#define MAX_ERROR 4
#include "common.c"