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 \
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 \
+++ /dev/null
-PROG= calendar
-MAN=
-
-.include <bsd.prog.mk>
+++ /dev/null
-/* 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);
-}
+++ /dev/null
-PROG= leave
-MAN=
-
-.include <bsd.prog.mk>
+++ /dev/null
-/* 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));
- }
-}
+++ /dev/null
-PROG= modem
-MAN=
-
-.include <bsd.prog.mk>
+++ /dev/null
-/* 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);
-}
+++ /dev/null
-# Makefile for rlogind.
-
-PROG= in.rlogind
-SRCS= rlogind.c setup.c
-MAN=
-
-.include <bsd.prog.mk>
+++ /dev/null
-/*
-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;
- }
-}
+++ /dev/null
-/*
-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);
+++ /dev/null
-/*
-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));
- }
-}
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
daemonize talkd
daemonize tcpd shell in.rshd
-daemonize tcpd login in.rlogind
daemonize tcpd telnet in.telnetd
daemonize tcpd ftp in.ftpd
+++ /dev/null
-# 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
#include <signal.h>
#include <machine/vm.h>
-#include <sys/sigcontext.h>
#include <minix/u64.h>
#include "archconst.h"
#include <minix/safecopies.h>
#include <machine/archtypes.h>
-#include <sys/sigcontext.h>
#include <a.out.h>
/* Struct declarations. */
#include <assert.h>
#include <signal.h>
#include <unistd.h>
-#include <sys/sigcontext.h>
#include <minix/endpoint.h>
#include <minix/safecopies.h>
#include "kernel/system.h"
#include <string.h>
#include <machine/cpu.h>
-#include <sys/sigcontext.h>
#if USE_SIGRETURN
#include "kernel/system.h"
#include <signal.h>
#include <string.h>
-#include <sys/sigcontext.h>
#if USE_SIGSEND
# 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>
+++ /dev/null
-/* 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);
-}
+++ /dev/null
-/*
-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 $
- */
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
+++ /dev/null
-/* 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 */
+++ /dev/null
-/* 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 $
- */
+++ /dev/null
-#ifndef _COMPAT_SYSLOG_H
-#define _COMPAT_SYSLOG_H
-
-#include <syslog.h>
-#define FacNames facilitynames
-#define PriNames prioritynames
-
-#endif
+++ /dev/null
-#ifndef COMPAT_SYS_SIGCONTEXT_H
-#define COMPAT_SYS_SIGCONTEXT_H
-
-/* Minix legacy compatibility header. */
-#include <sys/signal.h>
-#include <sys/siginfo.h>
-
-#endif
+++ /dev/null
-/*
- * "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;
-}
+++ /dev/null
-/* 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);
-}
+++ /dev/null
-/* regcomp and regexec -- regsub and regerror are elsewhere
- *
- * 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.
- *
- * Beware that some of this code is subtly aware of the way operator
- * precedence is structured in regular expressions. Serious changes in
- * regular-expression syntax might require a total rethink.
- *
- * The third parameter to regexec was added by Martin C. Atkins.
- * Andy Tanenbaum also made some changes.
- */
-
-#include <stdlib.h>
-#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
-
-/* The "internal use only" fields in regexp.h are present to pass info from
- * compile to execute that permits the execute phase to run lots faster on
- * simple cases. They are:
- *
- * regstart char that must begin a match; '\0' if none obvious
- * reganch is the match anchored (at beginning-of-line only)?
- * regmust string (pointer into program) that match must include, or NULL
- * regmlen length of regmust string
- *
- * Regstart and reganch permit very fast decisions on suitable starting points
- * for a match, cutting down the work a lot. Regmust permits fast rejection
- * of lines that cannot possibly match. The regmust tests are costly enough
- * that regcomp() supplies a regmust only if the r.e. contains something
- * potentially expensive (at present, the only such thing detected is * or +
- * at the start of the r.e., which can involve a lot of backup). Regmlen is
- * supplied because the test in regexec() needs it and regcomp() is computing
- * it anyway.
- */
-
-/* Structure for regexp "program". This is essentially a linear encoding
- * of a nondeterministic finite-state machine (aka syntax charts or
- * "railroad normal form" in parsing technology). Each node is an opcode
- * plus a "next" pointer, possibly plus an operand. "Next" pointers of
- * all nodes except BRANCH implement concatenation; a "next" pointer with
- * a BRANCH on both ends of it is connecting two alternatives. (Here we
- * have one of the subtle syntax dependencies: an individual BRANCH (as
- * opposed to a collection of them) is never concatenated with anything
- * because of operator precedence.) The operand of some types of node is
- * a literal string; for others, it is a node leading into a sub-FSM. In
- * particular, the operand of a BRANCH node is the first node of the branch.
- * (NB this is *not* a tree structure: the tail of the branch connects
- * to the thing following the set of BRANCHes.) The opcodes are:
- */
-
-/* Definition number opnd? meaning */
-#define END 0 /* no End of program. */
-#define BOL 1 /* no Match "" at beginning of line. */
-#define EOL 2 /* no Match "" at end of line. */
-#define ANY 3 /* no Match any one character. */
-#define ANYOF 4 /* str Match any character in this string. */
-#define ANYBUT 5 /* str Match any character not in this
- * string. */
-#define BRANCH 6 /* node Match this alternative, or the
- * next... */
-#define BACK 7 /* no Match "", "next" ptr points backward. */
-#define EXACTLY 8 /* str Match this string. */
-#define NOTHING 9 /* no Match empty string. */
-#define STAR 10 /* node Match this (simple) thing 0 or more
- * times. */
-#define PLUS 11 /* node Match this (simple) thing 1 or more
- * times. */
-#define OPEN 20 /* no Mark this point in input as start of
- * #n. */
- /* OPEN+1 is number 1, etc. */
-#define CLOSE 30 /* no Analogous to OPEN. */
-
-/* Opcode notes:
- *
- * BRANCH The set of branches constituting a single choice are hooked
- * together with their "next" pointers, since precedence prevents
- * anything being concatenated to any individual branch. The
- * "next" pointer of the last BRANCH in a choice points to the
- * thing following the whole choice. This is also where the
- * final "next" pointer of each individual branch points; each
- * branch starts with the operand node of a BRANCH node.
- *
- * BACK Normal "next" pointers all implicitly point forward; BACK
- * exists to make loop structures possible.
- *
- * STAR,PLUS '?', and complex '*' and '+', are implemented as circular
- * BRANCH structures using BACK. Simple cases (one character
- * per match) are implemented with STAR and PLUS for speed
- * and to minimize recursive plunges.
- *
- * OPEN,CLOSE ...are numbered at compile time.
- */
-
-/* A node is one char of opcode followed by two chars of "next" pointer.
- * "Next" pointers are stored as two 8-bit pieces, high order first. The
- * value is a positive offset from the opcode of the node containing it.
- * An operand, if any, simply follows the node. (Note that much of the
- * code generation knows about this implicit relationship.)
- *
- * Using two bytes for the "next" pointer is vast overkill for most things,
- * but allows patterns to get big without disasters.
- */
-#define OP(p) (*(p))
-#define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
-#define OPERAND(p) ((p) + 3)
-
-/* Utility definitions.
- */
-#ifndef CHARBITS
-#define UCHARAT(p) ((int)*(unsigned char *)(p))
-#else
-#define UCHARAT(p) ((int)*(p)&CHARBITS)
-#endif
-
-#define CFAIL(m) { regerror(m); return((char *)NULL); }
-#define RFAIL(m) { regerror(m); return((regexp *)NULL); }
-#define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?')
-#define META "^$.[()|?+*\\"
-
-/* Flags to be passed up and down.
- */
-#define HASWIDTH 01 /* Known never to match null string. */
-#define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */
-#define SPSTART 04 /* Starts with * or +. */
-#define WORST 0 /* Worst case. */
-
-/* Global work variables for regcomp().
- */
-static char *regparse; /* Input-scan pointer. */
-static int regnpar; /* () count. */
-static char regdummy;
-static char *regcode; /* Code-emit pointer; ®dummy = don't. */
-static long regsize; /* Code size. */
-
-/* Forward declarations for regcomp()'s friends.
- */
-static char *reg(int paren, int *flagp);
-static char *regbranch(int *flagp);
-static char *regpiece(int *flagp);
-static char *regatom(int *flagp);
-static char *regnode(int op);
-static char *regnext(char *p);
-static void regc(int b);
-static void reginsert(int op, char *opnd);
-static void regtail(char *p, char *val);
-static void regoptail(char *p, char *val);
-
-/*
- - regcomp - compile a regular expression into internal code
- *
- * We can't allocate space until we know how big the compiled form will be,
- * but we can't compile it (and thus know how big it is) until we've got a
- * place to put the code. So we cheat: we compile it twice, once with code
- * generation turned off and size counting turned on, and once "for real".
- * This also means that we don't allocate space until we are sure that the
- * thing really will compile successfully, and we never have to move the
- * code and thus invalidate pointers into it. (Note that it has to be in
- * one piece because free() must be able to free it all.)
- *
- * Beware that the optimization-preparation code in here knows about some
- * of the structure of the compiled regexp.
- */
-regexp *regcomp(exp)
-char *exp;
-{
- register regexp *r;
- register char *scan;
- register char *longest;
- register int len;
- int flags;
-
- if (exp == (char *)NULL) RFAIL("NULL argument");
-
- /* First pass: determine size, legality. */
- regparse = exp;
- regnpar = 1;
- regsize = 0L;
- regcode = ®dummy;
- regc(MAGIC);
- if (reg(0, &flags) == (char *)NULL) return((regexp *)NULL);
-
- /* Small enough for pointer-storage convention? */
- if (regsize >= 32767L) /* Probably could be 65535L. */
- RFAIL("regexp too big");
-
- /* Allocate space. */
- r = (regexp *) malloc(sizeof(regexp) + (unsigned) regsize);
- if (r == (regexp *)NULL) RFAIL("out of space");
-
- /* Second pass: emit code. */
- regparse = exp;
- regnpar = 1;
- regcode = r->program;
- regc(MAGIC);
- if (reg(0, &flags) == (char *)NULL) return((regexp *)NULL);
-
- /* Dig out information for optimizations. */
- r->regstart = '\0'; /* Worst-case defaults. */
- r->reganch = 0;
- r->regmust = (char *)NULL;
- r->regmlen = 0;
- scan = r->program + 1; /* First BRANCH. */
- if (OP(regnext(scan)) == END) { /* Only one top-level choice. */
- scan = OPERAND(scan);
-
- /* Starting-point info. */
- if (OP(scan) == EXACTLY)
- r->regstart = *OPERAND(scan);
- else if (OP(scan) == BOL)
- r->reganch++;
-
- /* If there's something expensive in the r.e., find the
- * longest literal string that must appear and make it the
- * regmust. Resolve ties in favor of later strings, since
- * the regstart check works with the beginning of the r.e.
- * and avoiding duplication strengthens checking. Not a
- * strong reason, but sufficient in the absence of others. */
- if (flags & SPSTART) {
- longest = (char *)NULL;
- len = 0;
- for (; scan != (char *)NULL; scan = regnext(scan))
- if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
- longest = OPERAND(scan);
- len = strlen(OPERAND(scan));
- }
- r->regmust = longest;
- r->regmlen = len;
- }
- }
- return(r);
-}
-
-/*
- - reg - regular expression, i.e. main body or parenthesized thing
- *
- * Caller must absorb opening parenthesis.
- *
- * Combining parenthesis handling with the base level of regular expression
- * is a trifle forced, but the need to tie the tails of the branches to what
- * follows makes it hard to avoid.
- */
-static char *reg(paren, flagp)
-int paren; /* Parenthesized? */
-int *flagp;
-{
- register char *ret;
- register char *br;
- register char *ender;
- register int parno;
- int flags;
-
- *flagp = HASWIDTH; /* Tentatively. */
-
- /* Make an OPEN node, if parenthesized. */
- if (paren) {
- if (regnpar >= NSUBEXP) CFAIL("too many ()");
- parno = regnpar;
- regnpar++;
- ret = regnode(OPEN + parno);
- } else {
- parno = 0; /* not actually used, keep compiler quiet */
- ret = (char *)NULL;
- }
-
- /* Pick up the branches, linking them together. */
- br = regbranch(&flags);
- if (br == (char *)NULL) return((char *)NULL);
- if (ret != (char *)NULL)
- regtail(ret, br); /* OPEN -> first. */
- else
- ret = br;
- if (!(flags & HASWIDTH)) *flagp &= ~HASWIDTH;
- *flagp |= flags & SPSTART;
- while (*regparse == '|') {
- regparse++;
- br = regbranch(&flags);
- if (br == (char *)NULL) return((char *)NULL);
- regtail(ret, br); /* BRANCH -> BRANCH. */
- if (!(flags & HASWIDTH)) *flagp &= ~HASWIDTH;
- *flagp |= flags & SPSTART;
- }
-
- /* Make a closing node, and hook it on the end. */
- ender = regnode((paren) ? CLOSE + parno : END);
- regtail(ret, ender);
-
- /* Hook the tails of the branches to the closing node. */
- for (br = ret; br != (char *)NULL; br = regnext(br)) regoptail(br, ender);
-
- /* Check for proper termination. */
- if (paren && *regparse++ != ')') {
- CFAIL("unmatched ()");
- } else if (!paren && *regparse != '\0') {
- if (*regparse == ')') {
- CFAIL("unmatched ()");
- } else
- CFAIL("junk on end"); /* "Can't happen". */
- /* NOTREACHED */
- }
- return(ret);
-}
-
-/*
- - regbranch - one alternative of an | operator
- *
- * Implements the concatenation operator.
- */
-static char *regbranch(flagp)
-int *flagp;
-{
- register char *ret;
- register char *chain;
- register char *latest;
- int flags;
-
- *flagp = WORST; /* Tentatively. */
-
- ret = regnode(BRANCH);
- chain = (char *)NULL;
- while (*regparse != '\0' && *regparse != '|' && *regparse != ')') {
- latest = regpiece(&flags);
- if (latest == (char *)NULL) return((char *)NULL);
- *flagp |= flags & HASWIDTH;
- if (chain == (char *)NULL) /* First piece. */
- *flagp |= flags & SPSTART;
- else
- regtail(chain, latest);
- chain = latest;
- }
- if (chain == (char *)NULL) /* Loop ran zero times. */
- regnode(NOTHING);
-
- return(ret);
-}
-
-/*
- - regpiece - something followed by possible [*+?]
- *
- * Note that the branching code sequences used for ? and the general cases
- * of * and + are somewhat optimized: they use the same NOTHING node as
- * both the endmarker for their branch list and the body of the last branch.
- * It might seem that this node could be dispensed with entirely, but the
- * endmarker role is not redundant.
- */
-static char *regpiece(flagp)
-int *flagp;
-{
- register char *ret;
- register char op;
- register char *next;
- int flags;
-
- ret = regatom(&flags);
- if (ret == (char *)NULL) return((char *)NULL);
-
- op = *regparse;
- if (!ISMULT(op)) {
- *flagp = flags;
- return(ret);
- }
- if (!(flags & HASWIDTH) && op != '?') CFAIL("*+ operand could be empty");
- *flagp = (op != '+') ? (WORST | SPSTART) : (WORST | HASWIDTH);
-
- if (op == '*' && (flags & SIMPLE))
- reginsert(STAR, ret);
- else if (op == '*') {
- /* Emit x* as (x&|), where & means "self". */
- reginsert(BRANCH, ret); /* Either x */
- regoptail(ret, regnode(BACK)); /* and loop */
- regoptail(ret, ret); /* back */
- regtail(ret, regnode(BRANCH)); /* or */
- regtail(ret, regnode(NOTHING)); /* null. */
- } else if (op == '+' && (flags & SIMPLE))
- reginsert(PLUS, ret);
- else if (op == '+') {
- /* Emit x+ as x(&|), where & means "self". */
- next = regnode(BRANCH); /* Either */
- regtail(ret, next);
- regtail(regnode(BACK), ret); /* loop back */
- regtail(next, regnode(BRANCH)); /* or */
- regtail(ret, regnode(NOTHING)); /* null. */
- } else if (op == '?') {
- /* Emit x? as (x|) */
- reginsert(BRANCH, ret); /* Either x */
- regtail(ret, regnode(BRANCH)); /* or */
- next = regnode(NOTHING);/* null. */
- regtail(ret, next);
- regoptail(ret, next);
- }
- regparse++;
- if (ISMULT(*regparse)) CFAIL("nested *?+");
-
- return(ret);
-}
-
-/*
- - regatom - the lowest level
- *
- * Optimization: gobbles an entire sequence of ordinary characters so that
- * it can turn them into a single node, which is smaller to store and
- * faster to run. Backslashed characters are exceptions, each becoming a
- * separate node; the code is simpler that way and it's not worth fixing.
- */
-static char *regatom(flagp)
-int *flagp;
-{
- register char *ret;
- int flags;
-
- *flagp = WORST; /* Tentatively. */
-
- switch (*regparse++) {
- case '^': ret = regnode(BOL); break;
- case '$': ret = regnode(EOL); break;
- case '.':
- ret = regnode(ANY);
- *flagp |= HASWIDTH | SIMPLE;
- break;
- case '[':{
- register int class;
- register int classend;
-
- if (*regparse == '^') { /* Complement of range. */
- ret = regnode(ANYBUT);
- regparse++;
- } else
- ret = regnode(ANYOF);
- if (*regparse == ']' || *regparse == '-') regc(*regparse++);
- while (*regparse != '\0' && *regparse != ']') {
- if (*regparse == '-') {
- regparse++;
- if (*regparse == ']' || *regparse == '\0')
- regc('-');
- else {
- class = UCHARAT(regparse - 2) + 1;
- classend = UCHARAT(regparse);
- if (class > classend + 1)
- CFAIL("invalid [] range");
- for (; class <= classend; class++)
- regc(class);
- regparse++;
- }
- } else
- regc(*regparse++);
- }
- regc('\0');
- if (*regparse != ']') CFAIL("unmatched []");
- regparse++;
- *flagp |= HASWIDTH | SIMPLE;
- }
- break;
- case '(':
- ret = reg(1, &flags);
- if (ret == (char *)NULL) return((char *)NULL);
- *flagp |= flags & (HASWIDTH | SPSTART);
- break;
- case '\0':
- case '|':
- case ')':
- CFAIL("internal urp"); /* Supposed to be caught earlier. */
- break;
- case '?':
- case '+':
- case '*': CFAIL("?+* follows nothing"); break;
- case '\\':
- if (*regparse == '\0') CFAIL("trailing \\");
- ret = regnode(EXACTLY);
- regc(*regparse++);
- regc('\0');
- *flagp |= HASWIDTH | SIMPLE;
- break;
- default:{
- register int len;
- register char ender;
-
- regparse--;
- len = strcspn(regparse, META);
- if (len <= 0) CFAIL("internal disaster");
- ender = *(regparse + len);
- if (len > 1 && ISMULT(ender))
- len--; /* Back off clear of ?+* operand. */
- *flagp |= HASWIDTH;
- if (len == 1) *flagp |= SIMPLE;
- ret = regnode(EXACTLY);
- while (len > 0) {
- regc(*regparse++);
- len--;
- }
- regc('\0');
- }
- break;
- }
-
- return(ret);
-}
-
-/*
- - regnode - emit a node
- */
-static char *regnode(op)
-char op;
-{
- register char *ret;
- register char *ptr;
-
- ret = regcode;
- if (ret == ®dummy) {
- regsize += 3;
- return(ret);
- }
- ptr = ret;
- *ptr++ = op;
- *ptr++ = '\0'; /* Null "next" pointer. */
- *ptr++ = '\0';
- regcode = ptr;
-
- return(ret);
-}
-
-/*
- - regc - emit (if appropriate) a byte of code
- */
-static void regc(b)
-char b;
-{
- if (regcode != ®dummy)
- *regcode++ = b;
- else
- regsize++;
-}
-
-/*
- - reginsert - insert an operator in front of already-emitted operand
- *
- * Means relocating the operand.
- */
-static void reginsert(op, opnd)
-char op;
-char *opnd;
-{
- register char *src;
- register char *dst;
- register char *place;
-
- if (regcode == ®dummy) {
- regsize += 3;
- return;
- }
- src = regcode;
- regcode += 3;
- dst = regcode;
- while (src > opnd) *--dst = *--src;
-
- place = opnd; /* Op node, where operand used to be. */
- *place++ = op;
- *place++ = '\0';
- *place++ = '\0';
-}
-
-/*
- - regtail - set the next-pointer at the end of a node chain
- */
-static void regtail(p, val)
-char *p;
-char *val;
-{
- register char *scan;
- register char *temp;
- register int offset;
-
- if (p == ®dummy) return;
-
- /* Find last node. */
- scan = p;
- for (;;) {
- temp = (char *)regnext(scan);
- if (temp == (char *)NULL) break;
- scan = temp;
- }
-
- if (OP(scan) == BACK)
- offset = scan - val;
- else
- offset = val - scan;
- *(scan + 1) = (offset >> 8) & 0377;
- *(scan + 2) = offset & 0377;
-}
-
-/*
- - regoptail - regtail on operand of first argument; nop if operandless
- */
-static void regoptail(p, val)
-char *p;
-char *val;
-{
- /* "Operandless" and "op != BRANCH" are synonymous in practice. */
- if (p == (char *)NULL || p == ®dummy || OP(p) != BRANCH) return;
- regtail(OPERAND(p), val);
-}
-
-/* regexec and friends
- */
-
-/* Global work variables for regexec().
- */
-static char *reginput; /* String-input pointer. */
-static char *regbol; /* Beginning of input, for ^ check. */
-static char **regstartp; /* Pointer to startp array. */
-static char **regendp; /* Ditto for endp. */
-
-/* Forwards.
- */
-static int regtry(regexp *prog, char *string);
-static int regmatch(char *prog);
-static int regrepeat(char *p);
-
-#ifdef DEBUG
-int regnarrate = 0;
-void regdump();
-static char *regprop(char *op);
-#endif
-
-/*
- - regexec - match a regexp against a string
- */
-int regexec(prog, string, bolflag)
-register regexp *prog;
-register char *string;
-int bolflag;
-{
- register char *s;
-
- /* Be paranoid... */
- if (prog == (regexp *)NULL || string == (char *)NULL) {
- regerror("NULL parameter");
- return(0);
- }
-
- /* Check validity of program. */
- if (UCHARAT(prog->program) != MAGIC) {
- regerror("corrupted program");
- return(0);
- }
-
- /* If there is a "must appear" string, look for it. */
- if (prog->regmust != (char *)NULL) {
- s = string;
- while ((s = strchr(s, prog->regmust[0])) != (char *)NULL) {
- if (strncmp(s, prog->regmust, prog->regmlen) == 0)
- break; /* Found it. */
- s++;
- }
- if (s == (char *)NULL) /* Not present. */
- return(0);
- }
-
- /* Mark beginning of line for ^ . */
- if (bolflag)
- regbol = string;
- else
- regbol = (char *)NULL;
-
- /* Simplest case: anchored match need be tried only once. */
- if (prog->reganch) return(regtry(prog, string));
-
- /* Messy cases: unanchored match. */
- s = string;
- if (prog->regstart != '\0') /* We know what char it must start with. */
- while ((s = strchr(s, prog->regstart)) != (char *)NULL) {
- if (regtry(prog, s)) return(1);
- s++;
- }
- else
- /* We don't -- general case. */
- do {
- if (regtry(prog, s)) return(1);
- } while (*s++ != '\0');
-
- /* Failure. */
- return(0);
-}
-
-/*
- - regtry - try match at specific point
- */
-static int regtry(prog, string) /* 0 failure, 1 success */
-regexp *prog;
-char *string;
-{
- register int i;
- register char **sp;
- register char **ep;
-
- reginput = string;
- regstartp = prog->startp;
- regendp = prog->endp;
-
- sp = prog->startp;
- ep = prog->endp;
- for (i = NSUBEXP; i > 0; i--) {
- *sp++ = (char *)NULL;
- *ep++ = (char *)NULL;
- }
- if (regmatch(prog->program + 1)) {
- prog->startp[0] = string;
- prog->endp[0] = reginput;
- return(1);
- } else
- return(0);
-}
-
-/*
- - regmatch - main matching routine
- *
- * Conceptually the strategy is simple: check to see whether the current
- * node matches, call self recursively to see whether the rest matches,
- * and then act accordingly. In practice we make some effort to avoid
- * recursion, in particular by going through "ordinary" nodes (that don't
- * need to know whether the rest of the match failed) by a loop instead of
- * by recursion.
- */
-static int regmatch(prog) /* 0 failure, 1 success */
-char *prog;
-{
- register char *scan; /* Current node. */
- char *next; /* Next node. */
-
- scan = prog;
-#ifdef DEBUG
- if (scan != (char *)NULL && regnarrate) fprintf(stderr, "%s(\n", regprop(scan));
-#endif
- while (scan != (char *)NULL) {
-#ifdef DEBUG
- if (regnarrate) fprintf(stderr, "%s...\n", regprop(scan));
-#endif
- next = regnext(scan);
-
- switch (OP(scan)) {
- case BOL:
- if (reginput != regbol) return(0);
- break;
- case EOL:
- if (*reginput != '\0') return(0);
- break;
- case ANY:
- if (*reginput == '\0') return(0);
- reginput++;
- break;
- case EXACTLY:{
- register int len;
- register char *opnd;
-
- opnd = OPERAND(scan);
- /* Inline the first character, for speed. */
- if (*opnd != *reginput) return(0);
- len = strlen(opnd);
- if (len > 1 && strncmp(opnd, reginput, len) != 0)
- return(0);
- reginput += len;
- }
- break;
- case ANYOF:
- if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) == (char *)NULL)
- return(0);
- reginput++;
- break;
- case ANYBUT:
- if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) != (char *)NULL)
- return(0);
- reginput++;
- break;
- case NOTHING:
- break;
- case BACK:
- break;
- case OPEN + 1:
- case OPEN + 2:
- case OPEN + 3:
- case OPEN + 4:
- case OPEN + 5:
- case OPEN + 6:
- case OPEN + 7:
- case OPEN + 8:
- case OPEN + 9:{
- register int no;
- register char *save;
-
- no = OP(scan) - OPEN;
- save = reginput;
-
- if (regmatch(next)) {
- /* Don't set startp if some later
- * invocation of the same parentheses
- * already has. */
- if (regstartp[no] == (char *)NULL)
- regstartp[no] = save;
- return(1);
- } else
- return(0);
- }
- break;
- case CLOSE + 1:
- case CLOSE + 2:
- case CLOSE + 3:
- case CLOSE + 4:
- case CLOSE + 5:
- case CLOSE + 6:
- case CLOSE + 7:
- case CLOSE + 8:
- case CLOSE + 9:{
- register int no;
- register char *save;
-
- no = OP(scan) - CLOSE;
- save = reginput;
-
- if (regmatch(next)) {
- /* Don't set endp if some later
- * invocation of the same parentheses
- * already has. */
- if (regendp[no] == (char *)NULL) regendp[no] = save;
- return(1);
- } else
- return(0);
- }
- break;
- case BRANCH:{
- register char *save;
-
- if (OP(next) != BRANCH) /* No choice. */
- next = OPERAND(scan); /* Avoid recursion. */
- else {
- do {
- save = reginput;
- if (regmatch(OPERAND(scan)))
- return(1);
- reginput = save;
- scan = regnext(scan);
- } while (scan != (char *)NULL && OP(scan) == BRANCH);
- return(0);
- /* NOTREACHED */
- }
- }
- break;
- case STAR:
- case PLUS:{
- register char nextch;
- register int no;
- register char *save;
- register int min;
-
- /* Lookahead to avoid useless match attempts
- * when we know what character comes next. */
- nextch = '\0';
- if (OP(next) == EXACTLY) nextch = *OPERAND(next);
- min = (OP(scan) == STAR) ? 0 : 1;
- save = reginput;
- no = regrepeat(OPERAND(scan));
- while (no >= min) {
- /* If it could work, try it. */
- if (nextch == '\0' || *reginput == nextch)
- if (regmatch(next)) return(1);
- /* Couldn't or didn't -- back up. */
- no--;
- reginput = save + no;
- }
- return(0);
- }
- break;
- case END:
- return(1); /* Success! */
- break;
- default:
- regerror("memory corruption");
- return(0);
- break;
- }
-
- scan = next;
- }
-
- /* We get here only if there's trouble -- normally "case END" is the
- * terminating point. */
- regerror("corrupted pointers");
- return(0);
-}
-
-/*
- - regrepeat - repeatedly match something simple, report how many
- */
-static int regrepeat(p)
-char *p;
-{
- register int count = 0;
- register char *scan;
- register char *opnd;
-
- scan = reginput;
- opnd = OPERAND(p);
- switch (OP(p)) {
- case ANY:
- count = strlen(scan);
- scan += count;
- break;
- case EXACTLY:
- while (*opnd == *scan) {
- count++;
- scan++;
- }
- break;
- case ANYOF:
- while (*scan != '\0' && strchr(opnd, *scan) != (char *)NULL) {
- count++;
- scan++;
- }
- break;
- case ANYBUT:
- while (*scan != '\0' && strchr(opnd, *scan) == (char *)NULL) {
- count++;
- scan++;
- }
- break;
- default: /* Oh dear. Called inappropriately. */
- regerror("internal foulup");
- count = 0; /* Best compromise. */
- break;
- }
- reginput = scan;
-
- return(count);
-}
-
-/*
- - regnext - dig the "next" pointer out of a node
- */
-static char *regnext(p)
-register char *p;
-{
- register int offset;
-
- if (p == ®dummy) return((char *)NULL);
-
- offset = NEXT(p);
- if (offset == 0) return((char *)NULL);
-
- if (OP(p) == BACK)
- return(p - offset);
- else
- return(p + offset);
-}
-
-#ifdef DEBUG
-
-static char *regprop();
-
-/*
- - regdump - dump a regexp onto stdout in vaguely comprehensible form
- */
-void regdump(r)
-regexp *r;
-{
- register char *s;
- register char op = EXACTLY; /* Arbitrary non-END op. */
- register char *next;
-
- s = r->program + 1;
- while (op != END) { /* While that wasn't END last time... */
- op = OP(s);
- printf("%2d%s", (int) (s - r->program), regprop(s)); /* Where, what. */
- next = regnext(s);
- if (next == (char *)NULL) /* Next ptr. */
- printf("(0)");
- else
- printf("(%d)", (int) (s - r->program) + (int) (next - s));
- s += 3;
- if (op == ANYOF || op == ANYBUT || op == EXACTLY) {
- /* Literal string, where present. */
- while (*s != '\0') {
- putchar(*s);
- s++;
- }
- s++;
- }
- putchar('\n');
- }
-
- /* Header fields of interest. */
- if (r->regstart != '\0') printf("start `%c' ", r->regstart);
- if (r->reganch) printf("anchored ");
- if (r->regmust != (char *)NULL) printf("must have \"%s\"", r->regmust);
- printf("\n");
-}
-
-/*
- - regprop - printable representation of opcode
- */
-static char *regprop(op)
-char *op;
-{
- register char *p;
- static char buf[50];
-
- (void) strcpy(buf, ":");
-
- switch (OP(op)) {
- case BOL: p = "BOL"; break;
- case EOL: p = "EOL"; break;
- case ANY: p = "ANY"; break;
- case ANYOF: p = "ANYOF"; break;
- case ANYBUT: p = "ANYBUT"; break;
- case BRANCH: p = "BRANCH"; break;
- case EXACTLY: p = "EXACTLY"; break;
- case NOTHING: p = "NOTHING"; break;
- case BACK: p = "BACK"; break;
- case END: p = "END"; break;
- case OPEN + 1:
- case OPEN + 2:
- case OPEN + 3:
- case OPEN + 4:
- case OPEN + 5:
- case OPEN + 6:
- case OPEN + 7:
- case OPEN + 8:
- case OPEN + 9:
- sprintf(buf + strlen(buf), "OPEN%d", OP(op) - OPEN);
- p = (char *)NULL;
- break;
- case CLOSE + 1:
- case CLOSE + 2:
- case CLOSE + 3:
- case CLOSE + 4:
- case CLOSE + 5:
- case CLOSE + 6:
- case CLOSE + 7:
- case CLOSE + 8:
- case CLOSE + 9:
- sprintf(buf + strlen(buf), "CLOSE%d", OP(op) - CLOSE);
- p = (char *)NULL;
- break;
- case STAR: p = "STAR"; break;
- case PLUS: p = "PLUS"; break;
- default: regerror("corrupted opcode"); p = (char *) NULL; break;
- }
- if (p != (char *)NULL) (void) strcat(buf, p);
- return(buf);
-}
-
-#endif
-
-/*
- * $PchId: regexp.c,v 1.4 1996/02/22 09:03:07 philip Exp $
- */
+++ /dev/null
-/* 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 $
- */
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 \
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 \
+++ /dev/null
-.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).
+++ /dev/null
-.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.
+++ /dev/null
-.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).
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
+++ /dev/null
-.\" 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.
#include <minix/vm.h>
#include <signal.h>
#include <sys/resource.h>
-#include <sys/sigcontext.h>
#include <string.h>
#include "mproc.h"
#include "param.h"
#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>
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 */
#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>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#include <sys/sigcontext.h>
#define MAX_ERROR 4
#include "common.c"