From ef31a144da318588f085933f20ac7f4b65984c7d Mon Sep 17 00:00:00 2001 From: SeokYeon Hwang Date: Wed, 23 Jan 2013 15:39:51 +0900 Subject: [PATCH] osutil: Migration "get host proxy" to osutil on win32 Signed-off-by: SeokYeon Hwang --- tizen/src/emulator.c | 6 -- tizen/src/osutil-darwin.c | 5 ++ tizen/src/osutil-linux.c | 10 +-- tizen/src/osutil-win32.c | 193 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 200 insertions(+), 14 deletions(-) diff --git a/tizen/src/emulator.c b/tizen/src/emulator.c index 63c1cbb..85bc177 100644 --- a/tizen/src/emulator.c +++ b/tizen/src/emulator.c @@ -40,7 +40,6 @@ #include "skin/maruskin_server.h" #include "skin/maruskin_client.h" #include "guest_server.h" -#include "option.h" #include "emul_state.h" #include "qemu_socket.h" #include "build_info.h" @@ -345,12 +344,7 @@ static void prepare_basic_features(void) tizen_base_port = get_sdb_base_port(); - // TODO: Codes about Getting host proxy migration is processing... -#if !defined(CONFIG_WIN32) get_host_proxy(http_proxy, https_proxy, ftp_proxy, socks_proxy); -#else - gethostproxy(http_proxy, https_proxy, ftp_proxy, socks_proxy); -#endif // using "DNS" provided by default QEMU g_strlcpy(dns, DEFAULT_QEMU_DNS_IP, strlen(DEFAULT_QEMU_DNS_IP) + 1); diff --git a/tizen/src/osutil-darwin.c b/tizen/src/osutil-darwin.c index 5a15ec0..542a9bc 100644 --- a/tizen/src/osutil-darwin.c +++ b/tizen/src/osutil-darwin.c @@ -34,12 +34,17 @@ @brief Collection of utilities for darwin */ +#include "maru_common.h" #include "osutil.h" #include "emulator.h" #include "debug_ch.h" #include "maru_err_table.h" #include "sdb.h" +#ifndef CONFIG_DARWIN +#error +#endif + #include #include #include diff --git a/tizen/src/osutil-linux.c b/tizen/src/osutil-linux.c index 9d0fe6d..66f9041 100644 --- a/tizen/src/osutil-linux.c +++ b/tizen/src/osutil-linux.c @@ -41,14 +41,8 @@ #include "maru_err_table.h" #include "sdb.h" -#if 0 -#include -#include -#include -#include -#include -#include -#include +#ifndef CONFIG_LINUX +#error #endif #include diff --git a/tizen/src/osutil-win32.c b/tizen/src/osutil-win32.c index 02555ce..3dbde81 100644 --- a/tizen/src/osutil-win32.c +++ b/tizen/src/osutil-win32.c @@ -41,6 +41,10 @@ #include "maru_err_table.h" #include "sdb.h" +#ifndef CONFIG_WIN32 +#error +#endif + #include MULTI_DEBUG_CHANNEL (emulator, osutil); @@ -48,6 +52,8 @@ MULTI_DEBUG_CHANNEL (emulator, osutil); extern char tizen_target_img_path[]; extern int tizen_base_port; +static const char *pactempfile = ".autoproxy"; + void check_vm_lock_os(void) { uint32_t port; @@ -163,3 +169,190 @@ void print_system_info_os(void) INFO("* Total Ram : %llu kB, Free: %lld kB\n", memInfo.ullTotalPhys / 1024, memInfo.ullAvailPhys / 1024); } + +static int get_auto_proxy(BYTE *url, char *http_proxy, char *https_proxy, char *ftp_proxy, char *socks_proxy) +{ + char type[MAXLEN]; + char proxy[MAXLEN]; + char line[MAXLEN]; + FILE *fp_pacfile; + char *p = NULL; + + INFO("pac address: %s\n", (char*)url); + download_url((char*)url); + + fp_pacfile = fopen(pactempfile, "r"); + if(fp_pacfile != NULL) { + while(fgets(line, MAXLEN, fp_pacfile) != NULL) { + if( (strstr(line, "return") != NULL) && (strstr(line, "if") == NULL)) { + INFO("line found %s", line); + sscanf(line, "%*[^\"]\"%s %s", type, proxy); + } + } + + if(g_str_has_prefix(type, DIRECT)) { + INFO("auto proxy is set to direct mode\n"); + fclose(fp_pacfile); + } + else if(g_str_has_prefix(type, PROXY)) { + INFO("auto proxy is set to proxy mode\n"); + INFO("type: %s, proxy: %s\n", type, proxy); + p = strtok(proxy, "\";"); + if(p != NULL) { + INFO("auto proxy to set: %s\n",p); + strcpy(http_proxy, p); + strcpy(https_proxy, p); + strcpy(ftp_proxy, p); + strcpy(socks_proxy, p); + } + fclose(fp_pacfile); + } + else + { + ERR("pac file is not wrong! It could be the wrong pac address or pac file format\n"); + fclose(fp_pacfile); + } + } + else { + ERR("fail to get pacfile fp\n"); + return -1; + } + + remove(pactempfile); + + return 0; +} + +void get_host_proxy_os(char *http_proxy, char *https_proxy, char *ftp_proxy, char *socks_proxy) +{ + HKEY hKey; + int nRet; + LONG lRet; + BYTE *proxyenable, *proxyserver; + char *p; + char *real_proxy; + BYTE *url; + + DWORD dwLength = 0; + nRet = RegOpenKeyEx(HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", + 0, KEY_QUERY_VALUE, &hKey); + if (nRet != ERROR_SUCCESS) { + ERR("Failed to open registry from %s\n", + "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"); + return 0; + } + //check auto proxy key exists + lRet = RegQueryValueEx(hKey, "AutoConfigURL", 0, NULL, NULL, &dwLength); + if (lRet != ERROR_SUCCESS && dwLength == 0) { + ERR("Failed to query value from %s\n", + "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\AutoConfigURL"); + } + else { + //if exists + url = (char*)malloc(dwLength); + if (url == NULL) { + ERR( "Failed to allocate a buffer\n"); + } + else { + memset(url, 0x00, dwLength); + lRet = RegQueryValueEx(hKey, "AutoConfigURL", 0, NULL, url, &dwLength); + if (lRet == ERROR_SUCCESS && dwLength != 0) { + get_auto_proxy(url, http_proxy, https_proxy, ftp_proxy, socks_proxy); + RegCloseKey(hKey); + return 0; + } + } + } + //check manual proxy key exists + lRet = RegQueryValueEx(hKey, "ProxyEnable", 0, NULL, NULL, &dwLength); + if (lRet != ERROR_SUCCESS && dwLength == 0) { + ERR(stderr, "Failed to query value from %s\n", + "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ProxyEnable"); + RegCloseKey(hKey); + return 0; + } + proxyenable = (BYTE*)malloc(dwLength); + if (proxyenable == NULL) { + ERR( "Failed to allocate a buffer\n"); + RegCloseKey(hKey); + return 0; + } + + lRet = RegQueryValueEx(hKey, "ProxyEnable", 0, NULL, proxyenable, &dwLength); + if (lRet != ERROR_SUCCESS) { + free(proxyenable); + ERR("Failed to query value from %s\n", + "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ProxyEnable"); + RegCloseKey(hKey); + return 0; + } + if (*(char*)proxyenable == 0) { + free(proxyenable); + RegCloseKey(hKey); + return 0; + } + + dwLength = 0; + lRet = RegQueryValueEx(hKey, "ProxyServer", 0, NULL, NULL, &dwLength); + if (lRet != ERROR_SUCCESS && dwLength == 0) { + ERR("Failed to query value from from %s\n", + "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"); + RegCloseKey(hKey); + return 0; + } + + proxyserver = (BYTE*)malloc(dwLength); + if (proxyserver == NULL) { + ERR( "Failed to allocate a buffer\n"); + RegCloseKey(hKey); + return 0; + } + + memset(proxyserver, 0x00, dwLength); + lRet = RegQueryValueEx(hKey, "ProxyServer", 0, NULL, proxyserver, &dwLength); + if (lRet != ERROR_SUCCESS) { + free(proxyserver); + ERR( "Failed to query value from from %s\n", + "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"); + RegCloseKey(hKey); + return 0; + } + + if((char*)proxyserver != NULL) { + INFO("proxy value: %s\n", (char*)proxyserver); + real_proxy = malloc(MAXLEN); + + for(p = strtok((char*)proxyserver, ";"); p; p = strtok(NULL, ";")){ + if(strstr(p, HTTP_PROTOCOL)) { + remove_string(p, real_proxy, HTTP_PROTOCOL); + strcpy(http_proxy, real_proxy); + } + else if(strstr(p, HTTPS_PROTOCOL)) { + remove_string(p, real_proxy, HTTPS_PROTOCOL); + strcpy(https_proxy, real_proxy); + } + else if(strstr(p, FTP_PROTOCOL)) { + remove_string(p, real_proxy, FTP_PROTOCOL); + strcpy(ftp_proxy, real_proxy); + } + else if(strstr(p, SOCKS_PROTOCOL)) { + remove_string(p, real_proxy, SOCKS_PROTOCOL); + strcpy(socks_proxy, real_proxy); + } + else { + INFO("all protocol uses the same proxy server: %s\n", p); + strcpy(http_proxy, p); + strcpy(https_proxy, p); + strcpy(ftp_proxy, p); + strcpy(socks_proxy, p); + } + } + free(real_proxy); + } + else { + INFO("proxy is null\n"); + return 0; + } + RegCloseKey(hKey); +} -- 2.7.4