2 * The new sysinstall program.
4 * This is probably the last program in the `sysinstall' line - the next
5 * generation being essentially a complete rewrite.
10 * Jordan Hubbard. All rights reserved.
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer,
17 * verbatim and that no modifications are made prior to this
19 * 2. Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution.
23 * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 #include "sysinstall.h"
38 #include <sys/disklabel.h>
40 #include <sys/errno.h>
41 #include <sys/ioctl.h>
42 #include <sys/fcntl.h>
43 #include <sys/param.h>
46 #include <sys/mount.h>
49 static Chunk *chunk_list[MAX_CHUNKS];
51 static int rootdev_is_od;
55 chunk_compare(Chunk *c1, Chunk *c2)
63 else if (!c1->private_data && !c2->private_data)
65 else if (c1->private_data && !c2->private_data)
67 else if (!c1->private_data && c2->private_data)
70 return strcmp(((PartInfo *)(c1->private_data))->mountpoint, ((PartInfo *)(c2->private_data))->mountpoint);
78 for (i = 0; i < nchunks; i++) {
79 for (j = 0; j < nchunks; j++) {
80 if (chunk_compare(chunk_list[j], chunk_list[j + 1]) > 0) {
81 Chunk *tmp = chunk_list[j];
83 chunk_list[j] = chunk_list[j + 1];
84 chunk_list[j + 1] = tmp;
91 check_rootdev(Chunk **list, int n)
97 for (i = 0; i < n; i++) {
99 if (c->type == part && (c->flags & CHUNK_IS_ROOT)
100 && strncmp(c->disk->name, "od", 2) == 0)
112 mount_point(Chunk *c1)
114 if (c1->type == part && c1->subtype == FS_SWAP)
116 else if (c1->type == part || c1->type == fat)
117 return ((PartInfo *)c1->private_data)->mountpoint;
126 else if (c1->type == part) {
127 if (c1->subtype != FS_SWAP)
136 fstype_short(Chunk *c1)
138 if (c1->type == part) {
139 if (c1->subtype != FS_SWAP) {
140 if (rootdev_is_od == 0 && strncmp(c1->name, "od", 2) == 0)
148 else if (c1->type == fat) {
149 if (strncmp(c1->name, "od", 2) == 0)
160 if (c1->type == part && c1->subtype != FS_SWAP) {
161 if (rootdev_is_od == 0 && strncmp(c1->name, "od", 2) == 0)
163 else if (c1->flags & CHUNK_IS_ROOT)
172 configFstab(dialogMenuItem *self)
180 if (!RunningAsInit) {
181 if (file_readable("/etc/fstab"))
182 return DITEM_SUCCESS;
184 msgConfirm("Attempting to rebuild your /etc/fstab file. Warning: If you had\n"
185 "any CD devices in use before running sysinstall then they may NOT\n"
186 "be found by this run!");
190 devs = deviceFind(NULL, DEVICE_TYPE_DISK);
192 msgConfirm("No disks found!");
193 return DITEM_FAILURE;
196 /* Record all the chunks */
198 for (i = 0; devs[i]; i++) {
199 if (!devs[i]->enabled)
201 disk = (Disk *)devs[i]->private;
203 msgFatal("No chunk list found for %s!", disk->name);
204 for (c1 = disk->chunks->part; c1; c1 = c1->next) {
205 if (c1->type == freebsd) {
206 for (c2 = c1->part; c2; c2 = c2->next) {
207 if (c2->type == part && (c2->subtype == FS_SWAP || c2->private_data))
208 chunk_list[nchunks++] = c2;
211 else if (c1->type == fat && c1->private_data)
212 chunk_list[nchunks++] = c1;
215 chunk_list[nchunks] = 0;
218 fstab = fopen("/etc/fstab", "w");
220 msgConfirm("Unable to create a new /etc/fstab file! Manual intervention\n"
221 "will be required.");
222 return DITEM_FAILURE;
225 check_rootdev(chunk_list, nchunks);
227 /* Go for the burn */
228 msgDebug("Generating /etc/fstab file\n");
229 fprintf(fstab, "# Device\t\tMountpoint\tFStype\tOptions\t\tDump\tPass#\n");
230 for (i = 0; i < nchunks; i++)
231 fprintf(fstab, "/dev/%s\t\t%s\t\t%s\t%s\t\t%d\t%d\n", name_of(chunk_list[i]), mount_point(chunk_list[i]),
232 fstype(chunk_list[i]), fstype_short(chunk_list[i]), seq_num(chunk_list[i]), seq_num(chunk_list[i]));
234 /* Now look for the CDROMs */
235 devs = deviceFind(NULL, DEVICE_TYPE_CDROM);
236 cnt = deviceCount(devs);
238 /* Write out the CDROM entries */
239 for (i = 0; i < cnt; i++) {
242 sprintf(cdname, "/cdrom%s", i ? itoa(i) : "");
244 msgConfirm("Unable to make mount point for: %s", cdname);
246 fprintf(fstab, "/dev/%s\t\t%s\t\tcd9660\tro,noauto\t0\t0\n", devs[i]->name, cdname);
249 /* And finally, a /proc. */
250 fprintf(fstab, "proc\t\t\t/proc\t\tprocfs\trw\t\t0\t0\n");
255 msgDebug("Wrote out /etc/fstab file\n");
256 return DITEM_SUCCESS;
259 /* Do the work of sucking in a config file.
260 * config is the filename to read in.
261 * lines is a fixed (max) sized array of char*
262 * returns number of lines read. line contents
263 * are malloc'd and must be freed by the caller.
266 readConfig(char *config, char **lines, int max)
272 fp = fopen(config, "r");
277 /* Read in the entire file */
278 for (i = 0; i < max; i++) {
279 if (!fgets(line, sizeof line, fp))
281 lines[nlines++] = strdup(line);
285 msgDebug("readConfig: Read %d lines from %s.\n", nlines, config);
289 #define MAX_LINES 2000 /* Some big number we're not likely to ever reach - I'm being really lazy here, I know */
292 readConfigFile(char *config, int marked)
294 char *lines[MAX_LINES], *cp, *cp2;
297 nlines = readConfig(config, lines, MAX_LINES);
301 for (i = 0; i < nlines; i++) {
302 /* Skip the comments & non-variable settings */
303 if (lines[i][0] == '#' || !(cp = index(lines[i], '='))) {
309 if ((cp2 = index(cp, '"')) || (cp2 = index(cp, '\047'))) {
311 cp2 = index(cp, *cp2);
313 /* If valid quotes, use it */
316 /* If we have a legit value, set it */
318 variable_set2(lines[i], cp, marked);
324 /* Load the environment from rc.conf file(s) */
326 configEnvironmentRC_conf(void)
332 { "/etc/defaults/rc.conf", 0 },
333 { "/etc/rc.conf", 0 },
334 { "/etc/rc.conf.local", 0 },
339 for (i = 0; configs[i].fname; i++) {
340 if (file_readable(configs[i].fname))
341 readConfigFile(configs[i].fname, configs[i].marked);
345 /* Load the environment from a resolv.conf file */
347 configEnvironmentResolv(char *config)
349 char *lines[MAX_LINES];
352 nlines = readConfig(config, lines, MAX_LINES);
355 for (i = 0; i < nlines; i++) {
356 Boolean name_set = (Boolean)variable_get(VAR_NAMESERVER);
358 if (!strncmp(lines[i], "domain", 6) && !variable_get(VAR_DOMAINNAME))
359 variable_set2(VAR_DOMAINNAME, string_skipwhite(string_prune(lines[i] + 6)), 0);
360 else if (!name_set && !strncmp(lines[i], "nameserver", 10)) {
361 /* Only take the first nameserver setting - we're lame */
362 variable_set2(VAR_NAMESERVER, string_skipwhite(string_prune(lines[i] + 10)), 0);
368 /* Version of below for dispatch routines */
370 configRC(dialogMenuItem *unused)
373 return DITEM_SUCCESS;
384 static int did_marker = 0;
387 write_header = !file_readable("/etc/rc.conf");
388 rcSite = fopen("/etc/rc.conf", "a");
392 fprintf(rcSite, "# This file now contains just the overrides from /etc/defaults/rc.conf\n");
393 fprintf(rcSite, "# please make all changes to this file.\n\n");
394 fprintf(rcSite, "# Enable network daemons for user convenience.\n");
395 if ((t_loc = time(NULL)) != -1 && (cp = ctime(&t_loc)))
396 fprintf(rcSite, "# Created: %s", cp);
399 /* Now do variable substitutions */
400 for (v = VarHead; v; v = v->next) {
403 fprintf(rcSite, "# -- sysinstall generated deltas -- #\n");
406 fprintf(rcSite, "%s=\"%s\"\n", v->name, v->value);
411 /* Tidy up the resulting file if it's late enough in the installation
412 for sort and uniq to be available */
413 if (RunningAsInit && file_readable("/usr/bin/sort") && file_readable("/usr/bin/uniq"))
414 (void)vsystem("sort /etc/rc.conf | uniq > /etc/rc.conf.new && mv /etc/rc.conf.new /etc/rc.conf");
418 configSaver(dialogMenuItem *self)
420 variable_set((char *)self->data, 1);
421 if (!variable_get(VAR_BLANKTIME))
422 variable_set2(VAR_BLANKTIME, "300", 1);
423 return DITEM_SUCCESS;
427 configSaverTimeout(dialogMenuItem *self)
429 return (variable_get_value(VAR_BLANKTIME,
430 "Enter time-out period in seconds for screen saver", 1) ?
431 DITEM_SUCCESS : DITEM_FAILURE);
435 configNTP(dialogMenuItem *self)
439 status = variable_get_value(VAR_NTPDATE_FLAGS,
440 "Enter the name of an NTP server", 1)
441 ? DITEM_SUCCESS : DITEM_FAILURE;
442 if (status == DITEM_SUCCESS) {
443 static char tmp[255];
445 snprintf(tmp, sizeof(tmp), "ntpdate_enable=YES,ntpdate_flags=%s",
446 variable_get(VAR_NTPDATE_FLAGS));
448 dmenuSetVariables(self);
454 configUsers(dialogMenuItem *self)
456 WINDOW *w = savescr();
458 dialog_clear_norefresh();
459 dmenuOpenSimple(&MenuUsermgmt, FALSE);
461 return DITEM_SUCCESS;
465 configLinux(dialogMenuItem *self)
467 WINDOW *w = savescr();
470 dialog_clear_norefresh();
471 variable_set2(VAR_LINUX_ENABLE, "YES", 1);
472 Mkdir("/compat/linux");
473 msgNotify("Installing Linux compatibility library...");
474 i = package_add("linux_base");
480 configSecurityProfile(dialogMenuItem *self)
482 WINDOW *w = savescr();
484 dialog_clear_norefresh();
485 dmenuOpenSimple(&MenuSecurityProfile, FALSE);
487 return DITEM_SUCCESS;
490 /* Use the most fascist security settings */
492 configSecurityFascist(dialogMenuItem *self)
494 WINDOW *w = savescr();
496 variable_set2("inetd_enable", "NO", 1);
497 variable_set2("portmap_enable", "NO", 1);
498 variable_set2("sendmail_enable", "NO", 1);
499 variable_set2("sshd_enable", "NO", 1);
500 variable_set2("nfs_server_enable", "NO", 1);
501 variable_set2("kern_securelevel_enable", "YES", 1);
502 variable_set2("kern_securelevel", "2", 1);
503 /* More fascist stuff should go here */
506 msgConfirm("Extreme security settings have been selected.\n\n"
507 "This means that all \"popular\" network services and\n"
508 "mechanisms like inetd(8) have been DISABLED by default.\n\n"
509 "PLEASE NOTE that this still does not save you from having\n"
510 "to properly secure your system in other ways or exercise\n"
511 "due diligence in your administration, this simply picks\n"
512 "a more secure set of out-of-box defaults to start with.\n\n"
513 "To change any of these settings later, edit /etc/rc.conf");
516 return DITEM_SUCCESS;
520 configSecurityHigh(dialogMenuItem *self)
522 WINDOW *w = savescr();
524 variable_set2("inetd_enable", "NO", 1);
525 variable_set2("sendmail_enable", "YES", 1);
526 variable_set2("sshd_enable", "YES", 1);
527 variable_set2("portmap_enable", "NO", 1);
528 variable_set2("nfs_server_enable", "NO", 1);
529 variable_set2("kern_securelevel_enable", "YES", 1);
530 variable_set2("kern_securelevel", "1", 1);
533 msgConfirm("High security settings have been selected.\n\n"
534 "This means that most \"popular\" network services and\n"
535 "mechanisms like inetd(8) have been DISABLED by default.\n\n"
536 "PLEASE NOTE that this still does not save you from having\n"
537 "to properly secure your system in other ways or exercise\n"
538 "due diligence in your administration, this simply picks\n"
539 "a more secure set of out-of-box defaults to start with.\n\n"
540 "To change any of these settings later, edit /etc/rc.conf");
543 return DITEM_SUCCESS;
547 configSecurityModerate(dialogMenuItem *self)
549 WINDOW *w = savescr();
551 variable_set2("inetd_enable", "YES", 1);
552 if (!variable_cmp("nfs_client_enable", "YES") ||
553 !variable_cmp("nfs_server_enable", "YES"))
554 variable_set2("portmap_enable", "YES", 1);
555 if (!variable_cmp("nfs_server_enable", "YES"))
556 variable_set2("nfs_reserved_port_only", "YES", 1);
557 variable_set2("sendmail_enable", "YES", 1);
558 variable_set2("sshd_enable", "YES", 1);
559 variable_set2("kern_securelevel_enable", "NO", 1);
562 msgConfirm("Moderate security settings have been selected.\n\n"
563 "This means that most \"popular\" network services and\n"
564 "mechanisms like inetd(8) have been enabled by default\n"
565 "for a comfortable user experience but with possible\n"
566 "trade-offs in system security. If this bothers you and\n"
567 "you know exactly what you are doing, select one of the\n"
568 "other security profiles instead.\n\n"
569 "To change any of these settings later, edit /etc/rc.conf");
572 return DITEM_SUCCESS;
576 configSecurityLiberal(dialogMenuItem *self)
578 WINDOW *w = savescr();
580 variable_set2("inetd_enable", "YES", 1);
581 variable_set2("portmap_enable", "YES", 1);
582 variable_set2("sendmail_enable", "YES", 1);
583 variable_set2("sshd_enable", "YES", 1);
584 variable_set2("kern_securelevel_enable", "NO", 1);
587 msgConfirm("Liberal security settings have been selected.\n\n"
588 "This means that most \"popular\" network services and\n"
589 "mechanisms like inetd(8) have been enabled by default\n"
590 "for the most comfortable user experience but with possible\n"
591 "trade-offs in system security. If this bothers you and\n"
592 "you know exactly what you are doing, select one of the\n"
593 "other security profiles instead.\n\n"
594 "To change any of these settings later, edit /etc/rc.conf");
597 return DITEM_SUCCESS;
601 write_root_xprofile(char *str)
606 static char *flist[] = { /* take care of both xdm and startx */
609 "/usr/share/skel/dot.xinitrc",
610 "/usr/share/skel/dot.xsession",
615 for (cp = flist; *cp; cp++) {
616 fp = fopen(*cp, "w");
618 fwrite(str, 1, len, fp);
619 fchmod(fileno(fp), 0755);
628 char tmp[FILENAME_MAX];
630 snprintf(tmp, sizeof tmp, "/usr/X11R6/bin/%s", fname);
631 if (file_executable(tmp))
633 snprintf(tmp, sizeof tmp, "/usr/local/bin/%s", fname);
634 return file_executable(tmp);
638 configXDesktop(dialogMenuItem *self)
641 int ret = DITEM_SUCCESS;
642 WINDOW *w = savescr();
644 dialog_clear_norefresh();
645 if (!dmenuOpenSimple(&MenuXDesktops, FALSE) || !(desk = variable_get(VAR_DESKSTYLE))) {
647 return DITEM_FAILURE;
649 if (!strcmp(desk, "kde")) {
650 ret = package_add("kde");
651 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("startkde"))
652 write_root_xprofile("exec startkde\n");
654 else if (!strcmp(desk, "gnome")) {
655 ret = package_add("gnomecore");
656 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("gnome-session")) {
657 ret = package_add("sawfish");
658 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("sawfish"))
659 write_root_xprofile("exec gnome-session\n");
662 else if (!strcmp(desk, "enlightenment")) {
663 ret = package_add("gnomecore");
664 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("gnome-session")) {
665 ret = package_add("enlightenment");
666 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("enlightenment"))
667 write_root_xprofile("exec gnome-session\n");
670 else if (!strcmp(desk, "afterstep")) {
671 ret = package_add("afterstep");
672 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("afterstep"))
673 write_root_xprofile("exec afterstep\n");
675 else if (!strcmp(desk, "windowmaker")) {
676 ret = package_add("windowmaker");
677 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("wmaker.inst")) {
678 write_root_xprofile("xterm &\n[ ! -d $HOME/GNUstep/Library/WindowMaker ] && /usr/X11R6/bin/wmaker.inst\nexec /usr/X11R6/bin/wmaker\n");
681 else if (!strcmp(desk, "fvwm2")) {
682 ret = package_add("fvwm");
683 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("fvwm"))
684 write_root_xprofile("exec fvwm\n");
686 if (DITEM_STATUS(ret) == DITEM_FAILURE)
687 msgConfirm("An error occurred while adding the package(s) required\n"
688 "by this desktop type. Please change installation media\n"
689 "and/or select a different, perhaps simpler, desktop\n"
690 "environment and try again.");
696 configXSetup(dialogMenuItem *self)
698 char *config, *execfile, *style;
700 WINDOW *w = savescr();
702 setenv("XWINHOME", "/usr/X11R6", 1);
704 variable_unset(VAR_DESKSTYLE);
705 variable_unset(VAR_XF86_CONFIG);
706 dialog_clear_norefresh();
707 if (!dmenuOpenSimple(&MenuXF86Config, FALSE)) {
709 return DITEM_FAILURE;
711 config = variable_get(VAR_XF86_CONFIG);
712 style = variable_get(VAR_DESKSTYLE);
718 return DITEM_FAILURE;
722 if (file_readable("/var/run/ld-elf.so.hints"))
723 vsystem("/sbin/ldconfig -m /usr/lib /usr/X11R6/lib /usr/local/lib /usr/lib/compat");
725 vsystem("/sbin/ldconfig /usr/lib /usr/X11R6/lib /usr/local/lib /usr/lib/compat");
726 if (file_readable("/var/run/ld.so.hints"))
727 vsystem("ldconfig -m -aout /usr/lib/aout /usr/lib/compat/aout /usr/local/lib/aout /usr/X11R6/lib/aout");
729 vsystem("ldconfig -aout /usr/lib/aout /usr/lib/compat/aout /usr/local/lib/aout /usr/X11R6/lib/aout");
731 vsystem("/sbin/ifconfig lo0 127.0.0.1");
732 execfile = string_concat("/usr/X11R6/bin/", config);
733 if (file_executable(execfile)) {
734 moused = variable_get(VAR_MOUSED);
735 while (!moused || strcmp(moused, "YES")) {
736 if (msgYesNo("The X server may access the mouse in two ways: direct access\n"
737 "or indirect access via the mouse daemon. You have not\n"
738 "configured the mouse daemon. Would you like to configure it\n"
739 "now? If you intend to let the X server access the mouse\n"
740 "directly, choose \"No\" at this time."))
742 dialog_clear_norefresh();
743 dmenuOpenSimple(&MenuMouse, FALSE);
744 moused = variable_get(VAR_MOUSED);
746 if (moused && !strcmp(moused, "YES"))
747 msgConfirm("You have configured and are now running the mouse daemon.\n"
748 "Choose \"/dev/sysmouse\" as the mouse port and \"SysMouse\" or\n"
749 "\"MouseSystems\" as the mouse protocol in the X configuration\n"
751 systemExecute(execfile);
752 if (!file_readable("/etc/XF86Config")) {
753 if (!msgYesNo("The XFree86 configuration process seems to have\nfailed. Would you like to try again?"))
757 return DITEM_FAILURE;
761 configXDesktop(self);
763 return DITEM_SUCCESS;
766 msgConfirm("The XFree86 setup utility you chose does not appear to be installed!\n"
767 "Please install this before attempting to configure XFree86.");
769 return DITEM_FAILURE;
774 configResolv(dialogMenuItem *ditem)
777 char *cp, *c6p, *dp, *hp;
779 cp = variable_get(VAR_NAMESERVER);
783 fp = fopen("/etc/resolv.conf", "w");
785 return DITEM_FAILURE;
786 if (variable_get(VAR_DOMAINNAME))
787 fprintf(fp, "domain\t%s\n", variable_get(VAR_DOMAINNAME));
788 fprintf(fp, "nameserver\t%s\n", cp);
791 msgDebug("Wrote out /etc/resolv.conf\n");
794 dp = variable_get(VAR_DOMAINNAME);
795 cp = variable_get(VAR_IPADDR);
796 c6p = variable_get(VAR_IPV6ADDR);
797 hp = variable_get(VAR_HOSTNAME);
798 /* Tack ourselves into /etc/hosts */
799 fp = fopen("/etc/hosts", "w");
801 return DITEM_FAILURE;
802 /* Add an entry for localhost */
803 if (!variable_cmp(VAR_IPV6_ENABLE, "YES")) {
805 fprintf(fp, "::1\t\t\tlocalhost.%s localhost\n", dp);
807 fprintf(fp, "::1\t\t\tlocalhost\n");
810 fprintf(fp, "127.0.0.1\t\tlocalhost.%s localhost\n", dp);
812 fprintf(fp, "127.0.0.1\t\tlocalhost\n");
813 /* Now the host entries, if applicable */
814 if (((cp && cp[0] != '0') || (c6p && c6p[0] != '0')) && hp) {
820 SAFE_STRCPY(cp2, hp);
821 *(index(cp2, '.')) = '\0';
823 if (c6p && c6p[0] != '0') {
824 fprintf(fp, "%s\t%s %s\n", c6p, hp, cp2);
825 fprintf(fp, "%s\t%s.\n", c6p, hp);
827 if (cp && cp[0] != '0') {
828 fprintf(fp, "%s\t\t%s %s\n", cp, hp, cp2);
829 fprintf(fp, "%s\t\t%s.\n", cp, hp);
834 msgDebug("Wrote out /etc/hosts\n");
835 return DITEM_SUCCESS;
839 configRouter(dialogMenuItem *self)
843 ret = variable_get_value(VAR_ROUTER,
844 "Please specify the router you wish to use. Routed is\n"
845 "provided with the stock system and gated is provided\n"
846 "as an optional package which this installation system\n"
847 "will attempt to load if you select gated. Any other\n"
848 "choice of routing daemon will be assumed to be something\n"
849 "the user intends to install themselves before rebooting\n"
850 "the system. If you don't want any routing daemon, choose NO", 1)
851 ? DITEM_SUCCESS : DITEM_FAILURE;
853 if (ret == DITEM_SUCCESS) {
854 char *cp = variable_get(VAR_ROUTER);
856 if (cp && strcmp(cp, "NO")) {
857 variable_set2(VAR_ROUTER_ENABLE, "YES", 1);
858 if (!strcmp(cp, "gated")) {
859 if (package_add("gated") != DITEM_SUCCESS) {
860 msgConfirm("Unable to load gated package. Falling back to no router.");
861 variable_unset(VAR_ROUTER);
862 variable_unset(VAR_ROUTERFLAGS);
863 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
868 /* Now get the flags, if they chose a router */
869 ret = variable_get_value(VAR_ROUTERFLAGS,
870 "Please Specify the routing daemon flags; if you're running routed\n"
871 "then -q is the right choice for nodes and -s for gateway hosts.\n", 1)
872 ? DITEM_SUCCESS : DITEM_FAILURE;
873 if (ret != DITEM_SUCCESS)
874 variable_unset(VAR_ROUTERFLAGS);
879 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
880 variable_unset(VAR_ROUTERFLAGS);
881 variable_unset(VAR_ROUTER);
885 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
886 variable_unset(VAR_ROUTERFLAGS);
887 variable_unset(VAR_ROUTER);
892 /* Shared between us and index_initialize() */
893 extern PkgNode Top, Plist;
896 configPackages(dialogMenuItem *self)
898 int i, restoreflag = 0;
901 /* Did we get an INDEX? */
902 i = index_initialize("packages/INDEX");
903 if (DITEM_STATUS(i) == DITEM_FAILURE)
907 int ret, pos, scroll;
909 /* Bring up the packages menu */
911 index_menu(&Top, &Top, &Plist, &pos, &scroll);
913 if (Plist.kids && Plist.kids->name) {
914 /* Now show the packing list menu */
916 ret = index_menu(&Plist, &Plist, NULL, &pos, &scroll);
917 if (ret & DITEM_LEAVE_MENU)
919 else if (DITEM_STATUS(ret) != DITEM_FAILURE) {
922 for (tmp = Plist.kids; tmp && tmp->name; tmp = tmp->next)
923 (void)index_extract(mediaDevice, &Top, tmp, FALSE);
928 msgConfirm("No packages were selected for extraction.");
934 PkgNodePtr tmp2 = tmp->next;
939 index_init(NULL, &Plist);
940 return DITEM_SUCCESS | (restoreflag ? DITEM_RESTORE : 0);
943 /* Load pcnfsd package */
945 configPCNFSD(dialogMenuItem *self)
949 ret = package_add("pcnfsd");
950 if (DITEM_STATUS(ret) == DITEM_SUCCESS) {
951 variable_set2(VAR_PCNFSD, "YES", 0);
952 variable_set2("mountd_flags", "-n", 1);
958 configNFSServer(dialogMenuItem *self)
962 /* If we're an NFS server, we need an exports file */
963 if (!file_readable("/etc/exports")) {
964 WINDOW *w = savescr();
966 if (file_readable("/etc/exports.disabled"))
967 vsystem("mv /etc/exports.disabled /etc/exports");
969 dialog_clear_norefresh();
970 msgConfirm("Operating as an NFS server means that you must first configure\n"
971 "an /etc/exports file to indicate which hosts are allowed certain\n"
972 "kinds of access to your local file systems.\n"
973 "Press [ENTER] now to invoke an editor on /etc/exports\n");
974 vsystem("echo '#The following examples export /usr to 3 machines named after ducks,' > /etc/exports");
975 vsystem("echo '#/usr/src and /usr/ports read-only to machines named after trouble makers' >> /etc/exports");
976 vsystem("echo '#/home and all directories under it to machines named after dead rock stars' >> /etc/exports");
977 vsystem("echo '#and, /a to a network of privileged machines allowed to write on it as root.' >> /etc/exports");
978 vsystem("echo '#/usr huey louie dewie' >> /etc/exports");
979 vsystem("echo '#/usr/src /usr/obj -ro calvin hobbes' >> /etc/exports");
980 vsystem("echo '#/home -alldirs janice jimmy frank' >> /etc/exports");
981 vsystem("echo '#/a -maproot=0 -network 10.0.1.0 -mask 255.255.248.0' >> /etc/exports");
982 vsystem("echo '#' >> /etc/exports");
983 vsystem("echo '# You should replace these lines with your actual exported filesystems.' >> /etc/exports");
984 vsystem("echo '# Note that BSD's export synatx is \"host-centric\" vs. Sun\'s \"FS-centric\" one.' >> /etc/exports");
985 vsystem("echo >> /etc/exports");
986 sprintf(cmd, "%s /etc/exports", variable_get(VAR_EDITOR));
990 variable_set2(VAR_NFS_SERVER, "YES", 1);
993 else if (variable_get(VAR_NFS_SERVER)) { /* We want to turn it off again? */
994 vsystem("mv -f /etc/exports /etc/exports.disabled");
995 variable_unset(VAR_NFS_SERVER);
997 return DITEM_SUCCESS;