diff options
author | cvs2svn <cvs2svn@FreeBSD.org> | 1996-10-06 07:58:04 +0000 |
---|---|---|
committer | cvs2svn <cvs2svn@FreeBSD.org> | 1996-10-06 07:58:04 +0000 |
commit | 2cbfdf51d83d2fc0f0396562250a188cb6faba48 (patch) | |
tree | 3799ecd3ca6d917c414066937952fcbae699f1b6 | |
parent | 231387f437082b3b9a62189d7077e9d86b22243d (diff) |
Notes
30 files changed, 3339 insertions, 1370 deletions
diff --git a/lib/libc/stdio/asprintf.c b/lib/libc/stdio/asprintf.c deleted file mode 100644 index 9b4d05b4397b..000000000000 --- a/lib/libc/stdio/asprintf.c +++ /dev/null @@ -1,59 +0,0 @@ -/*- - * Copyright (c) 1996 Peter Wemm <peter@freebsd.org> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if defined(LIBC_RCS) && !defined(lint) -static char rcsid[] = "$Id$"; -#endif /* LIBC_RCS and not lint */ - -#include <stdio.h> -#if __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -#if __STDC__ -int -asprintf(char **str, char const *fmt, ...) -#else -int -asprintf(str, fmt, va_alist) - char **str; - char *fmt; - va_dcl -#endif -{ - int ret; - va_list ap; - -#if __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - ret = vasprintf(str, fmt, ap); - va_end(ap); - return (ret); -} diff --git a/release/floppies/boot/Makefile b/release/floppies/boot/Makefile deleted file mode 100644 index 2dd894d898d9..000000000000 --- a/release/floppies/boot/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -# $Id: Makefile,v 1.214 1996/05/02 08:18:28 jkh Exp $ -SUBDIR= crunch mfs floppy - -.include <bsd.subdir.mk> diff --git a/release/floppies/boot/crunch/crunch.conf b/release/floppies/boot/crunch/crunch.conf deleted file mode 100644 index b9d6f14b65f7..000000000000 --- a/release/floppies/boot/crunch/crunch.conf +++ /dev/null @@ -1,20 +0,0 @@ -# $Id: boot_crunch.conf,v 1.23 1996/02/08 18:02:51 phk Exp $ - -srcdirs /usr/src/bin -srcdirs /usr/src/release -srcdirs /usr/src/sbin/i386 -srcdirs /usr/src/sbin -srcdirs /usr/src/usr.bin -srcdirs /usr/src/gnu/usr.bin -srcdirs /usr/src/usr.sbin - -progs sh find -progs pwd ft ppp -progs sysinstall newfs gzip cpio bad144 fsck ifconfig route slattach -progs mount_nfs -ln gzip gunzip -ln gzip zcat -ln sh -sh - -libs -ll -ledit -lutil -lkvm -lmd -libs -ldialog -lncurses -lmytinfo -L/usr/src/release/libdisk/obj -ldisk -lipx diff --git a/release/floppies/boot/verbatim/etc/services b/release/floppies/boot/verbatim/etc/services deleted file mode 100644 index bd1beff4d9a7..000000000000 --- a/release/floppies/boot/verbatim/etc/services +++ /dev/null @@ -1,4 +0,0 @@ -nameserver 42/tcp name -ftp 21/tcp -domain 53/tcp nameserver -domain 53/udp nameserver diff --git a/release/floppies/doFS.sh b/release/floppies/doFS.sh deleted file mode 100644 index 16932269363f..000000000000 --- a/release/floppies/doFS.sh +++ /dev/null @@ -1,120 +0,0 @@ -: -#set -ex - -VNDEVICE=vn0 -export BLOCKSIZE=512 - -LABELDIR=$1 ; shift -MNT=$1 ; shift -FSSIZE=$1 ; shift -FSPROTO=$1 ; shift -FSINODE=$1 ; shift -FSLABEL=$1 ; shift -OLDFSSIZE=${FSSIZE} -OLDFSINODE=${FSINODE} - -deadlock=40 - -while true -do - rm -f fs-image - - if [ ! -b /dev/${VNDEVICE} -o ! -c /dev/r${VNDEVICE} ] ; then - ( cd /dev && sh MAKEDEV ${VNDEVICE} ) - fi - - umount /dev/${VNDEVICE} 2>/dev/null || true - - umount ${MNT} 2>/dev/null || true - - vnconfig -u /dev/r${VNDEVICE} 2>/dev/null || true - - dd of=fs-image if=/dev/zero count=${FSSIZE} bs=1k 2>/dev/null - # this suppresses the `invalid primary partition table: no magic' - awk 'BEGIN {printf "%c%c", 85, 170}' |\ - dd of=fs-image obs=1 seek=510 conv=notrunc 2>/dev/null - - vnconfig -s labels -c /dev/r${VNDEVICE} fs-image - - sed '/^minimum:/,$d' /etc/disktab > /etc/disktab.tmp - cat /etc/disktab.tmp > /etc/disktab - rm -f /etc/disktab.tmp - ( - a=`expr ${FSSIZE} \* 2` - echo - echo "minimum:ty=mfs:se#512:nt#1:rm#300:\\" - echo " :ns#$a:nc#1:\\" - echo " :pa#$a:oa#0:ba#4096:fa#512:\\" - echo " :pc#$a:oc#0:bc#4096:fc#512:" - echo - ) >> /etc/disktab - - disklabel -w -r -B \ - -b ${LABELDIR}/boot1 \ - -s ${LABELDIR}/boot2 \ - /dev/r${VNDEVICE} minimum - - newfs -u 0 -t 0 -i ${FSINODE} -m 0 -T minimum /dev/r${VNDEVICE}a - - mount /dev/${VNDEVICE}a ${MNT} - - if ( set -e && cd ${FSPROTO} && find . -print | cpio -dump ${MNT} ) - then - ; - else - echo " $FSINODE and $FSSIZE failed, reverting.." - FSSIZE=`expr ${FSSIZE} + 10` - #FSSIZE=${OLDFSSIZE} - FSINODE=${FSINODE} - continue - fi - - set `df -i /mnt | tail -1` -#/dev/vn0a 937 932 5 99% 342 328 51% /mnt - - umount ${MNT} - - fsck -p /dev/r${VNDEVICE}a < /dev/null - - vnconfig -u /dev/r${VNDEVICE} 2>/dev/null || true - - if [ $FSLABEL != "minimum" ] ; then - echo ${FSSIZE} > fs-image.size - break - fi - - OLDFSSIZE=${FSSIZE} - OLDFSINODE=${FSINODE} - echo ">>> Filesystem is ${FSSIZE} K, $4 left" - echo ">>> ${FSINODE} bytes/inode, $7 left" - echo ">>> `expr ${FSSIZE} \* 1024 / ${FSINODE}`" - if [ $4 -gt 128 ] ; then - echo "Reducing size" - FSSIZE=`expr ${FSSIZE} - $4 / 2` - continue - fi - if [ $7 -gt 128 ] ; then - echo "Increasing bytes per inode" - FSINODE=`expr ${FSINODE} + 8192` - continue - fi - if [ $4 -gt 32 ] ; then - echo "Reducing size" - FSSIZE=`expr ${FSSIZE} - 4` - FSINODE=`expr ${FSINODE} - 1024` - continue - fi - if [ $7 -gt 64 ] ; then - echo "Increasing bytes per inode" - FSINODE=`expr ${FSINODE} + 8192` - continue - fi - if [ $deadlock -eq 0 ] ; then - echo "Avoiding deadlock, giving up" - echo ${FSSIZE} > fs-image.size - break - fi - deadlock=`expr $deadlock - 1` - echo ${FSSIZE} > fs-image.size - break; -done diff --git a/release/floppies/fixit/Makefile b/release/floppies/fixit/Makefile deleted file mode 100644 index ee278f76ab4c..000000000000 --- a/release/floppies/fixit/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -### -# $Id: Makefile,v 1.214 1996/05/02 08:18:28 jkh Exp $ -# -SUBDIR= crunch image - -.include <bsd.subdir.mk> diff --git a/release/floppies/fixit/crunch/crunch.conf b/release/floppies/fixit/crunch/crunch.conf deleted file mode 100644 index f31652ea1e87..000000000000 --- a/release/floppies/fixit/crunch/crunch.conf +++ /dev/null @@ -1,45 +0,0 @@ -# $Id: fixit_crunch.conf,v 1.6 1996/01/03 23:41:03 joerg Exp $ - -# first, we list the source dirs that our programs reside in. These are -# searched in order listed to find the dir containing each program. - -srcdirs /usr/src/bin -srcdirs /usr/src/sbin/i386 -srcdirs /usr/src/sbin -srcdirs /usr/src/gnu/usr.bin -srcdirs /usr/src/usr.bin -srcdirs /usr/src/usr.sbin -srcdirs /usr/src/usr.bin/vi - -# second, we list all the programs we want to include in our crunched binary. -# The order doesn't matter. Any program that needs hard links to it gets an -# `ln' directive. - -# /bin stuff - -progs cat chmod chroot cp date dd df echo ed expr hostname kill ln ls mkdir -progs mt mv pwd rcp rm rmdir sleep stty sync test - -ln test [ - -# /sbin stuff - -progs badsect chown clri disklabel dump dmesg fdisk -progs mknod mount newfs ping reboot restore scsi swapon umount - -progs mount_msdos mount_cd9660 mount_nfs -ln dump rdump -ln restore rrestore -ln newfs mount_mfs - -# /usr/bin stuff - -progs ftp rsh sed telnet rlogin common find grep -ln common vi -ln common view -ln common ex - -# finally, we specify the libraries to link in with our binary - -libs -lcrypt -ltelnet -lutil -ll -libs -lcurses -ltermcap -ledit -lgnuregex -lkvm -lscsi diff --git a/release/floppies/fixit/image/Makefile b/release/floppies/fixit/image/Makefile deleted file mode 100644 index a8a80c4403be..000000000000 --- a/release/floppies/fixit/image/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -### -# $Id: Makefile,v 1.214 1996/05/02 08:18:28 jkh Exp $ -# -# What are we if we weren't told.. -CRUNCH?= fixit -CRUNCHDIRS= ../crunch -TOP=${.CURDIR}/../../../.. -FS_BIN=${.CURDIR}/../.. - -# the directories you want on the fs -FS_DIRS= dev stand bin sbin etc mnt mnt1 mnt2 mnt3 mnt4 tmp -# a subdir that contains a verbatim image to be copied to the fs -VERBATIM= ../verbatim - -.include "../../crunch_fs.mk" -all: fs_image diff --git a/release/floppies/fixit/verbatim/.profile b/release/floppies/fixit/verbatim/.profile deleted file mode 100644 index f5664e8d6eb8..000000000000 --- a/release/floppies/fixit/verbatim/.profile +++ /dev/null @@ -1,15 +0,0 @@ -: -# $Id: fixit.profile,v 1.1 1995/03/15 06:14:19 phk Exp $ -PATH=/stand -BLOCKSIZE=K -PS1="Fixit# " - -echo '+---------------------------------------------------+' -echo '| You are now running from a FreeBSD "fixit" floppy |' -echo '+---------------------------------------------------+' -echo -echo 'Good Luck!' -echo - -export PATH BLOCKSIZE PS1 - diff --git a/release/floppies/write_mfs_in_kernel.c b/release/floppies/write_mfs_in_kernel.c deleted file mode 100644 index 886bdd234dd8..000000000000 --- a/release/floppies/write_mfs_in_kernel.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * ---------------------------------------------------------------------------- - * "THE BEER-WARE LICENSE" (Revision 42): - * <phk@login.dknet.dk> wrote this file. As long as you retain this notice you - * can do whatever you want with this stuff. If we meet some day, and you think - * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp - * ---------------------------------------------------------------------------- - * - * $Id: write_mfs_in_kernel.c,v 1.1 1995/04/25 03:45:18 phk Exp $ - * - * This program patches a filesystem into a kernel made with MFS_ROOT - * option. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/types.h> -#include <sys/param.h> -#include <sys/stat.h> -#include <ufs/ffs/fs.h> - -main(int argc, char **argv) -{ - unsigned char *buf_kernel, *buf_fs, *p,*q; - int fd_kernel, fd_fs; - struct stat st_kernel, st_fs; - u_long l; - - if (argc < 3) { - fprintf(stderr,"Usage:\n\t%s kernel fs\n"); - exit(2); - } - fd_kernel = open(argv[1],O_RDWR); - if (fd_kernel < 0) { perror(argv[1]); exit(2); } - fstat(fd_kernel,&st_kernel); - fd_fs = open(argv[2],O_RDONLY); - if (fd_fs < 0) { perror(argv[2]); exit(2); } - fstat(fd_fs,&st_fs); - buf_kernel = malloc(st_kernel.st_size); - if (!buf_kernel) { perror("malloc"); exit(2); } - buf_fs = malloc(st_fs.st_size); - if (!buf_fs) { perror("malloc"); exit(2); } - if (st_kernel.st_size != read(fd_kernel,buf_kernel,st_kernel.st_size)) - { perror(argv[1]); exit(2); } - if (st_fs.st_size != read(fd_fs,buf_fs,st_fs.st_size)) - { perror(argv[2]); exit(2); } - for(l=0,p=buf_kernel; l < st_kernel.st_size - st_fs.st_size ; l++,p++ ) - if(*p == 'M' && !strcmp(p,"MFS Filesystem goes here")) - goto found; - fprintf(stderr,"MFS filesystem signature not found in %s\n",argv[1]); - exit(1); - found: - for(l=0,q= p + SBOFF; l < st_fs.st_size - SBOFF ; l++,q++ ) - if (*q) - goto fail; - memcpy(p+SBOFF,buf_fs+SBOFF,st_fs.st_size-SBOFF); - lseek(fd_kernel,0L,SEEK_SET); - if (st_kernel.st_size != write(fd_kernel,buf_kernel,st_kernel.st_size)) - { perror(argv[1]); exit(2); } - exit(0); - fail: - l += SBOFF; - fprintf(stderr,"Obstruction in kernel after %ld bytes (%ld Kbyte)\n", - l, l/1024); - fprintf(stderr,"Filesystem is %ld bytes (%ld Kbyte)\n", - (u_long)st_fs.st_size, (u_long)st_fs.st_size/1024); - exit(1); -} diff --git a/release/sysinstall/anonFTP.c b/release/sysinstall/anonFTP.c new file mode 100644 index 000000000000..591589fa8141 --- /dev/null +++ b/release/sysinstall/anonFTP.c @@ -0,0 +1,476 @@ +/* + * The new sysinstall program. + * + * This is probably the last program in the `sysinstall' line - the next + * generation being essentially a complete rewrite. + * + * $Id: anonFTP.c,v 1.13 1996/04/28 01:07:19 jkh Exp $ + * + * Copyright (c) 1995 + * Coranth Gryphon. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * verbatim and that no modifications are made prior to this + * point in the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY CORANTH GRYPHON ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL CORANTH GRYPHON OR HIS PETS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/param.h> +#include <string.h> +#include <dialog.h> +#include <sys/types.h> +#include <pwd.h> +#include <grp.h> +#include "ui_objects.h" +#include "dir.h" +#include "dialog.priv.h" +#include "colors.h" +#include "sysinstall.h" + +/* This doesn't change until FTP itself changes */ + +#define FTP_NAME "ftp" +#define MOTD_FILE "ftpmotd" + +/* These change if we want to use different defaults */ + +#define FTP_UID 14 +#define FTP_GID 5 +#define FTP_GROUP "operator" +#define FTP_UPLOAD "incoming" +#define FTP_COMMENT "Anonymous FTP Admin" +#define FTP_HOMEDIR "/var/ftp" + +#define ANONFTP_HELPFILE "anonftp" + +/* Set up the structure to hold configuration information */ +/* Note that this is only what we could fit onto the one screen */ + +typedef struct +{ + char homedir[64]; /* Home Dir for Anon FTP */ + char group[32]; /* Group */ + char uid[8]; /* UID */ + char comment[64]; /* PWD Comment */ + char upload[32]; /* Upload Dir */ +} FTPConf; + +static FTPConf tconf; + +#define ANONFTP_HOMEDIR_LEN 64 +#define ANONFTP_COMMENT_LEN 64 +#define ANONFTP_UPLOAD_LEN 32 +#define ANONFTP_GROUP_LEN 32 +#define ANONFTP_UID_LEN 8 + +static int okbutton, cancelbutton; + +/* What the screen size is meant to be */ +#define ANONFTP_DIALOG_Y 0 +#define ANONFTP_DIALOG_X 8 +#define ANONFTP_DIALOG_WIDTH COLS - 16 +#define ANONFTP_DIALOG_HEIGHT LINES - 2 + +/* The screen layout structure */ +typedef struct _layout { + int y; /* x & Y co-ordinates */ + int x; + int len; /* The size of the dialog on the screen */ + int maxlen; /* How much the user can type in ... */ + char *prompt; /* The string for the prompt */ + char *help; /* The display for the help line */ + void *var; /* The var to set when this changes */ + int type; /* The type of the dialog to create */ + void *obj; /* The obj pointer returned by libdialog */ +} Layout; + +static Layout layout[] = { + { 2, 3, 8, ANONFTP_UID_LEN - 1, + "UID:", "What user ID to assign to FTP Admin", + tconf.uid, STRINGOBJ, NULL }, +#define LAYOUT_UID 1 + + { 2, 15, 15, ANONFTP_GROUP_LEN - 1, + "Group:", "Group name that ftp process belongs to", + tconf.group, STRINGOBJ, NULL }, +#define LAYOUT_GROUP 2 + + { 2, 35, 24, ANONFTP_COMMENT_LEN - 1, + "Comment:", "Password file comment for FTP Admin", + tconf.comment, STRINGOBJ, NULL }, +#define LAYOUT_COMMENT 3 + + { 9, 10, 43, ANONFTP_HOMEDIR_LEN - 1, + "FTP Root Directory:", + "The top directory to chroot to when doing anonymous ftp", + tconf.homedir, STRINGOBJ, NULL }, +#define LAYOUT_HOMEDIR 4 + + { 14, 20, 22, ANONFTP_UPLOAD_LEN - 1, + "Upload Subdirectory:", "Designated sub-directory that holds uploads", + tconf.upload, STRINGOBJ, NULL }, +#define LAYOUT_UPLOAD 5 + + { 19, 15, 0, 0, + "OK", "Select this if you are happy with these settings", + &okbutton, BUTTONOBJ, NULL }, +#define LAYOUT_OKBUTTON 6 + + { 19, 35, 0, 0, + "CANCEL", "Select this if you wish to cancel this screen", + &cancelbutton, BUTTONOBJ, NULL }, +#define LAYOUT_CANCELBUTTON 7 + { NULL }, +}; + +int +createFtpUser(void) +{ + struct passwd *tpw; + struct group *tgrp; + char pwline[256]; + char *tptr; + int gid; + FILE *fptr; + + if ((gid = atoi(tconf.group)) <= 0) { + if (!(tgrp = getgrnam(tconf.group))) { + /* group does not exist, create it by name */ + + tptr = msgGetInput("14", "What group ID to use for group %s ?", tconf.group); + if (tptr && *tptr && ((gid = atoi(tptr)) > 0)) { + if ((fptr = fopen(_PATH_GROUP,"a"))) { + fprintf(fptr,"%s:*:%d:%s\n",tconf.group,gid,FTP_NAME); + fclose(fptr); + } + } + else + gid = FTP_GID; + } + else + gid = tgrp->gr_gid; + } + else if (!getgrgid(gid)) { + /* group does not exist, create it by number */ + + tptr = msgGetInput("14", "What group name to use for gid %d ?", gid); + if (tptr && *tptr) { + strcpy(tconf.group, tptr); + if ((tgrp = getgrnam(tconf.group))) { + gid = tgrp->gr_gid; + } + else if ((fptr = fopen(_PATH_GROUP,"a"))) { + fprintf(fptr,"%s:*:%d:%s\n",tconf.group,gid,FTP_NAME); + fclose(fptr); + } + } + } + + if ((tpw = getpwnam(FTP_NAME))) { + if (tpw->pw_uid != FTP_UID) + msgConfirm("FTP user already exists with a different uid."); + + return (DITEM_SUCCESS); /* succeeds if already exists */ + } + + sprintf(pwline, "%s::%s:%d::0:0:%s:%s:/bin/date\n", FTP_NAME, tconf.uid, gid, tconf.comment, tconf.homedir); + + fptr = fopen(_PATH_MASTERPASSWD,"a"); + if (! fptr) { + msgConfirm("Could not open master password file."); + return (DITEM_FAILURE); + } + fprintf(fptr, pwline); + fclose(fptr); + msgNotify("Remaking password file: %s", _PATH_MASTERPASSWD); + vsystem("pwd_mkdb -p %s", _PATH_MASTERPASSWD); + return (DITEM_SUCCESS); +} + +/* This is it - how to get the setup values */ +static int +anonftpOpenDialog(void) +{ + WINDOW *ds_win; + ComposeObj *obj = NULL; + ComposeObj *first, *last; + int n=0, quit=FALSE, cancel=FALSE, ret; + int max; + char help[FILENAME_MAX]; + char title[80]; + + /* We need a curses window */ + ds_win = newwin(LINES, COLS, 0, 0); + if (ds_win == 0) { + beep(); + msgConfirm("Cannot open anonymous ftp dialog window!!"); + return(DITEM_FAILURE); + } + + /* Say where our help comes from */ + systemHelpFile(ANONFTP_HELPFILE, help); + use_helpfile(help); + + /* Setup a nice screen for us to splat stuff onto */ + draw_box(ds_win, ANONFTP_DIALOG_Y, ANONFTP_DIALOG_X, ANONFTP_DIALOG_HEIGHT, ANONFTP_DIALOG_WIDTH, dialog_attr, border_attr); + wattrset(ds_win, dialog_attr); + mvwaddstr(ds_win, ANONFTP_DIALOG_Y, ANONFTP_DIALOG_X + 20, " Anonymous FTP Configuration "); + + draw_box(ds_win, ANONFTP_DIALOG_Y + 7, ANONFTP_DIALOG_X + 8, ANONFTP_DIALOG_HEIGHT - 11, ANONFTP_DIALOG_WIDTH - 17, + dialog_attr, border_attr); + wattrset(ds_win, dialog_attr); + sprintf(title, " Path Configuration "); + mvwaddstr(ds_win, ANONFTP_DIALOG_Y + 7, ANONFTP_DIALOG_X + 22, title); + + /** Initialize the config Data Structure **/ + + bzero(&tconf, sizeof(tconf)); + + strcpy(tconf.group, FTP_GROUP); + strcpy(tconf.upload, FTP_UPLOAD); + strcpy(tconf.comment, FTP_COMMENT); + strcpy(tconf.homedir, FTP_HOMEDIR); + sprintf(tconf.uid, "%d", FTP_UID); + + /* Loop over the layout list, create the objects, and add them + onto the chain of objects that dialog uses for traversal*/ + + n = 0; +#define lt layout[n] + + while (lt.help != NULL) { + switch (lt.type) { + case STRINGOBJ: + lt.obj = NewStringObj(ds_win, lt.prompt, lt.var, + lt.y + ANONFTP_DIALOG_Y, lt.x + ANONFTP_DIALOG_X, + lt.len, lt.maxlen); + break; + + case BUTTONOBJ: + lt.obj = NewButtonObj(ds_win, lt.prompt, lt.var, + lt.y + ANONFTP_DIALOG_Y, lt.x + ANONFTP_DIALOG_X); + break; + + default: + msgFatal("Don't support this object yet!"); + } + AddObj(&obj, lt.type, (void *) lt.obj); + n++; + } + max = n - 1; + + /* Find the last object we can traverse to */ + last = obj; + while (last->next) + last = last->next; + + /* Find the first object in the list */ + first = obj; + while (first->prev) + first = first->prev; + + /* Some more initialisation before we go into the main input loop */ + n = 0; + cancelbutton = 0; + cancel = FALSE; + okbutton = 0; + + /* Incoming user data - DUCK! */ + while (!quit) { + char help_line[80]; + int i, len = strlen(lt.help); + + /* Display the help line at the bottom of the screen */ + for (i = 0; i < 79; i++) + help_line[i] = (i < len) ? lt.help[i] : ' '; + help_line[i] = '\0'; + use_helpline(help_line); + display_helpline(ds_win, LINES - 1, COLS - 1); + + /* Ask for libdialog to do its stuff */ + ret = PollObj(&obj); + + /* Handle special case stuff that libdialog misses. Sigh */ + switch (ret) { + /* Bail out */ + case SEL_ESC: + quit = TRUE, cancel=TRUE; + break; + + /* This doesn't work for list dialogs. Oh well. Perhaps + should special case the move from the OK button ``up'' + to make it go to the interface list, but then it gets + awkward for the user to go back and correct screw up's + in the per-interface section */ + + case KEY_UP: + if (obj->prev !=NULL ) { + obj = obj->prev; + --n; + } else { + obj = last; + n = max; + } + break; + + case KEY_DOWN: + if (obj->next != NULL) { + obj = obj->next; + ++n; + } else { + obj = first; + n = 0; + } + break; + + case SEL_TAB: + if (n < max) + ++n; + else + n = 0; + break; + + /* The user has pressed enter over a button object */ + case SEL_BUTTON: + quit = TRUE; + if (cancelbutton) + cancel = TRUE; + break; + + /* Generic CR handler */ + case SEL_CR: + if (n < max) + ++n; + else + n = 0; + break; + + case SEL_BACKTAB: + if (n) + --n; + else + n = max; + break; + + case KEY_F(1): + display_helpfile(); + + /* They tried some key combination we don't support - tell them! */ + default: + beep(); + } + } + + /* Clear this crap off the screen */ + dialog_clear(); + refresh(); + use_helpfile(NULL); + + if (cancel) + return DITEM_FAILURE; + return DITEM_SUCCESS; +} + +int +configAnonFTP(dialogMenuItem *self) +{ + int i; + + /* Be optimistic */ + i = DITEM_SUCCESS; + + dialog_clear(); + i = anonftpOpenDialog(); + if (DITEM_STATUS(i) != DITEM_SUCCESS) { + msgConfirm("Configuration of Anonymous FTP cancelled per user request."); + return i | DITEM_RESTORE; + } + + /*** Use defaults for any invalid values ***/ + if (atoi(tconf.uid) <= 0) + sprintf(tconf.uid, "%d", FTP_UID); + + if (!tconf.group[0]) + strcpy(tconf.group, FTP_GROUP); + + if (!tconf.upload[0]) + strcpy(tconf.upload, FTP_UPLOAD); + + /*** If the user did not specify a directory, use default ***/ + + if (tconf.homedir[strlen(tconf.homedir) - 1] == '/') + tconf.homedir[strlen(tconf.homedir) - 1] = '\0'; + + if (!tconf.homedir[0]) + strcpy(tconf.homedir, FTP_HOMEDIR); + + /*** If HomeDir does not exist, create it ***/ + + if (!directory_exists(tconf.homedir)) + vsystem("mkdir -p %s", tconf.homedir); + + if (directory_exists(tconf.homedir)) { + msgNotify("Configuring %s for use by anon FTP.", tconf.homedir); + vsystem("chmod 555 %s && chown root.%s %s", tconf.homedir, tconf.group, tconf.homedir); + vsystem("mkdir %s/bin && chmod 555 %s/bin", tconf.homedir, tconf.homedir); + vsystem("cp /bin/ls %s/bin && chmod 111 %s/bin/ls", tconf.homedir, tconf.homedir); + vsystem("cp /bin/date %s/bin && chmod 111 %s/bin/date", tconf.homedir, tconf.homedir); + vsystem("mkdir %s/etc && chmod 555 %s/etc", tconf.homedir, tconf.homedir); + vsystem("mkdir -p %s/pub", tconf.homedir); + vsystem("mkdir -p %s/%s", tconf.homedir, tconf.upload); + vsystem("chmod 1777 %s/%s", tconf.homedir, tconf.upload); + + if (DITEM_STATUS(createFtpUser()) == DITEM_SUCCESS) { + msgNotify("Copying password information for anon FTP."); + vsystem("cp /etc/pwd.db %s/etc && chmod 444 %s/etc/pwd.db", tconf.homedir, tconf.homedir); + vsystem("cp /etc/passwd %s/etc && chmod 444 %s/etc/passwd", tconf.homedir, tconf.homedir); + vsystem("cp /etc/group %s/etc && chmod 444 %s/etc/group", tconf.homedir, tconf.homedir); + vsystem("chown -R %s.%s %s/pub", FTP_NAME, tconf.group, tconf.homedir); + } + else { + msgConfirm("Unable to create FTP user! Anonymous FTP setup failed."); + i = DITEM_FAILURE; + } + + if (!msgYesNo("Create a welcome message file for anonymous FTP users?")) { + char cmd[256]; + dialog_clear(); + vsystem("echo Your welcome message here. > %s/etc/%s", tconf.homedir, MOTD_FILE); + sprintf(cmd, "%s %s/etc/%s", variable_get(VAR_EDITOR), tconf.homedir, MOTD_FILE); + if (!systemExecute(cmd)) + i = DITEM_SUCCESS; + else + i = DITEM_FAILURE; + } + } + else { + msgConfirm("Invalid Directory: %s\n" + "Anonymous FTP will not be set up.", tconf.homedir); + i = DITEM_FAILURE; + } + if (DITEM_STATUS(i) == DITEM_SUCCESS) + variable_set2("anon_ftp", "YES"); + return i | DITEM_RESTORE; +} diff --git a/release/sysinstall/apache.c b/release/sysinstall/apache.c new file mode 100644 index 000000000000..debf7a502232 --- /dev/null +++ b/release/sysinstall/apache.c @@ -0,0 +1,611 @@ +/* + * The new sysinstall program. + * + * This is probably the last program in the `sysinstall' line - the next + * generation being essentially a complete rewrite. + * + * $Id: apache.c,v 1.24 1996/06/15 17:58:49 jkh Exp $ + * + * Copyright (c) 1995 + * Coranth Gryphon. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * verbatim and that no modifications are made prior to this + * point in the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY CORANTH GRYPHON ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL CORANTH GRYPHON OR HIS PETS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/param.h> +#include <string.h> +#include <dialog.h> +#include "ui_objects.h" +#include "dir.h" +#include "dialog.priv.h" +#include "colors.h" +#include "sysinstall.h" + + +#define APACHE_HELPFILE "apache" +#define APACHE_PACKAGE "apache-1.1.1" +#define FREEBSD_GIF "http://www.freebsd.org/gifs/powerlogo.gif" + +/* These change if the package uses different defaults */ + +#define DEFAULT_USER "bin" +#define DEFAULT_GROUP "bin" +#define WELCOME_FILE "index.html" +#define USER_HOMEDIR "public_html" + +#define APACHE_BASE "/usr/local/www" +#define DATA_SUBDIR "data" +#define CONFIG_SUBDIR "server/conf" + +#define LOGS_SUBDIR "/var/log" +#define ACCESS_LOGNAME "httpd.access" +#define ERROR_LOGNAME "httpd.error" + +/* Set up the structure to hold configuration information */ +/* Note that this is only what we could fit onto the one screen */ + +typedef struct { + char docroot[128]; /* DocumentRoot */ + char userdir[128]; /* UserDir */ + char welcome[32]; /* Welcome Doc */ + char email[64]; /* ServerAdmin */ + char hostname[64]; /* ServerName */ + char logdir[64]; /* Where to put Logs */ + char accesslog[32]; /* access_log */ + char errorlog[32]; /* error_log */ + char defuser[16]; /* default user id */ + char defgroup[16]; /* default group id */ +} ApacheConf; + +static ApacheConf tconf; + +#define APACHE_DOCROOT_LEN 128 +#define APACHE_USERDIR_LEN 128 +#define APACHE_WELCOME_LEN 32 +#define APACHE_EMAIL_LEN 64 +#define APACHE_HOSTNAME_LEN 64 +#define APACHE_LOGDIR_LEN 64 +#define APACHE_ACCESSLOG_LEN 32 +#define APACHE_ERRORLOG_LEN 32 +#define APACHE_DEFUSER_LEN 16 +#define APACHE_DEFGROUP_LEN 16 + +static int okbutton, cancelbutton; + +/* What the screen size is meant to be */ +#define APACHE_DIALOG_Y 0 +#define APACHE_DIALOG_X 0 +#define APACHE_DIALOG_WIDTH COLS +#define APACHE_DIALOG_HEIGHT LINES - 2 + +/* The screen layout structure */ +typedef struct _layout { + int y; /* x & Y co-ordinates */ + int x; + int len; /* The size of the dialog on the screen */ + int maxlen; /* How much the user can type in ... */ + char *prompt; /* The string for the prompt */ + char *help; /* The display for the help line */ + void *var; /* The var to set when this changes */ + int type; /* The type of the dialog to create */ + void *obj; /* The obj pointer returned by libdialog */ +} Layout; + +static Layout layout[] = { + { 1, 2, 30, HOSTNAME_FIELD_LEN - 1, + "Host Name:", + "What name to report this host as to client browsers", + tconf.hostname, STRINGOBJ, NULL }, +#define LAYOUT_HOSTNAME 0 + + { 1, 40, 32, APACHE_EMAIL_LEN - 1, + "Email Address:", + "The email address of the site maintainer, e.g. webmaster@bar.com", + tconf.email, STRINGOBJ, NULL }, +#define LAYOUT_EMAIL 1 + + { 5, 5, 20, APACHE_WELCOME_LEN - 1, + "Default Document:", + "The name of the default document found in each directory", + tconf.welcome, STRINGOBJ, NULL }, +#define LAYOUT_WELCOME 2 + + { 5, 40, 14, APACHE_DEFUSER_LEN - 1, + "Default UserID:", "Default UID for access to web pages", + tconf.defuser, STRINGOBJ, NULL }, +#define LAYOUT_DEFUSER 3 + + { 5, 60, 14, APACHE_DEFGROUP_LEN - 1, + "Default Group ID:", "Default GID for access to web pages", + tconf.defgroup, STRINGOBJ, NULL }, +#define LAYOUT_DEFGROUP 4 + + { 10, 4, 36, APACHE_DOCROOT_LEN - 1, + "Root Document Path:", + "The top directory that holds the system web pages", + tconf.docroot, STRINGOBJ, NULL }, +#define LAYOUT_DOCROOT 5 + + { 10, 50, 14, APACHE_USERDIR_LEN - 1, + "User Directory:", + "Personal sub-directory that holds users' web pages (eg. ~/Web)", + tconf.userdir, STRINGOBJ, NULL }, +#define LAYOUT_USERDIR 6 + + { 14, 4, 28, APACHE_LOGDIR_LEN - 1, + "Log Dir:", "Directory to put httpd log files", + tconf.logdir, STRINGOBJ, NULL }, +#define LAYOUT_LOGDIR 7 + + { 14, 38, 16, APACHE_ACCESSLOG_LEN - 1, + "Access Log:", "Name of log file to report access", + tconf.accesslog, STRINGOBJ, NULL }, +#define LAYOUT_ACCESSLOG 8 + + { 14, 60, 16, APACHE_ERRORLOG_LEN - 1, + "Error Log:", "Name of log file to report errors", + tconf.errorlog, STRINGOBJ, NULL }, +#define LAYOUT_ERRORLOG 9 + + { 19, 15, 0, 0, + "OK", "Select this if you are happy with these settings", + &okbutton, BUTTONOBJ, NULL }, +#define LAYOUT_OKBUTTON 10 + + { 19, 45, 0, 0, + "CANCEL", "Select this if you wish to cancel this screen", + &cancelbutton, BUTTONOBJ, NULL }, +#define LAYOUT_CANCELBUTTON 11 + { NULL }, +}; + +/* This is it - how to get Apache setup values */ +static int +apacheOpenDialog(void) +{ + WINDOW *ds_win; + ComposeObj *obj = NULL; + ComposeObj *first, *last; + int n=0, quit=FALSE, cancel=FALSE, ret; + int max; + char *tmp; + char help[FILENAME_MAX]; + char title[80]; + + /* We need a curses window */ + ds_win = newwin(LINES, COLS, 0, 0); + if (ds_win == 0) + { + beep(); + msgConfirm("Cannot open apache dialog window!!"); + return(DITEM_SUCCESS); + } + + /* Say where our help comes from */ + systemHelpFile(APACHE_HELPFILE, help); + use_helpfile(help); + + /* Setup a nice screen for us to splat stuff onto */ + draw_box(ds_win, APACHE_DIALOG_Y, APACHE_DIALOG_X, APACHE_DIALOG_HEIGHT, APACHE_DIALOG_WIDTH, dialog_attr, border_attr); + wattrset(ds_win, dialog_attr); + mvwaddstr(ds_win, APACHE_DIALOG_Y, APACHE_DIALOG_X + 20, " Apache HTTPD Configuration "); + + draw_box(ds_win, APACHE_DIALOG_Y + 9, APACHE_DIALOG_X + 1, APACHE_DIALOG_HEIGHT - 13, APACHE_DIALOG_WIDTH - 2, + dialog_attr, border_attr); + wattrset(ds_win, dialog_attr); + sprintf(title, " Path Configuration "); + mvwaddstr(ds_win, APACHE_DIALOG_Y + 9, APACHE_DIALOG_X + 22, title); + + /** Initialize the config Data Structure **/ + + bzero(&tconf, sizeof(tconf)); + + tmp = variable_get(VAR_DOMAINNAME); + if (tmp) { + sprintf(tconf.email, "webmaster@%s", tmp); + sprintf(tconf.hostname, "www.%s", tmp); + } + + strcpy(tconf.defuser, DEFAULT_USER); + strcpy(tconf.defgroup, DEFAULT_GROUP); + + strcpy(tconf.userdir, USER_HOMEDIR); + strcpy(tconf.welcome, WELCOME_FILE); + + strcpy(tconf.logdir, LOGS_SUBDIR); + strcpy(tconf.accesslog, ACCESS_LOGNAME); + strcpy(tconf.errorlog, ERROR_LOGNAME); + + sprintf(tconf.docroot, "%s/%s", APACHE_BASE,DATA_SUBDIR); + + /* Loop over the layout list, create the objects, and add them + onto the chain of objects that dialog uses for traversal*/ + + n = 0; + +#define lt layout[n] + + while (lt.help != NULL) { + switch (lt.type) { + case STRINGOBJ: + lt.obj = NewStringObj(ds_win, lt.prompt, lt.var, + lt.y + APACHE_DIALOG_Y, lt.x + APACHE_DIALOG_X, + lt.len, lt.maxlen); + break; + + case BUTTONOBJ: + lt.obj = NewButtonObj(ds_win, lt.prompt, lt.var, + lt.y + APACHE_DIALOG_Y, lt.x + APACHE_DIALOG_X); + break; + + default: + msgFatal("Don't support this object yet!"); + } + AddObj(&obj, lt.type, (void *) lt.obj); + n++; + } + max = n - 1; + + /* Find the last object we can traverse to */ + last = obj; + while (last->next) + last = last->next; + + /* Find the first object in the list */ + first = obj; + while (first->prev) + first = first->prev; + + /* Some more initialisation before we go into the main input loop */ + n = 0; + cancelbutton = 0; + cancel = FALSE; + okbutton = 0; + + /* Incoming user data - DUCK! */ + while (!quit) { + char help_line[80]; + int i, len = strlen(lt.help); + + /* Display the help line at the bottom of the screen */ + for (i = 0; i < 79; i++) + help_line[i] = (i < len) ? lt.help[i] : ' '; + help_line[i] = '\0'; + use_helpline(help_line); + display_helpline(ds_win, LINES - 1, COLS - 1); + + /* Ask for libdialog to do its stuff */ + ret = PollObj(&obj); + + /* We are in the Hostname field - calculate the e-mail addr */ + if (n == LAYOUT_HOSTNAME) { + if ((tmp = index(tconf.hostname, '.')) != NULL) { + sprintf(tconf.email,"webmaster@%s",tmp+1); + RefreshStringObj(layout[LAYOUT_EMAIL].obj); + } + } + + /* Handle special case stuff that libdialog misses. Sigh */ + switch (ret) { + /* Bail out */ + case SEL_ESC: + quit = TRUE, cancel=TRUE; + break; + + /* This doesn't work for list dialogs. Oh well. Perhaps + should special case the move from the OK button ``up'' + to make it go to the interface list, but then it gets + awkward for the user to go back and correct screw up's + in the per-interface section */ + + case KEY_UP: + if (obj->prev !=NULL ) { + obj = obj->prev; + --n; + } else { + obj = last; + n = max; + } + break; + + case KEY_DOWN: + if (obj->next != NULL) { + obj = obj->next; + ++n; + } else { + obj = first; + n = 0; + } + break; + + case SEL_TAB: + if (n < max) + ++n; + else + n = 0; + break; + + /* The user has pressed enter over a button object */ + case SEL_BUTTON: + quit = TRUE; + if (cancelbutton) + cancel = TRUE; + break; + + /* Generic CR handler */ + case SEL_CR: + if (n < max) + ++n; + else + n = 0; + break; + + case SEL_BACKTAB: + if (n) + --n; + else + n = max; + break; + + case KEY_F(1): + display_helpfile(); + + /* They tried some key combination we don't support - tell them! */ + default: + beep(); + } + + } + + /* Clear this crap off the screen */ + dialog_clear(); + refresh(); + use_helpfile(NULL); + + if (cancel) + return DITEM_FAILURE | DITEM_RESTORE; + return DITEM_SUCCESS | DITEM_RESTORE; +} + +int +configApache(dialogMenuItem *self) +{ + int i; + char company[64], file[128]; + char *tptr; + FILE *fptr; + + /* Be optimistic */ + i = DITEM_SUCCESS; + + dialog_clear(); + msgConfirm("Since you elected to install the WEB server, we'll now add the\n" + "Apache HTTPD package and set up a few configuration files."); + i = package_add(APACHE_PACKAGE); + if (DITEM_STATUS(i) != DITEM_SUCCESS) { + msgConfirm("Hmmmmm. Looks like we weren't able to fetch the Apache WEB server\n" + "package. You may wish to fetch and configure it by hand by looking\n" + "in /usr/ports/net/apache (in the ports collection) or looking for the\n" + "precompiled apache package in packages/networking/%s.", APACHE_PACKAGE); + return i | DITEM_RESTORE; + } + + dialog_clear(); + i = apacheOpenDialog(); + if (DITEM_STATUS(i) != DITEM_SUCCESS) { + msgConfirm("Configuration of the Apache WEB server was cancelled per\n" + "user request."); + return i; + } + /*** Fix defaults for invalid value ***/ + if (!tconf.logdir[0]) + strcpy(tconf.logdir, LOGS_SUBDIR); + if (!tconf.accesslog[0]) + strcpy(tconf.accesslog, ACCESS_LOGNAME); + if (!tconf.errorlog[0]) + strcpy(tconf.errorlog, ERROR_LOGNAME); + + if (!tconf.welcome[0]) + strcpy(tconf.welcome, WELCOME_FILE); + if (!tconf.userdir[0]) + strcpy(tconf.userdir, USER_HOMEDIR); + + if (!tconf.defuser[0]) + strcpy(tconf.defuser, DEFAULT_USER); + if (!tconf.defgroup[0]) + strcpy(tconf.defgroup, DEFAULT_GROUP); + + /*** If the user did not specify a directory, use default ***/ + + if (tconf.docroot[strlen(tconf.docroot) - 1] == '/') + tconf.docroot[strlen(tconf.docroot) - 1] = '\0'; + + if (!tconf.docroot[0]) + sprintf(tconf.docroot, "%s/%s", APACHE_BASE, DATA_SUBDIR); + + /*** If DocRoot does not exist, create it ***/ + + if (!directory_exists(tconf.docroot)) + vsystem("mkdir -p %s", tconf.docroot); + + if (directory_exists(tconf.docroot)) { + sprintf(file, "%s/%s", tconf.docroot, tconf.welcome); + if (!file_readable(file)) { + tptr = msgGetInput(NULL, "What is your company name?"); + if (tptr && tptr[0]) + strcpy(company, tptr); + else + strcpy(company, "our Web Page"); + + msgNotify("Creating sample web page..."); + fptr = fopen(file,"w"); + if (fptr) { + fprintf(fptr, "<CENTER>\n<TITLE>Welcome Page</TITLE>\n"); + fprintf(fptr, "<H1>Welcome to %s </H1>\n</CENTER>\n",company); + fprintf(fptr, "<P><HR SIZE=4>\n<CENTER>\n"); + fprintf(fptr, "<A HREF=\"http://www.FreeBSD.org/What\">\n"); + fprintf(fptr, "<IMG SRC=\"%s\" ALIGN=CENTER BORDER=0 ", FREEBSD_GIF); + fprintf(fptr, " ALT=\"Powered by FreeBSD\"></A>\n"); + if (!tconf.email[0]) { + if ((tptr = variable_get(VAR_DOMAINNAME))) + sprintf(tconf.email, "root@%s", tptr); + } + if (tconf.email[0]) { + fprintf(fptr, "<ADDRESS><H4>\n"); + fprintf(fptr, " For questions or comments, please send mail to:\n"); + fprintf(fptr, " <A HREF=\"mailto:%s\">%s</A>\n", + tconf.email, tconf.email); + fprintf(fptr, "</H4></ADDRESS>\n"); + } + fprintf(fptr, "</CENTER>\n\n"); + fclose(fptr); + } + else { + msgConfirm("Unable to create sample Web Page."); + i = DITEM_FAILURE; + } + } + } + else { + msgConfirm("Unable to create Document Root Directory."); + i = DITEM_FAILURE; + } + + msgNotify("Writing configuration files...."); + + (void)vsystem("mkdir -p %s/%s", APACHE_BASE, CONFIG_SUBDIR); + sprintf(file, "%s/%s/access.conf", APACHE_BASE, CONFIG_SUBDIR); + if (file_readable(file)) + vsystem("mv -f %s %s.ORIG", file, file); + + fptr = fopen(file,"w"); + if (fptr) { + fprintf(fptr, "<Directory %s/cgi-bin>\n", APACHE_BASE); + fprintf(fptr, "Options Indexes FollowSymLinks\n"); + fprintf(fptr, "</Directory>\n"); + fprintf(fptr, "\n"); + fprintf(fptr, "<Directory %s>\n", tconf.docroot); + fprintf(fptr, "Options Indexes FollowSymLinks\n"); + fprintf(fptr, "AllowOverride All\n"); + fprintf(fptr, "</Directory>\n"); + fprintf(fptr, "\n"); + fclose(fptr); + } + else { + msgConfirm("Could not create %s",file); + i = DITEM_FAILURE; + } + + sprintf(file, "%s/%s/httpd.conf", APACHE_BASE, CONFIG_SUBDIR); + if (file_readable(file)) + vsystem("mv -f %s %s.ORIG", file, file); + + fptr = fopen(file,"w"); + if (fptr) { + fprintf(fptr, "ServerType standalone\n"); + fprintf(fptr, "Port 80\n"); + fprintf(fptr, "TimeOut 400\n"); + fprintf(fptr, "\n"); + fprintf(fptr, "ErrorLog %s/%s\n", LOGS_SUBDIR, ERROR_LOGNAME); + fprintf(fptr, "TransferLog %s/%s\n", LOGS_SUBDIR, ACCESS_LOGNAME); + fprintf(fptr, "PidFile /var/run/httpd.pid\n"); + fprintf(fptr, "\n"); + fprintf(fptr, "StartServers 5\n"); + fprintf(fptr, "MinSpareServers 5\n"); + fprintf(fptr, "MaxSpareServers 10\n"); + fprintf(fptr, "MaxRequestsPerChild 30\n"); + fprintf(fptr, "MaxClients 150\n"); + fprintf(fptr, "\n"); + fprintf(fptr, "User %s\n",tconf.defuser); + fprintf(fptr, "Group %s\n",tconf.defgroup); + fprintf(fptr, "\n"); + + if (tconf.email[0]) + fprintf(fptr, "ServerAdmin %s\n", tconf.email); + if (tconf.hostname[0]) + fprintf(fptr, "ServerName %s\n", tconf.hostname); + + fclose(fptr); + } + else { + msgConfirm("Could not create %s",file); + i = DITEM_FAILURE; + } + + sprintf(file, "%s/%s/srm.conf", APACHE_BASE, CONFIG_SUBDIR); + if (file_readable(file)) + vsystem("mv -f %s %s.ORIG", file, file); + fptr = fopen(file,"w"); + if (fptr) { + fprintf(fptr, "FancyIndexing on\n"); + fprintf(fptr, "DefaultType text/plain\n"); + fprintf(fptr, "IndexIgnore */.??* *~ *# */HEADER* */README* */RCS\n"); + fprintf(fptr, "HeaderName HEADER\n"); + fprintf(fptr, "ReadmeName README\n"); + fprintf(fptr, "AccessFileName .htaccess\n"); + fprintf(fptr, "\n"); + fprintf(fptr, "AddEncoding x-compress Z\n"); + fprintf(fptr, "AddEncoding x-gzip gz\n"); + fprintf(fptr, "DefaultIcon /icons/unknown.gif\n"); + fprintf(fptr, "\n"); + fprintf(fptr, "AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip\n"); + fprintf(fptr, "AddIconByType (TXT,/icons/text.gif) text/*\n"); + fprintf(fptr, "AddIconByType (IMG,/icons/image2.gif) image/*\n"); + fprintf(fptr, "AddIconByType (SND,/icons/sound2.gif) audio/*\n"); + fprintf(fptr, "AddIconByType (VID,/icons/movie.gif) video/*\n"); + fprintf(fptr, "\n"); + + fprintf(fptr, "AddIcon /icons/text.gif .ps .shtml\n"); + fprintf(fptr, "AddIcon /icons/movie.gif .mpg .qt\n"); + fprintf(fptr, "AddIcon /icons/binary.gif .bin\n"); + fprintf(fptr, "AddIcon /icons/burst.gif .wrl\n"); + fprintf(fptr, "AddIcon /icons/binhex.gif .hqx .sit\n"); + fprintf(fptr, "AddIcon /icons/uu.gif .uu\n"); + fprintf(fptr, "AddIcon /icons/tar.gif .tar\n"); + fprintf(fptr, "AddIcon /icons/back.gif ..\n"); + fprintf(fptr, "AddIcon /icons/dir.gif ^^DIRECTORY^^\n"); + fprintf(fptr, "AddIcon /icons/blank.gif ^^BLANKICON^^\n"); + fprintf(fptr, "\n"); + + fprintf(fptr, "ScriptAlias /cgi_bin/ %s/cgi_bin/\n",APACHE_BASE); + fprintf(fptr, "Alias /icons/ %s/icons/\n",APACHE_BASE); + fprintf(fptr, "DocumentRoot %s\n",tconf.docroot); + fprintf(fptr, "UserDir %s\n", tconf.userdir); + fprintf(fptr, "DirectoryIndex %s\n", tconf.welcome); + fprintf(fptr, "\n"); + + fclose(fptr); + } + else { + msgConfirm("Could not create %s",file); + i = DITEM_FAILURE; + } + if (DITEM_STATUS(i) == DITEM_SUCCESS) + variable_set2("apache_httpd", "YES"); + return i | DITEM_RESTORE; +} diff --git a/release/sysinstall/doc.c b/release/sysinstall/doc.c new file mode 100644 index 000000000000..50fdc900acba --- /dev/null +++ b/release/sysinstall/doc.c @@ -0,0 +1,125 @@ +/* + * The new sysinstall program. + * + * This is probably the last attempt in the `sysinstall' line, the next + * generation being slated for what's essentially a complete rewrite. + * + * $Id: doc.c,v 1.17 1996/07/02 01:03:40 jkh Exp $ + * + * Copyright (c) 1995 + * Jordan Hubbard. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * verbatim and that no modifications are made prior to this + * point in the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + + * + */ + +#include "sysinstall.h" + +/* + * This is called from the main menu. Try to find a copy of Lynx from somewhere + * and fire it up on the first copy of the handbook we can find. + */ +int +docBrowser(dialogMenuItem *self) +{ + int ret; + char *browser = variable_get(VAR_BROWSER_PACKAGE); + + if (RunningAsInit && !strstr(variable_get(SYSTEM_STATE), "install")) { + msgConfirm("This option may only be used after the system is installed, sorry!"); + return DITEM_FAILURE; + } + + /* First, make sure we have whatever browser we've chosen is here */ + if (!package_exists(browser)) { + ret = package_add(browser); + if (DITEM_STATUS(ret) != DITEM_SUCCESS) { + msgConfirm("Unable to install the %s HTML browser package. You may\n" + "wish to verify that your media is configured correctly and\n" + "try again.", browser); + return ret; + } + } + + if (!file_executable(variable_get(VAR_BROWSER_BINARY))) { + if (!msgYesNo("Hmmm. The %s package claims to have installed, but I can't\n" + "find its binary in %s! You may wish to try a different\n" + "location to load the package from (go to Media menu) and see if that\n" + "makes a difference.\n\n" + "I suggest that we remove the version that was extracted since it does\n" + "not appear to be correct. Would you like me to do that now?")) + vsystem("pkg_delete %s %s", !strcmp(variable_get(VAR_CPIO_VERBOSITY), "high") ? "-v" : "", browser); + return DITEM_FAILURE | DITEM_RESTORE; + } + + /* Run browser on the appropriate doc */ + if (dmenuOpenSimple(&MenuHTMLDoc, FALSE)) + return DITEM_SUCCESS | DITEM_RECREATE; + else + return DITEM_FAILURE | DITEM_RECREATE; +} + +/* Try to show one of the documents requested from the HTML doc menu */ +int +docShowDocument(dialogMenuItem *self) +{ + char tmp[512], target[512]; + char *where = NULL; + char *browser = variable_get(VAR_BROWSER_BINARY); + char *str = self->prompt; + + if (!file_executable(browser)) { + msgConfirm("Can't find the browser in %s! Please ensure that it's\n" + "properly set in the Options editor.", browser); + return DITEM_FAILURE; + } + if (!strcmp(str, "Home")) + where = "http://www.freebsd.org"; + else if (!strcmp(str, "Other")) + where = msgGetInput("http://www.freebsd.org", "Please enter the URL of the location you wish to visit."); + else if (!strcmp(str, "FAQ")) { + strcpy(target, "/usr/share/doc/FAQ/freebsd-faq.html"); + if (!file_readable(target)) + strcpy(target, "http://www.freebsd.org/FAQ"); + where = target; + } + else if (!strcmp(str, "Handbook")) { + strcpy(target, "/usr/share/doc/handbook/handbook.html"); + if (!file_readable(target)) + strcpy(target, "http://www.freebsd.org/handbook"); + where = target; + } + if (where) { + sprintf(tmp, "%s %s", browser, where); + dialog_clear(); + systemExecute(tmp); + return DITEM_SUCCESS | DITEM_RESTORE; + } + else { + msgConfirm("Hmmmmm! I can't seem to access the documentation you selected!\n" + "Have you loaded the bin distribution? Is your network connected?"); + return DITEM_FAILURE; + } +} diff --git a/release/sysinstall/help/anonftp.hlp b/release/sysinstall/help/anonftp.hlp new file mode 100644 index 000000000000..e90985e235fe --- /dev/null +++ b/release/sysinstall/help/anonftp.hlp @@ -0,0 +1,19 @@ +This screen allows you to configure the anonymous FTP user. + +The following configuration values are editable: + +UID: The user ID you wish to assign to the anonymous FTP user. + All files uploaded will be owned by this ID. + +Group: Which group you wish the anonymous FTP user to be in. + +Comment: String describing this user in /etc/passwd + + +FTP Root Directory: + + Where files available for anonymous FTP will be kept. + +Upload subdirectory: + + Where files uploaded by anonymous FTP users will go. diff --git a/release/sysinstall/help/apache.hlp b/release/sysinstall/help/apache.hlp new file mode 100644 index 000000000000..3880dddb2ba6 --- /dev/null +++ b/release/sysinstall/help/apache.hlp @@ -0,0 +1,51 @@ +There are two sets of options that the Apache HTTP Server needs. + +The first set covers how it operates. These are as follows: + + The "HostName" field is the name of this host, as it is + reported to each client connection. Normally, the fully + qualified domain name of the host running the server is + returned. If you want this set to something else, however, + (usually "www.my.domain") then this can be entered here. + + Additionally, the server needs to know how many connections + are allowed at one time - this is the "Max Connections" + field. If more than this number of clients attempt to connect + at once, the additional connections will be refused. This is + used to limit how much system load will be imposed by the HTTP + server. + + The "Email Address" field is the address of the person (or + system alias) who is the administrator for this web site. In + addition to being used by the Apache Server itself, it is also + put at the bottom of the sample web page that is created. + + Finally, the "Default User" and "Default Group" fields specify + what user id and group id should be used by the server for + remote connections. Local connections are kept as the UID and + GID of the local process. + +The second set of options determine what information is made available +to each client: + + The "Document Root Path" is the top of the tree of documents + that are made avaliable. For example, if the value is + "/usr/web", then the URL "http://www.foo.com/doc.html" would + translate as "/usr/web/doc.html". + + Similarly, the "User Directory" is the location in each user's + home directory where their public web documents are + stored. Thus if the value if this is "Public", then the URL + "http://www.foo.com/~joe/doc" would translate to the path + "~joe/Public/doc". + + Finally, if the URL points to a directory, there is always a + "Default Document" that Apache will use. This field holds the + name (not the path) of this document. By default, Apache uses + the file "index.html". However, some sites may be more used to + using the file "welcome.html". + +There are a number of other options that can be configured with +Apache, such as path aliases, masquerading as multiple hosts, server +child process parameters, and so forth. For more information on these, +consult the Apache man pages at http://www.apache.org. diff --git a/release/sysinstall/help/upgrade.hlp b/release/sysinstall/help/upgrade.hlp new file mode 100644 index 000000000000..c58c494c759b --- /dev/null +++ b/release/sysinstall/help/upgrade.hlp @@ -0,0 +1,38 @@ +Welcome to the 2.1 (or 2.0.5) -> 2.1.5 upgrade procedure! + +It must first be said that this upgrade DOES NOT take a particularly +sophisticated approach to the upgrade problem, it being more a question +of providing what seemed "good enough" at the time. A truly polished +upgrade that deals properly with the broad spectrum of installed 2.0.5 / 2.1 +systems would be nice to have, but until that gets written what you get is +this - the brute-force approach! + +What this upgrade will attempt to do is best summarized thusly: + + 1. fsck and mount all file systems chosen in the label editor. + 2. Ask for a location to preserve your /etc directory into and do so. + 3. Extract all selected distributions on top of your existing system. + 4. Copy certain obvious files back from the preserved /etc, leaving the + rest of the /etc file merge up to the user. + 5. Drop user in a shell so that they may perform that merge before + rebooting into the new system. + +And that's it! This "upgrade" is not going to hold your hand in all +major respects, it's simply provided to make one PART of the upgrade +easier. + +IMPORTANT NOTE: What this upgrade procedure may also do, in fact, is +completely destroy your system (though much more quickly than you +would have been able to destroy it yourself). It is simply impossible +to guarantee that this procedure's crude form of upgrade automation +will work in all cases and if you do this upgrade without proper +BACKUPS for any important data then you really must like living life +close to the edge, that's all we can say! + +NOTE to 2.0 users: We're sorry, but the "slice" changes that were +added in FreeBSD 2.0.5 made automated upgrades pretty difficult due to +the fact that a complete reinstall is pretty much called for. Things +may still *work* after a 2.1 upgrade, but you will also no doubt +receive many warnings at boot time about non-aligned slices and such; +we really do recommend a fresh installation for 2.0 systems! (But +back up your user data first :-). diff --git a/release/sysinstall/index.c b/release/sysinstall/index.c new file mode 100644 index 000000000000..ee4d265d3cb1 --- /dev/null +++ b/release/sysinstall/index.c @@ -0,0 +1,582 @@ +/* + * The new sysinstall program. + * + * This is probably the last program in the `sysinstall' line - the next + * generation being essentially a complete rewrite. + * + * $Id: index.c,v 1.35 1996/06/14 14:33:53 jkh Exp $ + * + * Copyright (c) 1995 + * Jordan Hubbard. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * verbatim and that no modifications are made prior to this + * point in the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include <fcntl.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <ncurses.h> +#include <dialog.h> +#include "sysinstall.h" + +/* Macros and magic values */ +#define MAX_MENU 12 +#define _MAX_DESC 60 + +static int index_extract_one(Device *dev, PkgNodePtr top, PkgNodePtr who, Boolean depended); + +/* Smarter strdup */ +inline char * +_strdup(char *ptr) +{ + return ptr ? strdup(ptr) : NULL; +} + +static char *descrs[] = { + "Package Selection", "To mark a package or select a category, move to it and press SPACE.\n" + "To unmark a package, press SPACE again. To go to a previous menu,\n" + "select the Cancel button. To search for a package by name, press ESC.\n" + "To finally extract packages, you should Cancel all the way out of any\n" + "submenus and then this top menu. NOTE: The All category selection\n" + "creates a very large submenu. If you select it, please be patient.", + "Package Targets", "These are the packages you've selected for extraction.\n\n" + "If you're sure of these choices, select OK.\n" + "If not, select Cancel to go back to the package selection menu.\n", + "All", "All available packages in all categories.", + "applications", "User application software.", + "archivers", "Utilities for archiving and unarchiving data.", + "audio", "Audio utilities - most require a supported sound card.", + "benchmarks", "Utilities for measuring system performance.", + "benchmarking", "Utilities for measuring system performance.", + "cad", "Computer Aided Design utilities.", + "comms", "Communications utilities.", + "databases", "Database software.", + "devel", "Software development utilities and libraries.", + "development", "Software development utilities and libraries.", + "documentation", "Document preparation utilities.", + "editors", "Common text editors.", + "emulation", "Utilities for emulating other OS types.", + "emulators", "Utilities for emulating other OS types.", + "games", "Various and sundry amusements.", + "graphics", "Graphics libraries and utilities.", + "japanese", "Ported software for the Japanese market.", + "lang", "Computer languages.", + "languages", "Computer languages.", + "libraries", "Software development libraries.", + "mail", "Electronic mail packages and utilities.", + "math", "Mathematical computation software.", + "misc", "Miscellaneous utilities.", + "net", "Networking utilities.", + "networking", "Networking utilities.", + "news", "USENET News support software.", + "numeric", "Mathematical computation software.", + "orphans", "Packages without a home elsewhere.", + "plan9", "Software from the plan9 Operating System.", + "print", "Utilities for dealing with printing.", + "printing", "Utilities for dealing with printing.", + "programming", "Software development utilities and libraries.", + "russian", "Ported software for the Russian market.", + "security", "System security software.", + "shells", "Various shells (tcsh, bash, etc).", + "sysutils", "Various system utilities.", + "www", "WEB utilities (browers, HTTP servers, etc).", + "troff", "TROFF Text formatting utilities.", + "utils", "Various user utilities.", + "utilities", "Various user utilities.", + "x11", "X Window System based utilities.", + NULL, NULL, +}; + +static char * +fetch_desc(char *name) +{ + int i; + + for (i = 0; descrs[i]; i += 2) { + if (!strcmp(descrs[i], name)) + return descrs[i + 1]; + } + return "No description provided"; +} + +static PkgNodePtr +new_pkg_node(char *name, node_type type) +{ + PkgNodePtr tmp = safe_malloc(sizeof(PkgNode)); + + tmp->name = _strdup(name); + tmp->type = type; + return tmp; +} + +static char * +strip(char *buf) +{ + int i; + + for (i = 0; buf[i]; i++) + if (buf[i] == '\t' || buf[i] == '\n') + buf[i] = ' '; + return buf; +} + +static IndexEntryPtr +new_index(char *name, char *pathto, char *prefix, char *comment, char *descr, char *maint, char *deps) +{ + IndexEntryPtr tmp = safe_malloc(sizeof(IndexEntry)); + + tmp->name = _strdup(name); + tmp->path = _strdup(pathto); + tmp->prefix = _strdup(prefix); + tmp->comment = _strdup(comment); + tmp->descrfile = strip(_strdup(descr)); + tmp->maintainer = _strdup(maint); + tmp->deps = _strdup(deps); + return tmp; +} + +static void +index_register(PkgNodePtr top, char *where, IndexEntryPtr ptr) +{ + PkgNodePtr p, q; + + for (q = NULL, p = top->kids; p; p = p->next) { + if (!strcmp(p->name, where)) { + q = p; + break; + } + } + if (!p) { + /* Add new category */ + q = new_pkg_node(where, PLACE); + q->desc = fetch_desc(where); + q->next = top->kids; + top->kids = q; + } + p = new_pkg_node(ptr->name, PACKAGE); + p->desc = ptr->comment; + p->data = ptr; + p->next = q->kids; + q->kids = p; +} + +static int +copy_to_sep(char *to, char *from, int sep) +{ + char *tok; + + tok = strchr(from, sep); + if (!tok) { + *to = '\0'; + return 0; + } + *tok = '\0'; + strcpy(to, from); + return tok + 1 - from; +} + +static int +readline(int fd, char *buf, int max) +{ + int rv, i = 0; + char ch; + + while ((rv = read(fd, &ch, 1)) == 1 && ch != '\n' && i < max) + buf[i++] = ch; + if (i < max) + buf[i] = '\0'; + return rv; +} + +int +index_parse(int fd, char *name, char *pathto, char *prefix, char *comment, char *descr, char *maint, char *cats, char *deps) +{ + char line[1024]; + char *cp; + int i; + + i = readline(fd, line, 1024); + if (i <= 0) + return EOF; + cp = line; + cp += copy_to_sep(name, cp, '|'); + cp += copy_to_sep(pathto, cp, '|'); + cp += copy_to_sep(prefix, cp, '|'); + cp += copy_to_sep(comment, cp, '|'); + cp += copy_to_sep(descr, cp, '|'); + cp += copy_to_sep(maint, cp, '|'); + cp += copy_to_sep(cats, cp, '|'); + (void)copy_to_sep(deps, cp, '|'); + /* We're not actually interested in any of the other fields */ + return 0; +} + +int +index_get(char *fname, PkgNodePtr papa) +{ + int i, fd; + + fd = open(fname, O_RDONLY); + if (fd < 0) { + fprintf(stderr, "Unable to open index file `%s' for reading.\n", fname); + i = -1; + } + else + i = index_read(fd, papa); + close(fd); + return i; +} + +int +index_read(int fd, PkgNodePtr papa) +{ + char name[127], pathto[255], prefix[255], comment[255], descr[127], maint[127], cats[511], deps[511]; + + while (index_parse(fd, name, pathto, prefix, comment, descr, maint, cats, deps) != EOF) { + char *cp, *cp2, tmp[511]; + IndexEntryPtr idx; + + idx = new_index(name, pathto, prefix, comment, descr, maint, deps); + /* For now, we only add things to menus if they're in categories. Keywords are ignored */ + for (cp = strcpy(tmp, cats); (cp2 = strchr(cp, ' ')) != NULL; cp = cp2 + 1) { + *cp2 = '\0'; + index_register(papa, cp, idx); + } + index_register(papa, cp, idx); + + /* Add to special "All" category */ + index_register(papa, "All", idx); + } + return 0; +} + +void +index_init(PkgNodePtr top, PkgNodePtr plist) +{ + if (top) { + top->next = top->kids = NULL; + top->name = "Package Selection"; + top->type = PLACE; + top->desc = fetch_desc(top->name); + top->data = NULL; + } + if (plist) { + plist->next = plist->kids = NULL; + plist->name = "Package Targets"; + plist->type = PLACE; + plist->desc = fetch_desc(plist->name); + plist->data = NULL; + } +} + +void +index_print(PkgNodePtr top, int level) +{ + int i; + + while (top) { + for (i = 0; i < level; i++) putchar('\t'); + printf("name [%s]: %s\n", top->type == PLACE ? "place" : "package", top->name); + for (i = 0; i < level; i++) putchar('\t'); + printf("desc: %s\n", top->desc); + if (top->kids) + index_print(top->kids, level + 1); + top = top->next; + } +} + +/* Swap one node for another */ +static void +swap_nodes(PkgNodePtr a, PkgNodePtr b) +{ + PkgNode tmp; + + tmp = *a; + *a = *b; + a->next = tmp.next; + tmp.next = b->next; + *b = tmp; +} + +/* Use a disgustingly simplistic bubble sort to put our lists in order */ +void +index_sort(PkgNodePtr top) +{ + PkgNodePtr p, q; + + /* Sort everything at the top level */ + for (p = top->kids; p; p = p->next) { + for (q = top->kids; q; q = q->next) { + if (q->next && strcmp(q->name, q->next->name) > 0) + swap_nodes(q, q->next); + } + } + + /* Now sub-sort everything n levels down */ + + for (p = top->kids; p; p = p->next) { + if (p->kids) + index_sort(p); + } +} + +/* Delete an entry out of the list it's in (only the plist, at present) */ +void +index_delete(PkgNodePtr n) +{ + if (n->next) { + PkgNodePtr p = n->next; + + *n = *(n->next); + safe_free(p); + } + else /* Kludgy end sentinal */ + n->name = NULL; +} + +/* + * Search for a given node by name, returning the category in if + * tp is non-NULL. + */ +PkgNodePtr +index_search(PkgNodePtr top, char *str, PkgNodePtr *tp) +{ + PkgNodePtr p, sp; + + for (p = top->kids; p && p->name; p = p->next) { + /* Subtract out the All category from searches */ + if (!strcmp(p->name, "All")) + continue; + + /* If tp == NULL, we're looking for an exact package match */ + if (!tp && !strncmp(p->name, str, strlen(str))) + return p; + + /* If tp, we're looking for both a package and a pointer to the place it's in */ + if (tp && !strncmp(p->name, str, strlen(str))) { + *tp = top; + return p; + } + + /* The usual recursion-out-of-laziness ploy */ + if (p->kids) + if ((sp = index_search(p, str, tp)) != NULL) + return sp; + } + if (p && !p->name) + p = NULL; + return p; +} + +int +pkg_checked(dialogMenuItem *self) +{ + PkgNodePtr kp = self->data, plist = (PkgNodePtr)self->aux; + int i; + + i = index_search(plist, kp->name, NULL) ? TRUE : FALSE; + if (kp->type == PACKAGE && plist) + return i || package_exists(kp->name); + else + return FALSE; +} + +int +pkg_fire(dialogMenuItem *self) +{ + int ret; + PkgNodePtr sp, kp = self->data, plist = (PkgNodePtr)self->aux; + + if (!plist) + ret = DITEM_FAILURE; + else if (kp->type == PACKAGE) { + sp = index_search(plist, kp->name, NULL); + /* Not already selected? */ + if (!sp) { + if (!package_exists(kp->name)) { + PkgNodePtr np = (PkgNodePtr)safe_malloc(sizeof(PkgNode)); + + *np = *kp; + np->next = plist->kids; + plist->kids = np; + msgInfo("Added %s to selection list", kp->name); + } + } + else if (sp) { + msgInfo("Removed %s from selection list", kp->name); + index_delete(sp); + } + ret = DITEM_SUCCESS; + } + else { /* Not a package, must be a directory */ + int p, s; + + p = s = 0; + index_menu(kp, plist, &p, &s); + ret = DITEM_SUCCESS | DITEM_CONTINUE; + } + return ret; +} + +void +pkg_selected(dialogMenuItem *self, int is_selected) +{ + PkgNodePtr kp = self->data; + + if (!is_selected || kp->type != PACKAGE) + return; + msgInfo(kp->desc); +} + +int +index_menu(PkgNodePtr top, PkgNodePtr plist, int *pos, int *scroll) +{ + int n, rval, maxname; + int curr, max; + PkgNodePtr kp; + dialogMenuItem *nitems; + Boolean hasPackages; + WINDOW *w; + + hasPackages = FALSE; + nitems = NULL; + + w = savescr(); + n = maxname = 0; + /* Figure out if this menu is full of "leaves" or "branches" */ + for (kp = top->kids; kp && kp->name; kp = kp->next) { + int len; + + ++n; + if (kp->type == PACKAGE && plist) { + hasPackages = TRUE; + if ((len = strlen(kp->name)) > maxname) + maxname = len; + } + } + if (!n && plist) { + msgConfirm("The %s menu is empty.", top->name); + restorescr(w); + return DITEM_LEAVE_MENU; + } + + while (1) { + n = 0; + curr = max = 0; + kp = top->kids; + while (kp && kp->name) { + char buf[256]; + + /* Brutally adjust description to fit in menu */ + strcpy(buf, kp->desc); + if (strlen(buf) > (_MAX_DESC - maxname)) + buf[_MAX_DESC - maxname] = '\0'; + nitems = item_add(nitems, kp->name, buf, pkg_checked, pkg_fire, pkg_selected, kp, (int)plist, &curr, &max); + ++n; + kp = kp->next; + } + /* NULL delimiter so item_free() knows when to stop later */ + nitems = item_add(nitems, NULL, NULL, NULL, NULL, NULL, NULL, 0, &curr, &max); + +recycle: + dialog_clear(); + if (hasPackages) + rval = dialog_checklist(top->name, top->desc, -1, -1, n > MAX_MENU ? MAX_MENU : n, -n, nitems, NULL); + else /* It's a categories menu */ + rval = dialog_menu(top->name, top->desc, -1, -1, n > MAX_MENU ? MAX_MENU : n, -n, + nitems, NULL, pos, scroll); + if (rval == -1 && plist) { + static char *cp; + PkgNodePtr menu; + + /* Search */ + if ((cp = msgGetInput(cp, "Search by package name. Please enter search string:")) != NULL) { + PkgNodePtr p = index_search(top, cp, &menu); + + if (p) { + int pos, scroll; + + /* These need to be set to point at the found item, actually. Hmmm! */ + pos = scroll = 0; + index_menu(menu, plist, &pos, &scroll); + } + else + msgConfirm("Search string: %s yielded no hits.", cp); + } + goto recycle; + } + items_free(nitems, &curr, &max); + restorescr(w); + return rval ? DITEM_FAILURE : DITEM_SUCCESS; + } +} + +int +index_extract(Device *dev, PkgNodePtr top, PkgNodePtr plist) +{ + PkgNodePtr tmp; + int status = DITEM_SUCCESS; + + for (tmp = plist->kids; tmp && tmp->name; tmp = tmp->next) + status = index_extract_one(dev, top, tmp, FALSE); + return status; +} + +static int +index_extract_one(Device *dev, PkgNodePtr top, PkgNodePtr who, Boolean depended) +{ + int status = DITEM_SUCCESS; + PkgNodePtr tmp2; + IndexEntryPtr id = who->data; + + if (id && id->deps && strlen(id->deps)) { + char t[1024], *cp, *cp2; + + strcpy(t, id->deps); + cp = t; + while (cp && DITEM_STATUS(status) == DITEM_SUCCESS) { + if ((cp2 = index(cp, ' ')) != NULL) + *cp2 = '\0'; + if ((tmp2 = index_search(top, cp, NULL)) != NULL) { + status = index_extract_one(dev, top, tmp2, TRUE); + if (DITEM_STATUS(status) != DITEM_SUCCESS) { + if (variable_get(VAR_NO_CONFIRM)) + msgNotify("Loading of dependant package %s failed", cp); + else + msgConfirm("Loading of dependant package %s failed", cp); + } + if (cp2) + cp = cp2 + 1; + else + cp = NULL; + } + } + } + /* Done with the deps? Load the real m'coy */ + if (DITEM_STATUS(status) == DITEM_SUCCESS) + status = package_extract(dev, who->name, depended); + return status; +} diff --git a/release/sysinstall/installUpgrade.c b/release/sysinstall/installUpgrade.c new file mode 100644 index 000000000000..19a7dce43cbc --- /dev/null +++ b/release/sysinstall/installUpgrade.c @@ -0,0 +1,387 @@ +/* + * The new sysinstall program. + * + * This is probably the last program in the `sysinstall' line - the next + * generation being essentially a complete rewrite. + * + * $Id: installUpgrade.c,v 1.29 1996/07/08 08:54:28 jkh Exp $ + * + * Copyright (c) 1995 + * Jordan Hubbard. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * verbatim and that no modifications are made prior to this + * point in the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include "sysinstall.h" +#include <sys/disklabel.h> +#include <sys/errno.h> +#include <sys/ioctl.h> +#include <sys/fcntl.h> +#include <sys/wait.h> +#include <sys/param.h> +#include <sys/stat.h> +#include <unistd.h> +#include <sys/mount.h> + +typedef struct _hitList { + enum { JUST_COPY, CALL_HANDLER } action ; + char *name; + Boolean optional; + void (*handler)(struct _hitList *self); +} HitList; + +/* cop-out function for files we can't handle */ +static void +doByHand(HitList *h) +{ + msgConfirm("/etc/%s is one of those files that this upgrade procedure just isn't\n" + "smart enough to deal with right now. You'll need to merge the old and\n" + "new versions by hand when the option to do so manually is later\n" + "presented (in the meantime, you might want to write the name of\n" + "this file down! - the holographic shell on VTY4 is a good place for\n" + "this).", h->name); +} + +static void +yellSysconfig(HitList *h) +{ + msgConfirm("/etc/sysconfig is one of those files that this upgrade procedure just isn't\n" + "smart enough to deal with right now. Unfortunately, your system\n" + "will also come up with a very different \"personality\" than it had\n" + "before if you do not merge at LEAST the hostname and ifconfig lines\n" + "from the old one! This is very important, so please do this merge\n" + "even if you do no others before the system is allowed to reboot."); +} + +/* These are the only meaningful files I know about */ +static HitList etc_files [] = { + { JUST_COPY, "Xaccel.ini", TRUE, NULL }, + { JUST_COPY, "adduser.conf", TRUE, NULL }, + { JUST_COPY, "aliases", TRUE, NULL }, + { JUST_COPY, "aliases.db", TRUE, NULL }, + { JUST_COPY, "amd.map", TRUE, NULL }, + { JUST_COPY, "crontab", TRUE, NULL }, + { JUST_COPY, "csh.cshrc", TRUE, NULL }, + { JUST_COPY, "csh.login", TRUE, NULL }, + { JUST_COPY, "csh.logout", TRUE, NULL }, + { JUST_COPY, "daily", TRUE, NULL }, + { JUST_COPY, "disktab", TRUE, NULL }, + { JUST_COPY, "dm.conf", TRUE, NULL }, + { JUST_COPY, "exports", TRUE, NULL }, + { JUST_COPY, "fbtab", TRUE, NULL }, + { CALL_HANDLER, "fstab", FALSE, doByHand }, + { JUST_COPY, "ftpusers", TRUE, NULL }, + { JUST_COPY, "gnats", TRUE, NULL }, + { JUST_COPY, "group", FALSE, NULL }, + { JUST_COPY, "host.conf", TRUE, NULL }, + { JUST_COPY, "hosts", TRUE, NULL }, + { JUST_COPY, "hosts.equiv", TRUE, NULL }, + { JUST_COPY, "hosts.lpd", TRUE, NULL }, + { CALL_HANDLER, "inetd.conf", FALSE, doByHand }, + { CALL_HANDLER, "kerberosIV", TRUE, doByHand }, + { JUST_COPY, "localtime", TRUE, NULL }, + { JUST_COPY, "login.access", TRUE, NULL }, + { JUST_COPY, "mail.rc", TRUE, NULL }, + { JUST_COPY, "make.conf", TRUE, NULL }, + { JUST_COPY, "manpath.config", TRUE, NULL }, + { JUST_COPY, "master.passwd", TRUE, NULL }, + { JUST_COPY, "mib.txt", TRUE, NULL }, + { JUST_COPY, "modems", TRUE, NULL }, + { JUST_COPY, "monthly", TRUE, NULL }, + { JUST_COPY, "motd", TRUE, NULL }, + { JUST_COPY, "namedb", TRUE, NULL }, + { CALL_HANDLER, "netstart", FALSE, doByHand }, + { JUST_COPY, "networks", TRUE, NULL }, + { JUST_COPY, "passwd", FALSE, NULL }, + { JUST_COPY, "phones", TRUE, NULL }, + { JUST_COPY, "ppp", TRUE, NULL }, + { JUST_COPY, "printcap", TRUE, NULL }, + { JUST_COPY, "profile", TRUE, NULL }, + { JUST_COPY, "protocols", TRUE, NULL }, + { JUST_COPY, "pwd.db", TRUE, NULL }, + { CALL_HANDLER, "rc", FALSE, doByHand }, + { CALL_HANDLER, "rc.i386", TRUE, doByHand }, + { JUST_COPY, "rc.local", TRUE, NULL }, + { CALL_HANDLER, "rc.serial", TRUE, doByHand }, + { JUST_COPY, "remote", TRUE, NULL }, + { JUST_COPY, "resolv.conf", TRUE, NULL }, + { JUST_COPY, "rmt", TRUE, NULL }, + { JUST_COPY, "security", TRUE, NULL }, + { JUST_COPY, "sendmail.cf", TRUE, NULL }, + { CALL_HANDLER, "services", TRUE, doByHand }, + { JUST_COPY, "shells", TRUE, NULL }, + { JUST_COPY, "skeykeys", TRUE, NULL }, + { JUST_COPY, "spwd.db", TRUE, NULL }, + { JUST_COPY, "supfile", TRUE, NULL }, + { CALL_HANDLER, "sysconfig", FALSE, yellSysconfig }, + { JUST_COPY, "syslog.conf", TRUE, NULL }, + { JUST_COPY, "termcap", TRUE, NULL }, + { JUST_COPY, "ttys", TRUE, NULL }, + { JUST_COPY, "uucp", TRUE, NULL }, + { JUST_COPY, "weekly", TRUE, NULL }, + { 0 }, +}; + +void +traverseHitlist(HitList *h) +{ + while (h->name) { + if (!file_readable(h->name)) { + if (!h->optional) + msgConfirm("Unable to find an old /etc/%s file! That is decidedly non-standard and\n" + "your upgraded system may function a little strangely as a result."); + } + else { + if (h->action == JUST_COPY) { + /* Nuke the just-loaded copy thoroughly */ + vsystem("rm -rf /etc/%s", h->name); + + /* Copy the old one into its place */ + msgNotify("Resurrecting %s..", h->name); + /* Do this with tar so that symlinks and such are preserved */ + if (vsystem("tar cf - %s | tar xpf - -C /etc", h->name)) + msgConfirm("Unable to resurrect your old /etc/%s! Hmmmm.", h->name); + } + else /* call handler */ + h->handler(h); + } + ++h; + } +} + +int +installUpgrade(dialogMenuItem *self) +{ + char *saved_etc; + Boolean extractingBin = TRUE; + struct termios foo; + + variable_set2(SYSTEM_STATE, "upgrade"); + systemDisplayHelp("upgrade"); + + dialog_clear(); + if (msgYesNo("Given all that scary stuff you just read, are you sure you want to\n" + "risk it all and proceed with this upgrade?")) + return DITEM_FAILURE | DITEM_RESTORE; + + if (!Dists) { + msgConfirm("You haven't specified any distributions yet. The upgrade procedure will\n" + "only upgrade those portions of the system for which a distribution has\n" + "been selected. In the next screen, we'll go to the Distributions menu\n" + "to select those portions of 2.1 you wish to install on top of your 2.0.5\n" + "system."); + if (!dmenuOpenSimple(&MenuDistributions, FALSE)) + return DITEM_FAILURE | DITEM_RECREATE; + dialog_clear(); + } + + /* No bin selected? Not much of an upgrade.. */ + if (!(Dists & DIST_BIN)) { + if (msgYesNo("You didn't select the bin distribution as one of the distributons to load.\n" + "This one is pretty vital to a successful 2.1 upgrade. Are you SURE you don't\n" + "want to select the bin distribution? Chose _No_ to bring up the Distributions\n" + "menu.")) { + if (!dmenuOpenSimple(&MenuDistributions, FALSE)) + return DITEM_FAILURE | DITEM_RECREATE; + dialog_clear(); + } + } + + /* Still?! OK! They must know what they're doing.. */ + if (!(Dists & DIST_BIN)) + extractingBin = FALSE; + + if (!mediaDevice) { + msgConfirm("Now you must specify an installation medium for the upgrade."); + if (!dmenuOpenSimple(&MenuMedia, FALSE) || !mediaDevice) + return DITEM_FAILURE | DITEM_RECREATE; + } + + if (RunningAsInit) { + Device **devs; + int i, cnt; + char *cp; + + cp = variable_get(VAR_DISK); + devs = deviceFind(cp, DEVICE_TYPE_DISK); + cnt = deviceCount(devs); + if (!cnt) { + msgConfirm("No disks found! Please verify that your disk controller is being\n" + "properly probed at boot time. See the Hardware Guide on the\n" + "Documentation menu for clues on diagnosing this type of problem."); + return DITEM_FAILURE; + } + else { + /* Enable all the drives befor we start */ + for (i = 0; i < cnt; i++) + devs[i]->enabled = TRUE; + } + + msgConfirm("OK. First, we're going to go to the disk label editor. In this editor\n" + "you will be expected to *Mount* any partitions you're interested in\n" + "upgrading. DO NOT set the Newfs flag to Y on anything in the label editor\n" + "unless you're absolutely sure you know what you're doing! In this\n" + "instance, you'll be using the label editor as little more than a fancy\n" + "screen-oriented way of labeling existing partitions.\n\n" + "Once you're done in the label editor, press Q to return here for the next\n" + "step."); + + if (DITEM_STATUS(diskLabelEditor(self)) == DITEM_FAILURE) { + msgConfirm("The disk label editor failed to work properly! Upgrade operation\n" + "aborted."); + return DITEM_FAILURE | DITEM_RECREATE; + } + + /* Don't write out MBR info */ + variable_set2(DISK_PARTITIONED, "written"); + if (DITEM_STATUS(diskLabelCommit(self)) == DITEM_FAILURE) { + msgConfirm("Not all file systems were properly mounted. Upgrade operation\n" + "aborted."); + variable_unset(DISK_PARTITIONED); + return DITEM_FAILURE | DITEM_RECREATE; + } + } + + if (!copySelf()) { + msgConfirm("Couldn't clone the boot floppy onto the root file system.\n" + "Aborting."); + return DITEM_FAILURE | DITEM_RECREATE; + } + + if (DITEM_STATUS(chroot("/mnt")) == DITEM_FAILURE) { + msgConfirm("Unable to chroot to /mnt - something is wrong with the\n" + "root partition or the way it's mounted if this doesn't work."); + variable_unset(DISK_PARTITIONED); + return DITEM_FAILURE | DITEM_RECREATE; + } + + chdir("/"); + systemCreateHoloshell(); + + saved_etc = NULL; + if (extractingBin) { + while (!saved_etc) { + saved_etc = msgGetInput("/usr/tmp/etc", "Under which directory do you wish to save your current /etc?"); + if (!saved_etc || !*saved_etc || Mkdir(saved_etc)) { + saved_etc = NULL; + if (msgYesNo("Directory was not specified, was invalid or user selected Cancel.\n\n" + "Doing an upgrade without first backing up your /etc directory is a very\n" + "bad idea! Do you want to go back and specify the save directory again?")) + break; + } + } + + if (saved_etc) { + msgNotify("Preserving /etc directory.."); + if (vsystem("tar -cf - -C /etc . | tar -xpf - -C %s", saved_etc)) + if (msgYesNo("Unable to backup your /etc into %s.\n" + "Do you want to continue anyway?")) + return DITEM_FAILURE | DITEM_RECREATE; + } + if (file_readable("/kernel")) { + msgNotify("Moving old kernel to /kernel.prev"); + if (system("chflags noschg /kernel && mv /kernel /kernel.prev")) { + if (!msgYesNo("Hmmm! I couldn't move the old kernel over! Do you want to\n" + "treat this as a big problem and abort the upgrade? Due to the\n" + "way that this upgrade process works, you will have to reboot\n" + "and start over from the beginning. Select Yes to reboot now")) + systemShutdown(1); + } + } + } + + msgNotify("Beginning extraction of distributions.."); + if (DITEM_STATUS(distExtractAll(self)) == DITEM_FAILURE) { + if (extractingBin && (Dists & DIST_BIN)) { + msgConfirm("Hmmmm. We couldn't even extract the bin distribution. This upgrade\n" + "should be considered a failure and started from the beginning, sorry!\n" + "The system will reboot now."); + dialog_clear(); + systemShutdown(1); + } + msgConfirm("The extraction process seems to have had some problems, but we got most\n" + "of the essentials. We'll treat this as a warning since it may have been\n" + "only non-essential distributions which failed to load."); + } + + if (extractingBin) { + msgNotify("OK, now it's time to go pound on your root a little bit to create all the\n" + "/dev entries and such that a 2.1 system expects to see. I'll also perform a\n" + "few \"fixup\" operations to repair the effects of splatting a bin distribution\n" + "on top of an existing system.."); + if (DITEM_STATUS(installFixup(self)) == DITEM_FAILURE) { + msgConfirm("Hmmmmm. The fixups don't seem to have been very happy.\n" + "You may wish to examine the system a little more closely when\n" + "it comes time to merge your /etc customizations back."); + } + } + + msgConfirm("First stage of upgrade completed successfully!\n\n" + "Next comes stage 2, where we attempt to resurrect your /etc\n" + "directory!"); + + if (saved_etc && chdir(saved_etc)) { + msgConfirm("Unable to go to your saved /etc directory in %s?! Argh!\n" + "Something went seriously wrong! It's quite possible that\n" + "your former /etc is toast. I hope you didn't have any\n" + "important customizations you wanted to keep in there.. :("); + } + else { + /* Now try to resurrect the /etc files */ + traverseHitlist(etc_files); + } + + msgConfirm("OK! At this stage, we've resurrected all the /etc files we could\n" + "(and you may have been warned about some that you'll have to merge\n" + "yourself by hand) and we're going to drop you into a shell to do\n" + "the rest yourself (sorry about this!). Once the system looks good\n" + "to you, exit the shell to reboot the system."); + + chdir("/"); + dialog_clear(); + dialog_update(); + end_dialog(); + DialogActive = FALSE; + endwin(); + + signal(SIGTTOU, SIG_IGN); + if (tcgetattr(0, &foo) != -1) { + foo.c_cc[VERASE] = '\010'; + if (tcsetattr(0, TCSANOW, &foo) == -1) + msgDebug("Unable to set the erase character.\n"); + } + else + msgDebug("Unable to get the terminal attributes!\n"); + printf("Well, good luck! When you're done, please type \"reboot\" or exit\n" + "the shell to reboot the new system.\n"); + if (!Fake) + system("/bin/sh"); + else + exit(0); + if (RunningAsInit) + reboot(0); + /* NOTREACHED */ + return 0; +} diff --git a/release/sysinstall/lndir.c b/release/sysinstall/lndir.c new file mode 100644 index 000000000000..5e037cad7b97 --- /dev/null +++ b/release/sysinstall/lndir.c @@ -0,0 +1,218 @@ +/* $XConsortium: lndir.c,v 1.14 95/01/09 20:08:20 kaleb Exp $ */ +/* $XFree86: xc/config/util/lndir.c,v 3.3 1995/01/28 15:41:09 dawes Exp $ */ +/* Create shadow link tree (after X11R4 script of the same name) + Mark Reinhold (mbr@lcs.mit.edu)/3 January 1990 */ + +/* Hacked somewhat by Jordan Hubbard, The FreeBSD Project, to make it */ +/* an invokable function from sysinstall rather than a stand-alone binary */ + +/* +Copyright (c) 1990, X Consortium + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + +*/ + +/* From the original /bin/sh script: + + Used to create a copy of the a directory tree that has links for all + non-directories (except those named RCS, SCCS or CVS.adm). If you are + building the distribution on more than one machine, you should use + this technique. + + If your master sources are located in /usr/local/src/X and you would like + your link tree to be in /usr/local/src/new-X, do the following: + + % mkdir /usr/local/src/new-X + % cd /usr/local/src/new-X + % lndir ../X +*/ + +#include <sys/param.h> +#include <sys/stat.h> + +#include <dirent.h> +#include <errno.h> +#include <stdarg.h> +#include <stdio.h> +#include <string.h> + +#include "sysinstall.h" + +#ifndef MAXPATHLEN +#define MAXPATHLEN 2048 +#endif + +static char *rcurdir; +static char *curdir; + +static int +equivalent(char *lname, char *rname) +{ + char *s; + + if (!strcmp(lname, rname)) + return 1; + for (s = lname; *s && (s = strchr(s, '/')); s++) { + while (s[1] == '/') + strcpy(s+1, s+2); + } + return !strcmp(lname, rname); +} + + +/* Recursively create symbolic links from the current directory to the "from" + directory. Assumes that files described by fs and ts are directories. */ + +static int +dodir(char *fn, struct stat *fs, struct stat *ts, int rel) +{ + DIR *df; + struct dirent *dp; + char buf[MAXPATHLEN + 1], *p; + char symbuf[MAXPATHLEN + 1]; + struct stat sb, sc; + int n_dirs; + int symlen; + char *ocurdir; + + if ((fs->st_dev == ts->st_dev) && (fs->st_ino == ts->st_ino)) + return 1; + + if (rel) + strcpy (buf, "../"); + else + buf[0] = '\0'; + strcat (buf, fn); + + if (!(df = opendir (buf))) { + msgDebug("%s: Cannot opendir\n", buf); + return 1; + } + + p = buf + strlen (buf); + *p++ = '/'; + n_dirs = fs->st_nlink; + while ((dp = readdir (df)) != NULL) { + if (dp->d_name[strlen(dp->d_name) - 1] == '~') + continue; + strcpy (p, dp->d_name); + + if (n_dirs > 0) { + if (stat (buf, &sb) < 0) { + msgDebug("Can't stat: %s\n", buf); + continue; + } + + if (S_ISDIR(sb.st_mode)) { + /* directory */ + n_dirs--; + if (dp->d_name[0] == '.' && + (dp->d_name[1] == '\0' || (dp->d_name[1] == '.' && dp->d_name[2] == '\0'))) + continue; + if (!strcmp (dp->d_name, "RCS")) + continue; + if (!strcmp (dp->d_name, "SCCS")) + continue; + if (!strcmp (dp->d_name, "CVS")) + continue; + if (!strcmp (dp->d_name, "CVS.adm")) + continue; + ocurdir = rcurdir; + rcurdir = buf; + curdir = isDebug() ? buf : (char *)0; + if (isDebug()) + msgDebug("%s:\n", buf); + if ((stat(dp->d_name, &sc) < 0) && (errno == ENOENT)) { + if (mkdir(dp->d_name, 0777) < 0 || + stat (dp->d_name, &sc) < 0) { + msgDebug("Unable to make or stat: %s\n", dp->d_name); + curdir = rcurdir = ocurdir; + continue; + } + } + if (readlink (dp->d_name, symbuf, sizeof(symbuf) - 1) >= 0) { + msgDebug("%s: is a link instead of a directory\n", dp->d_name); + curdir = rcurdir = ocurdir; + continue; + } + if (chdir (dp->d_name) < 0) { + msgDebug("Unable to chdir to: %s\n", dp->d_name); + curdir = rcurdir = ocurdir; + continue; + } + (void)dodir(buf, &sb, &sc, (buf[0] != '/')); + if (chdir ("..") < 0) { + msgDebug("Unable to get back to ..\n"); + return DITEM_FAILURE; + } + curdir = rcurdir = ocurdir; + continue; + } + } + + /* non-directory */ + symlen = readlink (dp->d_name, symbuf, sizeof(symbuf) - 1); + if (symlen >= 0) { + symbuf[symlen] = '\0'; + if (!equivalent (symbuf, buf)) + msgDebug("%s: %s\n", dp->d_name, symbuf); + } else if (symlink (buf, dp->d_name) < 0) + msgDebug("Unable to create symlink: %s\n", dp->d_name); + } + + closedir (df); + return 0; +} + +int +lndir(char *from, char *to) +{ + struct stat fs, ts; + + if (!to) + to = "."; + + /* to directory */ + if (stat(to, &ts) < 0) { + msgDebug("Destination directory doesn't exist: %s\n", to); + return DITEM_FAILURE; + } + if (!(S_ISDIR(ts.st_mode))) { + msgDebug ("%s: Not a directory\n", to); + return DITEM_FAILURE; + } + if (chdir(to) < 0) { + msgDebug("Unable to chdir to %s\n", to); + return DITEM_FAILURE; + } + /* from directory */ + if (stat(from, &fs) < 0) { + msgDebug("From directory doesn't exist: %s\n", from); + return DITEM_FAILURE; + } + if (!(S_ISDIR(fs.st_mode))) { + msgDebug ("%s: Not a directory\n", from); + return DITEM_FAILURE; + } + return dodir(from, &fs, &ts, 0); +} diff --git a/release/sysinstall/options.c b/release/sysinstall/options.c new file mode 100644 index 000000000000..dd8d87951fff --- /dev/null +++ b/release/sysinstall/options.c @@ -0,0 +1,285 @@ +/* + * The new sysinstall program. + * + * This is probably the last attempt in the `sysinstall' line, the next + * generation being slated for what's essentially a complete rewrite. + * + * $Id: options.c,v 1.40 1996/07/08 10:08:18 jkh Exp $ + * + * Copyright (c) 1995 + * Jordan Hubbard. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * verbatim and that no modifications are made prior to this + * point in the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include "sysinstall.h" +#include <ctype.h> + +static char * +varCheck(Option opt) +{ + char *cp = NULL; + + if (opt.aux) + cp = variable_get((char *)opt.aux); + if (!cp) + return "NO"; + return cp; +} + +/* Show our little logo */ +static char * +resetLogo(char *str) +{ + return "[RESET!]"; +} + +static char * +mediaCheck(Option opt) +{ + if (mediaDevice) { + switch(mediaDevice->type) { + case DEVICE_TYPE_UFS: + case DEVICE_TYPE_DISK: + return "File system"; + + case DEVICE_TYPE_FLOPPY: + return "Floppy"; + + case DEVICE_TYPE_FTP: + return "FTP"; + + case DEVICE_TYPE_CDROM: + return "CDROM"; + + case DEVICE_TYPE_TAPE: + return "Tape"; + + case DEVICE_TYPE_DOS: + return "DOS"; + + case DEVICE_TYPE_NFS: + return "NFS"; + + case DEVICE_TYPE_NONE: + case DEVICE_TYPE_NETWORK: + case DEVICE_TYPE_ANY: + default: + return "<unknown>"; + } + } + return "<not yet set>"; +} + +#define TAPE_PROMPT "Please enter the tape block size in 512 byte blocks:" +#define RELNAME_PROMPT "Please specify the release you wish to load:" +#define BPKG_PROMPT "Please specify the name of the HTML browser package:" +#define BBIN_PROMPT "Please specify a full pathname to the HTML browser binary:" +#define EDITOR_PROMPT "Please specify the name of the text editor you wish to use:" +#define PKG_PROMPT "Please specify a temporary directory with lots of free space:" +#define INSTROOT_PROMPT "Please specify a root directory if installing somewhere other than /" + +static Option Options[] = { +{ "NFS Secure", "NFS server talks only on a secure port", + OPT_IS_VAR, NULL, VAR_NFS_SECURE, varCheck }, +{ "NFS Slow", "User is using a slow PC or ethernet card", + OPT_IS_VAR, NULL, VAR_SLOW_ETHER, varCheck }, +{ "Debugging", "Emit extra debugging output on VTY2 (ALT-F2)", + OPT_IS_VAR, NULL, VAR_DEBUG, varCheck }, +{ "Yes to All", "Assume \"Yes\" answers to all non-critical dialogs", + OPT_IS_VAR, NULL, VAR_NO_CONFIRM, varCheck }, +{ "FTP username", "Username and password to use instead of anonymous", + OPT_IS_FUNC, mediaSetFtpUserPass, VAR_FTP_USER, varCheck }, +{ "Editor", "Which text editor to use during installation", + OPT_IS_VAR, EDITOR_PROMPT, VAR_EDITOR, varCheck }, +{ "Tape Blocksize", "Tape media block size in 512 byte blocks", + OPT_IS_VAR, TAPE_PROMPT, VAR_TAPE_BLOCKSIZE, varCheck }, +{ "Extract Detail", "How verbosely to display file name information during extractions", + OPT_IS_FUNC, mediaSetCPIOVerbosity, VAR_CPIO_VERBOSITY, varCheck }, +{ "Release Name", "Which release to attempt to load from installation media", + OPT_IS_VAR, RELNAME_PROMPT, VAR_RELNAME, varCheck }, +{ "Install Root", "Which directory to unpack distributions or packages relative to", + OPT_IS_VAR, INSTROOT_PROMPT, VAR_INSTALL_ROOT, varCheck }, +{ "Browser Pkg", "This is the browser package that will be used for viewing HTML docs", + OPT_IS_VAR, BPKG_PROMPT, VAR_BROWSER_PACKAGE, varCheck }, +{ "Browser Exec", "This is the path to the main binary of the browser package", + OPT_IS_VAR, BBIN_PROMPT, VAR_BROWSER_BINARY, varCheck }, +{ "Media Type", "The current installation media type.", + OPT_IS_FUNC, mediaGetType, VAR_MEDIA_TYPE, mediaCheck }, +{ "Package Temp", "The directory where package temporary files should go", + OPT_IS_VAR, PKG_PROMPT, VAR_PKG_TMPDIR, varCheck }, +{ "Use Defaults", "Reset all values to startup defaults", + OPT_IS_FUNC, installVarDefaults, 0, resetLogo }, +{ NULL }, +}; + +#define OPT_START_ROW 4 +#define OPT_END_ROW 19 +#define OPT_NAME_COL 0 +#define OPT_VALUE_COL 16 +#define GROUP_OFFSET 40 + +static char * +value_of(Option opt) +{ + static char ival[40]; + + switch (opt.type) { + case OPT_IS_STRING: + return (char *)opt.data; + + case OPT_IS_INT: + sprintf(ival, "%d", (int)opt.data); + return ival; + + case OPT_IS_FUNC: + case OPT_IS_VAR: + if (opt.check) + return opt.check(opt); + else + return "<*>"; + } + return "<unknown>"; +} + +static void +fire(Option opt) +{ + if (opt.type == OPT_IS_FUNC) { + int (*cp)(char *) = opt.data; + + cp(NULL); + } + else if (opt.type == OPT_IS_VAR) { + if (opt.data) { + (void)variable_get_value(opt.aux, opt.data); + } + else if (variable_get(opt.aux)) + variable_unset(opt.aux); + else + variable_set2(opt.aux, "YES"); + } + if (opt.check) + opt.check(opt); + clear(); + refresh(); +} + +int +optionsEditor(dialogMenuItem *self) +{ + int i, optcol, optrow, key; + static int currOpt = 0; + + dialog_clear(); + clear(); + + while (1) { + /* Whap up the header */ + attrset(A_REVERSE); mvaddstr(0, 0, "Options Editor"); attrset(A_NORMAL); + for (i = 0; i < 2; i++) { + mvaddstr(OPT_START_ROW - 2, OPT_NAME_COL + (i * GROUP_OFFSET), "Name"); + mvaddstr(OPT_START_ROW - 1, OPT_NAME_COL + (i * GROUP_OFFSET), "----"); + + mvaddstr(OPT_START_ROW - 2, OPT_VALUE_COL + (i * GROUP_OFFSET), "Value"); + mvaddstr(OPT_START_ROW - 1, OPT_VALUE_COL + (i * GROUP_OFFSET), "-----"); + } + /* And the footer */ + mvprintw(OPT_END_ROW + 1, 0, "Use SPACE to select/toggle an option, arrow keys to move,"); + mvprintw(OPT_END_ROW + 2, 0, "? or F1 for more help. When you're done, type Q to Quit."); + + optrow = OPT_START_ROW; + optcol = OPT_NAME_COL; + for (i = 0; Options[i].name; i++) { + /* Names are painted somewhat gratuitously each time, but it's easier this way */ + mvprintw(optrow, OPT_NAME_COL + optcol, Options[i].name); + if (currOpt == i) + attrset(ATTR_SELECTED); + mvprintw(optrow++, OPT_VALUE_COL + optcol, value_of(Options[i])); + if (currOpt == i) + attrset(A_NORMAL); + if (optrow == OPT_END_ROW) { + optrow = OPT_START_ROW; + optcol += GROUP_OFFSET; + } + clrtoeol(); + } + attrset(ATTR_TITLE); + mvaddstr(OPT_END_ROW + 4, 0, Options[currOpt].desc); + attrset(A_NORMAL); + clrtoeol(); + move(0, 14); + refresh(); + + /* Start the edit loop */ + key = toupper(getch()); + switch (key) { + case KEY_F(1): + case '?': + systemDisplayHelp("options"); + break; + + case KEY_UP: + if (currOpt) + --currOpt; + else + for (currOpt = 0; Options[currOpt + 1].name; currOpt++); + continue; + + case KEY_DOWN: + if (Options[currOpt + 1].name) + ++currOpt; + else + currOpt = 0; + continue; + + case KEY_HOME: + currOpt = 0; + continue; + + case KEY_END: + while (Options[currOpt + 1].name) + ++currOpt; + continue; + + case ' ': + clear(); + fire(Options[currOpt]); + clear(); + continue; + + case 'Q': + clear(); + dialog_clear(); + return DITEM_SUCCESS | DITEM_RESTORE; + + default: + beep(); + } + } + /* NOTREACHED */ + return DITEM_SUCCESS | DITEM_RESTORE; +} + diff --git a/release/sysinstall/package.c b/release/sysinstall/package.c new file mode 100644 index 000000000000..9357cc15ce2d --- /dev/null +++ b/release/sysinstall/package.c @@ -0,0 +1,201 @@ +/* + * The new sysinstall program. + * + * This is probably the last program in the `sysinstall' line - the next + * generation being essentially a complete rewrite. + * + * $Id: package.c,v 1.42 1996/07/09 14:28:20 jkh Exp $ + * + * Copyright (c) 1995 + * Jordan Hubbard. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer, + * verbatim and that no modifications are made prior to this + * point in the file. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <sys/errno.h> +#include <sys/time.h> +#include <sys/param.h> +#include <sys/mount.h> +#include <sys/stat.h> +#include "sysinstall.h" + +/* Like package_extract, but assumes current media device */ +int +package_add(char *name) +{ + if (!mediaVerify()) + return DITEM_FAILURE; + return package_extract(mediaDevice, name, FALSE); +} + +Boolean +package_exists(char *name) +{ + char fname[FILENAME_MAX]; + int status /* = vsystem("pkg_info -e %s", name) */; + + /* XXX KLUDGE ALERT! This makes evil assumptions about how XXX + * packages register themselves and should *really be done with + * `pkg_info -e <name>' except that this it's too slow for an + * item check routine.. :-( + */ + snprintf(fname, FILENAME_MAX, "/var/db/pkg/%s", name); + status = access(fname, R_OK); + msgDebug("package check for %s returns %s.\n", name, + status ? "failure" : "success"); + return !status; +} + +/* SIGPIPE handler */ +static Boolean sigpipe_caught = FALSE; + +static void +catch_pipe(int sig) +{ + sigpipe_caught = TRUE; +} + +/* Extract a package based on a namespec and a media device */ +int +package_extract(Device *dev, char *name, Boolean depended) +{ + char path[511]; + int fd, ret; + + /* If necessary, initialize the ldconfig hints */ + if (!file_readable("/var/run/ld.so.hints")) + vsystem("ldconfig /usr/lib /usr/local/lib /usr/X11R6/lib"); + + /* Check to make sure it's not already there */ + if (package_exists(name)) + return DITEM_SUCCESS; + + if (!dev->init(dev)) { + msgConfirm("Unable to initialize media type for package extract."); + return DITEM_FAILURE; + } + + /* Be initially optimistic */ + ret = DITEM_SUCCESS | DITEM_RESTORE; + /* Make a couple of paranoid locations for temp files to live if user specified none */ + if (!variable_get("PKG_TMPDIR")) { + Mkdir("/usr/tmp"); + Mkdir("/var/tmp"); + /* Set it to a location with as much space as possible */ + variable_set2("PKG_TMPDIR", "/usr/tmp"); + } + + if (!index(name, '/')) + sprintf(path, "packages/All/%s%s", name, strstr(name, ".tgz") ? "" : ".tgz"); + else + sprintf(path, "%s%s", name, strstr(name, ".tgz") ? "" : ".tgz"); + fd = dev->get(dev, path, TRUE); + if (fd >= 0) { + int i, tot, pfd[2]; + pid_t pid; + + msgNotify("Adding %s%s\nfrom %s", path, depended ? " (as a dependency)" : "", dev->name); + signal(SIGPIPE, catch_pipe); + pipe(pfd); + pid = fork(); + if (!pid) { + dup2(pfd[0], 0); close(pfd[0]); + dup2(DebugFD, 1); + close(2); + close(pfd[1]); + chroot(variable_get(VAR_INSTALL_ROOT)); + i = execl("/usr/sbin/pkg_add", "/usr/sbin/pkg_add", "-", 0); + if (isDebug()) + msgDebug("pkg_add returns %d status\n", i); + } + else { + char buf[BUFSIZ]; + WINDOW *w = savescr(); + struct timeval start, stop; + + close(pfd[0]); + tot = 0; + (void)gettimeofday(&start, (struct timezone *)0); + + while (!sigpipe_caught && (i = read(fd, buf, BUFSIZ)) > 0) { + int seconds; + + tot += i; + /* Print statistics about how we're doing */ + (void) gettimeofday(&stop, (struct timezone *)0); + stop.tv_sec = stop.tv_sec - start.tv_sec; + stop.tv_usec = stop.tv_usec - start.tv_usec; + if (stop.tv_usec < 0) + stop.tv_sec--, stop.tv_usec += 1000000; + seconds = stop.tv_sec + (stop.tv_usec / 1000000.0); + if (!seconds) + seconds = 1; + msgInfo("%10d bytes read from package %s @ %4.1f KBytes/second", tot, name, (tot / seconds) / 1024.0); + /* Write it out */ + if (write(pfd[1], buf, i) != i) { + msgInfo("Write failure to pkg_add! Package may be corrupt."); + break; + } + } + close(pfd[1]); + dev->close(dev, fd); + if (sigpipe_caught) + msgDebug("Caught SIGPIPE while trying to install the %s package.\n", name); + else + msgInfo("Package %s read successfully - waiting for pkg_add", name); + refresh(); + i = waitpid(pid, &tot, 0); + if (sigpipe_caught || i < 0 || WEXITSTATUS(tot)) { + if (variable_get(VAR_NO_CONFIRM)) + msgNotify("Add of package %s aborted due to some error -\n" + "Please check the debug screen for more info.", name); + else + msgConfirm("Add of package %s aborted due to some error -\n" + "Please check the debug screen for more info.", name); + } + else + msgNotify("Package %s was added successfully", name); + sleep(1); + restorescr(w); + sigpipe_caught = FALSE; + } + } + else { + msgDebug("pkg_extract: get operation returned %d\n", fd); + dialog_clear(); + if (variable_get(VAR_NO_CONFIRM)) + msgNotify("Unable to fetch package %s from selected media.\n" + "No package add will be done.", name); + else { + msgConfirm("Unable to fetch package %s from selected media.\n" + "No package add will be done.", name); + } + ret = DITEM_FAILURE | DITEM_RESTORE; + } + return ret; +} diff --git a/release/sysinstall/version.h b/release/sysinstall/version.h new file mode 100644 index 000000000000..b42c26e8937d --- /dev/null +++ b/release/sysinstall/version.h @@ -0,0 +1 @@ +#define RELEASE_NAME "__RELEASE" diff --git a/share/man/man4/man4.i386/aic.4 b/share/man/man4/man4.i386/aic.4 new file mode 100644 index 000000000000..84bf10853c8a --- /dev/null +++ b/share/man/man4/man4.i386/aic.4 @@ -0,0 +1,47 @@ +.\" +.\" Copyright (c) 1994 James A. Jegers +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. The name of the author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" +.Dd November 29, 1994 +.Dt AIC 4 i386 +.Os +.Sh NAME +.Nm aic +.Nd Adaptec AIC-6260 and AIC-6360 SCSI driver +.Sh SYNOPSIS +.Cd "device aic0 at isa? port 0x340 bio irq 11" +.Sh DESCRIPTION +The +.Nm aic +driver provides support for the Adaptec AIC-6260 and AIC-6360 SCSI +controller chips. This includes the Adaptec 152x and the Creative +Labs SoundBlaster SCSI host adapter. +.Pp +Many systems that use these controller chips do not have a boot ROM +and therefore cannot be booted from. +.Sh SEE ALSO +.Xr intro 4 , +.Xr sd 4 , +.Xr st 4 , +.Xr cd 4 , +.Xr ch 4 diff --git a/share/man/man4/man4.i386/eg.4 b/share/man/man4/man4.i386/eg.4 new file mode 100644 index 000000000000..10f84552df47 --- /dev/null +++ b/share/man/man4/man4.i386/eg.4 @@ -0,0 +1,44 @@ +.\" +.\" Copyright (c) 1994 James A. Jegers +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. The name of the author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd July 10, 1995 +.Dt EG 4 i386 +.Os +.Sh NAME +.Nm eg +.Nd Ethernet driver for 3Com 3c505 Ethernet boards +.Sh SYNOPSIS +.Cd "device eg0 at isa? port 0x310 net irq 5 vector egintr" +.Sh DESCRIPTION +The +.Nm +interface provides access to a 10 Mb/s Ethernet network via the +3Com 3c505 Ethernet board. +.Sh SEE ALSO +.Xr ifconfig 8 , +.Xr intro 4 , +.Xr ed 4 , +.Xr el 4 , +.Xr ep 4 , +.Xr ie 4 , +.Xr le 4 diff --git a/share/man/man4/man4.i386/el.4 b/share/man/man4/man4.i386/el.4 new file mode 100644 index 000000000000..2e447337b819 --- /dev/null +++ b/share/man/man4/man4.i386/el.4 @@ -0,0 +1,44 @@ +.\" +.\" Copyright (c) 1994 James A. Jegers +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. The name of the author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd July 10, 1995 +.Dt EL 4 i386 +.Os +.Sh NAME +.Nm el +.Nd Ethernet driver for 3Com Etherlink 3C501 device driver +.Sh SYNOPSIS +.Cd "device el0 at isa? port 0x300 net irq 9 vector elintr" +.Sh DESCRIPTION +The +.Nm +interface provides access to a 10 Mb/s Ethernet network via the +3Com 3c501 Ethernet cards. +.Sh SEE ALSO +.Xr ifconfig 8 , +.Xr intro 4 , +.Xr ed 4 , +.Xr eg 4 , +.Xr ep 4 , +.Xr ie 4 , +.Xr le 4 diff --git a/share/man/man4/man4.i386/ep.4 b/share/man/man4/man4.i386/ep.4 new file mode 100644 index 000000000000..51b6a80666cd --- /dev/null +++ b/share/man/man4/man4.i386/ep.4 @@ -0,0 +1,123 @@ +.\" +.\" Copyright (c) 1994 Herb Peyerl +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by Herb Peyerl +.\" 3. The name of the author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" $Id: ep.4,v 1.1 1996/07/11 00:22:46 mpp Exp $ +.\" +.Dd February 04, 1993 +.Dt EP 4 +.Os +.Sh NAME +.Nm ep +.Nd Ethernet driver for 3Com Etherlink III (3c5x9) +.Sh SYNOPSIS +.Cd "device ep0 at isa? port 0x300 net irq 10 vector epintr" +.Sh DESCRIPTION +The +.Nm ep +device driver supports the 3c509 (ISA) and 3c579 (EISA) cards. +Various models of these cards come with a different assortment of +connectors: +.Pp +.Bl -tag -width xxxxxxxxxxxxxxxxxxxx +.It AUI/DIX +Standard 15 pin connector +.It 10Base2 +BNC, also known as thin-net +.It 10BaseT +UTP, also known as twisted pair +.El +.Pp +The default port to use is the BNC. To choose an alternate port, +use the following flag combinations with +.Xr ifconfig 8 +or in your /etc/hostname.ep? file. +.Pp +.Bl -tag -width xxxxxxxxxxxxxxxxxxxx +.It -link0 +Use the BNC port (default). +.It \ link0 -link1 +Use the AUI port. +.It \ link0 \ link1 +Use the UTP port. +.El +.Pp +If there are multiple cards in the computer, they are searched for +in the following order: +The 3c579 EISA cards are searched for first -- they will be found +in EISA slot# order. +Next, the 3c509 ISA cards are searched -- they are found in increasing +ethernet address order. +This is an example of how they will probe: +.Pp +ep0 at isa0 port 0x6000-0x600f irq 10: aui/bnc address 00:60:8c:70:e5:c5 +ep1 at isa0 port 0x300-0x30f irq 3: aui/bnc/utp address 00:20:af:10:62:ab +.Pp +You may specify the port and irq numbers that the cards are expected +to be found at, but it is not necessary. +The cards are sufficiently intelligent to tell us where they +actually live on the ISA bus. +.Pp +.Sh NOTES +The 3c509 card has no jumpers to set the address. +3Com supplies software to set the address of the card in software. +To find the card on the ISA bus, the kernel performs a complex +scan operation at IO address 0x100. +Beware! +Avoid placing other cards at that address! +.Pp +Some models of 3c5x9 have all three connectors on them. +In the case of these cards; you must configure the transceiver type +with the 3Com supplied DOS configuration disk before the link0/link1 +flags will operate correctly. +.Pp +.Sh DIAGNOSTICS +ep0: reset (status: %x) +.in +4 +the driver has encountered a FIFO underrun or overrun. The driver will reset +the card and the packet will be lost. This is not fatal. +.in -4 +ep0: eeprom failed to come ready +.in +4 +The eeprom failed to come ready. This probably means the card is wedged. +.in -4 +ep0: 3c509 in test mode. Erase pencil mark! +.in +4 +This means that someone has scribbled with pencil in the test area on the +card. Erase the pencil mark and reboot. (This is not a joke). +.in -4 +.Sh SEE ALSO +.Xr ifconfig 8 , +.Xr intro 4 , +.Xr ed 4 , +.Xr eg 4 , +.Xr el 4 , +.Xr ie 4 , +.Xr le 4 +.Sh STANDARDS +are great. There's so many to choose from. diff --git a/share/man/man4/man4.i386/ncr.4 b/share/man/man4/man4.i386/ncr.4 new file mode 100644 index 000000000000..dc3576da116a --- /dev/null +++ b/share/man/man4/man4.i386/ncr.4 @@ -0,0 +1,43 @@ +.\" +.\" Copyright (c) 1994 James A. Jegers +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. The name of the author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.\" +.Dd July 10, 1996 +.Dt NCR 4 i386 +.Os +.Sh NAME +.Nm ncr +.Nd NCR 53C810 SCSI driver +.Sh SYNOPSIS +.Cd "device ncr0" +.Sh DESCRIPTION +The +.Nm ncr +driver provides support for the NCR 53C810 and NCR 53C825 +SCSI controller chips. +.Sh SEE ALSO +.Xr intro 4 , +.Xr sd 4 , +.Xr st 4 , +.Xr cd 4 , +.Xr ch 4 diff --git a/share/man/man4/man4.i386/wt.4 b/share/man/man4/man4.i386/wt.4 new file mode 100644 index 000000000000..5ee71ce06af7 --- /dev/null +++ b/share/man/man4/man4.i386/wt.4 @@ -0,0 +1,44 @@ +.\" +.\" Copyright (c) 1994 James A. Jegers +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. The name of the author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd July 10, 1995 +.Dt WT 4 i386 +.Os +.Sh NAME +.Nm wt +.Nd +Archive/Wangtek cartridge tape driver +.Sh SYNOPSIS +.Cd "device wt0 at isa? port 0x300 bio irq 5 drq 1 vector wtintr" +.Sh DESCRIPTION +The +.Nm wt +driver provides support for the following Archive and Wangtek boards: +.Pp +.Bl -tag -width -offset indent -compact +.It QIC-02 +.It QIC-36 +.El +.Pp +.Sh SEE ALSO +.Xr intro 4 diff --git a/sys/dev/aic7xxx/aicasm.c b/sys/dev/aic7xxx/aicasm.c deleted file mode 100644 index 24140373b13d..000000000000 --- a/sys/dev/aic7xxx/aicasm.c +++ /dev/null @@ -1,685 +0,0 @@ -/*+M************************************************************************* - * Adaptec AIC7770/AIC7870 sequencer code assembler. - * - * Copyright (c) 1994 John Aycock - * The University of Calgary Department of Computer Science. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of Calgary - * Department of Computer Science and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * Comments are started by `#' and continue to the end of the line; lines - * may be of the form: - * <label>* - * <label>* <undef-sym> = <value> - * <label>* <opcode> <operand>* - * - * A <label> is an <undef-sym> ending in a colon. Spaces, tabs, and commas - * are token separators. - * - *-M*************************************************************************/ -static char id[] = "$Id: aic7xxx_asm.c,v 1.12 1996/03/31 03:02:35 gibbs Exp $"; -#include <ctype.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> - -#define MEMORY 448 -#define MAXLINE 1024 -#define MAXTOKEN 32 -#define ADOTOUT "a.out" -#define NOVALUE -1 - -/* - * AIC-7770/AIC-7870 register definitions - */ -#define R_SINDEX 0x65 -#define R_ALLONES 0x69 -#define R_ALLZEROS 0x6a -#define R_NONE 0x6a - -int debug; -int lineno, LC; -char *filename; -unsigned char M[MEMORY][4]; - -void -error(char *s) -{ - fprintf(stderr, "%s: %s at line %d\n", filename, s, lineno); - exit(EXIT_FAILURE); -} - -void * -Malloc(size_t size) -{ - void *p = malloc(size); - if (!p) - error("out of memory"); - return(p); -} - -void * -Realloc(void *ptr, size_t size) -{ - void *p = realloc(ptr, size); - if (!p) - error("out of memory"); - return(p); -} - -char * -Strdup(char *s) -{ - char *p = (char *)Malloc(strlen(s) + 1); - strcpy(p, s); - return(p); -} - -typedef struct sym_t { - struct sym_t *next; /* MUST BE FIRST */ - char *name; - int value; - int npatch; - int *patch; -} sym_t; - -sym_t *head; - -void -define(char *name, int value) -{ - sym_t *p, *q; - - for (p = head, q = (sym_t *)&head; p; p = p->next) { - if (!strcmp(p->name, name)) - error("redefined symbol"); - q = p; - } - - p = q->next = (sym_t *)Malloc(sizeof(sym_t)); - p->next = NULL; - p->name = Strdup(name); - p->value = value; - p->npatch = 0; - p->patch = NULL; - - if (debug) { - fprintf(stderr, "\"%s\" ", p->name); - if (p->value != NOVALUE) - fprintf(stderr, "defined as 0x%x\n", p->value); - else - fprintf(stderr, "undefined\n"); - } -} - -sym_t * -lookup(char *name) -{ - sym_t *p; - - for (p = head; p; p = p->next) - if (!strcmp(p->name, name)) - return(p); - return(NULL); -} - -void -patch(sym_t *p, int location) -{ - p->npatch += 1; - p->patch = (int *)Realloc(p->patch, p->npatch * sizeof(int *)); - - p->patch[p->npatch - 1] = location; -} - -void backpatch(void) -{ - int i; - sym_t *p; - - for (p = head; p; p = p->next) { - - if (p->value == NOVALUE) { - fprintf(stderr, - "%s: undefined symbol \"%s\"\n", - filename, p->name); - exit(EXIT_FAILURE); - } - - if (p->npatch) { - if (debug) - fprintf(stderr, - "\"%s\" (0x%x) patched at", - p->name, p->value); - - for (i = 0; i < p->npatch; i++) { - M[p->patch[i]][0] &= ~1; - M[p->patch[i]][0] |= ((p->value >> 8) & 1); - M[p->patch[i]][1] = p->value & 0xff; - - if (debug) - fprintf(stderr, " 0x%x", p->patch[i]); - } - - if (debug) - fputc('\n', stderr); - } - } -} - -/* - * Output words in byte-reversed order (least significant first) - * since the sequencer RAM is loaded that way. - */ -void -output(FILE *fp) -{ - int i; - - for (i = 0; i < LC; i++) - fprintf(fp, "\t0x%02x, 0x%02x, 0x%02x, 0x%02x,\n", - M[i][3], - M[i][2], - M[i][1], - M[i][0]); - printf("%d out of %d instructions used.\n", LC, MEMORY); -} - -char ** -getl(int *n) -{ - int i; - char *p, *quote; - static char buf[MAXLINE]; - static char *a[MAXTOKEN]; - - i = 0; - - while (fgets(buf, sizeof(buf), stdin)) { - - lineno += 1; - - if (buf[strlen(buf)-1] != '\n') - error("line too long"); - - p = strchr(buf, '#'); - if (p) - *p = '\0'; - p = buf; -rescan: - quote = strchr(p, '\"'); - if (quote) - *quote = '\0'; - for (p = strtok(p, ", \t\n"); p; p = strtok(NULL, ", \t\n")) - if (i < MAXTOKEN-1) - a[i++] = p; - else - error("too many tokens"); - if (quote) { - quote++; - p = strchr(quote, '\"'); - if (!p) - error("unterminated string constant"); - else if (i < MAXTOKEN-1) { - a[i++] = quote; - *p = '\0'; - p++; - } - else - error("too many tokens"); - goto rescan; - } - if (i) { - *n = i; - return(a); - } - } - return(NULL); -} - -#define A 0x8000 /* `A'ccumulator ok */ -#define I 0x4000 /* use as immediate value */ -#define SL 0x2000 /* shift left */ -#define SR 0x1000 /* shift right */ -#define RL 0x0800 /* rotate left */ -#define RR 0x0400 /* rotate right */ -#define LO 0x8000 /* lookup: ori-{jmp,jc,jnc,call} */ -#define LA 0x4000 /* lookup: and-{jz,jnz} */ -#define LX 0x2000 /* lookup: xor-{je,jne} */ -#define NA -1 /* not applicable */ - -struct { - char *name; - int n; /* number of operands, including opcode */ - unsigned int op; /* immediate or L?|pos_from_0 */ - unsigned int dest; /* NA, pos_from_0, or I|immediate */ - unsigned int src; /* NA, pos_from_0, or I|immediate */ - unsigned int imm; /* pos_from_0, A|pos_from_0, or I|immediate */ - unsigned int addr; /* NA or pos_from_0 */ - int fmt; /* instruction format - 1, 2, or 3 */ -} instr[] = { -/* - * N OP DEST SRC IMM ADDR FMT - */ - { "mov", 3, 1, 1, 2, I|0xff, NA, 1 }, - { "mov", 4, LO|2, NA, 1, I|0, 3, 3 }, - { "mvi", 3, 0, 1, I|R_ALLZEROS, A|2, NA, 1 }, - { "mvi", 4, LO|2, NA, I|R_ALLZEROS, 1, 3, 3 }, - { "not", 2, 2, 1, 1, I|0xff, NA, 1 }, - { "and", 3, 1, 1, 1, A|2, NA, 1 }, - { "and", 4, 1, 1, 3, A|2, NA, 1 }, - { "or", 3, 0, 1, 1, A|2, NA, 1 }, - { "or", 4, 0, 1, 3, A|2, NA, 1 }, - { "or", 5, LO|3, NA, 1, 2, 4, 3 }, - { "xor", 3, 2, 1, 1, A|2, NA, 1 }, - { "xor", 4, 2, 1, 3, A|2, NA, 1 }, - { "nop", 1, 1, I|R_NONE, I|R_ALLZEROS, I|0xff, NA, 1 }, - { "inc", 2, 3, 1, 1, I|1, NA, 1 }, - { "inc", 3, 3, 1, 2, I|1, NA, 1 }, - { "dec", 2, 3, 1, 1, I|0xff, NA, 1 }, - { "dec", 3, 3, 1, 2, I|0xff, NA, 1 }, - { "jmp", 2, LO|0, NA, I|R_SINDEX, I|0, 1, 3 }, - { "jc", 2, LO|0, NA, I|R_SINDEX, I|0, 1, 3 }, - { "jnc", 2, LO|0, NA, I|R_SINDEX, I|0, 1, 3 }, - { "call", 2, LO|0, NA, I|R_SINDEX, I|0, 1, 3 }, - { "test", 5, LA|3, NA, 1, A|2, 4, 3 }, - { "cmp", 5, LX|3, NA, 1, A|2, 4, 3 }, - { "ret", 1, 1, I|R_NONE, I|R_ALLZEROS, I|0xff, NA, 1 }, - { "ret", 1, 1, I|R_NONE, I|R_ALLZEROS, I|0xff, NA, 1 }, - { "clc", 1, 3, I|R_NONE, I|R_ALLZEROS, I|1, NA, 1 }, - { "clc", 4, 3, 2, I|R_ALLZEROS, A|3, NA, 1 }, - { "stc", 2, 3, 1, I|R_ALLONES, I|1, NA, 1 }, - { "add", 3, 3, 1, 1, A|2, NA, 1 }, - { "add", 4, 3, 1, 3, A|2, NA, 1 }, - { "adc", 3, 4, 1, 1, A|2, NA, 1 }, - { "adc", 4, 4, 1, 3, A|2, NA, 1 }, - { "shl", 3, 5, 1, 1, SL|2, NA, 2 }, - { "shl", 4, 5, 1, 2, SL|3, NA, 2 }, - { "shr", 3, 5, 1, 1, SR|2, NA, 2 }, - { "shr", 4, 5, 1, 2, SR|3, NA, 2 }, - { "rol", 3, 5, 1, 1, RL|2, NA, 2 }, - { "rol", 4, 5, 1, 2, RL|3, NA, 2 }, - { "ror", 3, 5, 1, 1, RR|2, NA, 2 }, - { "ror", 4, 5, 1, 2, RR|3, NA, 2 }, - /* - * Extensions (note also that mvi allows A) - */ - { "clr", 2, 1, 1, I|R_ALLZEROS, I|0xff, NA, 1 }, - { 0, 0, 0, 0, 0, 0, 0, 0 } -}; - -int -eval_operand(char **a, int spec) -{ - int i; - unsigned int want = spec & (LO|LA|LX); - - static struct { - unsigned int what; - char *name; - int value; - } jmptab[] = { - { LO, "jmp", 8 }, - { LO, "jc", 9 }, - { LO, "jnc", 10 }, - { LO, "call", 11 }, - { LA, "jz", 15 }, - { LA, "jnz", 13 }, - { LX, "je", 14 }, - { LX, "jne", 12 }, - }; - - spec &= ~(LO|LA|LX); - - for (i = 0; i < sizeof(jmptab)/sizeof(jmptab[0]); i++) - if (jmptab[i].what == want && - !strcmp(jmptab[i].name, a[spec])) - { - return(jmptab[i].value); - } - - if (want) - error("invalid jump"); - - return(spec); /* "case 0" - no flags set */ -} - -int -eval_sdi(char **a, int spec) -{ - sym_t *p; - unsigned val; - - if (spec == NA) - return(NA); - - switch (spec & (A|I|SL|SR|RL|RR)) { - case SL: - case SR: - case RL: - case RR: - if (isdigit(*a[spec &~ (SL|SR|RL|RR)])) - val = strtol(a[spec &~ (SL|SR|RL|RR)], NULL, 0); - else { - p = lookup(a[spec &~ (SL|SR|RL|RR)]); - if (!p) - error("undefined symbol used"); - val = p->value; - } - - switch (spec & (SL|SR|RL|RR)) { /* blech */ - case SL: - if (val > 7) - return(0xf0); - return(((val % 8) << 4) | - (val % 8)); - case SR: - if (val > 7) - return(0xf0); - return(((val % 8) << 4) | - (1 << 3) | - ((8 - (val % 8)) % 8)); - case RL: - return(val % 8); - case RR: - return((8 - (val % 8)) % 8); - } - case I: - return(spec &~ I); - case A: - /* - * An immediate field of zero selects - * the accumulator. Vigorously object - * if zero is given otherwise - it's - * most likely an error. - */ - spec &= ~A; - if (!strcmp("A", a[spec])) - return(0); - if (isdigit(*a[spec]) && - strtol(a[spec], NULL, 0) == 0) - { - error("immediate value of zero selects accumulator"); - } - /* falls through */ - case 0: - if (isdigit(*a[spec])) - return(strtol(a[spec], NULL, 0)); - p = lookup(a[spec]); - if (p) - return(p->value); - error("undefined symbol used"); - } - - return(NA); /* shut the compiler up */ -} - -int -eval_addr(char **a, int spec) -{ - sym_t *p; - - if (spec == NA) - return(NA); - if (isdigit(*a[spec])) - return(strtol(a[spec], NULL, 0)); - - p = lookup(a[spec]); - - if (p) { - if (p->value != NOVALUE) - return(p->value); - patch(p, LC); - } else { - define(a[spec], NOVALUE); - p = lookup(a[spec]); - patch(p, LC); - } - - return(NA); /* will be patched in later */ -} - -int -crack(char **a, int n) -{ - int i; - int I_imm, I_addr; - int I_op, I_dest, I_src, I_ret; - - /* - * Check for "ret" at the end of the line; remove - * it unless it's "ret" alone - we still want to - * look it up in the table. - */ - I_ret = (strcmp(a[n-1], "ret") ? 0 : !0); - if (I_ret && n > 1) - n -= 1; - - for (i = 0; instr[i].name; i++) { - /* - * Look for match in table given constraints, - * currently just the name and the number of - * operands. - */ - if (!strcmp(instr[i].name, *a) && instr[i].n == n) - break; - } - if (!instr[i].name) - error("unknown opcode or wrong number of operands"); - - I_op = eval_operand(a, instr[i].op); - I_src = eval_sdi(a, instr[i].src); - I_imm = eval_sdi(a, instr[i].imm); - I_dest = eval_sdi(a, instr[i].dest); - I_addr = eval_addr(a, instr[i].addr); - - if( LC >= MEMORY ) - error("Memory exhausted!\n"); - - switch (instr[i].fmt) { - case 1: - case 2: - M[LC][0] = (I_op << 1) | I_ret; - M[LC][1] = I_dest; - M[LC][2] = I_src; - M[LC][3] = I_imm; - break; - case 3: - if (I_ret) - error("illegal use of \"ret\""); - M[LC][0] = (I_op << 1) | ((I_addr >> 8) & 1); - M[LC][1] = I_addr & 0xff; - M[LC][2] = I_src; - M[LC][3] = I_imm; - break; - } - - return (1); /* no two-byte instructions yet */ -} - -#undef SL -#undef SR -#undef RL -#undef RR -#undef LX -#undef LA -#undef LO -#undef I -#undef A - -void -assemble(FILE *ofile) -{ - int n; - char **a; - sym_t *p; - - while ((a = getl(&n))) { - - while (a[0][strlen(*a)-1] == ':') { - a[0][strlen(*a)-1] = '\0'; - p = lookup(*a); - if (p) - p->value = LC; - else - define(*a, LC); - a += 1; - n -= 1; - } - - if (!n) /* line was all labels */ - continue; - - if (n == 3 && !strcmp("VERSION", *a)) - fprintf(ofile, "#define %s \"%s\"\n", a[1], a[2]); - else { - if (n == 3 && !strcmp("=", a[1])) - define(*a, strtol(a[2], NULL, 0)); - else - LC += crack(a, n); - } - } - - backpatch(); - output(ofile); - - if (debug) - output(stderr); -} - -int -main(int argc, char **argv) -{ - int c; - int pid; - int ifile; - FILE *ofile; - int fd[2]; - - ofile = NULL; - while ((c = getopt(argc, argv, "dho:vD:")) != EOF) { - switch (c) { - case 'd': - debug = !0; - break; - case 'D': - { - char *p; - if ((p = strchr(optarg, '=')) != NULL) { - *p = '\0'; - define(optarg, strtol(p + 1, NULL, 0)); - } - else - define(optarg, 1); - break; - } - case 'o': - - if ((ofile = fopen(optarg, "w")) == NULL) { - perror(optarg); - exit(EXIT_FAILURE); - } - break; - case 'h': - printf("usage: %s [-d] [-Dname] [-ooutput] input\n", - *argv); - exit(EXIT_SUCCESS); - break; - case 'v': - printf("%s\n", id); - exit(EXIT_SUCCESS); - break; - default: - exit(EXIT_FAILURE); - break; - } - } - - if (argc - optind != 1) { - fprintf(stderr, "%s: must have one input file\n", *argv); - exit(EXIT_FAILURE); - } - filename = argv[optind]; - - - if ((ifile = open(filename, O_RDONLY)) < 0) { - perror(filename); - exit(EXIT_FAILURE); - } - - if (!ofile) { - if ((ofile = fopen(ADOTOUT, "w")) == NULL) { - perror(ADOTOUT); - exit(EXIT_FAILURE); - } - } - - if (pipe(fd) < 0) { - perror("pipe failed"); - exit(1); - } - - if ((pid = fork()) < 0 ) { - perror("fork failed"); - exit(1); - } - else if (pid > 0) { /* Parent */ - close(fd[1]); /* Close write end */ - if (fd[0] != STDIN_FILENO) { - if (dup2(fd[0], STDIN_FILENO) != STDIN_FILENO) { - perror("dup2 error on stdin"); - exit(EXIT_FAILURE); - } - close(fd[0]); - } - assemble(ofile); - exit(EXIT_SUCCESS); - } - else { /* Child */ - close(fd[0]); /* Close Read end */ - if (fd[1] != STDOUT_FILENO) { - if (dup2(fd[1], STDOUT_FILENO) != STDOUT_FILENO) { - perror("dup2 error on stdout"); - exit(EXIT_FAILURE); - } - close(fd[1]); - } - if (ifile != STDIN_FILENO) { - if (dup2(ifile, STDIN_FILENO) != STDIN_FILENO) { - perror("dup2 error on stdin"); - exit(EXIT_FAILURE); - } - close(ifile); - } - execl("/usr/bin/cpp", "/usr/bin/cpp", "-P", "-", "-", NULL); - } - return(EXIT_SUCCESS); -} diff --git a/usr.sbin/mrouted/RELEASE b/usr.sbin/mrouted/RELEASE deleted file mode 100644 index 7dff93789cce..000000000000 --- a/usr.sbin/mrouted/RELEASE +++ /dev/null @@ -1,326 +0,0 @@ -Id: README-3.8.mrouted,v 3.8 1995/11/29 22:23:02 fenner Rel - - IP Multicast Extensions for BSD-Derived Unix Systems - - Release 3.8 - November 29, 1995 - - available from parcftp.xerox.com, - file pub/net-research/ipmulti/mrouted3.8.tar.Z - binaries pub/net-research/ipmulti/mrouted3.8-sparc-sunos41x.tar.Z - pub/net-research/ipmulti/mrouted3.8-sparc-solaris2.tar.Z - pub/net-research/ipmulti/mrouted3.8-i386-bsd.tar.Z - pub/net-research/ipmulti/mrouted3.8-alpha-osf1.tar.Z - pub/net-research/ipmulti/mrouted3.8-sgi-irix.tar.Z - pub/net-research/ipmulti/mrouted3.8-hp-hpux.tar.Z - -Note: The 3.8 release is mrouted-only, and will run on top of a 3.5 kernel. -It is a drop-in replacement for mrouted 3.5, 3.6 or 3.7 . - -The 3.8 release fixes the following bugs: - - o mrouted would fail to forget prunes when a neighbor went away, - thus potentially sending traffic down a tunnel after the tunnel - endpoint has gone down. This was due to some research code making - it into the "emergency" 3.7 release, sigh. - - o mrouted could send prunes with negative lifetimes. This causes - slightly higher prune traffic but shouldn't be any major problem. - -=========== -Release 3.7 -November 28, 1995 - -The 3.7 release fixes the following bugs: - - o mrouted now ignores route reports that include bogus netmasks. - There was a bug in 3.5 that would mangle default routes into - tens of bogus routes; this should prevent that bug from killing - the MBONE. - - This solution can cause route flaps and black holes until the - 3.5's are gone or all of the 3.5's neighbors are 3.7 . - - o mrouted now ignores duplicate routes. Ciscos and the above 3.5 - bug could cause two copies of the same route to appear in a single - routing update; mrouted would insert two copies of the same route - into its routing table and wreak all sorts of havoc. - - o mrouted now sends a group-specific query for both retransmissions - of a g-s query; previous versions sent a general query the second - time. - - o mrouted now loops back multicasted mtrace responses and - group-specific membership queries - - o mrouted now performs deterministic tiebreaking between two - neighbors on the same vif. - - o mrouted now only does duplicate suppression on traceroute requests, - not all traceroute packets, so that a loop can be nicely detected - via a duplicate router instead of just a timeout. - - o the buffer size that mrouted uses has been increased to allow - more than 16 hops in mtrace messages. - - o mtrace's hop-by-hop termination is now more likely to be correct. - - o mrinfo now waits for the responses to its retransmitted queries. - -The 3.7 release has the following new features: - - o The configuration file can accept a hostname as the other end - of a tunnel. There must be a single name->ip mapping for the - given name, however, or mrouted will fail to start up. - - o mrinfo now sends requests to all interfaces of a multihomed host. - - o mtrace's passive mode has been implemented. - - o The first screen of mtrace statistics is shorter and more likely - to fit on one screen. - -=========== -Release 3.6 -June 26, 1995 - -The 3.6 release fixes the following bugs: - - o mrouted would dump core when attempting to report no routes (i.e. upon - startup, if you have no enabled phyint's) - - o mrouted would dump core if requested to traceroute a source for which it - had no route - - o neighbor flags were not always properly updated on probe or report - - o mrouted would sometimes reply to a multicast traceroute on a disabled - phyint; now it uses the first configured phyint to reply to traceroutes. - - o host routes (i.e. netmask 0xffffffff) works now; it was discarding - IGMP from the host because it was coming from the "broadcast address" - of the subnet. - - o send_igmp() now treats the failure to send an mtrace or a neighbor - reply as informational, as opposed to warning. - - o mrouted would go into an infinite loop trying to respond to a traceroute - for a source with a netmask of 0xffffffff. - - o vifs_with_neighbors was not being reset if the mrouted was restarted - with SIGHUP - - o the default route was not being properly advertised to neighbors (although - it was accepted if it was advertised to it) - - o ANSI-fication for those who it helps, still-K&R-ish for those it doesn't. - - o mtrace now attempts to trace three hops past a non-responding router, - in the hopes that it does support traceroute but just couldn't respond - (i.e. unicast didn't work and it can't source multicast because all its - phyints are disabled). - - o mrinfo now times out even on a multicast router. - - -=========== -Release 3.5 -May 8, 1995 - -The 3.5 release has the following new features: - - o The kernel and mrouted make sure that each is the correct version, to - prevent problems with mismatched kernel/mrouted versions. A too-old - mrouted will die with the error: - - can't enable DVMRP routing in kernel: Option not supported by protocol - - o mrouted can accept and propogate a default route (essential for - heirarchical multicast routing) - - o Kernel route cache keeps source-specific routes instead of subnet routes, - eliminating hashing and longest-match problems. - (allows classless routing, longest-match and default routing) - - o Cached kernel routes only get deleted if no traffic is flowing, to - facilitate multicast traceroute - - o mrouted has a new configuration file parser, which provides better error - messages than before, and allows named boundaries (see man page) - - o added "netmask" to phyint configuration, at the suggestion of - Anders Klemets - - o System V and FreeBSD compatibility from John Brezak <brezak@ch.hp.com> - - o phyint's can have additional subnets configured, for people with - multiple subnets on one physical network. mrouted.conf syntax is - altnet 1.2.3.0, or altnet 1.2.3.0/24 if you need to specify - a different netmask. There can be as many altnet statements - as you need. - - o both mrouted and the kernel now support classless addresses. - - o the kernel supports PIM assert processing by notifying the router - when a packet arrives on the wrong interface - - o the kernel keeps additional counters, and mrouted can be compiled to - support SNMP and the Multicast MIB - - o the packet classifier in the kernel now uses the following udp port - ranges: - [0, 16384) - lowest priority, unclassified - [16384, 32768) - highest priority, i.e. audio - [32768, 49152) - medium priority, i.e. whiteboard - [49152, 65536) - low priority, i.e. video - A future release of a session directory will allocate ports in these - ranges. - - o the configuration code has been modified to default tunnels' rate_limit - parameters to 500kbps. This is easily modified with a rate_limit keyword - in mrouted.conf, but should be a good default for the MBONE in general. - - o The tunnel sending code now caches a route for ip_output(), this should - help performance on machines with lots of tunnels. - - o Dispatching for de-capsulating packets is now via protosw[], making - reception of other raw protocols more efficient - - o Neighbor capabilities are discovered via a bitmask as opposed to - version number. - - o Multicast traceroute code improved - - o mrouted can be compiled with Routing Support for Resource Reservation - (RSRR), required for RSVP. - - -The 3.5 release fixes the following bugs: - - o The IGMPv2 query timeout field was interpreted as being in units of - 200ms as opposed to 100ms, thus the maximum timeout was set to twice - the expected value. This is not fatal, as mrouted always queries - twice in the expectation that a packet could get loss, but it does - make it less robust in the face of packet loss. - - o IGMP could report membership in local-only groups (i.e. 224.0.0.X) - - o IGMP could get confused by hearing its own new membership reports, thus - a router would never perform fast leave. - - o IGMP could reset timers for the wrong interface. - - o mrouted put a bogus value in the maximum timeout field of IGMPv2 query - packets. - - o Non-querier mrouters would respond to IGMP leave messages - - o mrouted was not performing fast leave properly - - o If the last member goes away on a transit network, the upstream router - would stop forwarding even if there are downstream members. - - o Kernel hash function improved - - o Eliminated possibility of panic(): timeout in cache maintenance - - o Reordered resource allocation when sending upcall to handle failure properly - - o some endian-ness bugs squashed in mrouted, probably more to go. - - o Multicast traceroute could send a reply on a disabled interface. - - -This release consists of the following files: - - - README-3.8.mrouted - this file - - mrouted/* - version 3.8 of mrouted, - mrinfo, map-mbone and - mtrace. - - ifconfig/* - Changes to ifconfig to - show multicast interfaces - - netstat/* - Diffs to netstat - - ping/* - sources for ping - which support - multicasting - - mtest/* - utility for testing - multicast group - membership - - -MROUTED 3.8 - -Mrouted 3.8 has two optional features: SNMP and RSRR. RSRR support -is required for running RSVP; the SNMP code, with the help of the -ISODE snmpd, implements both the Multicast MIB and the DVMRP MIB. - -RSRR ----- -Routing Support for Resource Reservations (RSRR) was contributed by -Daniel Zappala <daniel@isi.edu>. - -To enable RSRR support, uncomment the three lines starting with -RSRR near the top of the Makefile and "make clean; make". Or use -the prebuilt binary, mrouted.rsrr . - -RSRR allows RSVP to query mrouted for its routing entry for a particular -source-group pair. Using the routing entry and the IP_MULTICAST_VIF -socket call, RSVP can forward distinct control messages out each -outgoing interface. This version of mrouted supports RSRR messages -using a Unix datagram socket. - -RSRR currently includes two pairs of query-reply messages. RSVP sends -an Initial Query when it starts. Mrouted responds with an Initial Reply -that includes the set of vifs it is using, flagging those that are -administratively disabled. When RSVP needs the routing entry for a -source-group pair, it sends a Route Query. Mrouted responds with a -Route Reply that includes the incoming vif and outgoing vifs for the -source-group pair. - -RSVP may request route change notification by setting the notification -bit in the Route Query. If mrouted can provide route change -notification for the source-group pair, it sets the notification bit in -its Route Reply. When the routing entry for the source-group pair -changes, mrouted sends an unsolicited Route Reply containing the new -routing information. The initial release of mrouted 3.5 did not support -route change notification and always returned a Route Reply with the -notification bit cleared. This release of mrouted provides route change -notification when possible. - -SNMP ----- -SNMP support was contributed by David Thaler <thalerd@eecs.umich.edu>. - -To enable SNMP support, uncomment the six lines near the top of -the Makefile below the description of SNMP support, or use the -prebuilt binary, mrouted.snmp or mrouted.rsrr.snmp . - -To link the SNMP-capable mrouted, you need the CMU libraries. -See http://nic.merit.edu/~mbone/ for a full mrouted-snmp distribution. - -Make sure to add the "sysName", "sysContact", "sysVersion" and -"sysLocation" variables to your /etc/mrouted.conf if you want them -to provide anything other than default values. - -Example: - -sysName "tibia" -sysContact "Bill Fenner <fenner@parc.xerox.com> +1 415 812-4816" -sysVersion "SunOS 4.1.3 and mrouted 3.8" -sysLocation "MAXC room, PARC building 35" - -The SNMP version of mrouted has an additional command line flag: - - -P snmp_port - - Specifies a port for SNMP communication (default 161). This option - should be used when another SNMP daemon already exists. The - preferred alternate port in this case is port 9161. - -The mstat(8) program allows querying of statistics using SNMP. |