📄 net.c
字号:
*/ if (primary == AF_INET) { if (ipcomps->ipv4) { if (inet_pton(AF_INET, ipcomps->ipv4, &addr) >= 1) { newCfg->dev.ip = ip_addr_in(&addr); newCfg->dev.set |= PUMP_INTFINFO_HAS_IP; } } } else if (primary == AF_INET6) { if (ipcomps->ipv6) { if (inet_pton(AF_INET6, ipcomps->ipv6, &addr) >= 1) { newCfg->dev.ip = ip_addr_in6(&addr6); newCfg->dev.set |= PUMP_INTFINFO_HAS_IP; } } } } if (ipcomps->ns) { if (inet_pton(AF_INET, ipcomps->ns, &addr) >= 1) { cfg->dev.dnsServers[0] = ip_addr_in(&addr); cfg->dev.set |= PUMP_NETINFO_HAS_DNS; if (cfg->dev.numDns < 1) cfg->dev.numDns = 1; } else if (inet_pton(AF_INET6, ipcomps->ns, &addr6) >= 1) { cfg->dev.dnsServers[0] = ip_addr_in6(&addr6); cfg->dev.set |= PUMP_NETINFO_HAS_DNS; if (cfg->dev.numDns < 1) cfg->dev.numDns = 1; } } /* user selected back, but we've saved what they entered already */ if (answer == back) { newtFormDestroy(f); newtPopWindow(); return LOADER_BACK; } /* we might be done now */ if (have[IPV4] != 2) { newtWinMessage(_("Missing Information"), _("Retry"), _("You must enter both a valid IPv4 address and a " "network mask or CIDR prefix.")); } if (have[IPV6] != 2) { newtWinMessage(_("Missing Information"), _("Retry"), _("You must enter both a valid IPv6 address and a " "CIDR prefix.")); } strcpy(newCfg->dev.device, device); newCfg->isDynamic = 0; } newtFormDestroy(f); newtPopWindow(); return LOADER_OK;}void debugNetworkInfo(struct networkDeviceConfig *cfg) { int i; char *buf = NULL; logMessage(DEBUGLVL, "device = %s", cfg->dev.device); if (cfg->dev.set & PUMP_INTFINFO_HAS_IPV4_IP) logMessage(DEBUGLVL, "ipv4 = %s", ip_text(cfg->dev.ipv4, buf, 0)); if (cfg->dev.set & PUMP_INTFINFO_HAS_BROADCAST) logMessage(DEBUGLVL,"broadcast = %s",ip_text(cfg->dev.broadcast,buf,0)); if (cfg->dev.set & PUMP_INTFINFO_HAS_NETMASK) logMessage(DEBUGLVL, "netmask = %s", ip_text(cfg->dev.netmask, buf, 0)); if (cfg->dev.set & PUMP_INTFINFO_HAS_NETWORK) logMessage(DEBUGLVL, "network = %s", ip_text(cfg->dev.network, buf, 0)); if (cfg->dev.set & PUMP_INTFINFO_HAS_IPV6_IP) logMessage(DEBUGLVL, "ipv6 = %s", ip_text(cfg->dev.ipv6, buf, 0)); if (cfg->dev.set & PUMP_INTFINFO_HAS_IPV6_PREFIX) logMessage(DEBUGLVL, "ipv6_prefixlen = %d", cfg->dev.ipv6_prefixlen); if (cfg->dev.set & PUMP_NETINFO_HAS_GATEWAY) logMessage(DEBUGLVL, "gateway = %s", ip_text(cfg->dev.gateway, buf, 0)); if (cfg->dev.set & PUMP_NETINFO_HAS_DNS) for (i=0; i < cfg->dev.numDns; i++) logMessage(DEBUGLVL, "dns[%d] = %s", i, ip_text(cfg->dev.dnsServers[i], buf, 0));}int setupWireless(struct networkDeviceConfig *dev) { /* wireless config needs to be set up before we can bring the interface * up */ if (!is_wireless_interface(dev->dev.device)) return 0; if (dev->essid) { logMessage(INFO, "setting essid for %s to %s", dev->dev.device, dev->essid); if (set_essid(dev->dev.device, dev->essid) < 0) { logMessage(ERROR, "failed to set essid: %s", strerror(errno)); } if (dev->wepkey) { logMessage(INFO, "setting encryption key for %s", dev->dev.device); if (set_wep_key(dev->dev.device, dev->wepkey) < 0) { logMessage(ERROR, "failed to set wep key: %s", strerror(errno)); } } } return 0;}void netlogger(void *arg, int priority, char *fmt, va_list va) { int p; char *buf = NULL; if (priority == LOG_ERR) p = ERROR; else if (priority == LOG_INFO) p = INFO; else if (priority == LOG_DEBUG) p = DEBUGLVL; else if (priority == LOG_FATAL) p = CRITICAL; else p = INFO; if (vasprintf(&buf, fmt, va) != -1) { logMessage(p, "%s", buf); free(buf); } else { logMessage(ERROR, "unable to log network message"); } return;}char *doDhcp(struct networkDeviceConfig *dev) { struct pumpNetIntf *i; char *r = NULL, *class = NULL; time_t timeout = 45; int loglevel; DHCP_Preference pref = 0; struct utsname kv; i = &dev->dev; if (dev->vendor_class != NULL) { class = dev->vendor_class; } else { if (uname(&kv) == -1) { logMessage(ERROR, "failure running uname() in doDhcp()"); class = "anaconda"; } else { int ret; ret = asprintf(&class, "anaconda-%s %s %s", kv.sysname, kv.release, kv.machine); logMessage(DEBUGLVL, "sending %s as dhcp vendor-class", class); } } if (getLogLevel() == DEBUGLVL) loglevel = LOG_DEBUG; else loglevel = LOG_INFO; /* dhcp preferences are in /usr/include/libdhcp/dhcp_nic.h */ /* calling function should catch ipv4Choice & ipv6Choice both being ' ' */ if (dev->noipv4 || dev->ipv4method == IPV4_MANUAL_METHOD) { /* IPv4 disabled entirely -or- manual IPv4 config selected */ pref |= DHCPv4_DISABLE; } /* IPv6 enabled -and- auto neighbor discovery selected */ /* IPv6 disabled entirely -or- manual IPv6 config selected */ if ((!dev->noipv6 && dev->ipv6method == IPV6_AUTO_METHOD) || (dev->noipv6 || dev->ipv6method == IPV6_MANUAL_METHOD)) { pref |= DHCPv6_DISABLE | DHCPv6_DISABLE_ADDRESSES; } /* disable some things for this DHCP call */ pref |= DHCPv6_DISABLE_RESOLVER | DHCPv4_DISABLE_HOSTNAME_SET; /* don't try to run the client if DHCPv4 and DHCPv6 are disabled */ if (!(pref & DHCPv4_DISABLE) || !(pref & DHCPv6_DISABLE)) r = pumpDhcpClassRun(i,0L,class,pref,0,timeout,netlogger,loglevel); return r;}int configureNetwork(struct networkDeviceConfig * dev) { char *rc; setupWireless(dev); rc = pumpSetupInterface(&dev->dev); if (rc != NULL) { logMessage(INFO, "result of pumpSetupInterface is %s", rc); return 1; } /* we need to wait for a link after setting up the interface as some * switches decide to reconfigure themselves after that (#115825) */ waitForLink((char *)&dev->dev.device); return 0;}int writeNetInfo(const char * fn, struct networkDeviceConfig * dev) { FILE * f; int i; struct device ** devices; char ret[48]; ip_addr_t *tip; devices = probeDevices(CLASS_NETWORK, BUS_UNSPEC, PROBE_LOADED); if (!devices) return 0; for (i = 0; devices[i]; i++) if (!strcmp(devices[i]->device, dev->dev.device)) break; if (!(f = fopen(fn, "w"))) return -1; fprintf(f, "DEVICE=%s\n", dev->dev.device); fprintf(f, "ONBOOT=yes\n"); if (dev->isDynamic) { fprintf(f, "BOOTPROTO=dhcp\n"); } else { fprintf(f, "BOOTPROTO=static\n"); tip = &(dev->dev.ipv4); inet_ntop(tip->sa_family, IP_ADDR(tip), ret, IP_STRLEN(tip)); fprintf(f, "IPADDR=%s\n", ret); tip = &(dev->dev.netmask); inet_ntop(tip->sa_family, IP_ADDR(tip), ret, IP_STRLEN(tip)); fprintf(f, "NETMASK=%s\n", ret); if (dev->dev.set & PUMP_NETINFO_HAS_GATEWAY) { tip = &(dev->dev.gateway); inet_ntop(tip->sa_family, IP_ADDR(tip), ret, IP_STRLEN(tip)); fprintf(f, "GATEWAY=%s\n", ret); } if (dev->dev.set & PUMP_INTFINFO_HAS_BROADCAST) { tip = &(dev->dev.broadcast); inet_ntop(tip->sa_family, IP_ADDR(tip), ret, IP_STRLEN(tip)); fprintf(f, "BROADCAST=%s\n", ret); } } if (!dev->noipv6) { if (dev->ipv6method == IPV6_AUTO_METHOD) { fprintf(f, "IPV6_AUTOCONF=yes\n"); } else if (dev->ipv6method == IPV6_DHCP_METHOD) { fprintf(f, "IPV6ADDR=dhcp\n"); } else { tip = &(dev->dev.ipv6); inet_ntop(tip->sa_family, IP_ADDR(tip), ret, IP_STRLEN(tip)); fprintf(f, "IPV6ADDR=%s/%d\n", ret, dev->dev.ipv6_prefixlen); } } if (dev->dev.set & PUMP_NETINFO_HAS_HOSTNAME) fprintf(f, "HOSTNAME=%s\n", dev->dev.hostname); if (dev->dev.set & PUMP_NETINFO_HAS_DOMAIN) fprintf(f, "DOMAIN=%s\n", dev->dev.domain); if (dev->mtu) fprintf(f, "MTU=%d\n", dev->mtu); if (dev->peerid) fprintf(f, "PEERID=%s\n", dev->peerid); if (dev->subchannels) fprintf(f, "SUBCHANNELS=%s\n", dev->subchannels); if (dev->portname) fprintf(f, "PORTNAME=%s\n", dev->portname); if (dev->nettype) fprintf(f, "NETTYPE=%s\n", dev->nettype); if (dev->ctcprot) fprintf(f, "CTCPROT=%s\n", dev->ctcprot); if (dev->essid) fprintf(f, "ESSID=%s\n", dev->essid); if (dev->wepkey) fprintf(f, "KEY=%s\n", dev->wepkey); fclose(f); return 0;}int writeResolvConf(struct networkDeviceConfig * net) { char * filename = "/etc/resolv.conf"; FILE * f; int i; char ret[48]; ip_addr_t *tip;#if defined(__s390__) || defined(__s390x__) return 0;#endif if (!(net->dev.set & PUMP_NETINFO_HAS_DOMAIN) && !net->dev.numDns) return LOADER_ERROR; f = fopen(filename, "w"); if (!f) { logMessage(ERROR, "Cannot create %s: %s\n", filename, strerror(errno)); return LOADER_ERROR; } if (net->dev.set & PUMP_NETINFO_HAS_DOMAIN) fprintf(f, "search %s\n", net->dev.domain); for (i = 0; i < net->dev.numDns; i++) { tip = &(net->dev.dnsServers[i]); inet_ntop(tip->sa_family, IP_ADDR(tip), ret, IP_STRLEN(tip)); fprintf(f, "nameserver %s\n", ret); } fclose(f); res_init(); /* reinit the resolver so DNS changes take affect */ return 0;}int findHostAndDomain(struct networkDeviceConfig * dev) { char * name, * chptr; char ret[48]; ip_addr_t *tip; if (!FL_TESTING(flags)) { writeResolvConf(dev); } if (dev->dev.numDns == 0) { logMessage(ERROR, "no DNS servers, can't look up hostname"); return 1; } if (!(dev->dev.set & PUMP_NETINFO_HAS_HOSTNAME)) { if (!FL_CMDLINE(flags)) winStatus(50, 3, NULL, _("Determining host name and domain...")); else printf("Determining host name and domain...\n"); tip = &(dev->dev.ip); inet_ntop(tip->sa_family, IP_ADDR(tip), ret, IP_STRLEN(tip)); name = mygethostbyaddr(ret, tip->sa_family); if (!FL_CMDLINE(flags)) newtPopWindow(); if (!name) { logMessage(WARNING, "reverse name lookup failed"); return 1; } logMessage(INFO, "reverse name lookup worked"); dev->dev.hostname = strdup(name); dev->dev.set |= PUMP_NETINFO_HAS_HOSTNAME; } else { name = dev->dev.hostname; } if (!(dev->dev.set & PUMP_NETINFO_HAS_DOMAIN)) { for (chptr = name; *chptr && (*chptr != '.'); chptr++) ; if (*chptr == '.') { if (dev->dev.domain) free(dev->dev.domain); dev->dev.domain = strdup(chptr + 1); dev->dev.set |= PUMP_NETINFO_HAS_DOMAIN; } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -