static int run_cc(int argc, char **argv, const char **fname) { const char *CC, *tmpdir; char * volatile pathname; static char tmpfilename[MAXPATHLEN]; char **args; int tmpfd; pid_t pid, cpid; int status; if ((CC = getenv("CC")) == NULL) CC = DEFAULT_CC; if ((pathname = findcc(CC)) == NULL) if (!setenv("PATH", DEFAULT_PATH, 1)) pathname = findcc(CC); if (pathname == NULL) err(EXIT_FAILURE, "%s: not found", CC); if ((args = malloc((argc + 3) * sizeof(char *))) == NULL) err(EXIT_FAILURE, "malloc"); args[0] = deconst(CC); args[1] = deconst("-M"); (void)memcpy(&args[2], argv, (argc + 1) * sizeof(char *)); if ((tmpdir = getenv("TMPDIR")) == NULL) tmpdir = _PATH_TMP; (void)snprintf(tmpfilename, sizeof (tmpfilename), "%s/%s", tmpdir, "mkdepXXXXXX"); if ((tmpfd = mkstemp(tmpfilename)) < 0) { warn("unable to create temporary file %s", tmpfilename); exit(EXIT_FAILURE); } (void)unlink(tmpfilename); *fname = tmpfilename; switch (cpid = vfork()) { case 0: (void)dup2(tmpfd, STDOUT_FILENO); (void)close(tmpfd); (void)execv(pathname, args); _exit(EXIT_FAILURE); /* NOTREACHED */ case -1: err(EXIT_FAILURE, "unable to fork"); } free(pathname); free(args); while (((pid = wait(&status)) != cpid) && (pid >= 0)) continue; if (status) errx(EXIT_FAILURE, "compile failed."); return tmpfd; }
static char* xmemmem(const char *hay, const size_t haysize, const char *needle, const size_t needlesize) { const char *const eoh = hay + haysize; const char *const eon = needle + needlesize; const char *hp; const char *np; const char *cand; unsigned int hsum; unsigned int nsum; unsigned int eqp; /* trivial checks first * a 0-sized needle is defined to be found anywhere in haystack * then run strchr() to find a candidate in HAYSTACK (i.e. a portion * that happens to begin with *NEEDLE) */ if (needlesize == 0UL) { return deconst(hay); } else if ((hay = memchr(hay, *needle, haysize)) == NULL) { /* trivial */ return NULL; } /* First characters of haystack and needle are the same now. Both are * guaranteed to be at least one character long. Now computes the sum * of characters values of needle together with the sum of the first * needle_len characters of haystack. */ for (hp = hay + 1U, np = needle + 1U, hsum = *hay, nsum = *hay, eqp = 1U; hp < eoh && np < eon; hsum ^= *hp, nsum ^= *np, eqp &= *hp == *np, hp++, np++); /* HP now references the (NEEDLESIZE + 1)-th character. */ if (np < eon) { /* haystack is smaller than needle, :O */ return NULL; } else if (eqp) { /* found a match */ return deconst(hay); } /* now loop through the rest of haystack, * updating the sum iteratively */ for (cand = hay; hp < eoh; hp++) { hsum ^= *cand++; hsum ^= *hp; /* Since the sum of the characters is already known to be * equal at that point, it is enough to check just NEEDLESIZE - 1 * characters for equality, * also CAND is by design < HP, so no need for range checks */ if (hsum == nsum && memcmp(cand, needle, needlesize - 1U) == 0) { return deconst(cand); } } return NULL; }
/* * hook called after upgrade() or install() has finished setting * up the target disk but immediately before the user is given the * ``disks are now set up'' message. * * On pmax, we take this opportuinty to update the bootblocks. */ int md_post_newfs(void) { char *bootxx; int error; /* XXX boot blocks ... */ if (target_already_root()) { /* /usr is empty and we must already have bootblocks? */ return 0; } msg_display(MSG_dobootblks, diskdev); cp_to_target("/usr/mdec/boot.pmax", "/boot.pmax"); bootxx = bootxx_name(); if (bootxx != NULL) { error = run_program(RUN_DISPLAY | RUN_NO_CLEAR, "/usr/sbin/installboot /dev/r%sc %s", diskdev, bootxx); free(bootxx); } else error = -1; if (error != 0) process_menu(MENU_ok, deconst("Warning: disk is probably not bootable")); return 0; }
static int set_pkgsrc(struct menudesc *menu, void *arg) { configinfo **confp = arg; distinfo dist; dist.name = "pkgsrc"; dist.set = SET_PKGSRC; dist.desc = "source for 3rd-party packages"; dist.marker_file = NULL; int status = SET_RETRY; do { status = get_pkgsrc(); if (status == SET_OK) { status = extract_file(&dist, 0); continue; } else if (status == SET_SKIP) { confp[menu->cursel]->setting = MSG_abandoned; return 0; } process_menu(MENU_yesno, deconst(MSG_retry_pkgsrc_network)); if (!yesno) { confp[menu->cursel]->setting = MSG_abandoned; return 1; } } while (status == SET_RETRY); confp[menu->cursel]->setting = MSG_DONE; return 0; }
/* new api */ truf_trod_t truf_trod_rd(const char *str, char **on) { static const char sep[] = " \t\n"; truf_trod_t res; const char *brk; switch (*(brk += strcspn(brk = str, sep))) { case '\0': case '\n': /* no separator, so it's just a symbol * imply exp = 0.df if ~FOO, exp = 1.df otherwise */ if (*str != '~') { res.exp = 1.df; } else { /* could be ~FOO notation */ res.exp = 0.df; str++; } /* also set ON pointer */ if (LIKELY(on != NULL)) { *on = deconst(brk); } break; default: /* get the exposure sorted (hopefully just 1 separator) */ res.exp = strtod32(brk + 1U, on); break; } /* before blindly strdup()ing the symbol check if it's not by * any chance in MMY notation * thankfully the mmy subsystem does the magic for us. */ res.sym = truf_sym_rd(str, NULL); return res; }
void consume(T* xs, size_t n) { result_ += '('; for (size_t i = 0; i < n; ++i) { sep(); consume(deconst(xs[i])); } result_ += ')'; }
enable_if_t<is_iterable<T>::value && !is_inspectable<stringification_inspector, T>::value && !has_to_string<T>::value> consume(T& xs) { result_ += '['; for (auto& x : xs) { sep(); consume(deconst(x)); } result_ += ']'; }
/* * hook called after upgrade() or install() has finished setting * up the target disk but immediately before the user is given the * ``disks are now set up'' message. * * On hp300, we use this opportunity to install the boot blocks. */ int md_post_newfs(void) { /* boot blocks ... */ msg_display(MSG_dobootblks, diskdev); if (run_program(RUN_DISPLAY | RUN_NO_CLEAR, "/usr/sbin/installboot /dev/r%sc /usr/mdec/uboot.lif", diskdev)) process_menu(MENU_ok, deconst("Warning: disk is probably not bootable")); return 0; }
static time_t xstrpisotime(const char *s, char **endptr) { /** like strptime() but strictly for ISO 8601 Zulu strings */ struct tm tm; time_t res = (time_t)-1; /* make sure tm is clean */ memset(&tm, 0, sizeof(tm)); /* as a courtesy to our callers, and since this is a non-standard * routine, we skip leading whitespace */ for (; isspace(*s); s++); /* read year */ if ((tm.tm_year = strtoi_lim(s, &s, 1583, 4095)) < 0 || *s++ != '-') { goto out; } /* read month */ if ((tm.tm_mon = strtoi_lim(s, &s, 1, 12)) < 0 || *s++ != '-') { goto out; } /* read day-of-month */ if ((tm.tm_mday = strtoi_lim(s, &s, 1, 31)) < 0 || *s++ != 'T') { goto out; } /* read hour */ if ((tm.tm_hour = strtoi_lim(s, &s, 0, 23)) < 0 || *s++ != ':') { goto out; } /* read minute */ if ((tm.tm_min = strtoi_lim(s, &s, 0, 59)) < 0 || *s++ != ':') { goto out; } /* read second */ if ((tm.tm_sec = strtoi_lim(s, &s, 0, 60)) < 0 || *s++ != 'Z') { goto out; } /* massage TM to fulfill some of POSIX' contraints */ tm.tm_year -= 1900; tm.tm_mon--; /* now convert our custom tm struct to a unix stamp using UTC */ res = time_from_tm(&tm); out: if (endptr != NULL) { *endptr = deconst(s); } return res; }
/* * hook called after upgrade() or install() has finished setting * up the target disk but immediately before the user is given the * ``disks are now set up'' message. * * On the x68k, we use this opportunity to install the boot blocks. */ int md_post_newfs(void) { /* boot blocks ... */ msg_display(MSG_dobootblks, pm->diskdev); cp_to_target("/usr/mdec/boot", "/boot"); if (run_program(RUN_DISPLAY | RUN_NO_CLEAR, "/usr/mdec/installboot.new /usr/mdec/sdboot_ufs /dev/r%sa", pm->diskdev)) process_menu(MENU_ok, deconst("Warning: disk is probably not bootable")); return 0; }
/* * hook called after upgrade() or install() has finished setting * up the target disk but immediately before the user is given the * ``disks are now set up'' message.. * * On mvme68k, we use this opportunity to install the boot blocks. */ int md_post_newfs(void) { /* boot blocks ... */ msg_display(MSG_dobootblks, diskdev); cp_to_target("/usr/mdec/bootsd", "/.bootsd"); if (run_program(RUN_DISPLAY | RUN_NO_CLEAR, "/usr/mdec/installboot %s /usr/mdec/bootxx /dev/r%sa", target_expand("/.bootsd"), diskdev)) process_menu(MENU_ok, deconst("Warning: disk is probably not bootable")); return 0; }
/* * hook called after upgrade() or install() has finished setting * up the target disk but immediately before the user is given the * ``disks are now set up'' message. */ int md_post_newfs(void) { int error; error = cp_to_target("/usr/mdec/boot", "/boot"); if (error) return error; /* boot blocks ... */ msg_display(MSG_dobootblks, diskdev); if (run_program(RUN_DISPLAY | RUN_NO_CLEAR, "/usr/sbin/installboot -v /dev/r%sc /usr/mdec/xxboot", diskdev)) process_menu(MENU_ok, deconst("Warning: disk is probably not bootable")); return 0; }
/* * hook called after upgrade() or install() has finished setting * up the target disk but immediately before the user is given the * ``disks are now set up'' message. * * On mipsco, we take this opportuinty to update the bootblocks. */ int md_post_newfs(void) { /* XXX boot blocks ... */ if (target_already_root()) { /* /usr is empty and we must already have bootblocks?*/ return 0; } printf(msg_string(MSG_dobootblks), diskdev); cp_to_target("/usr/mdec/boot", "/boot"); if (run_program(RUN_DISPLAY | RUN_NO_CLEAR, "/usr/mdec/installboot /dev/r%sc /usr/mdec/bootxx_ffs", diskdev)) process_menu(MENU_ok, deconst("Warning: disk is probably not bootable")); return 0; }
int get_via_ftp(const char *xfer_type) { if (do_config_network() != 0) return SET_RETRY; process_menu(MENU_ftpsource, deconst(xfer_type)); /* We'll fetch each file just before installing it */ fetch_fn = ftp_fetch; ftp.xfer_type = xfer_type; snprintf(ext_dir_bin, sizeof ext_dir_bin, "%s/%s", target_prefix(), xfer_dir + (*xfer_dir == '/')); snprintf(ext_dir_src, sizeof ext_dir_src, "%s/%s", target_prefix(), xfer_dir + (*xfer_dir == '/')); return SET_OK; }
truf_sym_t truf_sym_rd(const char *str, char **on) { truf_sym_t res; char *tmp; if (res.mmy = truf_mmy_rd(str, &tmp)) { /* good, it's a mmy, job done */ ; } else if (res.str = truf_str_rd(str, &tmp)) { /* ah, it's a str, tick */ ; } else { tmp = deconst(str); res.u = 0U; } if (LIKELY(on != NULL)) { *on = tmp; } return res; }
/* * hook called after upgrade() or install() has finished setting * up the target disk but immediately before the user is given the * ``disks are now set up'' message. * * On the Alpha, we use this opportunity to install the boot blocks. */ int md_post_newfs(void) { char *bootxx; int error; msg_display(MSG_dobootblks, diskdev); cp_to_target("/usr/mdec/boot", "/boot"); bootxx = bootxx_name(); if (bootxx != NULL) { error = run_program(RUN_DISPLAY | RUN_NO_CLEAR, "/usr/sbin/installboot /dev/r%sc %s", diskdev, bootxx); free(bootxx); } else error = -1; if (error != 0) process_menu(MENU_ok, deconst("Warning: disk is probably not bootable")); return 0; }
static int add_new_user(struct menudesc *menu, void *arg) { char username[STRSIZE]; int inwheel=0; msg_prompt(MSG_addusername, NULL, username, sizeof username -1); process_menu(MENU_yesno, deconst(MSG_addusertowheel)); inwheel = yesno; ushell = "/bin/csh"; process_menu(MENU_usersh, NULL); if (inwheel) run_program(RUN_PROGRESS | RUN_CHROOT, "/usr/sbin/useradd -m -s %s -G wheel %s", ushell, username); else run_program(RUN_PROGRESS | RUN_CHROOT, "/usr/sbin/useradd -m -s %s %s", ushell, username); run_program(RUN_DISPLAY | RUN_PROGRESS | RUN_CHROOT, "passwd -l %s", username); return 0; }
int config_dhcp(char *inter) { int dhcpautoconf; /* * Don't bother checking for an existing instance of dhcpcd, just * ask it to renew the lease. It will fork and daemonize if there * wasn't already an instance. */ if (!file_mode_match(DHCPCD, S_IFREG)) return 0; process_menu(MENU_yesno, deconst(MSG_Perform_DHCP_autoconfiguration)); if (yesno) { /* spawn off dhcpcd and wait for parent to exit */ dhcpautoconf = run_program(RUN_DISPLAY | RUN_PROGRESS, "%s -d -n %s", DHCPCD, inter); return dhcpautoconf ? 0 : 1; } return 0; }
int get_via_ftp(const char *xfer_type) { arg_rv arg; arg.rv = -1; arg.arg = deconst(xfer_type); process_menu(MENU_ftpsource, &arg); if (arg.rv == SET_RETRY) return SET_RETRY; /* We'll fetch each file just before installing it */ fetch_fn = ftp_fetch; ftp.xfer_type = xfer_type; snprintf(ext_dir_bin, sizeof ext_dir_bin, "%s/%s", target_prefix(), xfer_dir + (*xfer_dir == '/')); snprintf(ext_dir_src, sizeof ext_dir_src, "%s/%s", target_prefix(), xfer_dir + (*xfer_dir == '/')); return SET_OK; }
enable_if_t<!meta::is_annotation<T>::value> traverse(T&& x, Ts&&... xs) { sep(); consume(deconst(x)); traverse(std::forward<Ts>(xs)...); }
void traverse(meta::hex_formatted_t, T& x, Ts&&... xs) { sep(); consume_hex(reinterpret_cast<uint8_t*>(deconst(x).data()), x.size()); traverse(std::forward<Ts>(xs)...); }
/* * 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; }
/* * Write the network config info the user entered via menus into the * config files in the target disk. Be careful not to lose any * information we don't immediately add back, in case the install * target is the currently-active root. */ void mnt_net_config(void) { char ifconfig_fn[STRSIZE]; char ifconfig_str[STRSIZE]; FILE *ifconf = NULL; if (!network_up) return; process_menu(MENU_yesno, deconst(MSG_mntnetconfig)); if (!yesno) return; /* Write hostname to /etc/rc.conf */ if ((net_dhcpconf & DHCPCONF_HOST) == 0) if (del_rc_conf("hostname") == 0) add_rc_conf("hostname=%s\n", recombine_host_domain()); /* Copy resolv.conf to target. If DHCP was used to create it, * it will be replaced on next boot anyway. */ #ifndef INET6 if (net_namesvr[0] != '\0') dup_file_into_target("/etc/resolv.conf"); #else /* * not sure if it is a good idea, to allow dhcp config to * override IPv6 configuration */ if (net_namesvr[0] != '\0' || net_namesvr6[0] != '\0') dup_file_into_target("/etc/resolv.conf"); #endif /* * bring the interface up, it will be necessary for IPv6, and * it won't make trouble with IPv4 case either */ snprintf(ifconfig_fn, sizeof ifconfig_fn, "/etc/ifconfig.%s", net_dev); ifconf = target_fopen(ifconfig_fn, "w"); if (ifconf != NULL) { scripting_fprintf(NULL, "cat <<EOF >>%s%s\n", target_prefix(), ifconfig_fn); scripting_fprintf(ifconf, "up\n"); if (*net_media != '\0') scripting_fprintf(ifconf, "media %s\n", net_media); scripting_fprintf(NULL, "EOF\n"); } if ((net_dhcpconf & DHCPCONF_IPADDR) == 0) { FILE *hosts; /* Write IPaddr and netmask to /etc/ifconfig.if[0-9] */ if (ifconf != NULL) { scripting_fprintf(NULL, "cat <<EOF >>%s%s\n", target_prefix(), ifconfig_fn); if (*net_media != '\0') scripting_fprintf(ifconf, "%s netmask %s media %s\n", net_ip, net_mask, net_media); else scripting_fprintf(ifconf, "%s netmask %s\n", net_ip, net_mask); scripting_fprintf(NULL, "EOF\n"); } /* * Add IPaddr/hostname to /etc/hosts. * Be careful not to clobber any existing contents. * Relies on ordered search of /etc/hosts. XXX YP? */ hosts = target_fopen("/etc/hosts", "a"); if (hosts != 0) { scripting_fprintf(NULL, "cat <<EOF >>%s/etc/hosts\n", target_prefix()); write_etc_hosts(hosts); (void)fclose(hosts); scripting_fprintf(NULL, "EOF\n"); fclose(hosts); } if (del_rc_conf("defaultroute") == 0) add_rc_conf("defaultroute=\"%s\"\n", net_defroute); } else { if (snprintf(ifconfig_str, sizeof ifconfig_str, "ifconfig_%s", net_dev) > 0 && del_rc_conf(ifconfig_str) == 0) { add_rc_conf("ifconfig_%s=dhcp\n", net_dev); } } #ifdef INET6 if ((net_ip6conf & IP6CONF_AUTOHOST) != 0) { if (del_rc_conf("ip6mode") == 0) add_rc_conf("ip6mode=autohost\n"); if (ifconf != NULL) { scripting_fprintf(NULL, "cat <<EOF >>%s%s\n", target_prefix(), ifconfig_fn); scripting_fprintf(ifconf, "!rtsol $int\n"); scripting_fprintf(NULL, "EOF\n"); } } #endif if (ifconf) fclose(ifconf); fflush(NULL); }
void consume(std::pair<F, S>& x) { result_ += '('; traverse(deconst(x.first), deconst(x.second)); result_ += ')'; }