void slirp_init(int restricted, const char *special_ip) { #if DEBUG int slirp_logmask = 0; char slirp_logfile[512]; { const char* env = getenv( "ANDROID_SLIRP_LOGMASK" ); if (env != NULL) slirp_logmask = atoi(env); else if (VERBOSE_CHECK(slirp)) slirp_logmask = DEBUG_DEFAULT; } { char* p = slirp_logfile; char* end = p + sizeof(slirp_logfile); p = bufprint_temp_file( p, end, "slirp.log" ); if (p >= end) { dprint( "cannot create slirp log file in temporary directory" ); slirp_logmask = 0; } } if (slirp_logmask) { dprint( "sending slirp logs with mask %x to %s", slirp_logmask, slirp_logfile ); debug_init( slirp_logfile, slirp_logmask ); } #endif link_up = 1; slirp_restrict = restricted; if_init(); ip_init(); m_init(); inet_strtoip("127.0.0.1", &loopback_addr_ip); if (dns_addr_count == 0) { if (slirp_get_system_dns_servers() < 0) { dns_addr[0] = loopback_addr_ip; dns_addr_count = 1; fprintf (stderr, "Warning: No DNS servers found\n"); } } inet_strtoip(CTL_SPECIAL, &special_addr_ip); alias_addr_ip = special_addr_ip | CTL_ALIAS; getouraddr(); register_savevm("slirp", 0, 1, slirp_state_save, slirp_state_load, NULL); slirp_net_forward_init(); }
int slirp_get_system_dns_servers(void) { FIXED_INFO *FixedInfo=NULL; ULONG BufLen; DWORD ret; IP_ADDR_STRING *pIPAddr; if (dns_addr_count > 0) return dns_addr_count; FixedInfo = (FIXED_INFO *)GlobalAlloc(GPTR, sizeof(FIXED_INFO)); BufLen = sizeof(FIXED_INFO); if (ERROR_BUFFER_OVERFLOW == GetNetworkParams(FixedInfo, &BufLen)) { if (FixedInfo) { GlobalFree(FixedInfo); FixedInfo = NULL; } FixedInfo = GlobalAlloc(GPTR, BufLen); } if ((ret = GetNetworkParams(FixedInfo, &BufLen)) != ERROR_SUCCESS) { printf("GetNetworkParams failed. ret = %08x\n", (u_int)ret ); if (FixedInfo) { GlobalFree(FixedInfo); FixedInfo = NULL; } return -1; } D( "DNS Servers:"); pIPAddr = &(FixedInfo->DnsServerList); while (pIPAddr && dns_addr_count < DNS_ADDR_MAX) { uint32_t ip; D( " %s", pIPAddr->IpAddress.String ); if (inet_strtoip(pIPAddr->IpAddress.String, &ip) == 0) { if (ip == loopback_addr_ip) ip = our_addr_ip; if (dns_addr_count < DNS_ADDR_MAX) dns_addr[dns_addr_count++] = ip; } pIPAddr = pIPAddr->Next; } if (FixedInfo) { GlobalFree(FixedInfo); FixedInfo = NULL; } if (dns_addr_count <= 0) return -1; return dns_addr_count; }
int slirp_get_system_dns_servers(void) { char buff[512]; char buff2[257]; FILE *f; if (dns_addr_count > 0) return dns_addr_count; #ifdef CONFIG_DARWIN /* on Darwin /etc/resolv.conf is a symlink to /private/var/run/resolv.conf * in some siutations, the symlink can be destroyed and the system will not * re-create it. Darwin-aware applications will continue to run, but "legacy" * Unix ones will not. */ f = fopen("/private/var/run/resolv.conf", "r"); if (!f) f = fopen("/etc/resolv.conf", "r"); /* desperate attempt to sanity */ #else f = fopen("/etc/resolv.conf", "r"); #endif if (!f) return -1; DN("emulator: IP address of your DNS(s): "); while (fgets(buff, 512, f) != NULL) { if (sscanf(buff, "nameserver%*[ \t]%256s", buff2) == 1) { uint32_t tmp_ip; if (inet_strtoip(buff2, &tmp_ip) < 0) continue; if (tmp_ip == loopback_addr_ip) tmp_ip = our_addr_ip; if (dns_addr_count < DNS_ADDR_MAX) { dns_addr[dns_addr_count++] = tmp_ip; if (dns_addr_count > 1) DN(", "); DN("%s", inet_iptostr(tmp_ip)); } else { DN("(more)"); break; } } } DN("\n"); fclose(f); if (!dns_addr_count) return -1; return dns_addr_count; }
int slirp_get_system_dns_servers(void) { char buff[512]; char buff2[257]; FILE *f; if (dns_addr_count > 0) return dns_addr_count; #ifdef CONFIG_DARWIN f = fopen("/private/var/run/resolv.conf", "r"); if (!f) f = fopen("/etc/resolv.conf", "r"); #else f = fopen("/etc/resolv.conf", "r"); #endif if (!f) return -1; DN("emulator: IP address of your DNS(s): "); while (fgets(buff, 512, f) != NULL) { if (sscanf(buff, "nameserver%*[ \t]%256s", buff2) == 1) { uint32_t tmp_ip; if (inet_strtoip(buff2, &tmp_ip) < 0) continue; if (tmp_ip == loopback_addr_ip) tmp_ip = our_addr_ip; if (dns_addr_count < DNS_ADDR_MAX) { dns_addr[dns_addr_count++] = tmp_ip; if (dns_addr_count > 1) DN(", "); DN("%s", inet_iptostr(tmp_ip)); } else { DN("(more)"); break; } } } DN("\n"); fclose(f); if (!dns_addr_count) return -1; return dns_addr_count; }