Home | History | Annotate | Line # | Download | only in sysinst
main.c revision 1.4
      1  1.4    martin /*	$NetBSD: main.c,v 1.4 2014/08/19 13:04:45 martin Exp $	*/
      2  1.1  dholland 
      3  1.1  dholland /*
      4  1.1  dholland  * Copyright 1997 Piermont Information Systems Inc.
      5  1.1  dholland  * All rights reserved.
      6  1.1  dholland  *
      7  1.1  dholland  * Written by Philip A. Nelson for Piermont Information Systems Inc.
      8  1.1  dholland  *
      9  1.1  dholland  * Redistribution and use in source and binary forms, with or without
     10  1.1  dholland  * modification, are permitted provided that the following conditions
     11  1.1  dholland  * are met:
     12  1.1  dholland  * 1. Redistributions of source code must retain the above copyright
     13  1.1  dholland  *    notice, this list of conditions and the following disclaimer.
     14  1.1  dholland  * 2. Redistributions in binary form must reproduce the above copyright
     15  1.1  dholland  *    notice, this list of conditions and the following disclaimer in the
     16  1.1  dholland  *    documentation and/or other materials provided with the distribution.
     17  1.1  dholland  * 3. The name of Piermont Information Systems Inc. may not be used to endorse
     18  1.1  dholland  *    or promote products derived from this software without specific prior
     19  1.1  dholland  *    written permission.
     20  1.1  dholland  *
     21  1.1  dholland  * THIS SOFTWARE IS PROVIDED BY PIERMONT INFORMATION SYSTEMS INC. ``AS IS''
     22  1.1  dholland  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  1.1  dholland  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  1.1  dholland  * ARE DISCLAIMED. IN NO EVENT SHALL PIERMONT INFORMATION SYSTEMS INC. BE
     25  1.1  dholland  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     26  1.1  dholland  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     27  1.1  dholland  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     28  1.1  dholland  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     29  1.1  dholland  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     30  1.1  dholland  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     31  1.1  dholland  * THE POSSIBILITY OF SUCH DAMAGE.
     32  1.1  dholland  *
     33  1.1  dholland  */
     34  1.1  dholland 
     35  1.1  dholland /* main sysinst program. */
     36  1.1  dholland 
     37  1.1  dholland #include <sys/types.h>
     38  1.1  dholland #include <sys/stat.h>
     39  1.3    martin #include <sys/syslimits.h>
     40  1.1  dholland #include <sys/uio.h>
     41  1.1  dholland #include <stdio.h>
     42  1.1  dholland #include <signal.h>
     43  1.1  dholland #include <curses.h>
     44  1.1  dholland #include <unistd.h>
     45  1.1  dholland #include <fcntl.h>
     46  1.1  dholland #include <dirent.h>
     47  1.1  dholland #include <locale.h>
     48  1.1  dholland 
     49  1.1  dholland #include "defs.h"
     50  1.1  dholland #include "md.h"
     51  1.1  dholland #include "msg_defs.h"
     52  1.1  dholland #include "menu_defs.h"
     53  1.1  dholland #include "txtwalk.h"
     54  1.1  dholland 
     55  1.1  dholland int main(int, char **);
     56  1.1  dholland static void select_language(void);
     57  1.1  dholland __dead static void usage(void);
     58  1.1  dholland __dead static void miscsighandler(int);
     59  1.1  dholland static void ttysighandler(int);
     60  1.1  dholland static void cleanup(void);
     61  1.1  dholland static void process_f_flag(char *);
     62  1.1  dholland 
     63  1.1  dholland static int exit_cleanly = 0;	/* Did we finish nicely? */
     64  1.1  dholland FILE *logfp;			/* log file */
     65  1.1  dholland FILE *script;			/* script file */
     66  1.1  dholland 
     67  1.1  dholland #ifdef DEBUG
     68  1.1  dholland extern int log_flip(void);
     69  1.1  dholland #endif
     70  1.1  dholland 
     71  1.2    martin /* Definion for colors */
     72  1.2    martin 
     73  1.2    martin struct {
     74  1.2    martin 	unsigned int bg;
     75  1.2    martin 	unsigned int fg;
     76  1.2    martin } clr_arg;
     77  1.2    martin 
     78  1.1  dholland /* String defaults and stuff for processing the -f file argument. */
     79  1.1  dholland 
     80  1.2    martin static char bsddiskname[DISKNAME_SIZE]; /* default name for fist selected disk */
     81  1.2    martin 
     82  1.1  dholland struct f_arg {
     83  1.1  dholland 	const char *name;
     84  1.1  dholland 	const char *dflt;
     85  1.1  dholland 	char *var;
     86  1.1  dholland 	int size;
     87  1.1  dholland };
     88  1.1  dholland 
     89  1.1  dholland static const struct f_arg fflagopts[] = {
     90  1.1  dholland 	{"release", REL, rel, sizeof rel},
     91  1.1  dholland 	{"machine", MACH, machine, sizeof machine},
     92  1.1  dholland 	{"xfer dir", "/usr/INSTALL", xfer_dir, sizeof xfer_dir},
     93  1.1  dholland 	{"ext dir", "", ext_dir_bin, sizeof ext_dir_bin},
     94  1.1  dholland 	{"ext src dir", "", ext_dir_src, sizeof ext_dir_src},
     95  1.1  dholland 	{"ftp host", SYSINST_FTP_HOST, ftp.host, sizeof ftp.host},
     96  1.1  dholland 	{"ftp dir", SYSINST_FTP_DIR, ftp.dir, sizeof ftp.dir},
     97  1.1  dholland 	{"ftp prefix", "/" MACH "/binary/sets", set_dir_bin, sizeof set_dir_bin},
     98  1.1  dholland 	{"ftp src prefix", "/source/sets", set_dir_src, sizeof set_dir_src},
     99  1.1  dholland 	{"ftp user", "ftp", ftp.user, sizeof ftp.user},
    100  1.1  dholland 	{"ftp pass", "", ftp.pass, sizeof ftp.pass},
    101  1.1  dholland 	{"ftp proxy", "", ftp.proxy, sizeof ftp.proxy},
    102  1.1  dholland 	{"nfs host", "", nfs_host, sizeof nfs_host},
    103  1.1  dholland 	{"nfs dir", "/bsd/release", nfs_dir, sizeof nfs_dir},
    104  1.1  dholland 	{"cd dev", 0, cdrom_dev, sizeof cdrom_dev}, /* default filled in init */
    105  1.1  dholland 	{"fd dev", "/dev/fd0a", fd_dev, sizeof fd_dev},
    106  1.1  dholland 	{"local dev", "", localfs_dev, sizeof localfs_dev},
    107  1.1  dholland 	{"local fs", "ffs", localfs_fs, sizeof localfs_fs},
    108  1.1  dholland 	{"local dir", "release", localfs_dir, sizeof localfs_dir},
    109  1.1  dholland 	{"targetroot mount", "/targetroot", targetroot_mnt, sizeof targetroot_mnt},
    110  1.1  dholland 	{"dist postfix", ".tgz", dist_postfix, sizeof dist_postfix},
    111  1.1  dholland 	{"diskname", "mydisk", bsddiskname, sizeof bsddiskname},
    112  1.1  dholland 	{"pkg host", SYSINST_PKG_HOST, pkg.host, sizeof pkg.host},
    113  1.1  dholland 	{"pkg dir", SYSINST_PKG_DIR, pkg.dir, sizeof pkg.dir},
    114  1.1  dholland 	{"pkg prefix", "/" MACH "/" REL "/All", pkg_dir, sizeof pkg_dir},
    115  1.1  dholland 	{"pkg user", "ftp", pkg.user, sizeof pkg.user},
    116  1.1  dholland 	{"pkg pass", "", pkg.pass, sizeof pkg.pass},
    117  1.1  dholland 	{"pkg proxy", "", pkg.proxy, sizeof pkg.proxy},
    118  1.1  dholland 	{"pkgsrc host", SYSINST_PKGSRC_HOST, pkgsrc.host, sizeof pkgsrc.host},
    119  1.1  dholland 	{"pkgsrc dir", "", pkgsrc.dir, sizeof pkgsrc.dir},
    120  1.1  dholland 	{"pkgsrc prefix", "pub/pkgsrc/stable", pkgsrc_dir, sizeof pkgsrc_dir},
    121  1.1  dholland 	{"pkgsrc user", "ftp", pkgsrc.user, sizeof pkgsrc.user},
    122  1.1  dholland 	{"pkgsrc pass", "", pkgsrc.pass, sizeof pkgsrc.pass},
    123  1.1  dholland 	{"pkgsrc proxy", "", pkgsrc.proxy, sizeof pkgsrc.proxy},
    124  1.1  dholland 
    125  1.1  dholland 	{NULL, NULL, NULL, 0}
    126  1.1  dholland };
    127  1.1  dholland 
    128  1.1  dholland static void
    129  1.1  dholland init(void)
    130  1.1  dholland {
    131  1.1  dholland 	const struct f_arg *arg;
    132  1.2    martin 
    133  1.1  dholland 	sizemult = 1;
    134  1.2    martin 	multname = msg_string(MSG_secname);
    135  1.1  dholland 	tmp_ramdisk_size = 0;
    136  1.1  dholland 	clean_xfer_dir = 0;
    137  1.1  dholland 	mnt2_mounted = 0;
    138  1.1  dholland 	fd_type = "msdos";
    139  1.2    martin 	layoutkind = LY_SETNEW;
    140  1.2    martin 
    141  1.2    martin 	pm_head = (struct pm_head_t) SLIST_HEAD_INITIALIZER(pm_head);
    142  1.2    martin 	SLIST_INIT(&pm_head);
    143  1.2    martin 	pm_new = malloc (sizeof (pm_devs_t));
    144  1.2    martin 	memset(pm_new, 0, sizeof *pm_new);
    145  1.1  dholland 
    146  1.1  dholland 	for (arg = fflagopts; arg->name != NULL; arg++) {
    147  1.1  dholland 		if (arg->var == cdrom_dev)
    148  1.1  dholland 			strlcpy(arg->var, get_default_cdrom(), arg->size);
    149  1.1  dholland 		else
    150  1.1  dholland 			strlcpy(arg->var, arg->dflt, arg->size);
    151  1.1  dholland 	}
    152  1.2    martin 	strlcpy(pm_new->bsddiskname, bsddiskname, sizeof pm_new->bsddiskname);
    153  1.1  dholland 	pkg.xfer_type = pkgsrc.xfer_type = "http";
    154  1.2    martin 
    155  1.2    martin 	clr_arg.bg=COLOR_BLUE;
    156  1.2    martin 	clr_arg.fg=COLOR_WHITE;
    157  1.1  dholland }
    158  1.1  dholland 
    159  1.1  dholland __weakref_visible void prelim_menu(void)
    160  1.1  dholland     __weak_reference(md_prelim_menu);
    161  1.1  dholland 
    162  1.1  dholland int
    163  1.1  dholland main(int argc, char **argv)
    164  1.1  dholland {
    165  1.1  dholland 	int ch;
    166  1.1  dholland 
    167  1.1  dholland 	init();
    168  1.1  dholland #ifdef DEBUG
    169  1.1  dholland 	log_flip();
    170  1.1  dholland #endif
    171  1.2    martin 
    172  1.1  dholland 	/* Check for TERM ... */
    173  1.1  dholland 	if (!getenv("TERM")) {
    174  1.1  dholland 		(void)fprintf(stderr,
    175  1.1  dholland 			 "sysinst: environment variable TERM not set.\n");
    176  1.1  dholland 		exit(4);
    177  1.1  dholland 	}
    178  1.1  dholland 
    179  1.1  dholland 	/* argv processing */
    180  1.2    martin 	while ((ch = getopt(argc, argv, "Dr:f:C:p")) != -1)
    181  1.1  dholland 		switch(ch) {
    182  1.1  dholland 		case 'D':	/* set to get past certain errors in testing */
    183  1.1  dholland 			debug = 1;
    184  1.1  dholland 			break;
    185  1.1  dholland 		case 'r':
    186  1.1  dholland 			/* Release name other than compiled in release. */
    187  1.1  dholland 			strncpy(rel, optarg, sizeof rel);
    188  1.1  dholland 			break;
    189  1.1  dholland 		case 'f':
    190  1.1  dholland 			/* Definition file to read. */
    191  1.1  dholland 			process_f_flag(optarg);
    192  1.1  dholland 			break;
    193  1.2    martin 		case 'C':
    194  1.2    martin 			/* Define colors */
    195  1.2    martin 			sscanf(optarg, "%u:%u", &clr_arg.bg, &clr_arg.fg);
    196  1.2    martin 			break;
    197  1.2    martin 		case 'p':
    198  1.2    martin 			/* Partition tool */
    199  1.2    martin 			partman_go = 1;
    200  1.2    martin 			break;
    201  1.1  dholland 		case '?':
    202  1.1  dholland 		default:
    203  1.1  dholland 			usage();
    204  1.1  dholland 		}
    205  1.1  dholland 
    206  1.1  dholland 	md_init();
    207  1.1  dholland 
    208  1.1  dholland 	/* initialize message window */
    209  1.1  dholland 	if (menu_init()) {
    210  1.1  dholland 		__menu_initerror();
    211  1.1  dholland 		exit(4);
    212  1.1  dholland 	}
    213  1.1  dholland 
    214  1.1  dholland 	/*
    215  1.1  dholland 	 * Put 'messages' in a window that has a one-character border
    216  1.1  dholland 	 * on the real screen.
    217  1.1  dholland 	 */
    218  1.2    martin 	mainwin = newwin(getmaxy(stdscr) - 2, getmaxx(stdscr) - 2, 1, 1);
    219  1.2    martin 	if (mainwin == NULL) {
    220  1.1  dholland 		(void)fprintf(stderr,
    221  1.1  dholland 			 "sysinst: screen too small\n");
    222  1.1  dholland 		exit(1);
    223  1.1  dholland 	}
    224  1.1  dholland 	if (has_colors()) {
    225  1.2    martin 		start_color();
    226  1.2    martin 		do_coloring(clr_arg.fg,clr_arg.bg);
    227  1.2    martin 	} else {
    228  1.2    martin 		remove_color_options();
    229  1.1  dholland 	}
    230  1.2    martin 	msg_window(mainwin);
    231  1.1  dholland 
    232  1.1  dholland 	/* Watch for signals and clean up */
    233  1.1  dholland 	(void)atexit(cleanup);
    234  1.1  dholland 	(void)signal(SIGINT, ttysighandler);
    235  1.1  dholland 	(void)signal(SIGQUIT, ttysighandler);
    236  1.1  dholland 	(void)signal(SIGHUP, miscsighandler);
    237  1.1  dholland 
    238  1.1  dholland 	/* redraw screen */
    239  1.1  dholland 	touchwin(stdscr);
    240  1.1  dholland 	refresh();
    241  1.1  dholland 
    242  1.1  dholland 	/* Ensure we have mountpoint for target filesystems */
    243  1.1  dholland 	mkdir(targetroot_mnt, S_IRWXU| S_IRGRP|S_IXGRP | S_IROTH|S_IXOTH);
    244  1.1  dholland 
    245  1.1  dholland 	select_language();
    246  1.1  dholland 	get_kb_encoding();
    247  1.1  dholland 
    248  1.1  dholland #ifdef __weak_reference
    249  1.1  dholland 	/* if md wants to ask anything before we start, do it now */
    250  1.1  dholland 	if (prelim_menu != 0)
    251  1.1  dholland 		prelim_menu();
    252  1.1  dholland #endif
    253  1.1  dholland 
    254  1.1  dholland 	/* Menu processing */
    255  1.2    martin 	if (partman_go)
    256  1.2    martin 		partman();
    257  1.2    martin 	else
    258  1.2    martin 		process_menu(MENU_netbsd, NULL);
    259  1.1  dholland 
    260  1.1  dholland 	exit_cleanly = 1;
    261  1.1  dholland 	return 0;
    262  1.1  dholland }
    263  1.1  dholland 
    264  1.1  dholland static int
    265  1.1  dholland set_language(menudesc *m, void *arg)
    266  1.1  dholland {
    267  1.1  dholland 	char **fnames = arg;
    268  1.1  dholland 
    269  1.1  dholland 	msg_file(fnames[m->cursel]);
    270  1.1  dholland 	return 1;
    271  1.1  dholland }
    272  1.1  dholland 
    273  1.1  dholland static void
    274  1.1  dholland select_language(void)
    275  1.1  dholland {
    276  1.1  dholland 	DIR *dir;
    277  1.1  dholland 	struct dirent *dirent;
    278  1.1  dholland 	char **lang_msg, **fnames;
    279  1.3    martin 	char prefix[PATH_MAX], fname[PATH_MAX];
    280  1.1  dholland 	int max_lang = 16, num_lang = 0;
    281  1.1  dholland 	const char *cp;
    282  1.1  dholland 	menu_ent *opt = 0;
    283  1.1  dholland 	int lang_menu = -1;
    284  1.1  dholland 	int lang;
    285  1.1  dholland 
    286  1.3    martin #ifdef CATALOG_DIR
    287  1.3    martin 	strcpy(prefix, CATALOG_DIR "/");
    288  1.3    martin 	dir = opendir(CATALOG_DIR);
    289  1.3    martin 	if (!dir) {
    290  1.3    martin 		strcpy(prefix, "./");
    291  1.3    martin 		dir = opendir(".");
    292  1.3    martin 	}
    293  1.3    martin #else
    294  1.1  dholland 	dir = opendir(".");
    295  1.3    martin 	strcpy(prefix, "./");
    296  1.3    martin #endif
    297  1.1  dholland 	if (!dir)
    298  1.1  dholland 		return;
    299  1.1  dholland 
    300  1.1  dholland 	lang_msg = malloc(max_lang * sizeof *lang_msg);
    301  1.1  dholland 	fnames = malloc(max_lang * sizeof *fnames);
    302  1.1  dholland 	if (!lang_msg || !fnames)
    303  1.1  dholland 		goto done;
    304  1.1  dholland 
    305  1.1  dholland 	lang_msg[0] = strdup(msg_string(MSG_sysinst_message_language));
    306  1.1  dholland 	fnames[0] = 0;
    307  1.1  dholland 	num_lang = 1;
    308  1.1  dholland 
    309  1.1  dholland 	while ((dirent = readdir(dir)) != 0) {
    310  1.1  dholland 		if (memcmp(dirent->d_name, "sysinstmsgs.", 12))
    311  1.1  dholland 			continue;
    312  1.3    martin 		strcpy(fname, prefix);
    313  1.3    martin 		strcat(fname, dirent->d_name);
    314  1.3    martin 		if (msg_file(fname))
    315  1.1  dholland 			continue;
    316  1.1  dholland 		cp = msg_string(MSG_sysinst_message_language);
    317  1.1  dholland 		if (!strcmp(cp, lang_msg[0]))
    318  1.1  dholland 			continue;
    319  1.1  dholland 		if (num_lang == max_lang) {
    320  1.1  dholland 			char **new;
    321  1.1  dholland 			max_lang *= 2;
    322  1.1  dholland 			new = realloc(lang_msg, max_lang * sizeof *lang_msg);
    323  1.1  dholland 			if (!new)
    324  1.1  dholland 				break;
    325  1.1  dholland 			lang_msg = new;
    326  1.1  dholland 			new = realloc(fnames, max_lang * sizeof *fnames);
    327  1.1  dholland 			if (!new)
    328  1.1  dholland 				break;
    329  1.1  dholland 			fnames = new;
    330  1.1  dholland 		}
    331  1.3    martin 		fnames[num_lang] = strdup(fname);
    332  1.1  dholland 		lang_msg[num_lang++] = strdup(cp);
    333  1.1  dholland 	}
    334  1.1  dholland 	msg_file(0);
    335  1.1  dholland 	closedir(dir);
    336  1.1  dholland 	dir = 0;
    337  1.1  dholland 
    338  1.1  dholland 	if (num_lang == 1)
    339  1.1  dholland 		goto done;
    340  1.1  dholland 
    341  1.1  dholland 	opt = calloc(num_lang, sizeof *opt);
    342  1.1  dholland 	if (!opt)
    343  1.1  dholland 		goto done;
    344  1.1  dholland 
    345  1.1  dholland 	for (lang = 0; lang < num_lang; lang++) {
    346  1.1  dholland 		opt[lang].opt_name = lang_msg[lang];
    347  1.1  dholland 		opt[lang].opt_menu = OPT_NOMENU;
    348  1.1  dholland 		opt[lang].opt_action = set_language;
    349  1.1  dholland 	}
    350  1.1  dholland 
    351  1.1  dholland 	lang_menu = new_menu(NULL, opt, num_lang, -1, 12, 0, 0, MC_NOEXITOPT,
    352  1.1  dholland 		NULL, NULL, NULL, NULL, NULL);
    353  1.1  dholland 
    354  1.1  dholland 	if (lang_menu != -1) {
    355  1.1  dholland 		msg_display(MSG_hello);
    356  1.1  dholland 		process_menu(lang_menu, fnames);
    357  1.1  dholland 	}
    358  1.1  dholland 
    359  1.1  dholland     done:
    360  1.1  dholland 	if (dir)
    361  1.1  dholland 		closedir(dir);
    362  1.1  dholland 	if (lang_menu != -1)
    363  1.1  dholland 		free_menu(lang_menu);
    364  1.1  dholland 	free(opt);
    365  1.1  dholland 	while (num_lang) {
    366  1.1  dholland 		free(lang_msg[--num_lang]);
    367  1.1  dholland 		free(fnames[num_lang]);
    368  1.1  dholland 	}
    369  1.1  dholland 	free(lang_msg);
    370  1.1  dholland 	free(fnames);
    371  1.1  dholland 
    372  1.1  dholland 	/* set locale according to selected language */
    373  1.1  dholland 	cp = msg_string(MSG_sysinst_message_locale);
    374  1.1  dholland 	if (cp) {
    375  1.1  dholland 		setlocale(LC_CTYPE, cp);
    376  1.1  dholland 		setenv("LC_CTYPE", cp, 1);
    377  1.1  dholland 	}
    378  1.1  dholland }
    379  1.1  dholland 
    380  1.1  dholland #ifndef md_may_remove_boot_medium
    381  1.1  dholland #define md_may_remove_boot_medium()	(boot_media_still_needed()<=0)
    382  1.1  dholland #endif
    383  1.1  dholland 
    384  1.1  dholland /* toplevel menu handler ... */
    385  1.1  dholland void
    386  1.1  dholland toplevel(void)
    387  1.1  dholland {
    388  1.2    martin 	/*
    389  1.2    martin 	 * Undo any stateful side-effects of previous menu choices.
    390  1.2    martin 	 * XXX must be idempotent, since we get run each time the main
    391  1.2    martin 	 *     menu is displayed.
    392  1.2    martin 	 */
    393  1.4    martin 	char *home = getenv("HOME");
    394  1.4    martin 	if (home != NULL)
    395  1.4    martin 		chdir(home);
    396  1.2    martin 	unwind_mounts();
    397  1.1  dholland 
    398  1.1  dholland 	/* Display banner message in (english, francais, deutsch..) */
    399  1.1  dholland 	msg_display(MSG_hello);
    400  1.1  dholland 	msg_display_add(MSG_md_hello);
    401  1.1  dholland 	if (md_may_remove_boot_medium())
    402  1.1  dholland 		msg_display_add(MSG_md_may_remove_boot_medium);
    403  1.1  dholland 	msg_display_add(MSG_thanks);
    404  1.1  dholland }
    405  1.1  dholland 
    406  1.1  dholland 
    407  1.1  dholland /* The usage ... */
    408  1.1  dholland 
    409  1.1  dholland static void
    410  1.1  dholland usage(void)
    411  1.1  dholland {
    412  1.1  dholland 
    413  1.1  dholland 	(void)fprintf(stderr, "%s", msg_string(MSG_usage));
    414  1.1  dholland 	exit(1);
    415  1.1  dholland }
    416  1.1  dholland 
    417  1.1  dholland /* ARGSUSED */
    418  1.1  dholland static void
    419  1.1  dholland miscsighandler(int signo)
    420  1.1  dholland {
    421  1.1  dholland 
    422  1.1  dholland 	/*
    423  1.1  dholland 	 * we need to cleanup(), but it was already scheduled with atexit(),
    424  1.1  dholland 	 * so it'll be invoked on exit().
    425  1.1  dholland 	 */
    426  1.1  dholland 	exit(1);
    427  1.1  dholland }
    428  1.1  dholland 
    429  1.1  dholland static void
    430  1.1  dholland ttysighandler(int signo)
    431  1.1  dholland {
    432  1.1  dholland 
    433  1.1  dholland 	/*
    434  1.1  dholland 	 * if we want to ignore a TTY signal (SIGINT or SIGQUIT), then we
    435  1.1  dholland 	 * just return.  If we want to forward a TTY signal, we forward it
    436  1.1  dholland 	 * to the specified process group.
    437  1.1  dholland 	 *
    438  1.1  dholland 	 * This functionality is used when setting up and displaying child
    439  1.1  dholland 	 * output so that the child gets the signal and presumably dies,
    440  1.1  dholland 	 * but sysinst continues.  We use this rather than actually ignoring
    441  1.1  dholland 	 * the signals, because that will be be passed on to a child
    442  1.1  dholland 	 * through fork/exec, whereas special handlers get reset on exec..
    443  1.1  dholland 	 */
    444  1.1  dholland 	if (ttysig_ignore)
    445  1.1  dholland 		return;
    446  1.1  dholland 	if (ttysig_forward) {
    447  1.1  dholland 		killpg(ttysig_forward, signo);
    448  1.1  dholland 		return;
    449  1.1  dholland 	}
    450  1.1  dholland 
    451  1.1  dholland 	/*
    452  1.1  dholland 	 * we need to cleanup(), but it was already scheduled with atexit(),
    453  1.1  dholland 	 * so it'll be invoked on exit().
    454  1.1  dholland 	 */
    455  1.1  dholland 	exit(1);
    456  1.1  dholland }
    457  1.1  dholland 
    458  1.1  dholland static void
    459  1.1  dholland cleanup(void)
    460  1.1  dholland {
    461  1.1  dholland 	time_t tloc;
    462  1.1  dholland 
    463  1.1  dholland 	(void)time(&tloc);
    464  1.1  dholland 
    465  1.1  dholland #if 0
    466  1.1  dholland 	restore_etc();
    467  1.1  dholland #endif
    468  1.1  dholland 	/* Ensure we aren't inside the target tree */
    469  1.1  dholland 	chdir(getenv("HOME"));
    470  1.1  dholland 	unwind_mounts();
    471  1.1  dholland 	umount_mnt2();
    472  1.1  dholland 
    473  1.1  dholland 	endwin();
    474  1.1  dholland 
    475  1.1  dholland 	if (logfp) {
    476  1.1  dholland 		fprintf(logfp, "Log ended at: %s\n", asctime(localtime(&tloc)));
    477  1.1  dholland 		fflush(logfp);
    478  1.1  dholland 		fclose(logfp);
    479  1.1  dholland 		logfp = NULL;
    480  1.1  dholland 	}
    481  1.1  dholland 	if (script) {
    482  1.1  dholland 		fprintf(script, "# Script ended at: %s\n",
    483  1.1  dholland 		    asctime(localtime(&tloc)));
    484  1.1  dholland 		fflush(script);
    485  1.1  dholland 		fclose(script);
    486  1.1  dholland 		script = NULL;
    487  1.1  dholland 	}
    488  1.1  dholland 
    489  1.1  dholland 	if (!exit_cleanly)
    490  1.1  dholland 		fprintf(stderr, "\n\nsysinst terminated.\n");
    491  1.1  dholland }
    492  1.1  dholland 
    493  1.1  dholland 
    494  1.1  dholland /* process function ... */
    495  1.1  dholland 
    496  1.1  dholland void
    497  1.1  dholland process_f_flag(char *f_name)
    498  1.1  dholland {
    499  1.1  dholland 	char buffer[STRSIZE];
    500  1.1  dholland 	int len;
    501  1.1  dholland 	const struct f_arg *arg;
    502  1.1  dholland 	FILE *fp;
    503  1.1  dholland 	char *cp, *cp1;
    504  1.1  dholland 
    505  1.1  dholland 	/* open the file */
    506  1.1  dholland 	fp = fopen(f_name, "r");
    507  1.1  dholland 	if (fp == NULL) {
    508  1.1  dholland 		fprintf(stderr, msg_string(MSG_config_open_error), f_name);
    509  1.1  dholland 		exit(1);
    510  1.1  dholland 	}
    511  1.1  dholland 
    512  1.1  dholland 	while (fgets(buffer, sizeof buffer, fp) != NULL) {
    513  1.1  dholland 		cp = buffer + strspn(buffer, " \t");
    514  1.1  dholland 		if (strchr("#\r\n", *cp) != NULL)
    515  1.1  dholland 			continue;
    516  1.1  dholland 		for (arg = fflagopts; arg->name != NULL; arg++) {
    517  1.1  dholland 			len = strlen(arg->name);
    518  1.1  dholland 			if (memcmp(cp, arg->name, len) != 0)
    519  1.1  dholland 				continue;
    520  1.1  dholland 			cp1 = cp + len;
    521  1.1  dholland 			cp1 += strspn(cp1, " \t");
    522  1.1  dholland 			if (*cp1++ != '=')
    523  1.1  dholland 				continue;
    524  1.1  dholland 			cp1 += strspn(cp1, " \t");
    525  1.1  dholland 			len = strcspn(cp1, " \n\r\t");
    526  1.1  dholland 			cp1[len] = 0;
    527  1.1  dholland 			strlcpy(arg->var, cp1, arg->size);
    528  1.1  dholland 			break;
    529  1.1  dholland 		}
    530  1.1  dholland 	}
    531  1.2    martin 	strlcpy(pm_new->bsddiskname, bsddiskname, sizeof pm_new->bsddiskname);
    532  1.1  dholland 
    533  1.1  dholland 	fclose(fp);
    534  1.1  dholland }
    535