int md_check_mbr(mbr_info_t *mbri) { mbr_info_t *ext; struct mbr_partition *part; int i; for (ext = mbri; ext; ext = ext->extended) { part = ext->mbr.mbr_parts; for (i = 0; i < MBR_PART_COUNT; part++, i++) { if (part->mbrp_type == MBR_PTYPE_FAT12) { bootstart = part->mbrp_start; bootsize = part->mbrp_size; break; } } } if (bootsize < (MIN_FAT12_BOOT / 512)) { msg_display(MSG_boottoosmall); msg_display_add(MSG_reeditpart, 0); process_menu(MENU_yesno, NULL); if (!yesno) return 0; return 1; } if (bootstart == 0 || bootsize == 0) { msg_display(MSG_nobootpart); msg_display_add(MSG_reeditpart, 0); process_menu(MENU_yesno, NULL); if (!yesno) return 0; return 1; } return 2; }
int md_check_mbr(mbr_info_t *mbri) { mbr_info_t *ext; struct mbr_partition *part; int i, hasboot=0; if (boardtype == BOARD_TYPE_NORMAL) return 2; /* raspi code */ if (boardtype == BOARD_TYPE_RPI) { for (ext = mbri; ext; ext = ext->extended) { part = ext->mbr.mbr_parts; for (i=0, hasboot=0; i < MBR_PART_COUNT; part++, i++) { if (part->mbrp_type != MBR_PTYPE_FAT16L && part->mbrp_type != MBR_PTYPE_FAT32L) continue; hasboot = 1; break; } } if (!hasboot) { msg_display(MSG_nomsdospart); msg_display_add(MSG_reeditpart, 0); if (!ask_yesno(NULL)) return 0; return 1; } } return 2; }
int md_pre_update(void) { struct mbr_partition *part; mbr_info_t *ext; int i; if (get_ramsize() <= 32) set_swap(diskdev, NULL); read_mbr(diskdev, &mbr); /* do a sanity check of the partition table */ for (ext = &mbr; ext; ext = ext->extended) { part = ext->mbr.mbr_parts; for (i = 0; i < MBR_PART_COUNT; part++, i++) { if (part->mbrp_type != MBR_PTYPE_FAT12) continue; if (part->mbrp_size < (MIN_FAT12_BOOT / 512)) { msg_display(MSG_boottoosmall); msg_display_add(MSG_nobootpart, 0); process_menu(MENU_yesno, NULL); if (!yesno) return 0; nobootfs = 1; } } } if (md_check_partitions() == 0) nobootfs = 1; return 1; }
/* * Check a disklabel. * If there are overlapping active partitions, * Ask the user if they want to edit the partition or give up. */ int edit_and_check_label(partinfo *lp, int nparts, int rawpart, int bsdpart) { static struct menu_ent *menu; static int menu_no = -1; static struct ptn_menu_info pi; int maxpart = getmaxpartitions(); if (menu == NULL) { menu = malloc((maxpart + 1) * sizeof *menu); if (!menu) return 1; } if (menu_no == -1) { menu_no = new_menu(NULL, menu, maxpart + 1, 0, -1, maxpart + 2, 74, MC_ALWAYS_SCROLL | MC_NOBOX | MC_DFLTEXIT, set_label_texts, fmt_fspart, NULL, NULL, MSG_partition_sizes_ok); } if (menu_no < 0) return 1; pi.flags = 0; pm->current_cylsize = pm->dlcylsize; for (;;) { /* first give the user the option to edit the label... */ process_menu(menu_no, &pi); /* User thinks the label is OK. */ /* check we have a single root fs */ if (check_one_root(lp, nparts) == 0 && partman_go == 0) msg_display(MSG_must_be_one_root); else /* Check for overlaps */ if (checkoverlap(lp, nparts, rawpart, bsdpart) == 0) return 1; /*XXX ???*/ msg_display_add(MSG_edit_partitions_again); if (!ask_yesno(NULL)) return(0); } /*NOTREACHED*/ }
/* * Get the information to configure the network, configure it and * make sure both the gateway and the name server are up. */ int config_network(void) { char *tp; char *defname; const char *prompt; char *textbuf; int octet0; int dhcp_config; int nfs_root = 0; int slip = 0; int pid, status; char **ap, *slcmd[10], *in_buf; char buffer[STRSIZE]; struct statvfs sb; int l; char dhcp_host[STRSIZE]; #ifdef INET6 int v6config = 1; #endif FILE *f; time_t now; if (network_up) return (1); get_ifconfig_info(); if (net_up != NULL) { /* XXX: some retry loops come here... */ /* active interfaces found */ msg_display(MSG_netup, net_up); process_menu(MENU_yesno, NULL); if (!yesno) return 0; } if (net_devices == NULL) { /* No network interfaces found! */ msg_display(MSG_nonet); process_menu(MENU_ok, NULL); return (-1); } network_up = 1; again: tp = strchr(net_devices, ' '); asprintf(&defname, "%.*s", (int)(tp - net_devices), net_devices); for (prompt = MSG_asknetdev;; prompt = MSG_badnet) { msg_prompt(prompt, defname, net_dev, sizeof net_dev - 1, net_devices); l = strlen(net_dev); net_dev[l] = ' '; net_dev[l + 1] = 0; tp = strstr(net_devices, net_dev); if (tp == NULL) continue; if (tp != net_devices && tp[-1] != ' ') continue; net_dev[l] = 0; break; } free(defname); if (!handle_license(net_dev)) goto done; slip = net_dev[0] == 's' && net_dev[1] == 'l' && isdigit((unsigned char)net_dev[2]); /* If root is on NFS do not reconfigure the interface. */ if (statvfs("/", &sb) == 0 && strcmp(sb.f_fstypename, "nfs") == 0) { nfs_root = 1; dhcp_config = 0; get_ifinterface_info(); get_if6interface_info(); get_host_info(); } else if (slip) { dhcp_config = 0; } else { /* Preload any defaults we can find */ get_ifinterface_info(); get_if6interface_info(); get_host_info(); /* domain and host */ msg_display(MSG_netinfo); /* ethernet medium */ for (;;) { msg_prompt_add(MSG_net_media, net_media, net_media, sizeof net_media); /* * ifconfig does not allow media specifiers on * IFM_MANUAL interfaces. Our UI gives no way * to set an option back * to null-string if it gets accidentally set. * Check for plausible alternatives. */ if (strcmp(net_media, "<default>") == 0 || strcmp(net_media, "default") == 0 || strcmp(net_media, "<manual>") == 0 || strcmp(net_media, "manual") == 0 || strcmp(net_media, "<none>") == 0 || strcmp(net_media, "none") == 0 || strcmp(net_media, " ") == 0) { *net_media = '\0'; } if (*net_media == '\0') break; /* * We must set the media type here - to give dhcp * a chance */ if (run_program(0, "/sbin/ifconfig %s media %s", net_dev, net_media) == 0) break; /* Failed to set - output the supported values */ if (collect(T_OUTPUT, &textbuf, "/sbin/ifconfig -m %s |" "while IFS=; read line;" " do [ \"$line\" = \"${line#*media}\" ] || " "echo $line;" " done", net_dev ) > 0) msg_display(textbuf); free(textbuf); } net_dhcpconf = 0; /* try a dhcp configuration */ dhcp_config = config_dhcp(net_dev); if (dhcp_config) { /* Get newly configured data off interface. */ get_ifinterface_info(); get_if6interface_info(); get_host_info(); net_dhcpconf |= DHCPCONF_IPADDR; /* * Extract default route from output of * 'route -n show' */ if (collect(T_OUTPUT, &textbuf, "/sbin/route -n show | " "while read dest gateway flags;" " do [ \"$dest\" = default ] && {" " echo $gateway; break; };" " done" ) > 0) strlcpy(net_defroute, textbuf, sizeof net_defroute); free(textbuf); /* pull nameserver info out of /etc/resolv.conf */ if (collect(T_OUTPUT, &textbuf, "cat /etc/resolv.conf 2>/dev/null |" " while read keyword address rest;" " do [ \"$keyword\" = nameserver " " -a \"${address#*:}\" = " "\"${address}\" ] && {" " echo $address; break; };" " done" ) > 0) strlcpy(net_namesvr, textbuf, sizeof net_namesvr); free(textbuf); if (net_namesvr[0] != '\0') net_dhcpconf |= DHCPCONF_NAMESVR; /* pull domainname out of leases file */ get_dhcp_value(net_domain, sizeof(net_domain), "domain-name"); if (net_domain[0] != '\0') net_dhcpconf |= DHCPCONF_DOMAIN; /* pull hostname out of leases file */ dhcp_host[0] = 0; get_dhcp_value(dhcp_host, sizeof(dhcp_host), "host-name"); if (dhcp_host[0] != '\0') { net_dhcpconf |= DHCPCONF_HOST; strlcpy(net_host, dhcp_host, sizeof net_host); } } } msg_prompt_add(MSG_net_domain, net_domain, net_domain, sizeof net_domain); msg_prompt_add(MSG_net_host, net_host, net_host, sizeof net_host); if (!dhcp_config) { /* Manually configure IPv4 */ if (!nfs_root) msg_prompt_add(MSG_net_ip, net_ip, net_ip, sizeof net_ip); if (slip) msg_prompt_add(MSG_net_srv_ip, net_srv_ip, net_srv_ip, sizeof net_srv_ip); else if (!nfs_root) { /* We don't want netmasks for SLIP */ octet0 = atoi(net_ip); if (!net_mask[0]) { if (0 <= octet0 && octet0 <= 127) strlcpy(net_mask, "0xff000000", sizeof(net_mask)); else if (128 <= octet0 && octet0 <= 191) strlcpy(net_mask, "0xffff0000", sizeof(net_mask)); else if (192 <= octet0 && octet0 <= 223) strlcpy(net_mask, "0xffffff00", sizeof(net_mask)); } msg_prompt_add(MSG_net_mask, net_mask, net_mask, sizeof net_mask); } msg_prompt_add(MSG_net_defroute, net_defroute, net_defroute, sizeof net_defroute); } if (!dhcp_config || net_namesvr[0] == 0) msg_prompt_add(MSG_net_namesrv, net_namesvr, net_namesvr, sizeof net_namesvr); #ifdef INET6 /* IPv6 autoconfiguration */ if (!is_v6kernel()) v6config = 0; else if (v6config) { process_menu(MENU_noyes, deconst(MSG_Perform_IPv6_autoconfiguration)); v6config = yesno ? 1 : 0; net_ip6conf |= yesno ? IP6CONF_AUTOHOST : 0; } if (v6config) { process_menu(MENU_namesrv6, NULL); if (!yesno) msg_prompt_add(MSG_net_namesrv6, net_namesvr6, net_namesvr6, sizeof net_namesvr6); } #endif /* confirm the setting */ if (slip) msg_display(MSG_netok_slip, net_domain, net_host, net_dev, *net_ip == '\0' ? "<none>" : net_ip, *net_srv_ip == '\0' ? "<none>" : net_srv_ip, *net_mask == '\0' ? "<none>" : net_mask, *net_namesvr == '\0' ? "<none>" : net_namesvr, *net_defroute == '\0' ? "<none>" : net_defroute, *net_media == '\0' ? "<default>" : net_media); else msg_display(MSG_netok, net_domain, net_host, net_dev, *net_ip == '\0' ? "<none>" : net_ip, *net_mask == '\0' ? "<none>" : net_mask, *net_namesvr == '\0' ? "<none>" : net_namesvr, *net_defroute == '\0' ? "<none>" : net_defroute, *net_media == '\0' ? "<default>" : net_media); #ifdef INET6 msg_display_add(MSG_netokv6, !is_v6kernel() ? "<not supported>" : (v6config ? "yes" : "no"), *net_namesvr6 == '\0' ? "<none>" : net_namesvr6); #endif done: process_menu(MENU_yesno, deconst(MSG_netok_ok)); if (!yesno) msg_display(MSG_netagain); if (!yesno) goto again; /* * we may want to perform checks against inconsistent configuration, * like IPv4 DNS server without IPv4 configuration. */ /* Create /etc/resolv.conf if a nameserver was given */ if (net_namesvr[0] != '\0' #ifdef INET6 || net_namesvr6[0] != '\0' #endif ) { f = fopen("/etc/resolv.conf", "w"); if (f == NULL) { if (logfp) (void)fprintf(logfp, "%s", msg_string(MSG_resolv)); (void)fprintf(stderr, "%s", msg_string(MSG_resolv)); exit(1); } scripting_fprintf(NULL, "cat <<EOF >/etc/resolv.conf\n"); time(&now); /* NB: ctime() returns a string ending in '\n' */ scripting_fprintf(f, ";\n; BIND data file\n; %s %s;\n", "Created by NetBSD sysinst on", ctime(&now)); if (net_domain[0] != '\0') scripting_fprintf(f, "search %s\n", net_domain); if (net_namesvr[0] != '\0') scripting_fprintf(f, "nameserver %s\n", net_namesvr); #ifdef INET6 if (net_namesvr6[0] != '\0') scripting_fprintf(f, "nameserver %s\n", net_namesvr6); #endif scripting_fprintf(NULL, "EOF\n"); fflush(NULL); fclose(f); } run_program(0, "/sbin/ifconfig lo0 127.0.0.1"); #ifdef INET6 if (v6config && !nfs_root) { init_v6kernel(1); run_program(0, "/sbin/ifconfig %s up", net_dev); sleep(get_v6wait() + 1); run_program(RUN_DISPLAY, "/sbin/rtsol -D %s", net_dev); sleep(get_v6wait() + 1); } #endif if (net_ip[0] != '\0') { if (slip) { /* XXX: needs 'ifconfig sl0 create' much earlier */ /* Set SLIP interface UP */ run_program(0, "/sbin/ifconfig %s inet %s %s up", net_dev, net_ip, net_srv_ip); strcpy(sl_flags, "-s 115200 -l /dev/tty00"); msg_prompt_win(MSG_slattach, -1, 12, 70, 0, sl_flags, sl_flags, 255); /* XXX: wtf isn't run_program() used here? */ pid = fork(); if (pid == 0) { strcpy(buffer, "/sbin/slattach "); strcat(buffer, sl_flags); in_buf = buffer; for (ap = slcmd; (*ap = strsep(&in_buf, " ")) != NULL;) if (**ap != '\0') ++ap; execvp(slcmd[0], slcmd); } else wait4(pid, &status, WNOHANG, 0); } else if (!nfs_root) { if (net_mask[0] != '\0') { run_program(0, "/sbin/ifconfig %s inet %s netmask %s", net_dev, net_ip, net_mask); } else { run_program(0, "/sbin/ifconfig %s inet %s", net_dev, net_ip); } } } /* Set host name */ if (net_host[0] != '\0') sethostname(net_host, strlen(net_host)); /* Set a default route if one was given */ if (!nfs_root && net_defroute[0] != '\0') { run_program(RUN_DISPLAY | RUN_PROGRESS, "/sbin/route -n flush -inet"); run_program(RUN_DISPLAY | RUN_PROGRESS, "/sbin/route -n add default %s", net_defroute); } /* * wait a couple of seconds for the interface to go live. */ if (!nfs_root) { msg_display_add(MSG_wait_network); sleep(5); } /* * ping should be verbose, so users can see the cause * of a network failure. */ #ifdef INET6 if (v6config && network_up) { network_up = !run_program(RUN_DISPLAY | RUN_PROGRESS, "/sbin/ping6 -v -c 3 -n -I %s ff02::2", net_dev); if (net_namesvr6[0] != '\0') network_up = !run_program(RUN_DISPLAY | RUN_PROGRESS, "/sbin/ping6 -v -c 3 -n %s", net_namesvr6); } #endif if (net_namesvr[0] != '\0' && network_up) network_up = !run_program(RUN_DISPLAY | RUN_PROGRESS, "/sbin/ping -v -c 5 -w 5 -o -n %s", net_namesvr); if (net_defroute[0] != '\0' && network_up) network_up = !run_program(RUN_DISPLAY | RUN_PROGRESS, "/sbin/ping -v -c 5 -w 5 -o -n %s", net_defroute); fflush(NULL); return network_up; }
/* * Get the information to configure the network, configure it and * make sure both the gateway and the name server are up. */ int config_network(void) { char *textbuf; int octet0; int dhcp_config; int nfs_root = 0; int slip = 0; int pid, status; char **ap, *slcmd[10], *in_buf; char buffer[STRSIZE]; struct statvfs sb; struct net_desc net_devs[MAX_NETS]; menu_ent net_menu[5]; int menu_no; int num_devs; int selected_net; int i; #ifdef INET6 int v6config = 1, rv; #endif FILE *f; time_t now; if (network_up) return (1); num_devs = get_ifconfig_info(net_devs); if (num_devs < 1) { /* No network interfaces found! */ msg_display(MSG_nonet); process_menu(MENU_ok, NULL); return (-1); } for (i = 0; i < num_devs; i++) { net_menu[i].opt_name = net_devs[i].if_dev; net_menu[i].opt_menu = OPT_NOMENU; net_menu[i].opt_flags = OPT_EXIT; net_menu[i].opt_action = set_menu_select; } again: selected_net = -1; menu_no = new_menu(MSG_netdevs, net_menu, num_devs, -1, 4, 0, 0, MC_SCROLL, NULL, NULL, NULL, NULL, NULL); msg_display(MSG_asknetdev, ""); process_menu(menu_no, &selected_net); free_menu(menu_no); if (selected_net == -1) return 0; network_up = 1; dhcp_config = 0; strncpy(net_dev, net_devs[selected_net].if_dev, STRSIZE); if (!handle_license(net_dev)) goto done; slip = net_dev[0] == 's' && net_dev[1] == 'l' && isdigit((unsigned char)net_dev[2]); /* If root is on NFS do not reconfigure the interface. */ if (statvfs("/", &sb) == 0 && strcmp(sb.f_fstypename, "nfs") == 0) { nfs_root = 1; get_ifinterface_info(); get_if6interface_info(); get_host_info(); } else if (!slip) { /* Preload any defaults we can find */ get_ifinterface_info(); get_if6interface_info(); get_host_info(); /* domain and host */ msg_display(MSG_netinfo); /* ethernet medium */ for (;;) { msg_prompt_add(MSG_net_media, net_media, net_media, sizeof net_media); /* * ifconfig does not allow media specifiers on * IFM_MANUAL interfaces. Our UI gives no way * to set an option back * to null-string if it gets accidentally set. * Check for plausible alternatives. */ if (strcmp(net_media, "<default>") == 0 || strcmp(net_media, "default") == 0 || strcmp(net_media, "<manual>") == 0 || strcmp(net_media, "manual") == 0 || strcmp(net_media, "<none>") == 0 || strcmp(net_media, "none") == 0 || strcmp(net_media, " ") == 0) { *net_media = '\0'; } if (*net_media == '\0') break; /* * We must set the media type here - to give dhcp * a chance */ if (run_program(0, "/sbin/ifconfig %s media %s", net_dev, net_media) == 0) break; /* Failed to set - output the supported values */ if (collect(T_OUTPUT, &textbuf, "/sbin/ifconfig -m %s |" "while IFS=; read line;" " do [ \"$line\" = \"${line#*media}\" ] || " "echo $line;" " done", net_dev ) > 0) msg_display(textbuf); free(textbuf); } net_dhcpconf = 0; /* try a dhcp configuration */ dhcp_config = config_dhcp(net_dev); if (dhcp_config) { char *nline; /* Get newly configured data off interface. */ get_ifinterface_info(); get_if6interface_info(); get_host_info(); net_dhcpconf |= DHCPCONF_IPADDR; /* * Extract default route from output of * 'route -n show' */ if (collect(T_OUTPUT, &textbuf, "/sbin/route -n show | " "while read dest gateway flags;" " do [ \"$dest\" = default ] && {" " echo \"$gateway\"; break; };" " done" ) > 0) strlcpy(net_defroute, textbuf, sizeof net_defroute); free(textbuf); if ((nline = strchr(net_defroute, '\n'))) *nline = '\0'; /* pull nameserver info out of /etc/resolv.conf */ if (collect(T_OUTPUT, &textbuf, "cat /etc/resolv.conf 2>/dev/null |" " while read keyword address rest;" " do [ \"$keyword\" = nameserver ] &&" " { echo \"$address\"; break; };" " done" ) > 0) strlcpy(net_namesvr, textbuf, sizeof net_namesvr); free(textbuf); if ((nline = strchr(net_namesvr, '\n'))) *nline = '\0'; if (net_namesvr[0] != '\0') net_dhcpconf |= DHCPCONF_NAMESVR; /* pull domain info out of /etc/resolv.conf */ if (collect(T_OUTPUT, &textbuf, "cat /etc/resolv.conf 2>/dev/null |" " while read keyword domain rest;" " do [ \"$keyword\" = domain ] &&" " { echo \"$domain\"; break; };" " done" ) > 0) strlcpy(net_domain, textbuf, sizeof net_domain); free(textbuf); if (net_domain[0] == '\0') { /* pull domain info out of /etc/resolv.conf */ if (collect(T_OUTPUT, &textbuf, "cat /etc/resolv.conf 2>/dev/null |" " while read keyword search rest;" " do [ \"$keyword\" = search ] &&" " { echo \"$search\"; break; };" " done" ) > 0) strlcpy(net_domain, textbuf, sizeof net_domain); free(textbuf); } if ((nline = strchr(net_domain, '\n'))) *nline = '\0'; if (net_domain[0] != '\0') net_dhcpconf |= DHCPCONF_DOMAIN; if (gethostname(net_host, sizeof(net_host)) == 0 && net_host[0] != 0) net_dhcpconf |= DHCPCONF_HOST; } } if (!(net_dhcpconf & DHCPCONF_HOST)) msg_prompt_add(MSG_net_host, net_host, net_host, sizeof net_host); if (!(net_dhcpconf & DHCPCONF_DOMAIN)) msg_prompt_add(MSG_net_domain, net_domain, net_domain, sizeof net_domain); if (!dhcp_config) { /* Manually configure IPv4 */ if (!nfs_root) msg_prompt_add(MSG_net_ip, net_ip, net_ip, sizeof net_ip); if (slip) msg_prompt_add(MSG_net_srv_ip, net_srv_ip, net_srv_ip, sizeof net_srv_ip); else if (!nfs_root) { /* We don't want netmasks for SLIP */ octet0 = atoi(net_ip); if (!net_mask[0]) { if (0 <= octet0 && octet0 <= 127) strlcpy(net_mask, "0xff000000", sizeof(net_mask)); else if (128 <= octet0 && octet0 <= 191) strlcpy(net_mask, "0xffff0000", sizeof(net_mask)); else if (192 <= octet0 && octet0 <= 223) strlcpy(net_mask, "0xffffff00", sizeof(net_mask)); } msg_prompt_add(MSG_net_mask, net_mask, net_mask, sizeof net_mask); } msg_prompt_add(MSG_net_defroute, net_defroute, net_defroute, sizeof net_defroute); } if (!(net_dhcpconf & DHCPCONF_NAMESVR)) { #ifdef INET6 if (v6config) { rv = 0; process_menu(MENU_namesrv6, &rv); if (!rv) msg_prompt_add(MSG_net_namesrv, net_namesvr, net_namesvr, sizeof net_namesvr); } else #endif msg_prompt_add(MSG_net_namesrv, net_namesvr, net_namesvr, sizeof net_namesvr); } /* confirm the setting */ if (slip) msg_display(MSG_netok_slip, net_domain, net_host, *net_namesvr == '\0' ? "<none>" : net_namesvr, net_dev, *net_media == '\0' ? "<default>" : net_media, *net_ip == '\0' ? "<none>" : net_ip, *net_srv_ip == '\0' ? "<none>" : net_srv_ip, *net_mask == '\0' ? "<none>" : net_mask, *net_defroute == '\0' ? "<none>" : net_defroute); else msg_display(MSG_netok, net_domain, net_host, *net_namesvr == '\0' ? "<none>" : net_namesvr, net_dev, *net_media == '\0' ? "<default>" : net_media, *net_ip == '\0' ? "<none>" : net_ip, *net_mask == '\0' ? "<none>" : net_mask, *net_defroute == '\0' ? "<none>" : net_defroute); #ifdef INET6 msg_display_add(MSG_netokv6, !is_v6kernel() ? "<not supported>" : net_ip6); #endif done: if (!ask_yesno(MSG_netok_ok)) goto again; run_program(0, "/sbin/ifconfig lo0 127.0.0.1"); /* dhcpcd will have configured it all for us */ if (dhcp_config) { fflush(NULL); network_up = 1; return network_up; } /* * we may want to perform checks against inconsistent configuration, * like IPv4 DNS server without IPv4 configuration. */ /* Create /etc/resolv.conf if a nameserver was given */ if (net_namesvr[0] != '\0') { f = fopen("/etc/resolv.conf", "w"); if (f == NULL) { if (logfp) (void)fprintf(logfp, "%s", msg_string(MSG_resolv)); (void)fprintf(stderr, "%s", msg_string(MSG_resolv)); exit(1); } scripting_fprintf(NULL, "cat <<EOF >/etc/resolv.conf\n"); time(&now); scripting_fprintf(f, ";\n; BIND data file\n; %s %s;\n", "Created by NetBSD sysinst on", safectime(&now)); if (net_domain[0] != '\0') scripting_fprintf(f, "search %s\n", net_domain); if (net_namesvr[0] != '\0') scripting_fprintf(f, "nameserver %s\n", net_namesvr); scripting_fprintf(NULL, "EOF\n"); fflush(NULL); fclose(f); } if (net_ip[0] != '\0') { if (slip) { /* XXX: needs 'ifconfig sl0 create' much earlier */ /* Set SLIP interface UP */ run_program(0, "/sbin/ifconfig %s inet %s %s up", net_dev, net_ip, net_srv_ip); strcpy(sl_flags, "-s 115200 -l /dev/tty00"); msg_prompt_win(MSG_slattach, -1, 12, 70, 0, sl_flags, sl_flags, 255); /* XXX: wtf isn't run_program() used here? */ pid = fork(); if (pid == 0) { strcpy(buffer, "/sbin/slattach "); strcat(buffer, sl_flags); in_buf = buffer; for (ap = slcmd; (*ap = strsep(&in_buf, " ")) != NULL;) if (**ap != '\0') ++ap; execvp(slcmd[0], slcmd); } else wait4(pid, &status, WNOHANG, 0); } else if (!nfs_root) { if (net_mask[0] != '\0') { run_program(0, "/sbin/ifconfig %s inet %s netmask %s", net_dev, net_ip, net_mask); } else { run_program(0, "/sbin/ifconfig %s inet %s", net_dev, net_ip); } } } /* Set host name */ if (net_host[0] != '\0') sethostname(net_host, strlen(net_host)); /* Set a default route if one was given */ if (!nfs_root && net_defroute[0] != '\0') { run_program(RUN_DISPLAY | RUN_PROGRESS, "/sbin/route -n flush -inet"); run_program(RUN_DISPLAY | RUN_PROGRESS, "/sbin/route -n add default %s", net_defroute); } /* * wait a couple of seconds for the interface to go live. */ if (!nfs_root) { msg_display_add(MSG_wait_network); sleep(5); } /* * ping should be verbose, so users can see the cause * of a network failure. */ if (net_defroute[0] != '\0' && network_up) network_up = !run_program(RUN_DISPLAY | RUN_PROGRESS, "/sbin/ping -v -c 5 -w 5 -o -n %s", net_defroute); if (net_namesvr[0] != '\0' && network_up) { #ifdef INET6 if (strchr(net_namesvr, ':')) network_up = !run_program(RUN_DISPLAY | RUN_PROGRESS, "/sbin/ping6 -v -c 3 -n %s", net_namesvr); else #endif network_up = !run_program(RUN_DISPLAY | RUN_PROGRESS, "/sbin/ping -v -c 5 -w 5 -o -n %s", net_namesvr); } fflush(NULL); return network_up; }