diff options
-rw-r--r-- | mdk-stage1/network.c | 82 | ||||
-rw-r--r-- | mdk-stage1/network.h | 1 |
2 files changed, 58 insertions, 25 deletions
diff --git a/mdk-stage1/network.c b/mdk-stage1/network.c index 7cae99e47..6e018a310 100644 --- a/mdk-stage1/network.c +++ b/mdk-stage1/network.c @@ -49,7 +49,7 @@ /* include it after config-stage1.h so that _GNU_SOURCE is defined and strndup is available */ #include <string.h> -static int choose_mirror_from_list(const char *desired_protocol, char **host, char **filepath); +static int choose_mirror_from_list(char *http_proxy_host, char *http_proxy_port, const char *desired_protocol, char **host, char **filepath); static void error_message_net(void) /* reduce code size */ { @@ -321,6 +321,11 @@ static int save_netinfo(struct interface_info * intf) { fprintf(f, "PASS=%s\n", intf->pass); } + if (!streq(intf->http_proxy_host, "") && !streq(intf->http_proxy_port, "")) { + fprintf(f, "PROXY=%s\n", intf->http_proxy_host); + fprintf(f, "PROXYPORT=%s\n", intf->http_proxy_port); + } + fclose(f); return 0; @@ -605,11 +610,31 @@ static char * interface_select(void) } +static enum return_type intf_get_http_proxy(struct interface_info * intf) +{ + char *questions[] = { "HTTP proxy host", "HTTP proxy port", NULL }; + char *questions_auto[] = { "proxy_host", "proxy_port", NULL }; + static char ** answers = NULL; + enum return_type results; + + results = ask_from_entries_auto("Please enter HTTP proxy host and port if you need it, else leave them blank or cancel.", + questions, &answers, 40, questions_auto, NULL); + if (results == RETURN_OK) { + intf->http_proxy_host = strdup(answers[0]); + intf->http_proxy_port = strdup(answers[1]); + } else { + intf->http_proxy_host = ""; + intf->http_proxy_port = ""; + } + + return results; +} + /* -=-=-- */ -static enum return_type intf_select_and_up(void) +static enum return_type intf_select_and_up(char **http_proxy_host, char **http_proxy_port) { static struct interface_info intf[20]; static int num_interfaces = 0; @@ -634,9 +659,15 @@ static enum return_type intf_select_and_up(void) results = bringup_networking(sel_intf); + if (http_proxy_host && http_proxy_port) { + intf_get_http_proxy(intf); + *http_proxy_host = intf->http_proxy_host; + *http_proxy_port = intf->http_proxy_port; + } + if (results == RETURN_OK) save_netinfo(sel_intf); - + return results; } @@ -648,7 +679,7 @@ enum return_type nfs_prepare(void) char * questions_auto[] = { "server", "directory", NULL }; static char ** answers = NULL; char * nfsmount_location; - enum return_type results = intf_select_and_up(); + enum return_type results = intf_select_and_up(NULL, NULL); if (results != RETURN_OK) return results; @@ -704,12 +735,13 @@ enum return_type nfs_prepare(void) enum return_type ftp_prepare(void) { - char * questions[] = { "FTP server", DISTRIB_NAME " directory", "Login", "Password", "HTTP proxy host", "HTTP proxy port", NULL }; - char * questions_auto[] = { "server", "directory", "user", "pass", "proxy_host", "proxy_port", NULL }; + char * questions[] = { "FTP server", DISTRIB_NAME " directory", "Login", "Password", NULL }; + char * questions_auto[] = { "server", "directory", "user", "pass", NULL }; static char ** answers = NULL; enum return_type results; char modules_cz[500]; struct utsname kernel_uname; + char *http_proxy_host = "", *http_proxy_port = ""; if (!ramdisk_possible()) { stg1_error_message("FTP install needs more than %d Mbytes of memory (detected %d Mbytes). You may want to try an NFS install.", @@ -717,7 +749,7 @@ enum return_type ftp_prepare(void) return RETURN_ERROR; } - results = intf_select_and_up(); + results = intf_select_and_up(&http_proxy_host, &http_proxy_port); if (results != RETURN_OK) return results; @@ -733,19 +765,18 @@ enum return_type ftp_prepare(void) if (answers == NULL) answers = (char **) malloc(sizeof(questions)); - results = choose_mirror_from_list("ftp", &answers[0], &answers[1]); + results = choose_mirror_from_list(http_proxy_host, http_proxy_port, "ftp", &answers[0], &answers[1]); results = ask_from_entries_auto("Please enter the name or IP address of the FTP server, " "the directory containing the " DISTRIB_NAME " Distribution, " - "and the login/pass if necessary (leave login blank for anonymous). " - "Please enter HTTP proxy host and port if you need it.", + "and the login/pass if necessary (leave login blank for anonymous). ", questions, &answers, 40, questions_auto, NULL); if (results != RETURN_OK || streq(answers[0], "")) { unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ return ftp_prepare(); } - use_http_proxy = !streq(answers[4], "") && !streq(answers[5], ""); + use_http_proxy = !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); if (use_http_proxy) { log_message("FTP: don't connect to %s directly, will use proxy", answers[0]); @@ -791,7 +822,7 @@ enum return_type ftp_prepare(void) strcpy(ftp_hostname, ""); } strcat(ftp_hostname, answers[0]); - fd = http_download_file(ftp_hostname, location_full, &size, "ftp", answers[4], answers[5]); + fd = http_download_file(ftp_hostname, location_full, &size, "ftp", http_proxy_host, http_proxy_port); } else { fd = ftp_start_download(ftp_serv_response, location_full, &size); } @@ -826,8 +857,8 @@ enum return_type ftp_prepare(void) add_to_env("METHOD", "http"); sprintf(location_full, "ftp://%s%s", ftp_hostname, answers[1]); add_to_env("URLPREFIX", location_full); - add_to_env("PROXY", answers[4]); - add_to_env("PROXYPORT", answers[5]); + add_to_env("PROXY", http_proxy_host); + add_to_env("PROXYPORT", http_proxy_port); } else { add_to_env("METHOD", "ftp"); add_to_env("HOST", answers[0]); @@ -845,10 +876,11 @@ enum return_type ftp_prepare(void) enum return_type http_prepare(void) { - char * questions[] = { "HTTP server", DISTRIB_NAME " directory", "HTTP proxy host", "HTTP proxy port", NULL }; - char * questions_auto[] = { "server", "directory", "proxy_host", "proxy_port", NULL }; + char * questions[] = { "HTTP server", DISTRIB_NAME " directory", NULL }; + char * questions_auto[] = { "server", "directory", NULL }; static char ** answers = NULL; enum return_type results; + char *http_proxy_host = "", *http_proxy_port = ""; if (!ramdisk_possible()) { stg1_error_message("HTTP install needs more than %d Mbytes of memory (detected %d Mbytes). You may want to try an NFS install.", @@ -856,7 +888,7 @@ enum return_type http_prepare(void) return RETURN_ERROR; } - results = intf_select_and_up(); + results = intf_select_and_up(&http_proxy_host, &http_proxy_port); if (results != RETURN_OK) return results; @@ -867,8 +899,7 @@ enum return_type http_prepare(void) int use_http_proxy; results = ask_from_entries_auto("Please enter the name or IP address of the HTTP server, " - "and the directory containing the " DISTRIB_NAME " Distribution." - "Please enter HTTP proxy host and port if you need it.", + "and the directory containing the " DISTRIB_NAME " Distribution.", questions, &answers, 40, questions_auto, NULL); if (results != RETURN_OK || streq(answers[0], "")) { unset_param(MODE_AUTOMATIC); /* we are in a fallback mode */ @@ -880,9 +911,9 @@ enum return_type http_prepare(void) log_message("HTTP: trying to retrieve %s from %s", location_full, answers[0]); - use_http_proxy = !streq(answers[2], "") && !streq(answers[3], ""); + use_http_proxy = !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); - fd = http_download_file(answers[0], location_full, &size, use_http_proxy ? "http" : NULL, answers[2], answers[3]); + fd = http_download_file(answers[0], location_full, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); if (fd < 0) { log_message("HTTP: error %d", fd); if (fd == FTPERR_FAILED_CONNECT) @@ -902,9 +933,9 @@ enum return_type http_prepare(void) sprintf(location_full, "http://%s%s", answers[0], answers[1]); add_to_env("URLPREFIX", location_full); if (!streq(answers[2], "")) - add_to_env("PROXY", answers[2]); + add_to_env("PROXY", http_proxy_host); if (!streq(answers[3], "")) - add_to_env("PROXYPORT", answers[3]); + add_to_env("PROXYPORT", http_proxy_port); } while (results == RETURN_BACK); @@ -954,19 +985,20 @@ static int mirrorlist_entry_split(const char *entry, char *mirror[4]) /* mirror return 0; } -static int choose_mirror_from_list(const char *protocol, char **selected_host, char **filepath) { +static int choose_mirror_from_list(char *http_proxy_host, char *http_proxy_port, const char *protocol, char **selected_host, char **filepath) { enum return_type results; char *mirrorlist[MIRRORLIST_MAX_ITEMS][4]; char *medialist[MIRRORLIST_MAX_MEDIA+1]; int mirrorlist_number = 0, media_number = 0; int fd, size, line_pos = 0; char line[500]; + int use_http_proxy = !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); if (IS_AUTOMATIC) return RETURN_OK; - fd = http_download_file(MIRRORLIST_HOST, MIRRORLIST_PATH, &size, NULL, NULL, NULL); + fd = http_download_file(MIRRORLIST_HOST, MIRRORLIST_PATH, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); if (fd < 0) { log_message("HTTP: unable to get mirrors list"); return RETURN_ERROR; diff --git a/mdk-stage1/network.h b/mdk-stage1/network.h index 02eea45b6..44a96c77b 100644 --- a/mdk-stage1/network.h +++ b/mdk-stage1/network.h @@ -41,6 +41,7 @@ struct interface_info { struct in_addr ip, netmask, broadcast, network; enum boot_proto_type boot_proto; char *user, *pass; /* for ADSL connection */ + char *http_proxy_host, *http_proxy_port; }; |