diff options
Diffstat (limited to 'mdk-stage1')
33 files changed, 12666 insertions, 7577 deletions
diff --git a/mdk-stage1/adsl.c b/mdk-stage1/adsl.c index afddb455b..ace741c18 100644 --- a/mdk-stage1/adsl.c +++ b/mdk-stage1/adsl.c @@ -40,148 +40,144 @@ static enum return_type adsl_connect(struct interface_info * intf, char * username, char * password, char * acname) { - char pppoe_call[500]; - char * pppd_launch[] = { "/sbin/pppd", "pty", pppoe_call, "noipdefault", "noauth", "default-asyncmap", "defaultroute", - "hide-password", "nodetach", "usepeerdns", "local", "mtu", "1492", "mru", "1492", "noaccomp", - "noccp", "nobsdcomp", "nodeflate", "nopcomp", "novj", "novjccomp", "user", username, - "password", password, "lcp-echo-interval", "20", "lcp-echo-failure", "3", "lock", "persist", NULL }; - int fd; - int retries = 10; - char * tty_adsl = "/dev/tty6"; - enum return_type status = RETURN_ERROR; - pid_t ppp_pid; - - snprintf(pppoe_call, sizeof(pppoe_call), "/sbin/pppoe -p /var/run/pppoe.conf-adsl.pid.pppoe -I %s -T 80 -U -m 1412", intf->device); - - if (!streq(acname, "")) { - strcat(pppoe_call, "-C "); - strcat(pppoe_call, acname); - } - - fd = open(tty_adsl, O_RDWR); - if (fd == -1) { - log_message("cannot open tty -- no pppd"); - return RETURN_ERROR; - } - else if (access(pppd_launch[0], X_OK)) { - log_message("cannot open pppd - %s doesn't exist", pppd_launch[0]); - return RETURN_ERROR; - } - - if (!(ppp_pid = fork())) { - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - - close(fd); - setsid(); - if (ioctl(0, TIOCSCTTY, NULL)) { - log_perror("could not set new controlling tty"); + char pppoe_call[500]; + char * pppd_launch[] = { "/sbin/pppd", "pty", pppoe_call, "noipdefault", "noauth", "default-asyncmap", "defaultroute", + "hide-password", "nodetach", "usepeerdns", "local", "mtu", "1492", "mru", "1492", "noaccomp", + "noccp", "nobsdcomp", "nodeflate", "nopcomp", "novj", "novjccomp", "user", username, + "password", password, "lcp-echo-interval", "20", "lcp-echo-failure", "3", "lock", "persist", NULL }; + int fd; + int retries = 10; + char * tty_adsl = "/dev/tty6"; + enum return_type status = RETURN_ERROR; + pid_t ppp_pid; + + snprintf(pppoe_call, sizeof(pppoe_call), "/sbin/pppoe -p /var/run/pppoe.conf-adsl.pid.pppoe -I %s -T 80 -U -m 1412", intf->device); + + if (!streq(acname, "")) { + strcat(pppoe_call, "-C "); + strcat(pppoe_call, acname); } - printf("\t(exec of pppd)\n"); - execv(pppd_launch[0], pppd_launch); - log_message("execve of %s failed: %s", pppd_launch[0], strerror(errno)); - exit(-1); - } - close(fd); - while (retries > 0 && kill(ppp_pid, 0) == 0) { - FILE * f; - if ((f = fopen("/var/run/pppd.tdb", "rb"))) { - while (1) { - char buf[500]; - char *p; - if (!fgets(buf, sizeof(buf), f)) { - break; - } - p = strstr(buf, "IPLOCAL="); - if (p) { - struct sockaddr_in addr; - if (inet_aton(p + 8, &addr.sin_addr)) { - intf->ip = addr.sin_addr; - } - status = RETURN_OK; - } - } - fclose(f); - if (status == RETURN_OK) { - log_message("PPP: connected!"); - break; - } - } - retries--; - log_message("PPP: <sleep>"); - sleep(2); - } - - if (status != RETURN_OK) { - log_message("PPP: could not connect"); - kill(ppp_pid, SIGTERM); - sleep(1); - kill(ppp_pid, SIGKILL); - sleep(1); - } - return status; + fd = open(tty_adsl, O_RDWR); + if (fd == -1) { + log_message("cannot open tty -- no pppd"); + return RETURN_ERROR; + } + else if (access(pppd_launch[0], X_OK)) { + log_message("cannot open pppd - %s doesn't exist", pppd_launch[0]); + return RETURN_ERROR; + } + + if (!(ppp_pid = fork())) { + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + + close(fd); + setsid(); + if (ioctl(0, TIOCSCTTY, NULL)) + log_perror("could not set new controlling tty"); + + printf("\t(exec of pppd)\n"); + execv(pppd_launch[0], pppd_launch); + log_message("execve of %s failed: %s", pppd_launch[0], strerror(errno)); + exit(-1); + } + close(fd); + while (retries > 0 && kill(ppp_pid, 0) == 0) { + FILE * f; + if ((f = fopen("/var/run/pppd.tdb", "rb"))) { + while (1) { + char buf[500]; + char *p; + if (!fgets(buf, sizeof(buf), f)) + break; + p = strstr(buf, "IPLOCAL="); + if (p) { + struct sockaddr_in addr; + if (inet_aton(p + 8, &addr.sin_addr)) + intf->ip = addr.sin_addr; + status = RETURN_OK; + } + } + fclose(f); + if (status == RETURN_OK) { + log_message("PPP: connected!"); + break; + } + } + retries--; + log_message("PPP: <sleep>"); + sleep(2); + } + + if (status != RETURN_OK) { + log_message("PPP: could not connect"); + kill(ppp_pid, SIGTERM); + sleep(1); + kill(ppp_pid, SIGKILL); + sleep(1); + } + return status; } enum return_type perform_adsl(struct interface_info * intf) { - struct in_addr addr; - char * questions[] = { "Username", "Password", "AC Name", NULL }; - char * questions_auto[] = { "adsluser", "adslpass", "adslacname", NULL }; - static char ** answers = NULL; - enum return_type results; + struct in_addr addr; + char * questions[] = { "Username", "Password", "AC Name", NULL }; + char * questions_auto[] = { "adsluser", "adslpass", "adslacname", NULL }; + static char ** answers = NULL; + enum return_type results; - inet_aton("10.0.0.10", &addr); - memcpy(&intf->ip, &addr, sizeof(addr)); + inet_aton("10.0.0.10", &addr); + memcpy(&intf->ip, &addr, sizeof(addr)); - inet_aton("255.255.255.0", &addr); - memcpy(&intf->netmask, &addr, sizeof(addr)); + inet_aton("255.255.255.0", &addr); + memcpy(&intf->netmask, &addr, sizeof(addr)); - *((uint32_t *) &intf->broadcast) = (*((uint32_t *) &intf->ip) & - *((uint32_t *) &intf->netmask)) | ~(*((uint32_t *) &intf->netmask)); + *((uint32_t *) &intf->broadcast) = (*((uint32_t *) &intf->ip) & + *((uint32_t *) &intf->netmask)) | ~(*((uint32_t *) &intf->netmask)); - intf->is_ptp = 0; + intf->is_ptp = 0; - if (configure_net_device(intf)) { - stg1_error_message("Could not configure.."); - return RETURN_ERROR; - } + if (configure_net_device(intf)) { + stg1_error_message("Could not configure.."); + return RETURN_ERROR; + } - results = ask_from_entries_auto("Please enter the username and password for your ADSL account.\n" + results = ask_from_entries_auto("Please enter the username and password for your ADSL account.\n" "Leave blank the AC Name field if you don't know what it means.\n" - "(Warning! only PPPoE protocol is supported)", - questions, &answers, 40, questions_auto, NULL); - if (results != RETURN_OK) { - return results; - } - - intf->boot_proto = BOOTPROTO_ADSL_PPPOE; - - wait_message("Waiting for ADSL connection to show up..."); - my_insmod("ppp_generic", ANY_DRIVER_TYPE, NULL, 1); - my_insmod("ppp_async", ANY_DRIVER_TYPE, NULL, 1); - results = adsl_connect(intf, answers[0], answers[1], answers[2]); - remove_wait_message(); - - if (results != RETURN_OK) { - wait_message("Retrying the ADSL connection..."); - results = adsl_connect(intf, answers[0], answers[1], answers[2]); - remove_wait_message(); - } else { - intf->user = strdup(answers[0]); - intf->pass = strdup(answers[1]); - intf->acname = strdup(answers[2]); - } - - if (results != RETURN_OK) { - stg1_error_message("I could not connect to the ADSL network."); - return perform_adsl(intf); - } - - sleep(1); - res_init(); /* reinit the resolver, pppd modified /etc/resolv.conf */ - - return RETURN_OK; + "(Warning! only PPPoE protocol is supported)", + questions, &answers, 40, questions_auto, NULL); + if (results != RETURN_OK) + return results; + + intf->boot_proto = BOOTPROTO_ADSL_PPPOE; + + wait_message("Waiting for ADSL connection to show up..."); + my_insmod("ppp_generic", ANY_DRIVER_TYPE, NULL, 1); + my_insmod("ppp_async", ANY_DRIVER_TYPE, NULL, 1); + results = adsl_connect(intf, answers[0], answers[1], answers[2]); + remove_wait_message(); + + if (results != RETURN_OK) { + wait_message("Retrying the ADSL connection..."); + results = adsl_connect(intf, answers[0], answers[1], answers[2]); + remove_wait_message(); + } else { + intf->user = strdup(answers[0]); + intf->pass = strdup(answers[1]); + intf->acname = strdup(answers[2]); + } + + if (results != RETURN_OK) { + stg1_error_message("I could not connect to the ADSL network."); + return perform_adsl(intf); + } + + sleep(1); + res_init(); /* reinit the resolver, pppd modified /etc/resolv.conf */ + + return RETURN_OK; } diff --git a/mdk-stage1/automatic.c b/mdk-stage1/automatic.c index a3821da23..fd9eb3679 100644 --- a/mdk-stage1/automatic.c +++ b/mdk-stage1/automatic.c @@ -36,138 +36,131 @@ static char * value_not_bound = ""; void grab_automatic_params(char * line) { - int i, p; - struct param_elem tmp_params[50]; - - i = 0; p = 0; - while (line[i] != '\0') { - char *name, *value; - int k; - int j = i; - - while (line[i] != ':' && line[i] != '\0') { - i++; - } - - name = _memdup(&line[j], i-j + 1); - name[i-j] = 0; - - k = i+1; - i++; - - while (line[i] != ',' && line[i] != '\0') { - i++; - } - - value = _memdup(&line[k], i-k + 1); - value[i-k] = 0; - - tmp_params[p].name = name; - tmp_params[p].value = value; - p++; - if (line[i] == '\0') { - break; - } - i++; - } - - tmp_params[p++].name = NULL; - automatic_params = _memdup(tmp_params, sizeof(struct param_elem) * p); - - log_message("AUTOMATIC MODE: got %d params", p-1); + int i, p; + struct param_elem tmp_params[50]; + + i = 0; p = 0; + while (line[i] != '\0') { + char *name, *value; + int k; + int j = i; + while (line[i] != ':' && line[i] != '\0') + i++; + name = _memdup(&line[j], i-j + 1); + name[i-j] = 0; + + k = i+1; + i++; + while (line[i] != ',' && line[i] != '\0') + i++; + value = _memdup(&line[k], i-k + 1); + value[i-k] = 0; + + tmp_params[p].name = name; + tmp_params[p].value = value; + p++; + if (line[i] == '\0') + break; + i++; + } + + tmp_params[p++].name = NULL; + automatic_params = _memdup(tmp_params, sizeof(struct param_elem) * p); + + log_message("AUTOMATIC MODE: got %d params", p-1); } char * get_auto_value(char * auto_param) { - struct param_elem * ptr = automatic_params; - - struct param_elem short_aliases[] = - { { "method", "met" }, { "network", "netw" }, { "interface", "int" }, { "gateway", "gat" }, - { "netmask", "netm" }, { "adsluser", "adslu" }, { "adslpass", "adslp" }, { "hostname", "hos" }, - { "domain", "dom" }, { "server", "ser" }, { "directory", "dir" }, { "user", "use" }, - { "pass", "pas" }, { "disk", "dis" }, { "partition", "par" }, { "proxy_host", "proxh" }, - { "proxy_port", "proxp" }, { NULL, NULL } }; - struct param_elem * ptr_alias = short_aliases; - while (ptr_alias->name) { - if (streq(auto_param, ptr_alias->name)) - break; - ptr_alias++; - } - - while (ptr->name) { - if (streq(ptr->name, auto_param) - || (ptr_alias->name && streq(ptr_alias->value, ptr->name))) - return ptr->value; - ptr++; - } - - return value_not_bound; + struct param_elem * ptr = automatic_params; + + struct param_elem short_aliases[] = + { { "method", "met" }, { "network", "netw" }, { "interface", "int" }, { "gateway", "gat" }, + { "netmask", "netm" }, { "adsluser", "adslu" }, { "adslpass", "adslp" }, { "hostname", "hos" }, + { "domain", "dom" }, { "server", "ser" }, { "directory", "dir" }, { "user", "use" }, + { "pass", "pas" }, { "disk", "dis" }, { "partition", "par" }, { "proxy_host", "proxh" }, + { "proxy_port", "proxp" }, { NULL, NULL } }; + struct param_elem * ptr_alias = short_aliases; + while (ptr_alias->name) { + if (streq(auto_param, ptr_alias->name)) + break; + ptr_alias++; + } + + while (ptr->name) { + if (streq(ptr->name, auto_param) + || (ptr_alias->name && streq(ptr_alias->value, ptr->name))) + return ptr->value; + ptr++; + } + + return value_not_bound; } enum return_type ask_from_list_auto(char *msg, char ** elems, char ** choice, char * auto_param, char ** elems_auto) { - if (!IS_AUTOMATIC) { - exit_bootsplash(); - return ask_from_list(msg, elems, choice); - } else { - char ** sav_elems = elems; - char * tmp = get_auto_value(auto_param); - while (elems && *elems) { - if (!strcmp(tmp, *elems_auto)) { - *choice = *elems; - log_message("AUTOMATIC: parameter %s for %s means returning %s", tmp, auto_param, *elems); - return RETURN_OK; - } - elems++; - elems_auto++; - } - unset_automatic(); /* we are in a fallback mode */ - return ask_from_list(msg, sav_elems, choice); - } + if (!IS_AUTOMATIC) { + exit_bootsplash(); + return ask_from_list(msg, elems, choice); + } else { + char ** sav_elems = elems; + char * tmp = get_auto_value(auto_param); + while (elems && *elems) { + if (!strcmp(tmp, *elems_auto)) { + *choice = *elems; + log_message("AUTOMATIC: parameter %s for %s means returning %s", tmp, auto_param, *elems); + return RETURN_OK; + } + elems++; + elems_auto++; + } + unset_automatic(); /* we are in a fallback mode */ + return ask_from_list(msg, sav_elems, choice); + } } enum return_type ask_from_list_comments_auto(char *msg, char ** elems, char ** elems_comments, char ** choice, char * auto_param, char ** elems_auto) { - if (!IS_AUTOMATIC) { - exit_bootsplash(); - return ask_from_list_comments(msg, elems, elems_comments, choice); - } else { - char ** sav_elems = elems; - char * tmp = get_auto_value(auto_param); - while (elems && *elems) { - if (!strcmp(tmp, *elems_auto)) { - *choice = *elems; - log_message("AUTOMATIC: parameter %s for %s means returning %s", tmp, auto_param, *elems); - return RETURN_OK; - } - elems++; - elems_auto++; - } - unset_automatic(); /* we are in a fallback mode */ - return ask_from_list_comments(msg, sav_elems, elems_comments, choice); - } + if (!IS_AUTOMATIC) { + exit_bootsplash(); + return ask_from_list_comments(msg, elems, elems_comments, choice); + } else { + char ** sav_elems = elems; + char * tmp = get_auto_value(auto_param); + while (elems && *elems) { + if (!strcmp(tmp, *elems_auto)) { + *choice = *elems; + log_message("AUTOMATIC: parameter %s for %s means returning %s", tmp, auto_param, *elems); + return RETURN_OK; + } + elems++; + elems_auto++; + } + unset_automatic(); /* we are in a fallback mode */ + return ask_from_list_comments(msg, sav_elems, elems_comments, choice); + } } enum return_type ask_from_entries_auto(char *msg, char ** questions, char *** answers, int entry_size, char ** questions_auto, void (*callback_func)(char ** strings)) { - if (!IS_AUTOMATIC) { - exit_bootsplash(); - return ask_from_entries(msg, questions, answers, entry_size, callback_func); - } else { - char * tmp_answers[50]; - int i = 0; - while (questions && *questions) { - tmp_answers[i] = get_auto_value(*questions_auto); - log_message("AUTOMATIC: question %s answers %s because of param %s", *questions, tmp_answers[i], *questions_auto); - i++; - questions++; - questions_auto++; - - } - *answers = _memdup(tmp_answers, sizeof(char *) * i); - return RETURN_OK; - } + if (!IS_AUTOMATIC) { + exit_bootsplash(); + return ask_from_entries(msg, questions, answers, entry_size, callback_func); + } else { + char * tmp_answers[50]; + int i = 0; + while (questions && *questions) { + tmp_answers[i] = get_auto_value(*questions_auto); + log_message("AUTOMATIC: question %s answers %s because of param %s", *questions, tmp_answers[i], *questions_auto); + i++; + questions++; + questions_auto++; + + } + *answers = _memdup(tmp_answers, sizeof(char *) * i); + return RETURN_OK; + } } diff --git a/mdk-stage1/bootsplash.c b/mdk-stage1/bootsplash.c index 839b4562e..9d0d53327 100644 --- a/mdk-stage1/bootsplash.c +++ b/mdk-stage1/bootsplash.c @@ -23,53 +23,48 @@ static FILE* splash = NULL; static void update_progression_only(int current_size) { - if (splash && total_size) { - float ratio = (float) (current_size + 1) / total_size; - if (ratio > previous + 0.01) { - fprintf(splash, "show %d\n", (int) (ratio * 65534)); - fflush(splash); - previous = ratio; - } - } + if (splash && total_size) { + float ratio = (float) (current_size + 1) / total_size; + if (ratio > previous + 0.01) { + fprintf(splash, "show %d\n", (int) (ratio * 65534)); + fflush(splash); + previous = ratio; + } + } } static void open_bootsplash(void) { - if (!splash) { - splash = fopen("/proc/splash", "w"); - } - - if (!splash) { - log_message("opening /proc/splash failed"); - } + if (!splash) splash = fopen("/proc/splash", "w"); + if (!splash) log_message("opening /proc/splash failed"); } void exit_bootsplash(void) { - log_message("exiting bootsplash"); - open_bootsplash(); - if (splash) { - fprintf(splash, "verbose\n"); - fflush(splash); - } + log_message("exiting bootsplash"); + open_bootsplash(); + if (splash) { + fprintf(splash, "verbose\n"); + fflush(splash); + } } void init_progression(char *msg, int size) { - previous = 0; total_size = size; - open_bootsplash(); - update_progression_only(0); - init_progression_raw(msg, size); + previous = 0; total_size = size; + open_bootsplash(); + update_progression_only(0); + init_progression_raw(msg, size); } void update_progression(int current_size) { - update_progression_only(current_size); - update_progression_raw(current_size); + update_progression_only(current_size); + update_progression_raw(current_size); } void end_progression(void) { - end_progression_raw(); + end_progression_raw(); } diff --git a/mdk-stage1/cdrom.c b/mdk-stage1/cdrom.c index b0060880b..e75e0fde4 100644 --- a/mdk-stage1/cdrom.c +++ b/mdk-stage1/cdrom.c @@ -38,16 +38,16 @@ static int mount_that_cd_device(char * dev_name) { - char device_fullname[50]; - int mount_result; + char device_fullname[50]; + int mount_result; - snprintf(device_fullname, sizeof(device_fullname), "/dev/%s", dev_name); + snprintf(device_fullname, sizeof(device_fullname), "/dev/%s", dev_name); - mount_result = my_mount(device_fullname, MEDIA_LOCATION, "iso9660", 0); + mount_result = my_mount(device_fullname, MEDIA_LOCATION, "iso9660", 0); - create_IMAGE_LOCATION(MEDIA_LOCATION); + create_IMAGE_LOCATION(MEDIA_LOCATION); - return mount_result; + return mount_result; } @@ -55,177 +55,172 @@ static enum return_type try_with_device(char * dev_name, char * dev_model); static enum return_type do_with_device(char * dev_name, char * dev_model) { - if (!image_has_stage2()) { - enum return_type results; - umount(MEDIA_LOCATION); - results = ask_yes_no("That CDROM disc does not seem to be a " DISTRIB_NAME " Installation CDROM.\nRetry with another disc?"); - if (results == RETURN_OK) { - return try_with_device(dev_name, dev_model); - } - return results; - } + if (!image_has_stage2()) { + enum return_type results; + umount(MEDIA_LOCATION); + results = ask_yes_no("That CDROM disc does not seem to be a " DISTRIB_NAME " Installation CDROM.\nRetry with another disc?"); + if (results == RETURN_OK) + return try_with_device(dev_name, dev_model); + return results; + } - log_message("found a " DISTRIB_NAME " CDROM, good news!"); + log_message("found a " DISTRIB_NAME " CDROM, good news!"); - may_load_compressed_image(); + may_load_compressed_image(); - if (!KEEP_MOUNTED) { - /* in rescue mode, we don't need the media anymore */ - umount(MEDIA_LOCATION); - } - - add_to_env("METHOD", "cdrom"); + if (!KEEP_MOUNTED) + /* in rescue mode, we don't need the media anymore */ + umount(MEDIA_LOCATION); - return RETURN_OK; -} + add_to_env("METHOD", "cdrom"); + return RETURN_OK; +} static enum return_type try_with_device(char * dev_name, char * dev_model) { - wait_message("Trying to access a CDROM disc (drive %s)", dev_model); - - if (mount_that_cd_device(dev_name) == -1) { - enum return_type results; - char msg[500]; - unset_automatic(); /* we are in a fallback mode */ - remove_wait_message(); - - snprintf(msg, sizeof(msg), "I can't access a " DISTRIB_NAME " Installation disc in your CDROM drive (%s).\nRetry?", dev_model); - results = ask_yes_no(msg); - if (results == RETURN_OK) { - return try_with_device(dev_name, dev_model); - } - return results; - } - remove_wait_message(); - - return do_with_device(dev_name, dev_model); + wait_message("Trying to access a CDROM disc (drive %s)", dev_model); + + if (mount_that_cd_device(dev_name) == -1) { + enum return_type results; + char msg[500]; + unset_automatic(); /* we are in a fallback mode */ + remove_wait_message(); + + snprintf(msg, sizeof(msg), "I can't access a " DISTRIB_NAME " Installation disc in your CDROM drive (%s).\nRetry?", dev_model); + results = ask_yes_no(msg); + if (results == RETURN_OK) + return try_with_device(dev_name, dev_model); + return results; + } + remove_wait_message(); + + return do_with_device(dev_name, dev_model); } int try_automatic(char ** medias, char ** medias_models) { - static char * already_tried[50] = { NULL }; - char ** model = medias_models; - char ** ptr = medias; - int i = 0; - while (ptr && *ptr) { - char ** p; - for (p = already_tried; p && *p; p++) - if (streq(*p, *ptr)) - goto try_automatic_already_tried; - *p = strdup(*ptr); - *(p+1) = NULL; - - wait_message("Trying to access " DISTRIB_NAME " CDROM disc (drive %s)", *model); - if (mount_that_cd_device(*ptr) != -1) { - if (image_has_stage2()) { - remove_wait_message(); - return i; - } - else - umount(MEDIA_LOCATION); - } - remove_wait_message(); - - try_automatic_already_tried: - ptr++; - model++; - i++; - } - return -1; + static char * already_tried[50] = { NULL }; + char ** model = medias_models; + char ** ptr = medias; + int i = 0; + while (ptr && *ptr) { + char ** p; + for (p = already_tried; p && *p; p++) + if (streq(*p, *ptr)) + goto try_automatic_already_tried; + *p = strdup(*ptr); + *(p+1) = NULL; + + wait_message("Trying to access " DISTRIB_NAME " CDROM disc (drive %s)", *model); + if (mount_that_cd_device(*ptr) != -1) { + if (image_has_stage2()) { + remove_wait_message(); + return i; + } + else + umount(MEDIA_LOCATION); + } + remove_wait_message(); + + try_automatic_already_tried: + ptr++; + model++; + i++; + } + return -1; } enum return_type cdrom_prepare(void) { - char ** medias, ** ptr, ** medias_models; - char * choice; - int i, count = 0; - enum return_type results; - static int already_probed_ide_generic = 0; - - my_insmod("ide_cd_mod", ANY_DRIVER_TYPE, NULL, 0); - - if (IS_AUTOMATIC) { - get_medias(CDROM, &medias, &medias_models, BUS_IDE); - if ((i = try_automatic(medias, medias_models)) != -1) - return do_with_device(medias[i], medias_models[i]); - - get_medias(CDROM, &medias, &medias_models, BUS_PCMCIA); - if ((i = try_automatic(medias, medias_models)) != -1) - return do_with_device(medias[i], medias_models[i]); - - my_insmod("sr_mod", ANY_DRIVER_TYPE, NULL, 0); - get_medias(CDROM, &medias, &medias_models, BUS_SCSI); - if ((i = try_automatic(medias, medias_models)) != -1) - return do_with_device(medias[i], medias_models[i]); - - get_medias(CDROM, &medias, &medias_models, BUS_USB); - if ((i = try_automatic(medias, medias_models)) != -1) - return do_with_device(medias[i], medias_models[i]); - - /* detect hybrid isos (isos dumped to an USB stick) */ - my_insmod("sd_mod", ANY_DRIVER_TYPE, NULL, 0); - get_medias(DISK, &medias, &medias_models, BUS_USB); - if ((i = try_automatic(medias, medias_models)) != -1) { - return do_with_device(medias[i], medias_models[i]); - } - - unset_automatic(); - } else - my_insmod("sr_mod", ANY_DRIVER_TYPE, NULL, 0); - - - get_medias(CDROM, &medias, &medias_models, BUS_ANY); - ptr = medias; - while (ptr && *ptr) { - count++; - ptr++; - } - - if (count == 0) { - if (!already_probed_ide_generic) { - already_probed_ide_generic = 1; - my_insmod("ide_generic", ANY_DRIVER_TYPE, NULL, 0); - return cdrom_prepare(); - } - stg1_error_message("No CDROM device found."); - i = ask_insmod(MEDIA_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return cdrom_prepare(); - } - - if (count == 1) { - results = try_with_device(*medias, *medias_models); - - if (results == RETURN_OK) - return RETURN_OK; - i = ask_insmod(MEDIA_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return cdrom_prepare(); - } - - results = ask_from_list_comments("Please choose the CDROM drive to use for the installation.", medias, medias_models, &choice); - if (results == RETURN_OK) { - char ** model = medias_models; + char ** medias, ** ptr, ** medias_models; + char * choice; + int i, count = 0; + enum return_type results; + static int already_probed_ide_generic = 0; + + my_insmod("ide_cd_mod", ANY_DRIVER_TYPE, NULL, 0); + + if (IS_AUTOMATIC) { + get_medias(CDROM, &medias, &medias_models, BUS_IDE); + if ((i = try_automatic(medias, medias_models)) != -1) + return do_with_device(medias[i], medias_models[i]); + + get_medias(CDROM, &medias, &medias_models, BUS_PCMCIA); + if ((i = try_automatic(medias, medias_models)) != -1) + return do_with_device(medias[i], medias_models[i]); + + my_insmod("sr_mod", ANY_DRIVER_TYPE, NULL, 0); + get_medias(CDROM, &medias, &medias_models, BUS_SCSI); + if ((i = try_automatic(medias, medias_models)) != -1) + return do_with_device(medias[i], medias_models[i]); + + get_medias(CDROM, &medias, &medias_models, BUS_USB); + if ((i = try_automatic(medias, medias_models)) != -1) + return do_with_device(medias[i], medias_models[i]); + + /* detect hybrid isos (isos dumped to an USB stick) */ + my_insmod("sd_mod", ANY_DRIVER_TYPE, NULL, 0); + get_medias(DISK, &medias, &medias_models, BUS_USB); + if ((i = try_automatic(medias, medias_models)) != -1) { + return do_with_device(medias[i], medias_models[i]); + } + + unset_automatic(); + } else + my_insmod("sr_mod", ANY_DRIVER_TYPE, NULL, 0); + + + get_medias(CDROM, &medias, &medias_models, BUS_ANY); ptr = medias; - while (ptr && *ptr && model && *model) { - if (!strcmp(*ptr, choice)) - break; - ptr++; - model++; + while (ptr && *ptr) { + count++; + ptr++; } - results = try_with_device(choice, *model); - } else - return results; - - if (results == RETURN_OK) - return RETURN_OK; - if (results == RETURN_BACK) - return cdrom_prepare(); - - i = ask_insmod(MEDIA_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return cdrom_prepare(); + + if (count == 0) { + if (!already_probed_ide_generic) { + already_probed_ide_generic = 1; + my_insmod("ide_generic", ANY_DRIVER_TYPE, NULL, 0); + return cdrom_prepare(); + } + stg1_error_message("No CDROM device found."); + i = ask_insmod(MEDIA_ADAPTERS); + if (i == RETURN_BACK) + return RETURN_BACK; + return cdrom_prepare(); + } + + if (count == 1) { + results = try_with_device(*medias, *medias_models); + if (results == RETURN_OK) + return RETURN_OK; + i = ask_insmod(MEDIA_ADAPTERS); + if (i == RETURN_BACK) + return RETURN_BACK; + return cdrom_prepare(); + } + + results = ask_from_list_comments("Please choose the CDROM drive to use for the installation.", medias, medias_models, &choice); + if (results == RETURN_OK) { + char ** model = medias_models; + ptr = medias; + while (ptr && *ptr && model && *model) { + if (!strcmp(*ptr, choice)) + break; + ptr++; + model++; + } + results = try_with_device(choice, *model); + } else + return results; + + if (results == RETURN_OK) + return RETURN_OK; + if (results == RETURN_BACK) + return cdrom_prepare(); + + i = ask_insmod(MEDIA_ADAPTERS); + if (i == RETURN_BACK) + return RETURN_BACK; + return cdrom_prepare(); } diff --git a/mdk-stage1/dhcp.c b/mdk-stage1/dhcp.c index bec9e24cf..a4cc07446 100644 --- a/mdk-stage1/dhcp.c +++ b/mdk-stage1/dhcp.c @@ -57,50 +57,50 @@ typedef int bp_int32; typedef short bp_int16; -#define BOOTP_OPTION_NETMASK 1 -#define BOOTP_OPTION_GATEWAY 3 -#define BOOTP_OPTION_DNS 6 -#define BOOTP_OPTION_HOSTNAME 12 -#define BOOTP_OPTION_DOMAIN 15 -#define BOOTP_OPTION_BROADCAST 28 +#define BOOTP_OPTION_NETMASK 1 +#define BOOTP_OPTION_GATEWAY 3 +#define BOOTP_OPTION_DNS 6 +#define BOOTP_OPTION_HOSTNAME 12 +#define BOOTP_OPTION_DOMAIN 15 +#define BOOTP_OPTION_BROADCAST 28 -#define DHCP_OPTION_REQADDR 50 -#define DHCP_OPTION_LEASE 51 -#define DHCP_OPTION_TYPE 53 -#define DHCP_OPTION_SERVER 54 -#define DHCP_OPTION_OPTIONREQ 55 -#define DHCP_OPTION_MAXSIZE 57 +#define DHCP_OPTION_REQADDR 50 +#define DHCP_OPTION_LEASE 51 +#define DHCP_OPTION_TYPE 53 +#define DHCP_OPTION_SERVER 54 +#define DHCP_OPTION_OPTIONREQ 55 +#define DHCP_OPTION_MAXSIZE 57 -#define DHCP_OPTION_CLIENT_IDENTIFIER 61 +#define DHCP_OPTION_CLIENT_IDENTIFIER 61 -#define BOOTP_CLIENT_PORT 68 -#define BOOTP_SERVER_PORT 67 +#define BOOTP_CLIENT_PORT 68 +#define BOOTP_SERVER_PORT 67 -#define BOOTP_OPCODE_REQUEST 1 -#define BOOTP_OPCODE_REPLY 2 +#define BOOTP_OPCODE_REQUEST 1 +#define BOOTP_OPCODE_REPLY 2 -#define DHCP_TYPE_DISCOVER 1 -#define DHCP_TYPE_OFFER 2 -#define DHCP_TYPE_REQUEST 3 -#define DHCP_TYPE_ACK 5 -#define DHCP_TYPE_RELEASE 7 +#define DHCP_TYPE_DISCOVER 1 +#define DHCP_TYPE_OFFER 2 +#define DHCP_TYPE_REQUEST 3 +#define DHCP_TYPE_ACK 5 +#define DHCP_TYPE_RELEASE 7 -#define BOOTP_VENDOR_LENGTH 64 -#define DHCP_VENDOR_LENGTH 340 +#define BOOTP_VENDOR_LENGTH 64 +#define DHCP_VENDOR_LENGTH 340 struct bootp_request { - char opcode; - char hw; - char hwlength; - char hopcount; - bp_int32 id; - bp_int16 secs; - bp_int16 flags; - bp_int32 ciaddr, yiaddr, server_ip, bootp_gw_ip; - char hwaddr[16]; - char servername[64]; - char bootfile[128]; - char vendor[DHCP_VENDOR_LENGTH]; + char opcode; + char hw; + char hwlength; + char hopcount; + bp_int32 id; + bp_int16 secs; + bp_int16 flags; + bp_int32 ciaddr, yiaddr, server_ip, bootp_gw_ip; + char hwaddr[16]; + char servername[64]; + char bootfile[128]; + char vendor[DHCP_VENDOR_LENGTH]; } ; static const char vendor_cookie[] = { 99, 130, 83, 99, 255 }; @@ -108,396 +108,396 @@ static const char vendor_cookie[] = { 99, 130, 83, 99, 255 }; static unsigned int verify_checksum(void * buf2, int length2) { - unsigned int csum = 0; - unsigned short * sp; + unsigned int csum = 0; + unsigned short * sp; - for (sp = (unsigned short *) buf2; length2 > 0; (length2 -= 2), sp++) - csum += *sp; - - while (csum >> 16) - csum = (csum & 0xffff) + (csum >> 16); + for (sp = (unsigned short *) buf2; length2 > 0; (length2 -= 2), sp++) + csum += *sp; + + while (csum >> 16) + csum = (csum & 0xffff) + (csum >> 16); - return (csum == 0xffff); + return (csum == 0xffff); } static int initial_setup_interface(char * device, int s) { - struct sockaddr_in * addrp; - struct ifreq req; - struct rtentry route; - int true = 1; - - addrp = (struct sockaddr_in *) &req.ifr_addr; - - strcpy(req.ifr_name, device); - addrp->sin_family = AF_INET; - addrp->sin_port = 0; - memset(&addrp->sin_addr, 0, sizeof(addrp->sin_addr)); - - req.ifr_flags = 0; /* take it down */ - if (ioctl(s, SIOCSIFFLAGS, &req)) { - log_perror("SIOCSIFFLAGS (downing)"); - return -1; - } - - addrp->sin_family = AF_INET; - addrp->sin_addr.s_addr = htonl(0); - if (ioctl(s, SIOCSIFADDR, &req)) { - log_perror("SIOCSIFADDR"); - return -1; - } - - req.ifr_flags = IFF_UP | IFF_BROADCAST | IFF_RUNNING; - if (ioctl(s, SIOCSIFFLAGS, &req)) { - log_perror("SIOCSIFFLAGS (upping)"); - return -1; - } - - memset(&route, 0, sizeof(route)); - memcpy(&route.rt_gateway, addrp, sizeof(*addrp)); + struct sockaddr_in * addrp; + struct ifreq req; + struct rtentry route; + int true = 1; + + addrp = (struct sockaddr_in *) &req.ifr_addr; + + strcpy(req.ifr_name, device); + addrp->sin_family = AF_INET; + addrp->sin_port = 0; + memset(&addrp->sin_addr, 0, sizeof(addrp->sin_addr)); + + req.ifr_flags = 0; /* take it down */ + if (ioctl(s, SIOCSIFFLAGS, &req)) { + log_perror("SIOCSIFFLAGS (downing)"); + return -1; + } - addrp->sin_family = AF_INET; - addrp->sin_port = 0; - addrp->sin_addr.s_addr = INADDR_ANY; - memcpy(&route.rt_dst, addrp, sizeof(*addrp)); - memcpy(&route.rt_genmask, addrp, sizeof(*addrp)); - - route.rt_dev = device; - route.rt_flags = RTF_UP; - route.rt_metric = 0; - - if (ioctl(s, SIOCADDRT, &route)) { - if (errno != EEXIST) { - close(s); - log_perror("SIOCADDRT"); - return -1; - } - } - - if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &true, sizeof(true))) { - close(s); - log_perror("setsockopt"); - return -1; - } - - /* I need to sleep a bit in order for kernel to finish init of the + addrp->sin_family = AF_INET; + addrp->sin_addr.s_addr = htonl(0); + if (ioctl(s, SIOCSIFADDR, &req)) { + log_perror("SIOCSIFADDR"); + return -1; + } + + req.ifr_flags = IFF_UP | IFF_BROADCAST | IFF_RUNNING; + if (ioctl(s, SIOCSIFFLAGS, &req)) { + log_perror("SIOCSIFFLAGS (upping)"); + return -1; + } + + memset(&route, 0, sizeof(route)); + memcpy(&route.rt_gateway, addrp, sizeof(*addrp)); + + addrp->sin_family = AF_INET; + addrp->sin_port = 0; + addrp->sin_addr.s_addr = INADDR_ANY; + memcpy(&route.rt_dst, addrp, sizeof(*addrp)); + memcpy(&route.rt_genmask, addrp, sizeof(*addrp)); + + route.rt_dev = device; + route.rt_flags = RTF_UP; + route.rt_metric = 0; + + if (ioctl(s, SIOCADDRT, &route)) { + if (errno != EEXIST) { + close(s); + log_perror("SIOCADDRT"); + return -1; + } + } + + if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &true, sizeof(true))) { + close(s); + log_perror("setsockopt"); + return -1; + } + + /* I need to sleep a bit in order for kernel to finish init of the network device; this would allow to not send further multiple dhcp requests when only one is needed. */ - wait_message("Bringing up networking..."); - sleep(2); - remove_wait_message(); + wait_message("Bringing up networking..."); + sleep(2); + remove_wait_message(); - return 0; + return 0; } void set_missing_ip_info(struct interface_info * intf) { - bp_int32 ipNum = *((bp_int32 *) &intf->ip); - bp_int32 nmNum; + bp_int32 ipNum = *((bp_int32 *) &intf->ip); + bp_int32 nmNum; - if (intf->netmask.s_addr == 0) - inet_aton(guess_netmask(inet_ntoa(intf->ip)), &intf->netmask); + if (intf->netmask.s_addr == 0) + inet_aton(guess_netmask(inet_ntoa(intf->ip)), &intf->netmask); - nmNum = *((bp_int32 *) &intf->netmask); + nmNum = *((bp_int32 *) &intf->netmask); - if (intf->broadcast.s_addr == 0) - *((bp_int32 *) &intf->broadcast) = (ipNum & nmNum) | ~(nmNum); + if (intf->broadcast.s_addr == 0) + *((bp_int32 *) &intf->broadcast) = (ipNum & nmNum) | ~(nmNum); - if (intf->network.s_addr == 0) - *((bp_int32 *) &intf->network) = ipNum & nmNum; + if (intf->network.s_addr == 0) + *((bp_int32 *) &intf->network) = ipNum & nmNum; } static void parse_reply(struct bootp_request * breq, struct interface_info * intf) { - unsigned char * chptr; - unsigned char option, length; + unsigned char * chptr; + unsigned char option, length; - if (breq->bootfile && strlen(breq->bootfile) > 0) { + if (breq->bootfile && strlen(breq->bootfile) > 0) { if (IS_NETAUTO) add_to_env("KICKSTART", breq->bootfile); else log_message("warning: ignoring `bootfile' DHCP server parameter, since `netauto' boot parameter was not given; reboot with `linux netauto' (and anymore useful boot parameters) if you want `bootfile' to be used as a `auto_inst.cfg.pl' stage2 configuration file"); } - - memcpy(&intf->ip, &breq->yiaddr, 4); - - chptr = (unsigned char *) breq->vendor; - chptr += 4; - while (*chptr != 0xFF && (void *) chptr < (void *) breq->vendor + DHCP_VENDOR_LENGTH) { - char tmp_str[500]; - option = *chptr++; - if (!option) - continue; - length = *chptr++; - - switch (option) { - case BOOTP_OPTION_DNS: - memcpy(&dns_server, chptr, sizeof(dns_server)); - log_message("got dns %s", inet_ntoa(dns_server)); - if (length >= sizeof(dns_server)*2) { - memcpy(&dns_server2, chptr+sizeof(dns_server), sizeof(dns_server2)); - log_message("got dns2 %s", inet_ntoa(dns_server2)); - } - break; - - case BOOTP_OPTION_NETMASK: - memcpy(&intf->netmask, chptr, sizeof(intf->netmask)); - log_message("got netmask %s", inet_ntoa(intf->netmask)); - break; - - case BOOTP_OPTION_DOMAIN: - memcpy(tmp_str, chptr, length); - tmp_str[length] = '\0'; - domain = strdup(tmp_str); - log_message("got domain %s", domain); - break; - - case BOOTP_OPTION_BROADCAST: - memcpy(&intf->broadcast, chptr, sizeof(intf->broadcast)); - log_message("got broadcast %s", inet_ntoa(intf->broadcast)); - break; - - case BOOTP_OPTION_GATEWAY: - memcpy(&gateway, chptr, sizeof(gateway)); - log_message("got gateway %s", inet_ntoa(gateway)); - break; - - } - - chptr += length; - } - - set_missing_ip_info(intf); + + memcpy(&intf->ip, &breq->yiaddr, 4); + + chptr = (unsigned char *) breq->vendor; + chptr += 4; + while (*chptr != 0xFF && (void *) chptr < (void *) breq->vendor + DHCP_VENDOR_LENGTH) { + char tmp_str[500]; + option = *chptr++; + if (!option) + continue; + length = *chptr++; + + switch (option) { + case BOOTP_OPTION_DNS: + memcpy(&dns_server, chptr, sizeof(dns_server)); + log_message("got dns %s", inet_ntoa(dns_server)); + if (length >= sizeof(dns_server)*2) { + memcpy(&dns_server2, chptr+sizeof(dns_server), sizeof(dns_server2)); + log_message("got dns2 %s", inet_ntoa(dns_server2)); + } + break; + + case BOOTP_OPTION_NETMASK: + memcpy(&intf->netmask, chptr, sizeof(intf->netmask)); + log_message("got netmask %s", inet_ntoa(intf->netmask)); + break; + + case BOOTP_OPTION_DOMAIN: + memcpy(tmp_str, chptr, length); + tmp_str[length] = '\0'; + domain = strdup(tmp_str); + log_message("got domain %s", domain); + break; + + case BOOTP_OPTION_BROADCAST: + memcpy(&intf->broadcast, chptr, sizeof(intf->broadcast)); + log_message("got broadcast %s", inet_ntoa(intf->broadcast)); + break; + + case BOOTP_OPTION_GATEWAY: + memcpy(&gateway, chptr, sizeof(gateway)); + log_message("got gateway %s", inet_ntoa(gateway)); + break; + + } + + chptr += length; + } + + set_missing_ip_info(intf); } static void init_vendor_codes(struct bootp_request * breq) { - memcpy(breq->vendor, vendor_cookie, sizeof(vendor_cookie)); + memcpy(breq->vendor, vendor_cookie, sizeof(vendor_cookie)); } static char gen_hwaddr[16]; static int prepare_request(struct bootp_request * breq, int sock, char * device) { - struct ifreq req; - - memset(breq, 0, sizeof(*breq)); - - breq->opcode = BOOTP_OPCODE_REQUEST; - - strcpy(req.ifr_name, device); - if (ioctl(sock, SIOCGIFHWADDR, &req)) { - log_perror("SIOCSIFHWADDR"); - return -1; - } - - breq->hw = req.ifr_hwaddr.sa_family; - breq->hwlength = IFHWADDRLEN; - memcpy(breq->hwaddr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); - memcpy(gen_hwaddr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); - - breq->hopcount = 0; - - init_vendor_codes(breq); - - return 0; + struct ifreq req; + + memset(breq, 0, sizeof(*breq)); + + breq->opcode = BOOTP_OPCODE_REQUEST; + + strcpy(req.ifr_name, device); + if (ioctl(sock, SIOCGIFHWADDR, &req)) { + log_perror("SIOCSIFHWADDR"); + return -1; + } + + breq->hw = req.ifr_hwaddr.sa_family; + breq->hwlength = IFHWADDRLEN; + memcpy(breq->hwaddr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); + memcpy(gen_hwaddr, req.ifr_hwaddr.sa_data, IFHWADDRLEN); + + breq->hopcount = 0; + + init_vendor_codes(breq); + + return 0; } static int get_vendor_code(struct bootp_request * bresp, unsigned char option, void * data) { - unsigned char * chptr; - unsigned int length, theOption; - - chptr = (unsigned char*) bresp->vendor + 4; - while (*chptr != 0xFF && *chptr != option) { - theOption = *chptr++; - if (!theOption) - continue; - length = *chptr++; - chptr += length; - } - - if (*chptr++ == 0xff) - return 1; - - length = *chptr++; - memcpy(data, chptr, length); - - return 0; + unsigned char * chptr; + unsigned int length, theOption; + + chptr = (unsigned char*) bresp->vendor + 4; + while (*chptr != 0xFF && *chptr != option) { + theOption = *chptr++; + if (!theOption) + continue; + length = *chptr++; + chptr += length; + } + + if (*chptr++ == 0xff) + return 1; + + length = *chptr++; + memcpy(data, chptr, length); + + return 0; } static unsigned long currticks(void) { - struct timeval tv; - unsigned long csecs; - unsigned long ticks_per_csec, ticks_per_usec; - - /* Note: 18.2 ticks/sec. */ - - gettimeofday (&tv, 0); - csecs = tv.tv_sec / 10; - ticks_per_csec = csecs * 182; - ticks_per_usec = (((tv.tv_sec - csecs * 10) * 1000000 + tv.tv_usec) * 182 / 10000000); - return ticks_per_csec + ticks_per_usec; + struct timeval tv; + unsigned long csecs; + unsigned long ticks_per_csec, ticks_per_usec; + + /* Note: 18.2 ticks/sec. */ + + gettimeofday (&tv, 0); + csecs = tv.tv_sec / 10; + ticks_per_csec = csecs * 182; + ticks_per_usec = (((tv.tv_sec - csecs * 10) * 1000000 + tv.tv_usec) * 182 / 10000000); + return ticks_per_csec + ticks_per_usec; } #define BACKOFF_LIMIT 7 -#define TICKS_PER_SEC 18 -#define MAX_ARP_RETRIES 7 +#define TICKS_PER_SEC 18 +#define MAX_ARP_RETRIES 7 static void rfc951_sleep(int exp) { - static long seed = 0; - long q; - unsigned long tmo; - - if (exp > BACKOFF_LIMIT) - exp = BACKOFF_LIMIT; - - if (!seed) - /* Initialize linear congruential generator. */ - seed = (currticks () + *(long *) &gen_hwaddr + ((short *) gen_hwaddr)[2]); + static long seed = 0; + long q; + unsigned long tmo; + + if (exp > BACKOFF_LIMIT) + exp = BACKOFF_LIMIT; + + if (!seed) + /* Initialize linear congruential generator. */ + seed = (currticks () + *(long *) &gen_hwaddr + ((short *) gen_hwaddr)[2]); - /* Simplified version of the LCG given in Bruce Scheier's - "Applied Cryptography". */ - q = seed / 53668; - if ((seed = 40014 * (seed - 53668 * q) - 12211 * q) < 0) - seed += 2147483563l; - - /* Compute mask. */ - for (tmo = 63; tmo <= 60 * TICKS_PER_SEC && --exp > 0; tmo = 2 * tmo + 1) - ; + /* Simplified version of the LCG given in Bruce Scheier's + "Applied Cryptography". */ + q = seed / 53668; + if ((seed = 40014 * (seed - 53668 * q) - 12211 * q) < 0) + seed += 2147483563l; + + /* Compute mask. */ + for (tmo = 63; tmo <= 60 * TICKS_PER_SEC && --exp > 0; tmo = 2 * tmo + 1) + ; - /* Sleep. */ - log_message("<sleep>"); - - for (tmo = (tmo & seed) + currticks (); currticks () < tmo;); + /* Sleep. */ + log_message("<sleep>"); + + for (tmo = (tmo & seed) + currticks (); currticks () < tmo;); } static int handle_transaction(int s, struct bootp_request * breq, struct bootp_request * bresp, - struct sockaddr_in * server_addr, int dhcp_type) + struct sockaddr_in * server_addr, int dhcp_type) { - struct pollfd polls; - int i, j; - int retry = 1; - int sin; - char eth_packet[ETH_FRAME_LEN]; - struct iphdr * ip_hdr; - struct udphdr * udp_hdr; - unsigned char type; - unsigned long starttime; - int timeout = 1; - - breq->id = starttime = currticks(); - breq->secs = 0; - - sin = socket(AF_PACKET, SOCK_DGRAM, ntohs(ETH_P_IP)); - if (sin < 0) { - log_perror("af_packet socket"); - return -1; - } - - while (retry <= MAX_ARP_RETRIES) { - i = sizeof(*breq); - - if (sendto(s, breq, i, 0, (struct sockaddr *) server_addr, sizeof(*server_addr)) != i) { - close(s); - log_perror("sendto"); - return -1; - } - - polls.fd = sin; - polls.events = POLLIN; - - while (poll(&polls, 1, timeout*1000) == 1) { - - if ((j = recv(sin, eth_packet, sizeof(eth_packet), 0)) == -1) { - log_perror("recv"); - continue; - } - - /* We need to do some basic sanity checking of the header */ - if (j < (signed)(sizeof(*ip_hdr) + sizeof(*udp_hdr))) - continue; - - ip_hdr = (void *) eth_packet; - if (!verify_checksum(ip_hdr, sizeof(*ip_hdr))) - continue; - - if (ntohs(ip_hdr->tot_len) > j) - continue; - - j = ntohs(ip_hdr->tot_len); - - if (ip_hdr->protocol != IPPROTO_UDP) - continue; - - udp_hdr = (void *) (eth_packet + sizeof(*ip_hdr)); - - if (ntohs(udp_hdr->source) != BOOTP_SERVER_PORT) - continue; - - if (ntohs(udp_hdr->dest) != BOOTP_CLIENT_PORT) - continue; - /* Go on with this packet; it looks sane */ - - /* Originally copied sizeof (*bresp) - this is a security - problem due to a potential underflow of the source - buffer. Also, it trusted that the packet was properly - 0xFF terminated, which is not true in the case of the - DHCP server on Cisco 800 series ISDN router. */ - - memset (bresp, 0xFF, sizeof (*bresp)); - memcpy (bresp, (char *) udp_hdr + sizeof (*udp_hdr), j - sizeof (*ip_hdr) - sizeof (*udp_hdr)); - - /* sanity checks */ - if (bresp->id != breq->id) - continue; - if (bresp->opcode != BOOTP_OPCODE_REPLY) - continue; - if (bresp->hwlength != breq->hwlength) - continue; - if (memcmp(bresp->hwaddr, breq->hwaddr, bresp->hwlength)) - continue; - if (get_vendor_code(bresp, DHCP_OPTION_TYPE, &type) || type != dhcp_type) - continue; - if (memcmp(bresp->vendor, vendor_cookie, 4)) - continue; - return 0; - } - rfc951_sleep(retry); - breq->secs = htons ((currticks () - starttime) / 20); - retry++; - timeout *= 2; - if (timeout > 5) - timeout = 5; - } - - return -1; + struct pollfd polls; + int i, j; + int retry = 1; + int sin; + char eth_packet[ETH_FRAME_LEN]; + struct iphdr * ip_hdr; + struct udphdr * udp_hdr; + unsigned char type; + unsigned long starttime; + int timeout = 1; + + breq->id = starttime = currticks(); + breq->secs = 0; + + sin = socket(AF_PACKET, SOCK_DGRAM, ntohs(ETH_P_IP)); + if (sin < 0) { + log_perror("af_packet socket"); + return -1; + } + + while (retry <= MAX_ARP_RETRIES) { + i = sizeof(*breq); + + if (sendto(s, breq, i, 0, (struct sockaddr *) server_addr, sizeof(*server_addr)) != i) { + close(s); + log_perror("sendto"); + return -1; + } + + polls.fd = sin; + polls.events = POLLIN; + + while (poll(&polls, 1, timeout*1000) == 1) { + + if ((j = recv(sin, eth_packet, sizeof(eth_packet), 0)) == -1) { + log_perror("recv"); + continue; + } + + /* We need to do some basic sanity checking of the header */ + if (j < (signed)(sizeof(*ip_hdr) + sizeof(*udp_hdr))) + continue; + + ip_hdr = (void *) eth_packet; + if (!verify_checksum(ip_hdr, sizeof(*ip_hdr))) + continue; + + if (ntohs(ip_hdr->tot_len) > j) + continue; + + j = ntohs(ip_hdr->tot_len); + + if (ip_hdr->protocol != IPPROTO_UDP) + continue; + + udp_hdr = (void *) (eth_packet + sizeof(*ip_hdr)); + + if (ntohs(udp_hdr->source) != BOOTP_SERVER_PORT) + continue; + + if (ntohs(udp_hdr->dest) != BOOTP_CLIENT_PORT) + continue; + /* Go on with this packet; it looks sane */ + + /* Originally copied sizeof (*bresp) - this is a security + problem due to a potential underflow of the source + buffer. Also, it trusted that the packet was properly + 0xFF terminated, which is not true in the case of the + DHCP server on Cisco 800 series ISDN router. */ + + memset (bresp, 0xFF, sizeof (*bresp)); + memcpy (bresp, (char *) udp_hdr + sizeof (*udp_hdr), j - sizeof (*ip_hdr) - sizeof (*udp_hdr)); + + /* sanity checks */ + if (bresp->id != breq->id) + continue; + if (bresp->opcode != BOOTP_OPCODE_REPLY) + continue; + if (bresp->hwlength != breq->hwlength) + continue; + if (memcmp(bresp->hwaddr, breq->hwaddr, bresp->hwlength)) + continue; + if (get_vendor_code(bresp, DHCP_OPTION_TYPE, &type) || type != dhcp_type) + continue; + if (memcmp(bresp->vendor, vendor_cookie, 4)) + continue; + return 0; + } + rfc951_sleep(retry); + breq->secs = htons ((currticks () - starttime) / 20); + retry++; + timeout *= 2; + if (timeout > 5) + timeout = 5; + } + + return -1; } static void add_vendor_code(struct bootp_request * breq, unsigned char option, unsigned char length, void * data) { - unsigned char * chptr; - int theOption, theLength; - - chptr = (unsigned char*) breq->vendor; - chptr += 4; - while (*chptr != 0xFF && *chptr != option) { - theOption = *chptr++; - if (!theOption) continue; - theLength = *chptr++; - chptr += theLength; - } - - *chptr++ = option; - *chptr++ = length; - memcpy(chptr, data, length); - chptr[length] = 0xff; + unsigned char * chptr; + int theOption, theLength; + + chptr = (unsigned char*) breq->vendor; + chptr += 4; + while (*chptr != 0xFF && *chptr != option) { + theOption = *chptr++; + if (!theOption) continue; + theLength = *chptr++; + chptr += theLength; + } + + *chptr++ = option; + *chptr++ = length; + memcpy(chptr, data, length); + chptr[length] = 0xff; } @@ -506,173 +506,173 @@ char * dhcp_domain = NULL; enum return_type perform_dhcp(struct interface_info * intf) { - int s, i; - struct sockaddr_in server_addr; - struct sockaddr_in client_addr; - struct sockaddr_in broadcast_addr; - struct bootp_request breq, bresp; - unsigned char messageType; - unsigned int lease; - short aShort; - int num_options; - char requested_options[50]; - char * client_id_str, * client_id_hwaddr; - - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s < 0) { - log_perror("socket"); - return RETURN_ERROR; - } - - { - enum return_type results; - char * questions[] = { "Host name", "Domain name", NULL }; - char * questions_auto[] = { "hostname", "domain" }; - static char ** answers = NULL; - char * boulet; - - client_id_str = client_id_hwaddr = NULL; - - results = ask_from_entries_auto("If the DHCP server needs to know you by name; please fill in this information. " - "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for " - "domain name, for a machine called `mybox.mynetwork.com' on the Internet.", - questions, &answers, 32, questions_auto, NULL); - if (results == RETURN_OK) - { - dhcp_hostname = answers[0]; - if ((boulet = strchr(dhcp_hostname, '.')) != NULL) - boulet[0] = '\0'; - dhcp_domain = answers[1]; - - if (*dhcp_hostname && *dhcp_domain) { - /* if we have both, then create client id from them */ - client_id_str = malloc(1 + strlen(dhcp_hostname) + 1 + strlen(dhcp_domain) + 1); - client_id_str[0] = '\0'; - sprintf(client_id_str+1, "%s.%s", dhcp_hostname, dhcp_domain); - } - } - } - - if (initial_setup_interface(intf->device, s) != 0) { - close(s); - return RETURN_ERROR; - } - - if (prepare_request(&breq, s, intf->device) != 0) { - close(s); - return RETURN_ERROR; - } - - messageType = DHCP_TYPE_DISCOVER; - add_vendor_code(&breq, DHCP_OPTION_TYPE, 1, &messageType); - - /* add pieces needed to have DDNS/DHCP IP selection based on requested name */ - if (dhcp_hostname && *dhcp_hostname) { /* pick client id form based on absence or presence of domain name */ - if (*dhcp_domain) /* alternate style <hostname>.<domainname> */ - add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, strlen(client_id_str+1)+1, client_id_str); - else { /* usual style (aka windows / dhcpcd) */ - /* but put MAC in form required for client identifier first */ - client_id_hwaddr = malloc(IFHWADDRLEN+2); - /* (from pump-0.8.22/dhcp.c) - * Microsoft uses a client identifier field of the 802.3 address with a - * pre-byte of a "1". In order to re-use the DHCP address that they set - * for this interface, we have to mimic their identifier. - */ - client_id_hwaddr[0] = 1; /* set flag for ethernet */ - memcpy(client_id_hwaddr+1, gen_hwaddr, IFHWADDRLEN); - add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, IFHWADDRLEN+1, client_id_hwaddr); - } - /* this is the one that the dhcp server really wants for DDNS updates */ - add_vendor_code(&breq, BOOTP_OPTION_HOSTNAME, strlen(dhcp_hostname), dhcp_hostname); - log_message("DHCP: telling server to use name = %s", dhcp_hostname); - } - - memset(&client_addr.sin_addr, 0, sizeof(&client_addr.sin_addr)); - client_addr.sin_family = AF_INET; - client_addr.sin_port = htons(BOOTP_CLIENT_PORT); /* bootp client */ - - if (bind(s, (struct sockaddr *) &client_addr, sizeof(client_addr))) { - log_perror("bind"); - return RETURN_ERROR; - } - - broadcast_addr.sin_family = AF_INET; - broadcast_addr.sin_port = htons(BOOTP_SERVER_PORT); /* bootp server */ - memset(&broadcast_addr.sin_addr, 0xff, sizeof(broadcast_addr.sin_addr)); /* broadcast */ - - log_message("DHCP: sending DISCOVER"); - - wait_message("Sending DHCP request..."); - i = handle_transaction(s, &breq, &bresp, &broadcast_addr, DHCP_TYPE_OFFER); - remove_wait_message(); - - if (i != 0) { - stg1_error_message("No DHCP reply received."); - close(s); - return RETURN_ERROR; - } - - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(BOOTP_SERVER_PORT); /* bootp server */ - if (get_vendor_code(&bresp, DHCP_OPTION_SERVER, &server_addr.sin_addr)) { - close(s); - log_message("DHCPOFFER didn't include server address"); - return RETURN_ERROR; - } - - init_vendor_codes(&breq); - messageType = DHCP_TYPE_REQUEST; - add_vendor_code(&breq, DHCP_OPTION_TYPE, 1, &messageType); - add_vendor_code(&breq, DHCP_OPTION_SERVER, 4, &server_addr.sin_addr); - add_vendor_code(&breq, DHCP_OPTION_REQADDR, 4, &bresp.yiaddr); - - /* if used the first time, then have to use it again */ - if (dhcp_hostname && *dhcp_hostname) { /* add pieces needed to have DDNS/DHCP IP selection based on requested name */ - if (dhcp_domain && *dhcp_domain) /* alternate style */ - add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, strlen(client_id_str+1)+1, client_id_str); - else /* usual style (aka windows / dhcpcd) */ - add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, IFHWADDRLEN+1, client_id_hwaddr); - /* this is the one that the dhcp server really wants for DDNS updates */ - add_vendor_code(&breq, BOOTP_OPTION_HOSTNAME, strlen(dhcp_hostname), dhcp_hostname); - } - - aShort = ntohs(sizeof(struct bootp_request)); - add_vendor_code(&breq, DHCP_OPTION_MAXSIZE, 2, &aShort); - - num_options = 0; - requested_options[num_options++] = BOOTP_OPTION_NETMASK; - requested_options[num_options++] = BOOTP_OPTION_GATEWAY; - requested_options[num_options++] = BOOTP_OPTION_DNS; - requested_options[num_options++] = BOOTP_OPTION_DOMAIN; - requested_options[num_options++] = BOOTP_OPTION_BROADCAST; - add_vendor_code(&breq, DHCP_OPTION_OPTIONREQ, num_options, requested_options); - - /* request a lease of 1 hour */ - i = htonl(60 * 60); - add_vendor_code(&breq, DHCP_OPTION_LEASE, 4, &i); - - log_message("DHCP: sending REQUEST"); - - i = handle_transaction(s, &breq, &bresp, &broadcast_addr, DHCP_TYPE_ACK); - - if (i != 0) { - close(s); - return RETURN_ERROR; - } - - if (get_vendor_code(&bresp, DHCP_OPTION_LEASE, &lease)) { - log_message("failed to get lease time\n"); - return RETURN_ERROR; - } - lease = ntohl(lease); - - close(s); - - intf->netmask.s_addr = 0; - intf->broadcast.s_addr = 0; - intf->network.s_addr = 0; - - parse_reply(&bresp, intf); - - return RETURN_OK; + int s, i; + struct sockaddr_in server_addr; + struct sockaddr_in client_addr; + struct sockaddr_in broadcast_addr; + struct bootp_request breq, bresp; + unsigned char messageType; + unsigned int lease; + short aShort; + int num_options; + char requested_options[50]; + char * client_id_str, * client_id_hwaddr; + + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s < 0) { + log_perror("socket"); + return RETURN_ERROR; + } + + { + enum return_type results; + char * questions[] = { "Host name", "Domain name", NULL }; + char * questions_auto[] = { "hostname", "domain" }; + static char ** answers = NULL; + char * boulet; + + client_id_str = client_id_hwaddr = NULL; + + results = ask_from_entries_auto("If the DHCP server needs to know you by name; please fill in this information. " + "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for " + "domain name, for a machine called `mybox.mynetwork.com' on the Internet.", + questions, &answers, 32, questions_auto, NULL); + if (results == RETURN_OK) + { + dhcp_hostname = answers[0]; + if ((boulet = strchr(dhcp_hostname, '.')) != NULL) + boulet[0] = '\0'; + dhcp_domain = answers[1]; + + if (*dhcp_hostname && *dhcp_domain) { + /* if we have both, then create client id from them */ + client_id_str = malloc(1 + strlen(dhcp_hostname) + 1 + strlen(dhcp_domain) + 1); + client_id_str[0] = '\0'; + sprintf(client_id_str+1, "%s.%s", dhcp_hostname, dhcp_domain); + } + } + } + + if (initial_setup_interface(intf->device, s) != 0) { + close(s); + return RETURN_ERROR; + } + + if (prepare_request(&breq, s, intf->device) != 0) { + close(s); + return RETURN_ERROR; + } + + messageType = DHCP_TYPE_DISCOVER; + add_vendor_code(&breq, DHCP_OPTION_TYPE, 1, &messageType); + + /* add pieces needed to have DDNS/DHCP IP selection based on requested name */ + if (dhcp_hostname && *dhcp_hostname) { /* pick client id form based on absence or presence of domain name */ + if (*dhcp_domain) /* alternate style <hostname>.<domainname> */ + add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, strlen(client_id_str+1)+1, client_id_str); + else { /* usual style (aka windows / dhcpcd) */ + /* but put MAC in form required for client identifier first */ + client_id_hwaddr = malloc(IFHWADDRLEN+2); + /* (from pump-0.8.22/dhcp.c) + * Microsoft uses a client identifier field of the 802.3 address with a + * pre-byte of a "1". In order to re-use the DHCP address that they set + * for this interface, we have to mimic their identifier. + */ + client_id_hwaddr[0] = 1; /* set flag for ethernet */ + memcpy(client_id_hwaddr+1, gen_hwaddr, IFHWADDRLEN); + add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, IFHWADDRLEN+1, client_id_hwaddr); + } + /* this is the one that the dhcp server really wants for DDNS updates */ + add_vendor_code(&breq, BOOTP_OPTION_HOSTNAME, strlen(dhcp_hostname), dhcp_hostname); + log_message("DHCP: telling server to use name = %s", dhcp_hostname); + } + + memset(&client_addr.sin_addr, 0, sizeof(&client_addr.sin_addr)); + client_addr.sin_family = AF_INET; + client_addr.sin_port = htons(BOOTP_CLIENT_PORT); /* bootp client */ + + if (bind(s, (struct sockaddr *) &client_addr, sizeof(client_addr))) { + log_perror("bind"); + return RETURN_ERROR; + } + + broadcast_addr.sin_family = AF_INET; + broadcast_addr.sin_port = htons(BOOTP_SERVER_PORT); /* bootp server */ + memset(&broadcast_addr.sin_addr, 0xff, sizeof(broadcast_addr.sin_addr)); /* broadcast */ + + log_message("DHCP: sending DISCOVER"); + + wait_message("Sending DHCP request..."); + i = handle_transaction(s, &breq, &bresp, &broadcast_addr, DHCP_TYPE_OFFER); + remove_wait_message(); + + if (i != 0) { + stg1_error_message("No DHCP reply received."); + close(s); + return RETURN_ERROR; + } + + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(BOOTP_SERVER_PORT); /* bootp server */ + if (get_vendor_code(&bresp, DHCP_OPTION_SERVER, &server_addr.sin_addr)) { + close(s); + log_message("DHCPOFFER didn't include server address"); + return RETURN_ERROR; + } + + init_vendor_codes(&breq); + messageType = DHCP_TYPE_REQUEST; + add_vendor_code(&breq, DHCP_OPTION_TYPE, 1, &messageType); + add_vendor_code(&breq, DHCP_OPTION_SERVER, 4, &server_addr.sin_addr); + add_vendor_code(&breq, DHCP_OPTION_REQADDR, 4, &bresp.yiaddr); + + /* if used the first time, then have to use it again */ + if (dhcp_hostname && *dhcp_hostname) { /* add pieces needed to have DDNS/DHCP IP selection based on requested name */ + if (dhcp_domain && *dhcp_domain) /* alternate style */ + add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, strlen(client_id_str+1)+1, client_id_str); + else /* usual style (aka windows / dhcpcd) */ + add_vendor_code(&breq, DHCP_OPTION_CLIENT_IDENTIFIER, IFHWADDRLEN+1, client_id_hwaddr); + /* this is the one that the dhcp server really wants for DDNS updates */ + add_vendor_code(&breq, BOOTP_OPTION_HOSTNAME, strlen(dhcp_hostname), dhcp_hostname); + } + + aShort = ntohs(sizeof(struct bootp_request)); + add_vendor_code(&breq, DHCP_OPTION_MAXSIZE, 2, &aShort); + + num_options = 0; + requested_options[num_options++] = BOOTP_OPTION_NETMASK; + requested_options[num_options++] = BOOTP_OPTION_GATEWAY; + requested_options[num_options++] = BOOTP_OPTION_DNS; + requested_options[num_options++] = BOOTP_OPTION_DOMAIN; + requested_options[num_options++] = BOOTP_OPTION_BROADCAST; + add_vendor_code(&breq, DHCP_OPTION_OPTIONREQ, num_options, requested_options); + + /* request a lease of 1 hour */ + i = htonl(60 * 60); + add_vendor_code(&breq, DHCP_OPTION_LEASE, 4, &i); + + log_message("DHCP: sending REQUEST"); + + i = handle_transaction(s, &breq, &bresp, &broadcast_addr, DHCP_TYPE_ACK); + + if (i != 0) { + close(s); + return RETURN_ERROR; + } + + if (get_vendor_code(&bresp, DHCP_OPTION_LEASE, &lease)) { + log_message("failed to get lease time\n"); + return RETURN_ERROR; + } + lease = ntohl(lease); + + close(s); + + intf->netmask.s_addr = 0; + intf->broadcast.s_addr = 0; + intf->network.s_addr = 0; + + parse_reply(&bresp, intf); + + return RETURN_OK; } diff --git a/mdk-stage1/directory.c b/mdk-stage1/directory.c index e33838035..0538b55b6 100644 --- a/mdk-stage1/directory.c +++ b/mdk-stage1/directory.c @@ -34,136 +34,136 @@ char * extract_list_directory(char * direct) { - char ** full = list_directory(direct); - char tmp[20000] = ""; - int i; - for (i=0; i<50 ; i++) { - if (!full || !*full) - break; - strcat(tmp, *full); - strcat(tmp, "\n"); - full++; - } - return strdup(tmp); + char ** full = list_directory(direct); + char tmp[20000] = ""; + int i; + for (i=0; i<50 ; i++) { + if (!full || !*full) + break; + strcat(tmp, *full); + strcat(tmp, "\n"); + full++; + } + return strdup(tmp); } static void choose_iso_in_directory(char *directory, char *location_full) { - char **file; - char *stage2_isos[100] = { "Use directory as a mirror tree", "-----" }; - int stage2_iso_number = 2; - - log_message("\"%s\" exists and is a directory, looking for iso files", directory); - - for (file = list_directory(directory); *file; file++) { - char isofile[500]; - char * loopdev = NULL; - - if (strstr(*file, ".iso") != *file + strlen(*file) - 4) - /* file doesn't end in .iso, skipping */ - continue; - - strcpy(isofile, directory); - strcat(isofile, "/"); - strcat(isofile, *file); - - if (lomount(isofile, LOOP_LOCATION, &loopdev, 0)) { - log_message("unable to mount iso file \"%s\", skipping", isofile); - continue; - } - symlink(LOOP_LOCATION_REL "/" ARCH, IMAGE_LOCATION); - - if (image_has_stage2()) { - log_message("stage2 installer found in ISO image \"%s\"", isofile); - stage2_isos[stage2_iso_number++] = strdup(*file); - } else { - log_message("ISO image \"%s\" doesn't contain stage2 installer", isofile); - } - - unlink(IMAGE_LOCATION); - umount(LOOP_LOCATION); - del_loop(loopdev); - } - - stage2_isos[stage2_iso_number] = NULL; - - if (stage2_iso_number > 2) { - enum return_type results; - do { - results = ask_from_list("Please choose the ISO image to be used to install the " - DISTRIB_NAME " Distribution.", - stage2_isos, file); - if (results == RETURN_BACK) { - return; - } else if (results == RETURN_OK) { - if (!strcmp(*file, stage2_isos[0])) { - /* use directory as a mirror tree */ - continue; - } else if (!strcmp(*file, stage2_isos[1])) { - /* the separator has been selected */ - results = RETURN_ERROR; - continue; - } else { - /* use selected ISO image */ - strcat(location_full, "/"); - strcat(location_full, *file); - log_message("installer will use ISO image \"%s\"", location_full); - } - } - } while (results == RETURN_ERROR); - } else { - log_message("no ISO image found in \"%s\" directory", location_full); - } + char **file; + char *stage2_isos[100] = { "Use directory as a mirror tree", "-----" }; + int stage2_iso_number = 2; + + log_message("\"%s\" exists and is a directory, looking for iso files", directory); + + for (file = list_directory(directory); *file; file++) { + char isofile[500]; + char * loopdev = NULL; + + if (strstr(*file, ".iso") != *file + strlen(*file) - 4) + /* file doesn't end in .iso, skipping */ + continue; + + strcpy(isofile, directory); + strcat(isofile, "/"); + strcat(isofile, *file); + + if (lomount(isofile, LOOP_LOCATION, &loopdev, 0)) { + log_message("unable to mount iso file \"%s\", skipping", isofile); + continue; + } + symlink(LOOP_LOCATION_REL "/" ARCH, IMAGE_LOCATION); + + if (image_has_stage2()) { + log_message("stage2 installer found in ISO image \"%s\"", isofile); + stage2_isos[stage2_iso_number++] = strdup(*file); + } else { + log_message("ISO image \"%s\" doesn't contain stage2 installer", isofile); + } + + unlink(IMAGE_LOCATION); + umount(LOOP_LOCATION); + del_loop(loopdev); + } + + stage2_isos[stage2_iso_number] = NULL; + + if (stage2_iso_number > 2) { + enum return_type results; + do { + results = ask_from_list("Please choose the ISO image to be used to install the " + DISTRIB_NAME " Distribution.", + stage2_isos, file); + if (results == RETURN_BACK) { + return; + } else if (results == RETURN_OK) { + if (!strcmp(*file, stage2_isos[0])) { + /* use directory as a mirror tree */ + continue; + } else if (!strcmp(*file, stage2_isos[1])) { + /* the separator has been selected */ + results = RETURN_ERROR; + continue; + } else { + /* use selected ISO image */ + strcat(location_full, "/"); + strcat(location_full, *file); + log_message("installer will use ISO image \"%s\"", location_full); + } + } + } while (results == RETURN_ERROR); + } else { + log_message("no ISO image found in \"%s\" directory", location_full); + } } enum return_type try_with_directory(char *directory, char *method_live, char *method_iso) { - char location_full[500]; + char location_full[500]; char * loopdev = NULL; - struct stat statbuf; - enum return_type ret = RETURN_OK; - - unlink(IMAGE_LOCATION); - strcpy(location_full, directory); - - if (!stat(directory, &statbuf) && S_ISDIR(statbuf.st_mode)) { - choose_iso_in_directory(directory, location_full); - } - - loopdev = NULL; - if (!stat(location_full, &statbuf) && !S_ISDIR(statbuf.st_mode)) { - log_message("%s exists and is not a directory, assuming this is an ISO image", location_full); - if (lomount(location_full, LOOP_LOCATION, &loopdev, 0)) { - stg1_error_message("Could not mount file %s as an ISO image of the " DISTRIB_NAME " Distribution.", location_full); - return RETURN_ERROR; - } - symlink(LOOP_LOCATION_REL "/" ARCH, IMAGE_LOCATION); - add_to_env("ISOPATH", location_full); - add_to_env("METHOD", method_iso); - } else { - create_IMAGE_LOCATION(location_full); - add_to_env("METHOD", method_live); - } - - if (access(IMAGE_LOCATION "/" COMPRESSED_LOCATION_REL, R_OK)) { - stg1_error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. " - "(I need the subdirectory " COMPRESSED_LOCATION_REL ")\n" - "Here's a short extract of the files in the directory:\n" - "%s", extract_list_directory(IMAGE_LOCATION)); - ret = RETURN_BACK; - } else if (may_load_compressed_image() != RETURN_OK) { - stg1_error_message("Could not load program into memory."); - ret = RETURN_ERROR; - } - - if (ret == RETURN_OK) - log_message("found the " DISTRIB_NAME " Installation, good news!"); - - if (!KEEP_MOUNTED || ret != RETURN_OK) { - /* in rescue mode, we don't need the media anymore */ - umount(LOOP_LOCATION); - del_loop(loopdev); - } - - return ret; + struct stat statbuf; + enum return_type ret = RETURN_OK; + + unlink(IMAGE_LOCATION); + strcpy(location_full, directory); + + if (!stat(directory, &statbuf) && S_ISDIR(statbuf.st_mode)) { + choose_iso_in_directory(directory, location_full); + } + + loopdev = NULL; + if (!stat(location_full, &statbuf) && !S_ISDIR(statbuf.st_mode)) { + log_message("%s exists and is not a directory, assuming this is an ISO image", location_full); + if (lomount(location_full, LOOP_LOCATION, &loopdev, 0)) { + stg1_error_message("Could not mount file %s as an ISO image of the " DISTRIB_NAME " Distribution.", location_full); + return RETURN_ERROR; + } + symlink(LOOP_LOCATION_REL "/" ARCH, IMAGE_LOCATION); + add_to_env("ISOPATH", location_full); + add_to_env("METHOD", method_iso); + } else { + create_IMAGE_LOCATION(location_full); + add_to_env("METHOD", method_live); + } + + if (access(IMAGE_LOCATION "/" COMPRESSED_LOCATION_REL, R_OK)) { + stg1_error_message("I can't find the " DISTRIB_NAME " Distribution in the specified directory. " + "(I need the subdirectory " COMPRESSED_LOCATION_REL ")\n" + "Here's a short extract of the files in the directory:\n" + "%s", extract_list_directory(IMAGE_LOCATION)); + ret = RETURN_BACK; + } else if (may_load_compressed_image() != RETURN_OK) { + stg1_error_message("Could not load program into memory."); + ret = RETURN_ERROR; + } + + if (ret == RETURN_OK) + log_message("found the " DISTRIB_NAME " Installation, good news!"); + + if (!KEEP_MOUNTED || ret != RETURN_OK) { + /* in rescue mode, we don't need the media anymore */ + umount(LOOP_LOCATION); + del_loop(loopdev); + } + + return ret; } diff --git a/mdk-stage1/disk.c b/mdk-stage1/disk.c index c324a01f2..804c8ea2b 100644 --- a/mdk-stage1/disk.c +++ b/mdk-stage1/disk.c @@ -43,79 +43,79 @@ #include "disk.h" static enum return_type try_automatic_with_partition(char *dev) { - enum return_type results; - int mounted; - wait_message("Trying to access " DISTRIB_NAME " disk (partition %s)", dev); - mounted = !try_mount(dev, MEDIA_LOCATION); - remove_wait_message(); - if (mounted) { - create_IMAGE_LOCATION(MEDIA_LOCATION); - if (image_has_stage2()) { - results = try_with_directory(MEDIA_LOCATION, "disk", "disk-iso"); - if (results == RETURN_OK) { - if (!KEEP_MOUNTED) - umount(MEDIA_LOCATION); - return RETURN_OK; - } - } - } - if (mounted) - umount(MEDIA_LOCATION); - return RETURN_ERROR; + enum return_type results; + int mounted; + wait_message("Trying to access " DISTRIB_NAME " disk (partition %s)", dev); + mounted = !try_mount(dev, MEDIA_LOCATION); + remove_wait_message(); + if (mounted) { + create_IMAGE_LOCATION(MEDIA_LOCATION); + if (image_has_stage2()) { + results = try_with_directory(MEDIA_LOCATION, "disk", "disk-iso"); + if (results == RETURN_OK) { + if (!KEEP_MOUNTED) + umount(MEDIA_LOCATION); + return RETURN_OK; + } + } + } + if (mounted) + umount(MEDIA_LOCATION); + return RETURN_ERROR; } static enum return_type try_automatic_with_disk(char *disk, char *model) { - char * parts[50]; - char * parts_comments[50]; - enum return_type results; - char **dev; - wait_message("Trying to access " DISTRIB_NAME " disk (drive %s)", model); - if (list_partitions(disk, parts, parts_comments)) { - stg1_error_message("Could not read partitions information."); - return RETURN_ERROR; - } - remove_wait_message(); - dev = parts; - while (dev && *dev) { - results = try_automatic_with_partition(*dev); - if (results == RETURN_OK) { - return RETURN_OK; - } - dev++; - } - return RETURN_ERROR; + char * parts[50]; + char * parts_comments[50]; + enum return_type results; + char **dev; + wait_message("Trying to access " DISTRIB_NAME " disk (drive %s)", model); + if (list_partitions(disk, parts, parts_comments)) { + stg1_error_message("Could not read partitions information."); + return RETURN_ERROR; + } + remove_wait_message(); + dev = parts; + while (dev && *dev) { + results = try_automatic_with_partition(*dev); + if (results == RETURN_OK) { + return RETURN_OK; + } + dev++; + } + return RETURN_ERROR; } static enum return_type try_automatic(char ** medias, char ** medias_models) { - char ** model = medias_models; - char ** ptr = medias; - while (ptr && *ptr) { - enum return_type results; - results = try_automatic_with_disk(*ptr, *model); - if (results == RETURN_OK) - return RETURN_OK; - ptr++; - model++; - } - return RETURN_ERROR; + char ** model = medias_models; + char ** ptr = medias; + while (ptr && *ptr) { + enum return_type results; + results = try_automatic_with_disk(*ptr, *model); + if (results == RETURN_OK) + return RETURN_OK; + ptr++; + model++; + } + return RETURN_ERROR; } static enum return_type try_with_device(char *dev_name) { - char * questions_location[] = { "Directory or ISO images directory or ISO image", NULL }; - char * questions_location_auto[] = { "directory", NULL }; - static char ** answers_location = NULL; - char location_full[500]; - - char * parts[50]; - char * parts_comments[50]; - enum return_type results; - char * choice; + char * questions_location[] = { "Directory or ISO images directory or ISO image", NULL }; + char * questions_location_auto[] = { "directory", NULL }; + static char ** answers_location = NULL; + char location_full[500]; + + char * parts[50]; + char * parts_comments[50]; + enum return_type results; + char * choice; if (list_partitions(dev_name, parts, parts_comments)) { - stg1_error_message("Could not read partitions information."); - return RETURN_ERROR; + stg1_error_message("Could not read partitions information."); + return RETURN_ERROR; } /* uglyness to allow auto starting with devfs */ @@ -126,103 +126,103 @@ static enum return_type try_with_device(char *dev_name) } results = ask_from_list_comments_auto("Please select the partition containing the copy of the " - DISTRIB_NAME " Distribution install source.", + DISTRIB_NAME " Distribution install source.", parts, parts_comments, &choice, "partition", parts); if (results != RETURN_OK) return results; } - /* in testing mode, assume the partition is already mounted on MEDIA_LOCATION */ + /* in testing mode, assume the partition is already mounted on MEDIA_LOCATION */ if (!IS_TESTING && try_mount(choice, MEDIA_LOCATION)) { - stg1_error_message("I can't find a valid filesystem (tried: ext2, vfat, ntfs, reiserfs). " + stg1_error_message("I can't find a valid filesystem (tried: ext2, vfat, ntfs, reiserfs). " "Make sure the partition has been cleanly unmounted."); - return try_with_device(dev_name); - } + return try_with_device(dev_name); + } ask_dir: - if (ask_from_entries_auto("Please enter the directory (or ISO image file) containing the " - DISTRIB_NAME " Distribution install source.", - questions_location, &answers_location, 24, questions_location_auto, NULL) != RETURN_OK) { - umount(MEDIA_LOCATION); - return try_with_device(dev_name); - } - - strcpy(location_full, MEDIA_LOCATION); - strcat(location_full, "/"); - strcat(location_full, answers_location[0]); - - if (access(location_full, R_OK)) { - char * path = strdup(answers_location[0]); - stg1_error_message("Directory or ISO image file could not be found on partition.\n" - "Here's a short extract of the files in the directory %s:\n" - "%s", my_dirname(path), extract_list_directory(my_dirname(location_full))); - free(path); - goto ask_dir; - } - - results = try_with_directory(location_full, "disk", "disk-iso"); - if (results != RETURN_OK) { - goto ask_dir; - } - - if (!KEEP_MOUNTED) - umount(MEDIA_LOCATION); - - return RETURN_OK; + if (ask_from_entries_auto("Please enter the directory (or ISO image file) containing the " + DISTRIB_NAME " Distribution install source.", + questions_location, &answers_location, 24, questions_location_auto, NULL) != RETURN_OK) { + umount(MEDIA_LOCATION); + return try_with_device(dev_name); + } + + strcpy(location_full, MEDIA_LOCATION); + strcat(location_full, "/"); + strcat(location_full, answers_location[0]); + + if (access(location_full, R_OK)) { + char * path = strdup(answers_location[0]); + stg1_error_message("Directory or ISO image file could not be found on partition.\n" + "Here's a short extract of the files in the directory %s:\n" + "%s", my_dirname(path), extract_list_directory(my_dirname(location_full))); + free(path); + goto ask_dir; + } + + results = try_with_directory(location_full, "disk", "disk-iso"); + if (results != RETURN_OK) { + goto ask_dir; + } + + if (!KEEP_MOUNTED) + umount(MEDIA_LOCATION); + + return RETURN_OK; } enum return_type disk_prepare(void) { - char ** medias, ** medias_models; - char * choice; - int i; - enum return_type results; - static int already_probed_ide_generic = 0; + char ** medias, ** medias_models; + char * choice; + int i; + enum return_type results; + static int already_probed_ide_generic = 0; int count = get_disks(&medias, &medias_models); - if (IS_AUTOMATIC) { - results = try_automatic(medias, medias_models); - if (results != RETURN_ERROR) - return results; - unset_automatic(); + if (IS_AUTOMATIC) { + results = try_automatic(medias, medias_models); + if (results != RETURN_ERROR) + return results; + unset_automatic(); } - if (count == 0) { - if (!already_probed_ide_generic) { - already_probed_ide_generic = 1; - my_insmod("ide_generic", ANY_DRIVER_TYPE, NULL, 0); - return disk_prepare(); - } - stg1_error_message("No DISK drive found."); - i = ask_insmod(MEDIA_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return disk_prepare(); - } - - if (count == 1) { - results = try_with_device(*medias); - if (results != RETURN_ERROR) - return results; - i = ask_insmod(MEDIA_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return disk_prepare(); - } - - results = ask_from_list_comments_auto("Please select the disk containing the copy of the " - DISTRIB_NAME " Distribution install source.", - medias, medias_models, &choice, "disk", medias); - - if (results != RETURN_OK) - return results; - - results = try_with_device(choice); - if (results != RETURN_ERROR) - return results; - i = ask_insmod(MEDIA_ADAPTERS); - if (i == RETURN_BACK) - return RETURN_BACK; - return disk_prepare(); + if (count == 0) { + if (!already_probed_ide_generic) { + already_probed_ide_generic = 1; + my_insmod("ide_generic", ANY_DRIVER_TYPE, NULL, 0); + return disk_prepare(); + } + stg1_error_message("No DISK drive found."); + i = ask_insmod(MEDIA_ADAPTERS); + if (i == RETURN_BACK) + return RETURN_BACK; + return disk_prepare(); + } + + if (count == 1) { + results = try_with_device(*medias); + if (results != RETURN_ERROR) + return results; + i = ask_insmod(MEDIA_ADAPTERS); + if (i == RETURN_BACK) + return RETURN_BACK; + return disk_prepare(); + } + + results = ask_from_list_comments_auto("Please select the disk containing the copy of the " + DISTRIB_NAME " Distribution install source.", + medias, medias_models, &choice, "disk", medias); + + if (results != RETURN_OK) + return results; + + results = try_with_device(choice); + if (results != RETURN_ERROR) + return results; + i = ask_insmod(MEDIA_ADAPTERS); + if (i == RETURN_BACK) + return RETURN_BACK; + return disk_prepare(); } diff --git a/mdk-stage1/dns.c b/mdk-stage1/dns.c index 36fb0f187..488b4844e 100644 --- a/mdk-stage1/dns.c +++ b/mdk-stage1/dns.c @@ -39,46 +39,58 @@ int mygethostbyname(char * name, struct in_addr * addr) { - struct hostent * h; + struct addrinfo hints, *res, *p; + int status; + char ipstr[INET6_ADDRSTRLEN]; - /* prevent from timeouts */ - if (_res.nscount == 0) - return -1; + memset(&hints, 0, sizeof hints); + hints.ai_family = AF_INET; //AF_UNSPEC for both IPv4 & IPv6 + hints.ai_socktype = SOCK_STREAM; - h = gethostbyname(name); + /* prevent from timeouts */ + if (_res.nscount == 0) + return -1; - if (!h && domain) { - // gethostbyname from dietlibc doesn't support domain handling - char fully_qualified[500]; - sprintf(fully_qualified, "%s.%s", name, domain); - h = gethostbyname(fully_qualified); - } + if ((status = getaddrinfo(name, NULL, &hints, &res)) != 0) { + log_message("getaddrinfo: %s\n", gai_strerror(status)); + return -1; + } - if (h && h->h_addr_list && (h->h_addr_list)[0]) { - memcpy(addr, (h->h_addr_list)[0], sizeof(*addr)); - log_message("is-at: %s", inet_ntoa(*addr)); - return 0; - } + for (p = res;p != NULL; p = p->ai_next) { + void *tmp_addr; - log_message("unknown host %s", name); - return -1; + struct sockaddr_in *ipv = (struct sockaddr_in *)p->ai_addr; + tmp_addr = &(ipv->sin_addr); + + /* convert the IP to a string: */ + inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr); + + memcpy(addr, tmp_addr, sizeof(*addr)); + log_message("is-at: %s\n", inet_ntoa(*addr)); + } + + freeaddrinfo(res); // free the linked list + return 0; } char * mygethostbyaddr(char * ipnum) { - struct in_addr in; - struct hostent * host; + struct sockaddr_in sa; + char hbuf[NI_MAXHOST]; /* prevent from timeouts */ if (_res.nscount == 0) return NULL; + + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; + + if (inet_pton(AF_INET, ipnum, &sa.sin_addr) != 1) + return NULL; - if (!inet_aton(ipnum, &in)) - return NULL; - host = gethostbyaddr(&(in.s_addr), sizeof(in.s_addr) /* INADDRSZ */, AF_INET); - if (host && host->h_name) - return host->h_name; - return NULL; + if (getnameinfo((struct sockaddr*)&sa, sizeof(sa), hbuf, sizeof(hbuf), NULL, 0, 0 |NI_NAMEREQD) == 0) //NI_NUMERICHOST NI_NAMEREQD + return strdup(hbuf); + else return NULL; } #elif defined(__GLIBC__) @@ -105,116 +117,116 @@ union dns_response { static int do_query(char * query, int queryType, char ** domainName, struct in_addr * ipNum) { - int len, ancount, type; - u_char * data, * end; - char name[MAXDNAME]; - union dns_response response; - + int len, ancount, type; + u_char * data, * end; + char name[MAXDNAME]; + union dns_response response; + #ifdef __sparc__ - /* from jj: */ - /* We have to wait till ethernet negotiation is done */ - _res.retry = 3; + /* from jj: */ + /* We have to wait till ethernet negotiation is done */ + _res.retry = 3; #else - _res.retry = 2; + _res.retry = 2; #endif - len = res_search(query, C_IN, queryType, (void *) &response, sizeof(response)); - if (len <= 0) - return -1; - - if (ntohs(response.hdr.rcode) != NOERROR) - return -1; - - ancount = ntohs(response.hdr.ancount); - if (ancount < 1) - return -1; - - data = response.buf + sizeof(HEADER); - end = response.buf + len; - - /* skip the question */ - data += dn_skipname(data, end) + QFIXEDSZ; - - /* parse the answer(s) */ - while (--ancount >= 0 && data < end) { - - /* skip the domain name portion of the RR record */ - data += dn_skipname(data, end); - - /* get RR information */ - GETSHORT(type, data); - data += INT16SZ; /* skipp class */ - data += INT32SZ; /* skipp TTL */ - GETSHORT(len, data); - - if (type == T_PTR) { - /* we got a pointer */ - len = dn_expand(response.buf, end, data, name, sizeof(name)); - if (len <= 0) return -1; - if (queryType == T_PTR && domainName) { - /* we wanted a pointer */ - *domainName = malloc(strlen(name) + 1); - strcpy(*domainName, name); - return 0; - } - } else if (type == T_A) { - /* we got an address */ - if (queryType == T_A && ipNum) { - /* we wanted an address */ - memcpy(ipNum, data, sizeof(*ipNum)); - return 0; - } - } - - /* move ahead to next RR */ - data += len; - } - - return -1; + len = res_search(query, C_IN, queryType, (void *) &response, sizeof(response)); + if (len <= 0) + return -1; + + if (ntohs(response.hdr.rcode) != NOERROR) + return -1; + + ancount = ntohs(response.hdr.ancount); + if (ancount < 1) + return -1; + + data = response.buf + sizeof(HEADER); + end = response.buf + len; + + /* skip the question */ + data += dn_skipname(data, end) + QFIXEDSZ; + + /* parse the answer(s) */ + while (--ancount >= 0 && data < end) { + + /* skip the domain name portion of the RR record */ + data += dn_skipname(data, end); + + /* get RR information */ + GETSHORT(type, data); + data += INT16SZ; /* skipp class */ + data += INT32SZ; /* skipp TTL */ + GETSHORT(len, data); + + if (type == T_PTR) { + /* we got a pointer */ + len = dn_expand(response.buf, end, data, name, sizeof(name)); + if (len <= 0) return -1; + if (queryType == T_PTR && domainName) { + /* we wanted a pointer */ + *domainName = malloc(strlen(name) + 1); + strcpy(*domainName, name); + return 0; + } + } else if (type == T_A) { + /* we got an address */ + if (queryType == T_A && ipNum) { + /* we wanted an address */ + memcpy(ipNum, data, sizeof(*ipNum)); + return 0; + } + } + + /* move ahead to next RR */ + data += len; + } + + return -1; } char * mygethostbyaddr(char * ipnum) { - int rc; - char * result; - char * strbuf; - char * chptr; - char * splits[4]; - int i; - - _res.retry = 1; - - strbuf = alloca(strlen(ipnum) + 1); - strcpy(strbuf, ipnum); - - ipnum = alloca(strlen(strbuf) + 20); - - for (i = 0; i < 4; i++) { - chptr = strbuf; - while (*chptr && *chptr != '.') - chptr++; - *chptr = '\0'; - - if (chptr - strbuf > 3) return NULL; - splits[i] = strbuf; - strbuf = chptr + 1; - } - - sprintf(ipnum, "%s.%s.%s.%s.in-addr.arpa", splits[3], splits[2], splits[1], splits[0]); - - rc = do_query(ipnum, T_PTR, &result, NULL); - - if (rc) - return NULL; - else - return result; + int rc; + char * result; + char * strbuf; + char * chptr; + char * splits[4]; + int i; + + _res.retry = 1; + + strbuf = alloca(strlen(ipnum) + 1); + strcpy(strbuf, ipnum); + + ipnum = alloca(strlen(strbuf) + 20); + + for (i = 0; i < 4; i++) { + chptr = strbuf; + while (*chptr && *chptr != '.') + chptr++; + *chptr = '\0'; + + if (chptr - strbuf > 3) return NULL; + splits[i] = strbuf; + strbuf = chptr + 1; + } + + sprintf(ipnum, "%s.%s.%s.%s.in-addr.arpa", splits[3], splits[2], splits[1], splits[0]); + + rc = do_query(ipnum, T_PTR, &result, NULL); + + if (rc) + return NULL; + else + return result; } int mygethostbyname(char * name, struct in_addr * addr) { - int rc = do_query(name, T_A, NULL, addr); - if (!rc) - log_message("is-at %s", inet_ntoa(*addr)); - return rc; + int rc = do_query(name, T_A, NULL, addr); + if (!rc) + log_message("is-at %s", inet_ntoa(*addr)); + return rc; } #else diff --git a/mdk-stage1/frontend-common.c b/mdk-stage1/frontend-common.c index 32a0127aa..cdc972740 100644 --- a/mdk-stage1/frontend-common.c +++ b/mdk-stage1/frontend-common.c @@ -23,42 +23,42 @@ void info_message(char *msg, ...) { - va_list args; - va_start(args, msg); - vinfo_message(msg, args); - va_end(args); + va_list args; + va_start(args, msg); + vinfo_message(msg, args); + va_end(args); } void wait_message(char *msg, ...) { - va_list args; - va_start(args, msg); - vwait_message(msg, args); - va_end(args); + va_list args; + va_start(args, msg); + vwait_message(msg, args); + va_end(args); } void error_message(char *msg, ...) { - va_list args; - va_start(args, msg); - verror_message(msg, args); - va_end(args); + va_list args; + va_start(args, msg); + verror_message(msg, args); + va_end(args); } enum return_type ask_from_list_comments(char *msg, char ** elems, char ** elems_comments, char ** choice) { - int answer = 0; - enum return_type results; + int answer = 0; + enum return_type results; - results = ask_from_list_index(msg, elems, elems_comments, &answer); + results = ask_from_list_index(msg, elems, elems_comments, &answer); - if (results == RETURN_OK) - *choice = strdup(elems[answer]); + if (results == RETURN_OK) + *choice = strdup(elems[answer]); - return results; + return results; } enum return_type ask_from_list(char *msg, char ** elems, char ** choice) { - return ask_from_list_comments(msg, elems, NULL, choice); + return ask_from_list_comments(msg, elems, NULL, choice); } diff --git a/mdk-stage1/init.c b/mdk-stage1/init.c index 937549120..af6aefd2a 100644 --- a/mdk-stage1/init.c +++ b/mdk-stage1/init.c @@ -40,19 +40,19 @@ #include <sys/syscall.h> #define syslog(...) syscall(__NR_syslog, __VA_ARGS__) -#define LINUX_REBOOT_MAGIC1 0xfee1dead -#define LINUX_REBOOT_MAGIC2 672274793 -#define BMAGIC_HARD 0x89ABCDEF -#define BMAGIC_SOFT 0 -#define BMAGIC_REBOOT 0x01234567 -#define BMAGIC_HALT 0xCDEF0123 -#define BMAGIC_POWEROFF 0x4321FEDC +#define LINUX_REBOOT_MAGIC1 0xfee1dead +#define LINUX_REBOOT_MAGIC2 672274793 +#define BMAGIC_HARD 0x89ABCDEF +#define BMAGIC_SOFT 0 +#define BMAGIC_REBOOT 0x01234567 +#define BMAGIC_HALT 0xCDEF0123 +#define BMAGIC_POWEROFF 0x4321FEDC static unsigned int reboot_magic = BMAGIC_REBOOT; static inline long reboot(unsigned int command) { - return (long) syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, command, 0); + return (long) syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, command, 0); } #include "config-stage1.h" @@ -68,26 +68,27 @@ static inline long reboot(unsigned int command) char * env[] = { - "PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sbin:/mnt/usr/sbin:/mnt/bin:/mnt/usr/bin", - "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib:/usr/X11R6/lib:/mnt/usr/X11R6/lib" + "PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sbin:/mnt/usr/sbin:/mnt/bin:/mnt/usr/bin", + "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib:/usr/X11R6/lib:/mnt/usr/X11R6/lib" #if defined(__x86_64__) || defined(__ppc64__) - ":/lib64:/usr/lib64:/usr/X11R6/lib64:/mnt/lib64:/mnt/usr/lib64:/mnt/usr/X11R6/lib64" + ":/lib64:/usr/lib64:/usr/X11R6/lib64:/mnt/lib64:/mnt/usr/lib64:/mnt/usr/X11R6/lib64" #endif - , - "HOME=/", - "TERM=screen", - "TERMINFO=/etc/terminfo", - NULL + , + "HOME=/", + "TERM=linux", + "TERMINFO=/etc/terminfo", + "LC_CTYPE=UTF-8", + NULL }; /* * this needs to handle the following cases: * - * 1) run from a CD root filesystem - * 2) run from a read only nfs rooted filesystem + * 1) run from a CD root filesystem + * 2) run from a read only nfs rooted filesystem * 3) run from a floppy - * 4) run from a floppy that's been loaded into a ramdisk + * 4) run from a floppy that's been loaded into a ramdisk * */ @@ -97,45 +98,45 @@ int klog_pid; void fatal_error(char *msg) { - printf("FATAL ERROR IN INIT: %s\n\nI can't recover from this, please reboot manually and send bugreport.\n", msg); + printf("FATAL ERROR IN INIT: %s\n\nI can't recover from this, please reboot manually and send bugreport.\n", msg); select(0, NULL, NULL, NULL, NULL); } void print_error(char *msg) { - printf("E: %s\n", msg); + printf("E: %s\n", msg); } void print_warning(char *msg) { - printf("W: %s\n", msg); + printf("W: %s\n", msg); } void print_int_init(int fd, int i) { - char buf[10]; - char * chptr = buf + 9; - int j = 0; - - if (i < 0) - { - write(1, "-", 1); - i = -1 * i; - } - - while (i) - { - *chptr-- = '0' + (i % 10); - j++; - i = i / 10; - } - - write(fd, chptr + 1, j); + char buf[10]; + char * chptr = buf + 9; + int j = 0; + + if (i < 0) + { + write(1, "-", 1); + i = -1 * i; + } + + while (i) + { + *chptr-- = '0' + (i % 10); + j++; + i = i / 10; + } + + write(fd, chptr + 1, j); } void print_str_init(int fd, char * string) { - write(fd, string, strlen(string)); + write(fd, string, strlen(string)); } /* fork to: @@ -144,115 +145,114 @@ void print_str_init(int fd, char * string) */ void doklog() { - fd_set readset, unixs; - int in, out, i; - int log; - socklen_t s; - int sock = -1; - struct sockaddr_un sockaddr; - char buf[1024]; - int readfd; - - /* open kernel message logger */ - in = open("/proc/kmsg", O_RDONLY,0); - if (in < 0) { - print_error("could not open /proc/kmsg"); - return; - } - - mkdir("/tmp", 0755); - if ((log = open("/tmp/syslog", O_WRONLY | O_CREAT | O_APPEND, 0644)) < 0) { - print_error("error opening /tmp/syslog"); - sleep(5); - return; - } - - if ((klog_pid = fork())) { - close(in); - close(log); - return; - } else { - close(0); - close(1); - close(2); - } - - out = open("/dev/tty4", O_WRONLY, 0); - if (out < 0) - print_warning("couldn't open tty for syslog -- still using /tmp/syslog\n"); - - /* now open the syslog socket */ + fd_set readset, unixs; + int in, out, i; + int log; + socklen_t s; + int sock = -1; + struct sockaddr_un sockaddr; + char buf[1024]; + int readfd; + + /* open kernel message logger */ + in = open("/proc/kmsg", O_RDONLY,0); + if (in < 0) { + print_error("could not open /proc/kmsg"); + return; + } + + if ((log = open("/tmp/syslog", O_WRONLY | O_CREAT | O_APPEND, 0644)) < 0) { + print_error("error opening /tmp/syslog"); + sleep(5); + return; + } + + if ((klog_pid = fork())) { + close(in); + close(log); + return; + } else { + close(0); + close(1); + close(2); + } + + out = open("/dev/tty4", O_WRONLY, 0); + if (out < 0) + print_warning("couldn't open tty for syslog -- still using /tmp/syslog\n"); + + /* now open the syslog socket */ // ############# LINUX 2.4 /dev/log IS BUGGED! --> apparently the syslogs can't reach me, and it's full up after a while -// sockaddr.sun_family = AF_UNIX; -// strncpy(sockaddr.sun_path, "/dev/log", UNIX_PATH_MAX); -// sock = socket(AF_UNIX, SOCK_STREAM, 0); -// if (sock < 0) { -// printf("error creating socket: %d\n", errno); -// sleep(5); -// } +// sockaddr.sun_family = AF_UNIX; +// strncpy(sockaddr.sun_path, "/dev/log", UNIX_PATH_MAX); +// sock = socket(AF_UNIX, SOCK_STREAM, 0); +// if (sock < 0) { +// printf("error creating socket: %d\n", errno); +// sleep(5); +// } // -// print_str_init(log, "] got socket\n"); -// if (bind(sock, (struct sockaddr *) &sockaddr, sizeof(sockaddr.sun_family) + strlen(sockaddr.sun_path))) { -// print_str_init(log, "] bind error: "); -// print_int_init(log, errno); -// print_str_init(log, "\n"); -// sleep(// } +// print_str_init(log, "] got socket\n"); +// if (bind(sock, (struct sockaddr *) &sockaddr, sizeof(sockaddr.sun_family) + strlen(sockaddr.sun_path))) { +// print_str_init(log, "] bind error: "); +// print_int_init(log, errno); +// print_str_init(log, "\n"); +// sleep(// } // -// print_str_init(log, "] bound socket\n"); -// chmod("/dev/log", 0666); -// if (listen(sock, 5)) { -// print_str_init(log, "] listen error: "); -// print_int_init(log, errno); -// print_str_init(log, "\n"); -// sleep(5); -// } - - /* disable on-console syslog output */ - syslog(8, NULL, 1); - - print_str_init(log, "] kernel/system logger ok\n"); - FD_ZERO(&unixs); - while (1) { - memcpy(&readset, &unixs, sizeof(unixs)); - - if (sock >= 0) - FD_SET(sock, &readset); - FD_SET(in, &readset); - - i = select(20, &readset, NULL, NULL, NULL); - if (i <= 0) - continue; - - /* has /proc/kmsg things to tell us? */ - if (FD_ISSET(in, &readset)) { - i = read(in, buf, sizeof(buf)); - if (i > 0) { - if (out >= 0) - write(out, buf, i); - write(log, buf, i); - } - } - - /* the socket has moved, new stuff to do */ - if (sock >= 0 && FD_ISSET(sock, &readset)) { - s = sizeof(sockaddr); - readfd = accept(sock, (struct sockaddr *) &sockaddr, &s); - if (readfd < 0) { - char * msg_error = "] error in accept\n"; - if (out >= 0) - write(out, msg_error, strlen(msg_error)); - write(log, msg_error, strlen(msg_error)); - close(sock); - sock = -1; - } - else - FD_SET(readfd, &unixs); - } - } +// print_str_init(log, "] bound socket\n"); +// chmod("/dev/log", 0666); +// if (listen(sock, 5)) { +// print_str_init(log, "] listen error: "); +// print_int_init(log, errno); +// print_str_init(log, "\n"); +// sleep(5); +// } + + /* disable on-console syslog output */ + syslog(8, NULL, 1); + + print_str_init(log, "] kernel/system logger ok\n"); + FD_ZERO(&unixs); + while (1) { + memcpy(&readset, &unixs, sizeof(unixs)); + + if (sock >= 0) + FD_SET(sock, &readset); + FD_SET(in, &readset); + + i = select(20, &readset, NULL, NULL, NULL); + if (i <= 0) + continue; + + /* has /proc/kmsg things to tell us? */ + if (FD_ISSET(in, &readset)) { + i = read(in, buf, sizeof(buf)); + if (i > 0) { + if (out >= 0) + write(out, buf, i); + write(log, buf, i); + } + } + + /* the socket has moved, new stuff to do */ + if (sock >= 0 && FD_ISSET(sock, &readset)) { + s = sizeof(sockaddr); + readfd = accept(sock, (struct sockaddr *) &sockaddr, &s); + if (readfd < 0) { + char * msg_error = "] error in accept\n"; + if (out >= 0) + write(out, msg_error, strlen(msg_error)); + write(log, msg_error, strlen(msg_error)); + close(sock); + sock = -1; + } + else + FD_SET(readfd, &unixs); + } + } } -#define LOOP_CLR_FD 0x4C01 +#define LOOP_CLR_FD 0x4C01 void del_loops(void) { @@ -280,10 +280,10 @@ void del_loops(void) struct filesystem { - char * dev; - char * name; - char * fs; - int mounted; + char * dev; + char * name; + char * fs; + int mounted; }; char* strcat(register char* s,register const char* t) @@ -299,76 +299,76 @@ char* strcat(register char* s,register const char* t) /* attempt to unmount all filesystems in /proc/mounts */ void unmount_filesystems(void) { - int fd, size; - char buf[65535]; /* this should be big enough */ - char *p; - struct filesystem fs[500]; - int numfs = 0; - int i, nb; - - printf("unmounting filesystems...\n"); - - fd = open("/proc/mounts", O_RDONLY, 0); - if (fd < 1) { - print_error("failed to open /proc/mounts"); - sleep(2); - return; - } - - size = read(fd, buf, sizeof(buf) - 1); - buf[size] = '\0'; - - close(fd); - - p = buf; - while (*p) { - fs[numfs].mounted = 1; - fs[numfs].dev = p; - while (*p != ' ') p++; - *p++ = '\0'; - fs[numfs].name = p; - while (*p != ' ') p++; - *p++ = '\0'; - fs[numfs].fs = p; - while (*p != ' ') p++; - *p++ = '\0'; - while (*p != '\n') p++; - p++; - if (strcmp(fs[numfs].name, "/") + int fd, size; + char buf[65535]; /* this should be big enough */ + char *p; + struct filesystem fs[500]; + int numfs = 0; + int i, nb; + + printf("unmounting filesystems...\n"); + + fd = open("/proc/mounts", O_RDONLY, 0); + if (fd < 1) { + print_error("failed to open /proc/mounts"); + sleep(2); + return; + } + + size = read(fd, buf, sizeof(buf) - 1); + buf[size] = '\0'; + + close(fd); + + p = buf; + while (*p) { + fs[numfs].mounted = 1; + fs[numfs].dev = p; + while (*p != ' ') p++; + *p++ = '\0'; + fs[numfs].name = p; + while (*p != ' ') p++; + *p++ = '\0'; + fs[numfs].fs = p; + while (*p != ' ') p++; + *p++ = '\0'; + while (*p != '\n') p++; + p++; + if (strcmp(fs[numfs].name, "/") && !strstr(fs[numfs].dev, "ram") && strcmp(fs[numfs].name, "/dev") && strcmp(fs[numfs].name, "/sys") && strncmp(fs[numfs].name, "/proc", 5)) numfs++; - } - - /* Pixel's ultra-optimized sorting algorithm: - multiple passes trying to umount everything until nothing moves - anymore (a.k.a holy shotgun method) */ - do { - nb = 0; - for (i = 0; i < numfs; i++) { - /*printf("trying with %s\n", fs[i].name);*/ + } + + /* Pixel's ultra-optimized sorting algorithm: + multiple passes trying to umount everything until nothing moves + anymore (a.k.a holy shotgun method) */ + do { + nb = 0; + for (i = 0; i < numfs; i++) { + /*printf("trying with %s\n", fs[i].name);*/ del_loops(); - if (fs[i].mounted && umount(fs[i].name) == 0) { - printf("\t%s\n", fs[i].name); - fs[i].mounted = 0; - nb++; - } - } - } while (nb); - - for (i = nb = 0; i < numfs; i++) - if (fs[i].mounted) { - printf("\tumount failed: %s\n", fs[i].name); - if (strcmp(fs[i].fs, "ext3") == 0) nb++; /* don't count not-ext3 umount failed */ - } - - - if (nb) { - printf("failed to umount some filesystems\n"); + if (fs[i].mounted && umount(fs[i].name) == 0) { + printf("\t%s\n", fs[i].name); + fs[i].mounted = 0; + nb++; + } + } + } while (nb); + + for (i = nb = 0; i < numfs; i++) + if (fs[i].mounted) { + printf("\tumount failed: %s\n", fs[i].name); + if (strcmp(fs[i].fs, "ext3") == 0) nb++; /* don't count not-ext3 umount failed */ + } + + + if (nb) { + printf("failed to umount some filesystems\n"); select(0, NULL, NULL, NULL, NULL); - } + } } int in_reboot(void) @@ -390,11 +390,11 @@ int exit_value_restart = 0x35; int main(int argc, char **argv) { - pid_t installpid, childpid; - int wait_status; - int fd; - int counter = 0; - int abnormal_termination = 0; + pid_t installpid, childpid; + int wait_status; + int fd; + int counter = 0; + int abnormal_termination = 0; if (argc > 1 && argv[1][0] >= '0' && argv[1][0] <= '9') { printf("This is no normal init, sorry.\n" @@ -402,68 +402,76 @@ int main(int argc, char **argv) return 0; } - if (!testing) { - /* turn off screen blanking */ - printf("\033[9;0]"); - printf("\033[8]"); - } - else - printf("*** TESTING MODE *** (pid is %d)\n", getpid()); - - - if (!testing) { - mkdir("/proc", 0755); - if (mount("/proc", "/proc", "proc", 0, NULL)) - fatal_error("Unable to mount proc filesystem"); - mkdir("/sys", 0755); - if (mount("none", "/sys", "sysfs", 0, NULL)) - fatal_error("Unable to mount sysfs filesystem"); - } - - - /* ignore Control-C and keyboard stop signals */ - signal(SIGINT, SIG_IGN); - signal(SIGTSTP, SIG_IGN); - - if (!testing) { - fd = open("/dev/console", O_RDWR, 0); - if (fd < 0) - fatal_error("failed to open /dev/console"); - - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - close(fd); - } - - - /* I set me up as session leader (probably not necessary?) */ - setsid(); -// if (ioctl(0, TIOCSCTTY, NULL)) -// print_error("could not set new controlling tty"); - - if (!testing) { - char my_hostname[] = "localhost"; - sethostname(my_hostname, sizeof(my_hostname)); - /* the default domainname (as of 2.0.35) is "(none)", which confuses - glibc */ - setdomainname("", 0); - } - - if (!testing) - doklog(); - - /* Go into normal init mode - keep going, and then do a orderly shutdown - when: - - 1) install exits - 2) we receive a SIGHUP - */ + if (!testing) { + /* turn off screen blanking */ + printf("\033[9;0]"); + printf("\033[8]"); + } + else + printf("*** TESTING MODE *** (pid is %d)\n", getpid()); + + + if (!testing) { + if (mount("/proc", "/proc", "proc", 0, NULL)) + fatal_error("Unable to mount proc filesystem"); + if (mount("none", "/sys", "sysfs", 0, NULL)) + fatal_error("Unable to mount sysfs filesystem"); + if (mount("none", "/sys/kernel/debug", "debugfs", MS_NOSUID, "mode=0755")) + fatal_error("Unable to mount debugfs filesystem"); + if (mount("none", "/dev", "devtmpfs", 0, NULL)) + fatal_error("Unable to mount dev filesystem"); + mkdir("/dev/pts", 0755); + if (mount("/dev/pts", "/dev/pts", "devpts", MS_NOSUID|MS_NOEXEC, "gid=5,mode=0620")) + fatal_error("Unable to mount /dev/pts devpts filesystem"); + mkdir("/dev/shm", 0755); + if (mount("/dev/shm", "/dev/shm", "tmpfs", MS_NOSUID|MS_NODEV, "mode=1777")) + fatal_error("Unable to mount /dev/shm tmpfs filesystem"); + } + + + /* ignore Control-C and keyboard stop signals */ + signal(SIGINT, SIG_IGN); + signal(SIGTSTP, SIG_IGN); + + if (!testing) { + fd = open("/dev/console", O_RDWR, 0); + if (fd < 0) + fatal_error("failed to open /dev/console"); + + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + close(fd); + } + + + /* I set me up as session leader (probably not necessary?) */ + setsid(); +// if (ioctl(0, TIOCSCTTY, NULL)) +// print_error("could not set new controlling tty"); + + if (!testing) { + char my_hostname[] = "localhost"; + sethostname(my_hostname, sizeof(my_hostname)); + /* the default domainname (as of 2.0.35) is "(none)", which confuses + glibc */ + setdomainname("", 0); + } + + if (!testing) + doklog(); + + /* Go into normal init mode - keep going, and then do a orderly shutdown + when: + + 1) install exits + 2) we receive a SIGHUP + */ do { - if (counter == 1) { - printf("proceeding, please wait...\n"); - } + if (counter == 1) { + printf("proceeding, please wait...\n"); + } if (!(installpid = fork())) { /* child */ @@ -480,7 +488,7 @@ int main(int argc, char **argv) childpid = wait4(-1, &wait_status, 0, NULL); } while (childpid != installpid); - counter++; + counter++; } while (WIFEXITED(wait_status) && WEXITSTATUS(wait_status) == exit_value_restart); /* allow Ctrl Alt Del to reboot */ @@ -488,21 +496,21 @@ int main(int argc, char **argv) if (in_reboot()) { // any exitcode is valid if we're in_reboot - } else if (WIFEXITED(wait_status) && WEXITSTATUS(wait_status) == exit_value_proceed) { - kill(klog_pid, 9); - printf("proceeding, please wait...\n"); - - { - char * child_argv[2] = { "/sbin/init", NULL }; - execve(child_argv[0], child_argv, env); - } - fatal_error("failed to exec /sbin/init"); + } else if (WIFEXITED(wait_status) && WEXITSTATUS(wait_status) == exit_value_proceed) { + kill(klog_pid, 9); + printf("proceeding, please wait...\n"); + + { + char * child_argv[2] = { "/sbin/init", NULL }; + execve(child_argv[0], child_argv, env); + } + fatal_error("failed to exec /sbin/init"); } else if (!WIFEXITED(wait_status) || WEXITSTATUS(wait_status) != 0) { - printf("exited abnormally :-( "); - if (WIFSIGNALED(wait_status)) - printf("-- received signal %d", WTERMSIG(wait_status)); - printf("\n"); - abnormal_termination = 1; + printf("exited abnormally :-( "); + if (WIFSIGNALED(wait_status)) + printf("-- received signal %d", WTERMSIG(wait_status)); + printf("\n"); + abnormal_termination = 1; } if (!abnormal_termination) { @@ -511,40 +519,40 @@ int main(int argc, char **argv) printf("\n"); /* cleanup startkde messages */ } - if (testing) - return 0; + if (testing) + return 0; - sync(); sync(); - sleep(2); + sync(); sync(); + sleep(2); - printf("sending termination signals..."); - kill(-1, 15); - sleep(2); - printf("done\n"); + printf("sending termination signals..."); + kill(-1, 15); + sleep(2); + printf("done\n"); - printf("sending kill signals..."); - kill(-1, 9); - sleep(2); - printf("done\n"); + printf("sending kill signals..."); + kill(-1, 9); + sleep(2); + printf("done\n"); - unmount_filesystems(); + unmount_filesystems(); - sync(); sync(); + sync(); sync(); - if (!abnormal_termination) { - if (reboot_magic == BMAGIC_REBOOT) { + if (!abnormal_termination) { + if (reboot_magic == BMAGIC_REBOOT) { #ifdef DEBUG - printf("automatic reboot in 10 seconds\n"); - sleep(10); + printf("automatic reboot in 10 seconds\n"); + sleep(10); #endif - reboot(reboot_magic); - } else { - printf("you may safely poweroff your computer now\n"); - } - } else { - printf("you may safely reboot or halt your system\n"); - } + reboot(reboot_magic); + } else { + printf("you may safely poweroff your computer now\n"); + } + } else { + printf("you may safely reboot or halt your system\n"); + } select(0, NULL, NULL, NULL, NULL); - return 0; + return 0; } diff --git a/mdk-stage1/ka.c b/mdk-stage1/ka.c index 1f0b1dedd..670abe5af 100644 --- a/mdk-stage1/ka.c +++ b/mdk-stage1/ka.c @@ -36,163 +36,163 @@ static void save_stuff_for_rescue(void) #endif static void my_pause(void) { - unsigned char t; - fflush(stdout); - read(0, &t, 1); + unsigned char t; + fflush(stdout); + read(0, &t, 1); } static enum return_type ka_wait_for_stage2(int count) { - char * ramdisk = "/dev/ram3"; /* warning, verify that this file exists in the initrd*/ - char * ka_launch[] = { "/ka/ka-d-client", "-w","-s","getstage2","-e","(cd /tmp/stage2; tar -x -f - )", NULL }; /* The command line for ka_launch */ - char * mkfs_launch[] = { "/sbin/mke2fs", "-m", "0", ramdisk, NULL}; /* The mkfs command for formating the ramdisk */ + char * ramdisk = "/dev/ram3"; /* warning, verify that this file exists in the initrd*/ + char * ka_launch[] = { "/ka/ka-d-client", "-w","-s","getstage2","-e","(cd /tmp/stage2; tar -x -f - )", NULL }; /* The command line for ka_launch */ + char * mkfs_launch[] = { "/sbin/mke2fs", "-m", "0", ramdisk, NULL}; /* The mkfs command for formating the ramdisk */ - log_message("KA: Preparing to receive stage 2...."); + log_message("KA: Preparing to receive stage 2...."); wait_message("Preparing to receive stage 2"); - int pida, wait_status; + int pida, wait_status; - if (!(pida = fork())) { /* Forking current process for running mkfs */ - //close(1); - close(2); - execv(mkfs_launch[0], mkfs_launch); /* Formating the ramdisk */ - printf("KA: Can't execute %s\n<press Enter>\n", mkfs_launch[0]); - my_pause(); - return KAERR_CANTFORK; - } - while (wait4(-1, &wait_status, 0, NULL) != pida) {}; /* Waiting the end of mkfs */ - remove_wait_message(); + if (!(pida = fork())) { /* Forking current process for running mkfs */ + //close(1); + close(2); + execv(mkfs_launch[0], mkfs_launch); /* Formating the ramdisk */ + printf("KA: Can't execute %s\n<press Enter>\n", mkfs_launch[0]); + my_pause(); + return KAERR_CANTFORK; + } + while (wait4(-1, &wait_status, 0, NULL) != pida) {}; /* Waiting the end of mkfs */ + remove_wait_message(); wait_message("Mounting /dev/ram3 at %s", STAGE2_LOCATION); - if (my_mount(ramdisk, STAGE2_LOCATION, "ext2", 1)) {/* Trying to mount the ramdisk */ - return RETURN_ERROR; - } - remove_wait_message(); - - log_message("KA: Waiting for stage 2...."); - wait_message("Waiting for rescue from KA server (Try %d/%d)", count, KA_MAX_RETRY); - pid_t pid; /* Process ID of the child process */ - pid_t wpid; /* Process ID from wait() */ - int status; /* Exit status from wait() */ - - pid = fork(); - if ( pid == -1 ) { - fprintf(stderr, "%s: Failed to fork()\n", strerror(errno)); - exit(13); - } else if ( pid == 0 ) { - // close(2); - execv(ka_launch[0], ka_launch); - } else { - // wpid = wait(&status); /* Child's exit status */ - wpid = wait4(-1, &status, 0, NULL); - if ( wpid == -1 ) { - fprintf(stderr,"%s: wait()\n", strerror(errno)); - return RETURN_ERROR; - } else if ( wpid != pid ) - abort(); - else { - if ( WIFEXITED(status) ) { - printf("Exited: $? = %d\n", WEXITSTATUS(status)); - } else if ( WIFSIGNALED(status) ) { - printf("Signal: %d%s\n", WTERMSIG(status), WCOREDUMP(status) ? " with core file." : ""); - } - } - } - - remove_wait_message(); - return RETURN_OK; - // if (!(pid = fork())) { /* Froking current process for running ka-deploy (client side) */ - // close(1); /* Closing stdout */ - // close(2); /* Closing stderr */ - // execve(ka_launch[0], ka_launch,grab_env()); /* Running ka-deploy (client side) */ - // printf("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]); - // log_message("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]); - // my_pause(); - // return KAERR_CANTFORK; - //} - - //while (wait4(-1, &wait_status, 0, NULL) != pid) {}; /* Waiting the end of duplication */ - // log_message("kalaunch ret %d\n", WIFEXITED(wait_status)); - // remove_wait_message(); - //sleep(100000); - // return RETURN_OK; + if (my_mount(ramdisk, STAGE2_LOCATION, "ext2", 1)) {/* Trying to mount the ramdisk */ + return RETURN_ERROR; + } + remove_wait_message(); + + log_message("KA: Waiting for stage 2...."); + wait_message("Waiting for rescue from KA server (Try %d/%d)", count, KA_MAX_RETRY); + pid_t pid; /* Process ID of the child process */ + pid_t wpid; /* Process ID from wait() */ + int status; /* Exit status from wait() */ + + pid = fork(); + if ( pid == -1 ) { + fprintf(stderr, "%s: Failed to fork()\n", strerror(errno)); + exit(13); + } else if ( pid == 0 ) { + // close(2); + execv(ka_launch[0], ka_launch); + } else { + // wpid = wait(&status); /* Child's exit status */ + wpid = wait4(-1, &status, 0, NULL); + if ( wpid == -1 ) { + fprintf(stderr,"%s: wait()\n", strerror(errno)); + return RETURN_ERROR; + } else if ( wpid != pid ) + abort(); + else { + if ( WIFEXITED(status) ) { + printf("Exited: $? = %d\n", WEXITSTATUS(status)); + } else if ( WIFSIGNALED(status) ) { + printf("Signal: %d%s\n", WTERMSIG(status), WCOREDUMP(status) ? " with core file." : ""); + } + } + } + + remove_wait_message(); + return RETURN_OK; + // if (!(pid = fork())) { /* Froking current process for running ka-deploy (client side) */ + // close(1); /* Closing stdout */ + // close(2); /* Closing stderr */ + // execve(ka_launch[0], ka_launch,grab_env()); /* Running ka-deploy (client side) */ + // printf("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]); + // log_message("KA: Can't execute %s\n<press Enter>\n", ka_launch[0]); + // my_pause(); + // return KAERR_CANTFORK; + //} + + //while (wait4(-1, &wait_status, 0, NULL) != pid) {}; /* Waiting the end of duplication */ + // log_message("kalaunch ret %d\n", WIFEXITED(wait_status)); + // remove_wait_message(); + //sleep(100000); + // return RETURN_OK; } enum return_type perform_ka(void) { - enum return_type results; - int server_failure = 1; /* Number of time we've failed to find a ka server */ - FILE *f = fopen ("/ka/tftpserver","w"); - - if (f != NULL) { - /* Writing the NEXT_SERVER value of the DHCP Request in the /ka/tftpserver file */ - fprintf(f,"%s\n",inet_ntoa(next_server)); - fclose(f); - } - - log_message("KA: Trying to retrieve stage2 from server"); - log_message("KA: ka_wait_for_stage2"); - do { - /* We are trying to get a valid stage 2 (rescue) */ - results=ka_wait_for_stage2(server_failure); - if (results != RETURN_OK) { - return results; - } else { - /* Trying to open STAGE2_LOCATION/ka directory */ - char dir[255] = STAGE2_LOCATION; - strcat(dir,"/ka"); - DIR *dp = opendir(dir); - - /* Does the STAGE2_LOCATION/ka directory exists ? = Does the rescue with ka well downloaded ?*/ - if (!dp) { - log_message("KA: Server not found !"); - /* Be sure that the STAGE2_LOCATION isn't mounted after receiving a wrong rescue */ - if (umount (STAGE2_LOCATION)) { - log_perror("KA: Unable to umount STAGE2"); - } - int cpt; - - if (server_failure++ == KA_MAX_RETRY){ - /* if the KA server can't be reach KA_MAX_RETRY times */ - char * reboot_launch[] = { "/sbin/reboot", NULL}; - for (cpt=5; cpt>0; cpt--) { - wait_message("!!! Can't reach a valid KA server !!! (Rebooting in %d sec)",cpt); - sleep (1); - } - /* Rebooting the computer to avoid infinite loop on ka mode */ - execv(reboot_launch[0], reboot_launch); - } - - for (cpt=5; cpt>0; cpt--) { - wait_message("KA server not found ! (Try %d/%d in %d sec)",server_failure,KA_MAX_RETRY,cpt); - log_message("Ka not found %d/%d", server_failure,KA_MAX_RETRY); - sleep (1); - } - remove_wait_message(); - /* We should try another time*/ - results=RETURN_BACK; - continue; - } - - if (dp) { - log_message("KA: Stage 2 downloaded successfully"); - closedir(dp); /* Closing the /ka directory */ - server_failure=1; /* Resetting server_failure */ - results = RETURN_OK; - } - } - - log_message("KA: Preparing chroot"); - return RETURN_OK; - - // if (IS_RESCUE) { /* if we are in rescue mode */ - // save_stuff_for_rescue(); /* Saving resolve.conf */ - // if (umount (STAGE2_LOCATION)) { /* Unmounting STAGE2 elseif kernel can't mount it ! */ - // log_perror("KA: Unable to umount STAGE2"); - // return RETURN_ERROR; - // } - // } - } while (results == RETURN_BACK); - - // method_name = strdup("ka"); - return RETURN_OK; + enum return_type results; + int server_failure = 1; /* Number of time we've failed to find a ka server */ + FILE *f = fopen ("/ka/tftpserver","w"); + + if (f != NULL) { + /* Writing the NEXT_SERVER value of the DHCP Request in the /ka/tftpserver file */ + fprintf(f,"%s\n",inet_ntoa(next_server)); + fclose(f); + } + + log_message("KA: Trying to retrieve stage2 from server"); + log_message("KA: ka_wait_for_stage2"); + do { + /* We are trying to get a valid stage 2 (rescue) */ + results=ka_wait_for_stage2(server_failure); + if (results != RETURN_OK) { + return results; + } else { + /* Trying to open STAGE2_LOCATION/ka directory */ + char dir[255] = STAGE2_LOCATION; + strcat(dir,"/ka"); + DIR *dp = opendir(dir); + + /* Does the STAGE2_LOCATION/ka directory exists ? = Does the rescue with ka well downloaded ?*/ + if (!dp) { + log_message("KA: Server not found !"); + /* Be sure that the STAGE2_LOCATION isn't mounted after receiving a wrong rescue */ + if (umount (STAGE2_LOCATION)) { + log_perror("KA: Unable to umount STAGE2"); + } + int cpt; + + if (server_failure++ == KA_MAX_RETRY){ + /* if the KA server can't be reach KA_MAX_RETRY times */ + char * reboot_launch[] = { "/sbin/reboot", NULL}; + for (cpt=5; cpt>0; cpt--) { + wait_message("!!! Can't reach a valid KA server !!! (Rebooting in %d sec)",cpt); + sleep (1); + } + /* Rebooting the computer to avoid infinite loop on ka mode */ + execv(reboot_launch[0], reboot_launch); + } + + for (cpt=5; cpt>0; cpt--) { + wait_message("KA server not found ! (Try %d/%d in %d sec)",server_failure,KA_MAX_RETRY,cpt); + log_message("Ka not found %d/%d", server_failure,KA_MAX_RETRY); + sleep (1); + } + remove_wait_message(); + /* We should try another time*/ + results=RETURN_BACK; + continue; + } + + if (dp) { + log_message("KA: Stage 2 downloaded successfully"); + closedir(dp); /* Closing the /ka directory */ + server_failure=1; /* Resetting server_failure */ + results = RETURN_OK; + } + } + + log_message("KA: Preparing chroot"); + return RETURN_OK; + + // if (IS_RESCUE) { /* if we are in rescue mode */ + // save_stuff_for_rescue(); /* Saving resolve.conf */ + // if (umount (STAGE2_LOCATION)) { /* Unmounting STAGE2 elseif kernel can't mount it ! */ + // log_perror("KA: Unable to umount STAGE2"); + // return RETURN_ERROR; + // } + // } + } while (results == RETURN_BACK); + + // method_name = strdup("ka"); + return RETURN_OK; } diff --git a/mdk-stage1/log.c b/mdk-stage1/log.c index 56a13da93..cb3f741dc 100644 --- a/mdk-stage1/log.c +++ b/mdk-stage1/log.c @@ -37,58 +37,58 @@ static FILE * logfile = NULL; void vlog_message(const char * s, va_list args) { - va_list args_copy; - va_copy(args_copy, args); + va_list args_copy; + va_copy(args_copy, args); - if (logfile) { - fprintf(logfile, "* "); - vfprintf(logfile, s, args); - fprintf(logfile, "\n"); - fflush(logfile); - } - if (logtty) { - fprintf(logtty, "* "); - vfprintf(logtty, s, args_copy); - fprintf(logtty, "\n"); - fflush(logtty); - } + if (logfile) { + fprintf(logfile, "* "); + vfprintf(logfile, s, args); + fprintf(logfile, "\n"); + fflush(logfile); + } + if (logtty) { + fprintf(logtty, "* "); + vfprintf(logtty, s, args_copy); + fprintf(logtty, "\n"); + fflush(logtty); + } - va_end(args_copy); + va_end(args_copy); } void log_message(const char * s, ...) { - va_list args; - va_start(args, s); - vlog_message(s, args); - va_end(args); - - return; + va_list args; + va_start(args, s); + vlog_message(s, args); + va_end(args); + + return; } void log_perror(const char *msg) { - log_message("%s: %s", msg, strerror(errno)); + log_message("%s: %s", msg, strerror(errno)); } void open_log(void) { - if (!IS_TESTING) { - logtty = fopen("/dev/tty3", "w"); - logfile = fopen("/tmp/stage1.log", "w"); - } - else - logfile = fopen("debug.log", "w"); + if (!IS_TESTING) { + logtty = fopen("/dev/tty3", "w"); + logfile = fopen("/tmp/stage1.log", "w"); + } + else + logfile = fopen("debug.log", "w"); } void close_log(void) { - if (logfile) { - log_message("stage1: disconnecting life support systems"); - fclose(logfile); - if (logtty) - fclose(logtty); - } + if (logfile) { + log_message("stage1: disconnecting life support systems"); + fclose(logfile); + if (logtty) + fclose(logtty); + } } diff --git a/mdk-stage1/lomount.c b/mdk-stage1/lomount.c index 74a409e0b..b7d61f24b 100644 --- a/mdk-stage1/lomount.c +++ b/mdk-stage1/lomount.c @@ -35,90 +35,90 @@ #include "lomount.h" -#define LO_NAME_SIZE 64 -#define LO_KEY_SIZE 32 +#define LO_NAME_SIZE 64 +#define LO_KEY_SIZE 32 struct loop_info { - int lo_number; /* ioctl r/o */ - dev_t lo_device; /* ioctl r/o */ - unsigned long lo_inode; /* ioctl r/o */ - dev_t lo_rdevice; /* ioctl r/o */ - int lo_offset; - int lo_encrypt_type; - int lo_encrypt_key_size; /* ioctl w/o */ - int lo_flags; /* ioctl r/o */ - char lo_name[LO_NAME_SIZE]; - unsigned char lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ - unsigned long lo_init[2]; - char reserved[4]; + int lo_number; /* ioctl r/o */ + dev_t lo_device; /* ioctl r/o */ + unsigned long lo_inode; /* ioctl r/o */ + dev_t lo_rdevice; /* ioctl r/o */ + int lo_offset; + int lo_encrypt_type; + int lo_encrypt_key_size; /* ioctl w/o */ + int lo_flags; /* ioctl r/o */ + char lo_name[LO_NAME_SIZE]; + unsigned char lo_encrypt_key[LO_KEY_SIZE]; /* ioctl w/o */ + unsigned long lo_init[2]; + char reserved[4]; }; -#define LOOP_SET_FD 0x4C00 -#define LOOP_CLR_FD 0x4C01 -#define LOOP_SET_STATUS 0x4C02 -#define LOOP_GET_STATUS 0x4C03 +#define LOOP_SET_FD 0x4C00 +#define LOOP_CLR_FD 0x4C01 +#define LOOP_SET_STATUS 0x4C02 +#define LOOP_GET_STATUS 0x4C03 int set_loop (const char *device, const char *file) { - struct loop_info loopinfo; - int fd, ffd, mode; + struct loop_info loopinfo; + int fd, ffd, mode; - mode = O_RDONLY; + mode = O_RDONLY; - if ((ffd = open (file, mode)) < 0) - return 1; + if ((ffd = open (file, mode)) < 0) + return 1; - if ((fd = open (device, mode)) < 0) { - close(ffd); - return 1; - } + if ((fd = open (device, mode)) < 0) { + close(ffd); + return 1; + } - memset(&loopinfo, 0, sizeof (loopinfo)); - strncpy(loopinfo.lo_name, file, LO_NAME_SIZE); - loopinfo.lo_name[LO_NAME_SIZE - 1] = 0; - loopinfo.lo_offset = 0; + memset(&loopinfo, 0, sizeof (loopinfo)); + strncpy(loopinfo.lo_name, file, LO_NAME_SIZE); + loopinfo.lo_name[LO_NAME_SIZE - 1] = 0; + loopinfo.lo_offset = 0; #ifdef MCL_FUTURE - /* - * Oh-oh, sensitive data coming up. Better lock into memory to prevent - * passwd etc being swapped out and left somewhere on disk. - */ + /* + * Oh-oh, sensitive data coming up. Better lock into memory to prevent + * passwd etc being swapped out and left somewhere on disk. + */ - if(mlockall(MCL_CURRENT|MCL_FUTURE)) { - log_message("CRITICAL Couldn't lock into memory! %s (memlock)", strerror(errno)); - return 1; - } + if(mlockall(MCL_CURRENT|MCL_FUTURE)) { + log_message("CRITICAL Couldn't lock into memory! %s (memlock)", strerror(errno)); + return 1; + } #endif - if (ioctl(fd, LOOP_SET_FD, ffd) < 0) { - close(fd); - close(ffd); - return 1; - } - - if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { - (void) ioctl (fd, LOOP_CLR_FD, 0); - close(fd); - close(ffd); - return 1; - } - - close(fd); - close(ffd); - return 0; + if (ioctl(fd, LOOP_SET_FD, ffd) < 0) { + close(fd); + close(ffd); + return 1; + } + + if (ioctl(fd, LOOP_SET_STATUS, &loopinfo) < 0) { + (void) ioctl (fd, LOOP_CLR_FD, 0); + close(fd); + close(ffd); + return 1; + } + + close(fd); + close(ffd); + return 0; } char* find_free_loop() { - struct loop_info loopinfo; + struct loop_info loopinfo; int i; for (i=0; i<256; i++) { int fd; - char ldev[100]; - sprintf(ldev, "/dev/loop%d", i); + char ldev[100]; + sprintf(ldev, "/dev/loop%d", i); ensure_dev_exists(ldev); fd = open(ldev, O_RDONLY); if (!ioctl(fd, LOOP_GET_STATUS, &loopinfo)) { @@ -141,54 +141,54 @@ char* find_free_loop() void del_loop(char * loopdev) { - int fd; + int fd; if (!loopdev) return; - if ((fd = open (loopdev, O_RDONLY)) < 0) - return; + if ((fd = open (loopdev, O_RDONLY)) < 0) + return; - if (ioctl (fd, LOOP_CLR_FD, 0) < 0) - return; + if (ioctl (fd, LOOP_CLR_FD, 0) < 0) + return; - close (fd); + close (fd); } int lomount(char *loopfile, char *where, char **dev, int compressed) { - long int flag; + long int flag; char * loopdev; - flag = MS_MGC_VAL; - flag |= MS_RDONLY; + flag = MS_MGC_VAL; + flag |= MS_RDONLY; - my_insmod("loop", ANY_DRIVER_TYPE, "max_loop=256", 1); - if (compressed) { - my_insmod("squashfs", ANY_DRIVER_TYPE, NULL, 1); - } + my_insmod("loop", ANY_DRIVER_TYPE, "max_loop=256", 1); + if (compressed) { + my_insmod("squashfs", ANY_DRIVER_TYPE, NULL, 1); + } if (!(loopdev = find_free_loop())) { - log_message("could not find a free loop"); - return 1; + log_message("could not find a free loop"); + return 1; } if (dev) *dev = loopdev; - if (set_loop(loopdev, loopfile)) { - log_message("set_loop failed on %s (%s)", loopdev, strerror(errno)); - return 1; - } + if (set_loop(loopdev, loopfile)) { + log_message("set_loop failed on %s (%s)", loopdev, strerror(errno)); + return 1; + } - if (my_mount(loopdev, where, compressed ? "squashfs" : "iso9660", 0)) { - del_loop(loopdev); - return 1; - } + if (my_mount(loopdev, where, compressed ? "squashfs" : "iso9660", 0)) { + del_loop(loopdev); + return 1; + } - log_message("lomount succeeded for %s on %s", loopfile, where); - return 0; + log_message("lomount succeeded for %s on %s", loopfile, where); + return 0; } diff --git a/mdk-stage1/modules.c b/mdk-stage1/modules.c index ec03233ae..745070052 100644 --- a/mdk-stage1/modules.c +++ b/mdk-stage1/modules.c @@ -52,247 +52,247 @@ extern long init_module(void *, unsigned long, const char *); static const char *moderror(int err) { - switch (err) { - case ENOEXEC: - return "Invalid module format"; - case ENOENT: - return "Unknown symbol in module"; - case ESRCH: - return "Module has wrong symbol version"; - case EINVAL: - return "Invalid parameters"; - default: - return strerror(err); - } + switch (err) { + case ENOEXEC: + return "Invalid module format"; + case ENOENT: + return "Unknown symbol in module"; + case ESRCH: + return "Module has wrong symbol version"; + case EINVAL: + return "Invalid parameters"; + default: + return strerror(err); + } } int insmod_local_file(char * path, char * options) { - void *file; - unsigned long len; - int rc; + void *file; + unsigned long len; + int rc; - if (IS_TESTING) - return 0; + if (IS_TESTING) + return 0; - file = grab_file(path, &len); + file = grab_file(path, &len); - if (!file) { - log_perror(asprintf_("\terror reading %s", path)); - return -1; - } + if (!file) { + log_perror(asprintf_("\terror reading %s", path)); + return -1; + } - rc = init_module(file, len, options ? options : ""); - if (rc) - log_message("\terror: %s", moderror(errno)); - return rc; + rc = init_module(file, len, options ? options : ""); + if (rc) + log_message("\terror: %s", moderror(errno)); + return rc; } static char *kernel_module_extension(void) { - return ".ko.xz"; + return ".ko.xz"; } static char *filename2modname(char * filename) { - char *modname, *p; + char *modname, *p; - modname = strdup(basename(filename)); - if (strstr(modname, kernel_module_extension())) { - modname[strlen(modname)-strlen(kernel_module_extension())] = '\0'; /* remove trailing .ko.gz */ - } + modname = strdup(basename(filename)); + if (strstr(modname, kernel_module_extension())) { + modname[strlen(modname)-strlen(kernel_module_extension())] = '\0'; /* remove trailing .ko.gz */ + } - p = modname; - while (p && *p) { - if (*p == '-') - *p = '_'; - p++; - } + p = modname; + while (p && *p) { + if (*p == '-') + *p = '_'; + p++; + } - return modname; + return modname; } static void find_modules_directory(void) { - struct utsname kernel_uname; - char * prefix = "/lib/modules"; - char * release; - if (uname(&kernel_uname)) { - fatal_error("uname failed"); - } - release = kernel_uname.release; - sprintf(modules_directory , "%s/%s", prefix, release); + struct utsname kernel_uname; + char * prefix = "/lib/modules"; + char * release; + if (uname(&kernel_uname)) { + fatal_error("uname failed"); + } + release = kernel_uname.release; + sprintf(modules_directory , "%s/%s", prefix, release); } static int load_modules_dependencies(void) { - char * deps_file = asprintf_("%s/%s", modules_directory, "modules.dep"); - char * buf, * ptr, * start, * end; - struct stat s; - int line, i; - - log_message("loading modules dependencies"); - buf = cat_file(deps_file, &s); - if (!buf) - return -1; - line = line_counts(buf); - modules_deps = malloc(sizeof(*modules_deps) * (line+1)); - - start = buf; - line = 0; - while (start < (buf+s.st_size) && *start) { - char * tmp_deps[50]; - - end = strchr(start, '\n'); - *end = '\0'; - - ptr = strchr(start, ':'); - if (!ptr) { - start = end + 1; - continue; - } - *ptr = '\0'; - ptr++; - - while (*ptr && (*ptr == ' ')) ptr++; - - /* sort of a good line */ - modules_deps[line].filename = start[0] == '/' ? strdup(start) : asprintf_("%s/%s", modules_directory, start); - modules_deps[line].modname = filename2modname(start); - - start = ptr; - i = 0; - while (start && *start && i < sizeof(tmp_deps)/sizeof(char *)) { - ptr = strchr(start, ' '); - if (ptr) *ptr = '\0'; - tmp_deps[i++] = filename2modname(start); - if (ptr) - start = ptr + 1; - else - start = NULL; - while (start && *start && *start == ' ') - start++; - } - if(i >= sizeof(tmp_deps)/sizeof(char *)-1) { - log_message("warning, more than %zu dependencies for module %s", - sizeof(tmp_deps)/sizeof(char *)-1, - modules_deps[line].modname); - i = sizeof(tmp_deps)/sizeof(char *)-1; - } - tmp_deps[i++] = NULL; - - modules_deps[line].deps = _memdup(tmp_deps, sizeof(char *) * i); - - line++; - start = end + 1; - } - modules_deps[line].modname = NULL; - - free(buf); - - return 0; + char * deps_file = asprintf_("%s/%s", modules_directory, "modules.dep"); + char * buf, * ptr, * start, * end; + struct stat s; + int line, i; + + log_message("loading modules dependencies"); + buf = cat_file(deps_file, &s); + if (!buf) + return -1; + line = line_counts(buf); + modules_deps = malloc(sizeof(*modules_deps) * (line+1)); + + start = buf; + line = 0; + while (start < (buf+s.st_size) && *start) { + char * tmp_deps[50]; + + end = strchr(start, '\n'); + *end = '\0'; + + ptr = strchr(start, ':'); + if (!ptr) { + start = end + 1; + continue; + } + *ptr = '\0'; + ptr++; + + while (*ptr && (*ptr == ' ')) ptr++; + + /* sort of a good line */ + modules_deps[line].filename = start[0] == '/' ? strdup(start) : asprintf_("%s/%s", modules_directory, start); + modules_deps[line].modname = filename2modname(start); + + start = ptr; + i = 0; + while (start && *start && i < sizeof(tmp_deps)/sizeof(char *)) { + ptr = strchr(start, ' '); + if (ptr) *ptr = '\0'; + tmp_deps[i++] = filename2modname(start); + if (ptr) + start = ptr + 1; + else + start = NULL; + while (start && *start && *start == ' ') + start++; + } + if(i >= sizeof(tmp_deps)/sizeof(char *)-1) { + log_message("warning, more than %zu dependencies for module %s", + sizeof(tmp_deps)/sizeof(char *)-1, + modules_deps[line].modname); + i = sizeof(tmp_deps)/sizeof(char *)-1; + } + tmp_deps[i++] = NULL; + + modules_deps[line].deps = _memdup(tmp_deps, sizeof(char *) * i); + + line++; + start = end + 1; + } + modules_deps[line].modname = NULL; + + free(buf); + + return 0; } static int load_modules_descriptions(void) { - char * descr_file = asprintf_("%s/%s", modules_directory, "modules.description"); - char * buf, * ptr, * start, * end; - struct stat s; - int line; - - log_message("loading modules descriptions"); - - buf = cat_file(descr_file, &s); - if (!buf) - return -1; - line = line_counts(buf); - modules_descr = malloc(sizeof(*modules_descr) * (line+1)); - - start = buf; - line = 0; - while (start < (buf+s.st_size) && *start) { - end = strchr(start, '\n'); - *end = '\0'; - - ptr = strchr(start, '\t'); - if (!ptr) { - start = end + 1; - continue; - } - *ptr = '\0'; - ptr++; - - modules_descr[line].modname = filename2modname(start); - modules_descr[line].description = strndup(ptr, 50); - - line++; - start = end + 1; - } - modules_descr[line].modname = NULL; - - free(buf); - - return 0; + char * descr_file = asprintf_("%s/%s", modules_directory, "modules.description"); + char * buf, * ptr, * start, * end; + struct stat s; + int line; + + log_message("loading modules descriptions"); + + buf = cat_file(descr_file, &s); + if (!buf) + return -1; + line = line_counts(buf); + modules_descr = malloc(sizeof(*modules_descr) * (line+1)); + + start = buf; + line = 0; + while (start < (buf+s.st_size) && *start) { + end = strchr(start, '\n'); + *end = '\0'; + + ptr = strchr(start, '\t'); + if (!ptr) { + start = end + 1; + continue; + } + *ptr = '\0'; + ptr++; + + modules_descr[line].modname = filename2modname(start); + modules_descr[line].description = strndup(ptr, 50); + + line++; + start = end + 1; + } + modules_descr[line].modname = NULL; + + free(buf); + + return 0; } void init_firmware_loader(void) { - int fd = open(UEVENT_HELPER_FILE, O_WRONLY|O_TRUNC, 0666); - if (!fd) { - log_message("warning, unable to set firmware loader"); - return; - } - write(fd, UEVENT_HELPER_VALUE, strlen(UEVENT_HELPER_VALUE)); - close(fd); + int fd = open(UEVENT_HELPER_FILE, O_WRONLY|O_TRUNC, 0666); + if (!fd) { + log_message("warning, unable to set firmware loader"); + return; + } + write(fd, UEVENT_HELPER_VALUE, strlen(UEVENT_HELPER_VALUE)); + close(fd); } void init_modules_insmoding(void) { - find_modules_directory(); - if (load_modules_dependencies()) { - fatal_error("warning, error initing modules stuff, modules loading disabled"); - } - if (load_modules_descriptions()) { - log_message("warning, error initing modules stuff"); - } + find_modules_directory(); + if (load_modules_dependencies()) { + fatal_error("warning, error initing modules stuff, modules loading disabled"); + } + if (load_modules_descriptions()) { + log_message("warning, error initing modules stuff"); + } } static void add_modules_conf(char * str) { - static char data[5000] = ""; - char * target = "/tmp/modules.conf"; - int fd; + static char data[5000] = ""; + char * target = "/tmp/modules.conf"; + int fd; - if (strlen(data) + strlen(str) >= sizeof(data)) - return; + if (strlen(data) + strlen(str) >= sizeof(data)) + return; - strcat(data, str); - strcat(data, "\n"); + strcat(data, str); + strcat(data, "\n"); - fd = open(target, O_CREAT|O_WRONLY|O_TRUNC, 00660); - - if (fd == -1) { - log_perror(str); - return; - } + fd = open(target, O_CREAT|O_WRONLY|O_TRUNC, 00660); + + if (fd == -1) { + log_perror(str); + return; + } - if (write(fd, data, strlen(data) + 1) != (ssize_t) (strlen(data) + 1)) - log_perror(str); + if (write(fd, data, strlen(data) + 1) != (ssize_t) (strlen(data) + 1)) + log_perror(str); - close(fd); + close(fd); } int module_already_present(const char * name) { - FILE * f; - struct stat sb; - char *path; - int answ = 0; + FILE * f; + struct stat sb; + char *path; + int answ = 0; - if ((f = fopen("/proc/modules", "rb"))) { + if ((f = fopen("/proc/modules", "rb"))) { while (1) { char buf[500]; if (!fgets(buf, sizeof(buf), f)) break; @@ -302,51 +302,51 @@ int module_already_present(const char * name) fclose(f); } - /* built-in module case. try to find them through sysfs */ - if (!answ) { - asprintf(&path, "/sys/module/%s", name); - if (!stat(path, &sb)) - answ = 1; - free(path); - } - return answ; + /* built-in module case. try to find them through sysfs */ + if (!answ) { + asprintf(&path, "/sys/module/%s", name); + if (!stat(path, &sb)) + answ = 1; + free(path); + } + return answ; } #ifndef ENABLE_NETWORK_STANDALONE static enum insmod_return insmod_with_deps(const char * mod_name, char * options, int allow_modules_floppy) { - struct module_deps_elem * dep; - const char * filename; - - dep = modules_deps; - while (dep && dep->modname && strcmp(dep->modname, mod_name)) dep++; - - if (dep && dep->modname && dep->deps) { - char ** one_dep; - one_dep = dep->deps; - while (*one_dep) { - /* here, we can fail but we don't care, if the error is - * important, the desired module will fail also */ - insmod_with_deps(*one_dep, NULL, allow_modules_floppy); - one_dep++; - } - } + struct module_deps_elem * dep; + const char * filename; + + dep = modules_deps; + while (dep && dep->modname && strcmp(dep->modname, mod_name)) dep++; + + if (dep && dep->modname && dep->deps) { + char ** one_dep; + one_dep = dep->deps; + while (*one_dep) { + /* here, we can fail but we don't care, if the error is + * important, the desired module will fail also */ + insmod_with_deps(*one_dep, NULL, allow_modules_floppy); + one_dep++; + } + } - if (dep && dep->filename) { - filename = dep->filename; - } else { - log_message("warning: unable to get module filename for %s", mod_name); - filename = mod_name; - } - - if (module_already_present(mod_name)) - return INSMOD_OK; - - log_message("needs %s", filename); - { - return insmod_local_file((char *) filename, options); - } + if (dep && dep->filename) { + filename = dep->filename; + } else { + log_message("warning: unable to get module filename for %s", mod_name); + filename = mod_name; + } + + if (module_already_present(mod_name)) + return INSMOD_OK; + + log_message("needs %s", filename); + { + return insmod_local_file((char *) filename, options); + } } #endif @@ -357,84 +357,84 @@ enum insmod_return my_insmod(const char * mod_name, enum driver_type type, char enum insmod_return my_insmod(const char * mod_name, enum driver_type type __attribute__ ((unused)), char * options, int allow_modules_floppy) #endif { - int i; + int i; #ifndef DISABLE_NETWORK - char ** net_devices = NULL; /* fucking compiler */ + char ** net_devices = NULL; /* fucking compiler */ #endif - if (module_already_present(mod_name)) - return INSMOD_OK; + if (module_already_present(mod_name)) + return INSMOD_OK; - log_message("have to insmod %s", mod_name); + log_message("have to insmod %s", mod_name); #ifndef DISABLE_NETWORK - if (type == NETWORK_DEVICES) - net_devices = get_net_devices(); + if (type == NETWORK_DEVICES) + net_devices = get_net_devices(); #endif #ifdef ENABLE_NETWORK_STANDALONE - { - char *cmd = options ? asprintf_("/sbin/modprobe %s %s", mod_name, options) : - asprintf_("/sbin/modprobe %s", mod_name); - log_message("running %s", cmd); - i = system(cmd); - } + { + char *cmd = options ? asprintf_("/sbin/modprobe %s %s", mod_name, options) : + asprintf_("/sbin/modprobe %s", mod_name); + log_message("running %s", cmd); + i = system(cmd); + } #else - i = insmod_with_deps(mod_name, options, allow_modules_floppy); + i = insmod_with_deps(mod_name, options, allow_modules_floppy); #endif - if (i == 0) { - log_message("\tsucceeded %s", mod_name); + if (i == 0) { + log_message("\tsucceeded %s", mod_name); #ifndef DISABLE_NETWORK - if (type == NETWORK_DEVICES) { - char ** new_net_devices = get_net_devices(); - while (new_net_devices && *new_net_devices) { - char alias[500]; - char ** ptr = net_devices; - while (ptr && *ptr) { - if (!strcmp(*new_net_devices, *ptr)) - goto already_present; - ptr++; - } - sprintf(alias, "alias %s %s", *new_net_devices, mod_name); - add_modules_conf(alias); - log_message("NET: %s", alias); - net_discovered_interface(*new_net_devices); - - already_present: - new_net_devices++; - } - } + if (type == NETWORK_DEVICES) { + char ** new_net_devices = get_net_devices(); + while (new_net_devices && *new_net_devices) { + char alias[500]; + char ** ptr = net_devices; + while (ptr && *ptr) { + if (!strcmp(*new_net_devices, *ptr)) + goto already_present; + ptr++; + } + sprintf(alias, "alias %s %s", *new_net_devices, mod_name); + add_modules_conf(alias); + log_message("NET: %s", alias); + net_discovered_interface(*new_net_devices); + + already_present: + new_net_devices++; + } + } #endif - } else - log_message("warning, insmod failed (%s %s) (%d)", mod_name, options, i); - - return i; + } else + log_message("warning, insmod failed (%s %s) (%d)", mod_name, options, i); + + return i; } static enum return_type insmod_with_options(char * mod, enum driver_type type) { - char * questions[] = { "Options", NULL }; - static char ** answers = NULL; - enum return_type results; - char options[500] = "options "; - - results = ask_from_entries("Please enter the parameters to give to the kernel:", questions, &answers, 24, NULL); - if (results != RETURN_OK) - return results; - - strcat(options, mod); - strcat(options, " "); - strcat(options, answers[0]); // because my_insmod will eventually modify the string - - if (my_insmod(mod, type, answers[0], 1) != INSMOD_OK) { - stg1_error_message("Insmod failed."); - return RETURN_ERROR; - } - - add_modules_conf(options); - - return RETURN_OK; + char * questions[] = { "Options", NULL }; + static char ** answers = NULL; + enum return_type results; + char options[500] = "options "; + + results = ask_from_entries("Please enter the parameters to give to the kernel:", questions, &answers, 24, NULL); + if (results != RETURN_OK) + return results; + + strcat(options, mod); + strcat(options, " "); + strcat(options, answers[0]); // because my_insmod will eventually modify the string + + if (my_insmod(mod, type, answers[0], 1) != INSMOD_OK) { + stg1_error_message("Insmod failed."); + return RETURN_ERROR; + } + + add_modules_conf(options); + + return RETURN_OK; } static int strsortfunc(const void *a, const void *b) @@ -444,58 +444,58 @@ static int strsortfunc(const void *a, const void *b) enum return_type ask_insmod(enum driver_type type) { - enum return_type results; - char * choice; - char ** dlist = list_directory(modules_directory); - char ** modules = alloca(sizeof(char *) * (string_array_length(dlist) + 1)); - char ** descrs = alloca(sizeof(char *) * (string_array_length(dlist) + 1)); - char ** p_dlist = dlist; - char ** p_modules = modules; - char ** p_descrs = descrs; - - qsort(dlist, string_array_length(dlist), sizeof(char *), strsortfunc); - - unset_automatic(); /* we are in a fallback mode */ - - while (p_dlist && *p_dlist) { - struct module_descr_elem * descr; - if (!strstr(*p_dlist, kernel_module_extension())) { - p_dlist++; - continue; - } - *p_modules = *p_dlist; - *p_descrs = NULL; - (*p_modules)[strlen(*p_modules)-strlen(kernel_module_extension())] = '\0'; /* remove trailing .ko.gz */ - - descr = modules_descr; - while (descr && descr->modname && strcmp(descr->modname, *p_modules)) descr++; - if (descr) - *p_descrs = descr->description; - - p_dlist++; - p_modules++; - p_descrs++; - } - *p_modules = NULL; - *p_descrs = NULL; - - if (modules && *modules) { - char * mytype; - char msg[200]; - if (type == MEDIA_ADAPTERS) - mytype = "MEDIA"; - else if (type == NETWORK_DEVICES) - mytype = "NET"; - else - return RETURN_ERROR; - - snprintf(msg, sizeof(msg), "Which driver should I try to gain %s access?", mytype); - results = ask_from_list_comments(msg, modules, descrs, &choice); - if (results == RETURN_OK) - return insmod_with_options(choice, type); - else - return results; - } else { - return RETURN_BACK; - } + enum return_type results; + char * choice; + char ** dlist = list_directory(modules_directory); + char ** modules = alloca(sizeof(char *) * (string_array_length(dlist) + 1)); + char ** descrs = alloca(sizeof(char *) * (string_array_length(dlist) + 1)); + char ** p_dlist = dlist; + char ** p_modules = modules; + char ** p_descrs = descrs; + + qsort(dlist, string_array_length(dlist), sizeof(char *), strsortfunc); + + unset_automatic(); /* we are in a fallback mode */ + + while (p_dlist && *p_dlist) { + struct module_descr_elem * descr; + if (!strstr(*p_dlist, kernel_module_extension())) { + p_dlist++; + continue; + } + *p_modules = *p_dlist; + *p_descrs = NULL; + (*p_modules)[strlen(*p_modules)-strlen(kernel_module_extension())] = '\0'; /* remove trailing .ko.gz */ + + descr = modules_descr; + while (descr && descr->modname && strcmp(descr->modname, *p_modules)) descr++; + if (descr) + *p_descrs = descr->description; + + p_dlist++; + p_modules++; + p_descrs++; + } + *p_modules = NULL; + *p_descrs = NULL; + + if (modules && *modules) { + char * mytype; + char msg[200]; + if (type == MEDIA_ADAPTERS) + mytype = "MEDIA"; + else if (type == NETWORK_DEVICES) + mytype = "NET"; + else + return RETURN_ERROR; + + snprintf(msg, sizeof(msg), "Which driver should I try to gain %s access?", mytype); + results = ask_from_list_comments(msg, modules, descrs, &choice); + if (results == RETURN_OK) + return insmod_with_options(choice, type); + else + return results; + } else { + return RETURN_BACK; + } } diff --git a/mdk-stage1/mount.c b/mdk-stage1/mount.c index b481052c7..918f5d1a2 100644 --- a/mdk-stage1/mount.c +++ b/mdk-stage1/mount.c @@ -37,225 +37,237 @@ /* WARNING: this won't work if the argument is not /dev/ based */ int ensure_dev_exists(const char * dev) { - int major, minor; - int type = S_IFBLK; /* my default type is block. don't forget to change for chars */ - const char * name; - struct stat buf; - char * ptr; - - name = &dev[5]; /* we really need that dev be passed as /dev/something.. */ + int major, minor; + int type = S_IFBLK; /* my default type is block. don't forget to change for chars */ + const char * name; + struct stat buf; + char * ptr; + + name = &dev[5]; /* we really need that dev be passed as /dev/something.. */ - if (!stat(dev, &buf)) - return 0; /* if the file already exists, we assume it's correct */ + if (!stat(dev, &buf)) + return 0; /* if the file already exists, we assume it's correct */ - if (ptr_begins_static_str(name, "sd")) { - /* SCSI disks */ - major = 8; - minor = (name[2] - 'a') << 4; - if (name[3] && name[4]) { - minor += 10 + (name[4] - '0'); - if (name[3] > 1 || name[4] > 5) { - log_message("I don't know how to create device %s, please post bugreport to me!", dev); - return -1; - } - } else if (name[3]) - minor += (name[3] - '0'); - } else if (ptr_begins_static_str(name, "vd")) { - /* Virtual disks */ - major = 252; - minor = (name[2] - 'a') << 4; - if (name[3] && name[4]) { - minor += 10 + (name[4] - '0'); - if (name[3] > 1 || name[4] > 5) { - log_message("I don't know how to create device %s, please post bugreport to me!", dev); - return -1; - } - } else if (name[3]) - minor += (name[3] - '0'); - } else if (ptr_begins_static_str(name, "hd")) { - /* IDE disks/cd's */ - if (name[2] == 'a') - major = 3, minor = 0; - else if (name[2] == 'b') - major = 3, minor = 64; - else if (name[2] == 'c') - major = 22, minor = 0; - else if (name[2] == 'd') - major = 22, minor = 64; - else if (name[2] == 'e') - major = 33, minor = 0; - else if (name[2] == 'f') - major = 33, minor = 64; - else if (name[2] == 'g') - major = 34, minor = 0; - else if (name[2] == 'h') - major = 34, minor = 64; - else if (name[2] == 'i') - major = 56, minor = 0; - else if (name[2] == 'j') - major = 56, minor = 64; - else if (name[2] == 'k') - major = 57, minor = 0; - else if (name[2] == 'l') - major = 57, minor = 64; - else if (name[2] == 'm') - major = 88, minor = 0; - else if (name[2] == 'n') - major = 88, minor = 64; - else if (name[2] == 'o') - major = 89, minor = 0; - else if (name[2] == 'p') - major = 89, minor = 64; - else if (name[2] == 'q') - major = 90, minor = 0; - else if (name[2] == 'r') - major = 90, minor = 64; - else if (name[2] == 's') - major = 91, minor = 0; - else if (name[2] == 't') - major = 91, minor = 64; - else - return -1; - - if (name[3] && name[4]) - minor += 10 + (name[4] - '0'); - else if (name[3]) - minor += (name[3] - '0'); - } else if (ptr_begins_static_str(name , "sr")) { - /* SCSI cd's */ - major = 11; - minor = name[2] - '0'; - } else if (ptr_begins_static_str(name, "ida/") || - ptr_begins_static_str(name, "cciss/")) { - /* Compaq Smart Array "ida/c0d0{p1}" */ - ptr = strchr(name, '/'); - mkdir("/dev/ida", 0755); - mkdir("/dev/cciss", 0755); - major = ptr_begins_static_str(name, "ida/") ? 72 : 104 + charstar_to_int(ptr+2); - ptr = strchr(ptr, 'd'); - minor = 16 * charstar_to_int(ptr+1); - ptr = strchr(ptr, 'p'); - minor += charstar_to_int(ptr+1); - } else if (ptr_begins_static_str(name, "rd/")) { - /* DAC960 "rd/cXdXXpX" */ - mkdir("/dev/rd", 0755); - major = 48 + charstar_to_int(name+4); - ptr = strchr(name+4, 'd'); - minor = 8 * charstar_to_int(ptr+1); - ptr = strchr(ptr, 'p'); - minor += charstar_to_int(ptr+1); - } else if (ptr_begins_static_str(name, "loop")) { - major = 7; - minor = name[4] - '0'; - } else if (ptr_begins_static_str(name, "chloop")) { - major = 100; - minor = name[6] - '0'; - } else { - log_message("I don't know how to create device %s, please post bugreport to me!", dev); - return -1; - } + if (ptr_begins_static_str(name, "sd")) { + /* SCSI disks */ + major = 8; + minor = (name[2] - 'a') << 4; + if (name[3] && name[4]) { + minor += 10 + (name[4] - '0'); + if (name[3] > 1 || name[4] > 5) { + log_message("I don't know how to create device %s, please post bugreport to me!", dev); + return -1; + } + } else if (name[3]) + minor += (name[3] - '0'); + } else if (ptr_begins_static_str(name, "vd")) { + /* Virtual disks */ + major = 252; + minor = (name[2] - 'a') << 4; + if (name[3] && name[4]) { + minor += 10 + (name[4] - '0'); + if (name[3] > 1 || name[4] > 5) { + log_message("I don't know how to create device %s, please post bugreport to me!", dev); + return -1; + } + } else if (name[3]) + minor += (name[3] - '0'); + } else if (ptr_begins_static_str(name, "xvd")) { + /* Virtual disks */ + major = 202; + minor = (name[2] - 'a') << 4; + if (name[4] && name[5]) { + minor += 10 + (name[5] - '0'); + if (name[4] > 1 || name[5] > 5) { + log_message("I don't know how to create device %s, please post bugreport to me!", dev); + return -1; + } + } else if (name[4]) + minor += (name[4] - '0'); + } else if (ptr_begins_static_str(name, "hd")) { + /* IDE disks/cd's */ + if (name[2] == 'a') + major = 3, minor = 0; + else if (name[2] == 'b') + major = 3, minor = 64; + else if (name[2] == 'c') + major = 22, minor = 0; + else if (name[2] == 'd') + major = 22, minor = 64; + else if (name[2] == 'e') + major = 33, minor = 0; + else if (name[2] == 'f') + major = 33, minor = 64; + else if (name[2] == 'g') + major = 34, minor = 0; + else if (name[2] == 'h') + major = 34, minor = 64; + else if (name[2] == 'i') + major = 56, minor = 0; + else if (name[2] == 'j') + major = 56, minor = 64; + else if (name[2] == 'k') + major = 57, minor = 0; + else if (name[2] == 'l') + major = 57, minor = 64; + else if (name[2] == 'm') + major = 88, minor = 0; + else if (name[2] == 'n') + major = 88, minor = 64; + else if (name[2] == 'o') + major = 89, minor = 0; + else if (name[2] == 'p') + major = 89, minor = 64; + else if (name[2] == 'q') + major = 90, minor = 0; + else if (name[2] == 'r') + major = 90, minor = 64; + else if (name[2] == 's') + major = 91, minor = 0; + else if (name[2] == 't') + major = 91, minor = 64; + else + return -1; + + if (name[3] && name[4]) + minor += 10 + (name[4] - '0'); + else if (name[3]) + minor += (name[3] - '0'); + } else if (ptr_begins_static_str(name , "sr")) { + /* SCSI cd's */ + major = 11; + minor = name[2] - '0'; + } else if (ptr_begins_static_str(name, "ida/") || + ptr_begins_static_str(name, "cciss/")) { + /* Compaq Smart Array "ida/c0d0{p1}" */ + ptr = strchr(name, '/'); + mkdir("/dev/ida", 0755); + mkdir("/dev/cciss", 0755); + major = ptr_begins_static_str(name, "ida/") ? 72 : 104 + charstar_to_int(ptr+2); + ptr = strchr(ptr, 'd'); + minor = 16 * charstar_to_int(ptr+1); + ptr = strchr(ptr, 'p'); + minor += charstar_to_int(ptr+1); + } else if (ptr_begins_static_str(name, "rd/")) { + /* DAC960 "rd/cXdXXpX" */ + mkdir("/dev/rd", 0755); + major = 48 + charstar_to_int(name+4); + ptr = strchr(name+4, 'd'); + minor = 8 * charstar_to_int(ptr+1); + ptr = strchr(ptr, 'p'); + minor += charstar_to_int(ptr+1); + } else if (ptr_begins_static_str(name, "loop")) { + major = 7; + minor = name[4] - '0'; + } else if (ptr_begins_static_str(name, "chloop")) { + major = 100; + minor = name[6] - '0'; + } else { + log_message("I don't know how to create device %s, please post bugreport to me!", dev); + return -1; + } - if (mknod(dev, type | 0600, makedev(major, minor))) { - log_perror(dev); - return -1; - } - - return 0; + if (mknod(dev, type | 0600, makedev(major, minor))) { + log_perror(dev); + return -1; + } + + return 0; } /* mounts, creating the device if needed+possible */ int my_mount(char *dev, char *location, char *fs, int force_rw) { - unsigned long flags = MS_MGC_VAL | (force_rw ? 0 : MS_RDONLY); - char * opts = NULL; - struct stat buf; - int rc; + unsigned long flags = MS_MGC_VAL | (force_rw ? 0 : MS_RDONLY); + char * opts = NULL; + struct stat buf; + int rc; - if (strcmp(fs, "nfs")) { - rc = ensure_dev_exists(dev); - if (rc != 0) { - log_message("could not create required device file"); - return -1; - } - } + if (strcmp(fs, "nfs")) { + rc = ensure_dev_exists(dev); + if (rc != 0) { + log_message("could not create required device file"); + return -1; + } + } - log_message("mounting %s on %s as type %s", dev, location, fs); + log_message("mounting %s on %s as type %s", dev, location, fs); - if (stat(location, &buf)) { - if (mkdir(location, 0755)) { - log_perror("could not create location dir"); - return -1; - } - } else if (!S_ISDIR(buf.st_mode)) { - log_message("not a dir %s, will unlink and mkdir", location); - if (unlink(location)) { - log_perror("could not unlink"); - return -1; - } - if (mkdir(location, 0755)) { - log_perror("could not create location dir"); - return -1; - } - } + if (stat(location, &buf)) { + if (mkdir(location, 0755)) { + log_perror("could not create location dir"); + return -1; + } + } else if (!S_ISDIR(buf.st_mode)) { + log_message("not a dir %s, will unlink and mkdir", location); + if (unlink(location)) { + log_perror("could not unlink"); + return -1; + } + if (mkdir(location, 0755)) { + log_perror("could not create location dir"); + return -1; + } + } - if (!strcmp(fs, "supermount")) { - my_insmod("supermount", ANY_DRIVER_TYPE, NULL, 1); - my_insmod("isofs", ANY_DRIVER_TYPE, NULL, 1); - opts = alloca(500); + if (!strcmp(fs, "supermount")) { + my_insmod("supermount", ANY_DRIVER_TYPE, NULL, 1); + my_insmod("isofs", ANY_DRIVER_TYPE, NULL, 1); + opts = alloca(500); sprintf(opts, "dev=%s,fs=iso9660,tray_lock=always", dev); dev = "none"; - } + } #ifndef DISABLE_MEDIAS - if (!strcmp(fs, "vfat")) { - my_insmod("nls_cp437", ANY_DRIVER_TYPE, NULL, 1); - my_insmod("nls_iso8859_1", ANY_DRIVER_TYPE, NULL, 1); - my_insmod("vfat", ANY_DRIVER_TYPE, NULL, 1); - opts = "check=relaxed"; - } + if (!strcmp(fs, "vfat")) { + my_insmod("nls_cp437", ANY_DRIVER_TYPE, NULL, 1); + my_insmod("nls_iso8859_1", ANY_DRIVER_TYPE, NULL, 1); + my_insmod("vfat", ANY_DRIVER_TYPE, NULL, 1); + opts = "check=relaxed"; + } - if (!strcmp(fs, "ntfs")) { - my_insmod("ntfs", ANY_DRIVER_TYPE, NULL, 1); - } + if (!strcmp(fs, "ntfs")) { + my_insmod("ntfs", ANY_DRIVER_TYPE, NULL, 1); + } - if (!strcmp(fs, "reiserfs")) - my_insmod("reiserfs", ANY_DRIVER_TYPE, NULL, 1); + if (!strcmp(fs, "reiserfs")) + my_insmod("reiserfs", ANY_DRIVER_TYPE, NULL, 1); - if (!strcmp(fs, "reiser4")) - my_insmod("reiser4", ANY_DRIVER_TYPE, NULL, 1); + if (!strcmp(fs, "reiser4")) + my_insmod("reiser4", ANY_DRIVER_TYPE, NULL, 1); - if (!strcmp(fs, "jfs")) - my_insmod("jfs", ANY_DRIVER_TYPE, NULL, 1); + if (!strcmp(fs, "jfs")) + my_insmod("jfs", ANY_DRIVER_TYPE, NULL, 1); - if (!strcmp(fs, "xfs")) - my_insmod("xfs", ANY_DRIVER_TYPE, NULL, 1); + if (!strcmp(fs, "xfs")) + my_insmod("xfs", ANY_DRIVER_TYPE, NULL, 1); - if (!strcmp(fs, "ext4")) - my_insmod("ext4", ANY_DRIVER_TYPE, NULL, 1); + if (!strcmp(fs, "ext4")) + my_insmod("ext4", ANY_DRIVER_TYPE, NULL, 1); - if (!strcmp(fs, "btrfs")) - my_insmod("btrfs", ANY_DRIVER_TYPE, NULL, 1); + if (!strcmp(fs, "btrfs")) + my_insmod("btrfs", ANY_DRIVER_TYPE, NULL, 1); #endif - if (!strcmp(fs, "iso9660")) - my_insmod("isofs", ANY_DRIVER_TYPE, NULL, 1); + if (!strcmp(fs, "iso9660")) + my_insmod("isofs", ANY_DRIVER_TYPE, NULL, 1); #ifndef DISABLE_NETWORK - if (!strcmp(fs, "nfs")) { - my_insmod("nfs", ANY_DRIVER_TYPE, NULL, 1); - log_message("preparing nfsmount for %s", dev); - rc = nfsmount_prepare(dev, &opts); - if (rc != 0) - return rc; - } + if (!strcmp(fs, "nfs")) { + my_insmod("nfs", ANY_DRIVER_TYPE, NULL, 1); + log_message("preparing nfsmount for %s", dev); + rc = nfsmount_prepare(dev, &opts); + if (rc != 0) + return rc; + } #endif - rc = mount(dev, location, fs, flags, opts); - if (rc != 0) { - log_perror("mount failed"); - rmdir(location); - } + rc = mount(dev, location, fs, flags, opts); + if (rc != 0) { + log_perror("mount failed"); + rmdir(location); + } - return rc; + return rc; } diff --git a/mdk-stage1/network.c b/mdk-stage1/network.c index b86cc1e61..9030fbbde 100644 --- a/mdk-stage1/network.c +++ b/mdk-stage1/network.c @@ -59,136 +59,136 @@ static void error_message_net(void) /* reduce code size */ { - stg1_error_message("Could not configure network."); + stg1_error_message("Could not configure network."); } int configure_net_device(struct interface_info * intf) { - struct ifreq req; - struct rtentry route; - int s; - struct sockaddr_in addr; - struct in_addr ia; - char ip[20], nm[20], nw[20], bc[20]; - - addr.sin_family = AF_INET; - addr.sin_port = 0; - - memcpy(&ia, &intf->ip, sizeof(intf->ip)); - strcpy(ip, inet_ntoa(ia)); - - memcpy(&ia, &intf->netmask, sizeof(intf->netmask)); - strcpy(nm, inet_ntoa(ia)); - - memcpy(&ia, &intf->broadcast, sizeof(intf->broadcast)); - strcpy(bc, inet_ntoa(ia)); - - memcpy(&ia, &intf->network, sizeof(intf->network)); - strcpy(nw, inet_ntoa(ia)); - - log_message("configuring device %s ip: %s nm: %s nw: %s bc: %s", intf->device, ip, nm, nw, bc); - - if (IS_TESTING) - return 0; - - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s < 0) { - log_perror("socket"); - error_message_net(); - return 1; - } - - strcpy(req.ifr_name, intf->device); - - if (intf->is_up == 1) { - log_message("interface already up, downing before reconfigure"); - - req.ifr_flags = 0; - if (ioctl(s, SIOCSIFFLAGS, &req)) { - close(s); - log_perror("SIOCSIFFLAGS (downing)"); - error_message_net(); - return 1; - } - } - - /* sets IP address */ - addr.sin_port = 0; - memcpy(&addr.sin_addr, &intf->ip, sizeof(intf->ip)); - memcpy(&req.ifr_addr, &addr, sizeof(addr)); - if (ioctl(s, SIOCSIFADDR, &req)) { - close(s); - log_perror("SIOCSIFADDR"); - error_message_net(); - return 1; - } - - /* sets broadcast */ - memcpy(&addr.sin_addr, &intf->broadcast, sizeof(intf->broadcast)); - memcpy(&req.ifr_broadaddr, &addr, sizeof(addr)); - if (ioctl(s, SIOCSIFBRDADDR, &req)) { - close(s); - log_perror("SIOCSIFBRDADDR"); - error_message_net(); - return 1; - } - - /* sets netmask */ - memcpy(&addr.sin_addr, &intf->netmask, sizeof(intf->netmask)); - memcpy(&req.ifr_netmask, &addr, sizeof(addr)); - if (ioctl(s, SIOCSIFNETMASK, &req)) { - close(s); - log_perror("SIOCSIFNETMASK"); - error_message_net(); - return 1; - } - - if (intf->is_ptp) - req.ifr_flags = IFF_UP | IFF_RUNNING | IFF_POINTOPOINT | IFF_NOARP; - else - req.ifr_flags = IFF_UP | IFF_RUNNING | IFF_BROADCAST; - - /* brings up networking! */ - if (ioctl(s, SIOCSIFFLAGS, &req)) { - close(s); - log_perror("SIOCSIFFLAGS (upping)"); - error_message_net(); - return 1; - } - - memset(&route, 0, sizeof(route)); - route.rt_dev = intf->device; - route.rt_flags = RTF_UP; - - memcpy(&addr.sin_addr, &intf->network, sizeof(intf->network)); - memcpy(&route.rt_dst, &addr, sizeof(addr)); - - memcpy(&addr.sin_addr, &intf->netmask, sizeof(intf->netmask)); - memcpy(&route.rt_genmask, &addr, sizeof(addr)); - - /* adds route */ - if (ioctl(s, SIOCADDRT, &route)) { - close(s); - log_perror("SIOCADDRT"); - error_message_net(); - return 1; - } - - close(s); - - intf->is_up = 1; - - if (intf->boot_proto != BOOTPROTO_DHCP && !streq(intf->device, "lo")) { - /* I need to sleep a bit in order for kernel to finish - init of the network device; if not, first sendto() for - gethostbyaddr will get an EINVAL. */ - wait_message("Bringing up networking..."); - sleep(2); - remove_wait_message(); - } - - return 0; + struct ifreq req; + struct rtentry route; + int s; + struct sockaddr_in addr; + struct in_addr ia; + char ip[20], nm[20], nw[20], bc[20]; + + addr.sin_family = AF_INET; + addr.sin_port = 0; + + memcpy(&ia, &intf->ip, sizeof(intf->ip)); + strcpy(ip, inet_ntoa(ia)); + + memcpy(&ia, &intf->netmask, sizeof(intf->netmask)); + strcpy(nm, inet_ntoa(ia)); + + memcpy(&ia, &intf->broadcast, sizeof(intf->broadcast)); + strcpy(bc, inet_ntoa(ia)); + + memcpy(&ia, &intf->network, sizeof(intf->network)); + strcpy(nw, inet_ntoa(ia)); + + log_message("configuring device %s ip: %s nm: %s nw: %s bc: %s", intf->device, ip, nm, nw, bc); + + if (IS_TESTING) + return 0; + + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s < 0) { + log_perror("socket"); + error_message_net(); + return 1; + } + + strcpy(req.ifr_name, intf->device); + + if (intf->is_up == 1) { + log_message("interface already up, downing before reconfigure"); + + req.ifr_flags = 0; + if (ioctl(s, SIOCSIFFLAGS, &req)) { + close(s); + log_perror("SIOCSIFFLAGS (downing)"); + error_message_net(); + return 1; + } + } + + /* sets IP address */ + addr.sin_port = 0; + memcpy(&addr.sin_addr, &intf->ip, sizeof(intf->ip)); + memcpy(&req.ifr_addr, &addr, sizeof(addr)); + if (ioctl(s, SIOCSIFADDR, &req)) { + close(s); + log_perror("SIOCSIFADDR"); + error_message_net(); + return 1; + } + + /* sets broadcast */ + memcpy(&addr.sin_addr, &intf->broadcast, sizeof(intf->broadcast)); + memcpy(&req.ifr_broadaddr, &addr, sizeof(addr)); + if (ioctl(s, SIOCSIFBRDADDR, &req)) { + close(s); + log_perror("SIOCSIFBRDADDR"); + error_message_net(); + return 1; + } + + /* sets netmask */ + memcpy(&addr.sin_addr, &intf->netmask, sizeof(intf->netmask)); + memcpy(&req.ifr_netmask, &addr, sizeof(addr)); + if (ioctl(s, SIOCSIFNETMASK, &req)) { + close(s); + log_perror("SIOCSIFNETMASK"); + error_message_net(); + return 1; + } + + if (intf->is_ptp) + req.ifr_flags = IFF_UP | IFF_RUNNING | IFF_POINTOPOINT | IFF_NOARP; + else + req.ifr_flags = IFF_UP | IFF_RUNNING | IFF_BROADCAST; + + /* brings up networking! */ + if (ioctl(s, SIOCSIFFLAGS, &req)) { + close(s); + log_perror("SIOCSIFFLAGS (upping)"); + error_message_net(); + return 1; + } + + memset(&route, 0, sizeof(route)); + route.rt_dev = intf->device; + route.rt_flags = RTF_UP; + + memcpy(&addr.sin_addr, &intf->network, sizeof(intf->network)); + memcpy(&route.rt_dst, &addr, sizeof(addr)); + + memcpy(&addr.sin_addr, &intf->netmask, sizeof(intf->netmask)); + memcpy(&route.rt_genmask, &addr, sizeof(addr)); + + /* adds route */ + if (ioctl(s, SIOCADDRT, &route)) { + close(s); + log_perror("SIOCADDRT"); + error_message_net(); + return 1; + } + + close(s); + + intf->is_up = 1; + + if (intf->boot_proto != BOOTPROTO_DHCP && !streq(intf->device, "lo")) { + /* I need to sleep a bit in order for kernel to finish + init of the network device; if not, first sendto() for + gethostbyaddr will get an EINVAL. */ + wait_message("Bringing up networking..."); + sleep(2); + remove_wait_message(); + } + + return 0; } /* host network informations */ @@ -200,420 +200,420 @@ struct in_addr dns_server2 = { 0 }; static int add_default_route(void) { - int s; - struct rtentry route; - struct sockaddr_in addr; - - if (IS_TESTING) - return 0; - - if (gateway.s_addr == 0) { - log_message("no gateway provided, can't add default route"); - return 0; - } - - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s < 0) { - close(s); - log_perror("socket"); - error_message_net(); - return 1; - } - - memset(&route, 0, sizeof(route)); - - addr.sin_family = AF_INET; - addr.sin_port = 0; - addr.sin_addr = gateway; - memcpy(&route.rt_gateway, &addr, sizeof(addr)); - - addr.sin_addr.s_addr = INADDR_ANY; - memcpy(&route.rt_dst, &addr, sizeof(addr)); - memcpy(&route.rt_genmask, &addr, sizeof(addr)); - - route.rt_flags = RTF_UP | RTF_GATEWAY; - route.rt_metric = 0; - - if (ioctl(s, SIOCADDRT, &route)) { - close(s); - log_perror("SIOCADDRT"); - error_message_net(); - return 1; - } - - close(s); - - return 0; + int s; + struct rtentry route; + struct sockaddr_in addr; + + if (IS_TESTING) + return 0; + + if (gateway.s_addr == 0) { + log_message("no gateway provided, can't add default route"); + return 0; + } + + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s < 0) { + close(s); + log_perror("socket"); + error_message_net(); + return 1; + } + + memset(&route, 0, sizeof(route)); + + addr.sin_family = AF_INET; + addr.sin_port = 0; + addr.sin_addr = gateway; + memcpy(&route.rt_gateway, &addr, sizeof(addr)); + + addr.sin_addr.s_addr = INADDR_ANY; + memcpy(&route.rt_dst, &addr, sizeof(addr)); + memcpy(&route.rt_genmask, &addr, sizeof(addr)); + + route.rt_flags = RTF_UP | RTF_GATEWAY; + route.rt_metric = 0; + + if (ioctl(s, SIOCADDRT, &route)) { + close(s); + log_perror("SIOCADDRT"); + error_message_net(); + return 1; + } + + close(s); + + return 0; } static int write_resolvconf(void) { - char * filename = "/etc/resolv.conf"; - FILE * f; - - if (dns_server.s_addr == 0) { - log_message("resolvconf needs a dns server"); - return -1; - } - - f = fopen(filename, "w"); - if (!f) { - log_perror(filename); - return -1; - } - - if (domain) - fprintf(f, "search %s\n", domain); /* we can live without the domain search (user will have to enter fully-qualified names) */ - fprintf(f, "nameserver %s\n", inet_ntoa(dns_server)); - if (dns_server2.s_addr != 0) - fprintf(f, "nameserver %s\n", inet_ntoa(dns_server2)); - - fclose(f); - res_init(); /* reinit the resolver so DNS changes take affect */ - - return 0; + char * filename = "/etc/resolv.conf"; + FILE * f; + + if (dns_server.s_addr == 0) { + log_message("resolvconf needs a dns server"); + return -1; + } + + f = fopen(filename, "w"); + if (!f) { + log_perror(filename); + return -1; + } + + if (domain) + fprintf(f, "search %s\n", domain); /* we can live without the domain search (user will have to enter fully-qualified names) */ + fprintf(f, "nameserver %s\n", inet_ntoa(dns_server)); + if (dns_server2.s_addr != 0) + fprintf(f, "nameserver %s\n", inet_ntoa(dns_server2)); + + fclose(f); + res_init(); /* reinit the resolver so DNS changes take affect */ + + return 0; } static int save_netinfo(struct interface_info * intf) { - char * file_network = "/tmp/network"; - char file_intf[500]; - FILE * f; - - f = fopen(file_network, "w"); - if (!f) { - log_perror(file_network); - return -1; - } - - fprintf(f, "NETWORKING=yes\n"); - fprintf(f, "FORWARD_IPV4=false\n"); - - if (hostname && !intf->boot_proto == BOOTPROTO_DHCP) - fprintf(f, "HOSTNAME=%s\n", hostname); - if (gateway.s_addr != 0) - fprintf(f, "GATEWAY=%s\n", inet_ntoa(gateway)); - - fclose(f); - - - strcpy(file_intf, "/tmp/ifcfg-"); - strcat(file_intf, intf->device); - - f = fopen(file_intf, "w"); - if (!f) { - log_perror(file_intf); - return -1; - } - - fprintf(f, "DEVICE=%s\n", intf->device); - - if (intf->boot_proto == BOOTPROTO_DHCP) { - fprintf(f, "BOOTPROTO=dhcp\n"); - if (dhcp_hostname && !streq(dhcp_hostname, "")) - fprintf(f, "DHCP_HOSTNAME=%s\n", dhcp_hostname); - } else if (intf->boot_proto == BOOTPROTO_STATIC) { - fprintf(f, "BOOTPROTO=static\n"); - fprintf(f, "IPADDR=%s\n", inet_ntoa(intf->ip)); - fprintf(f, "NETMASK=%s\n", inet_ntoa(intf->netmask)); - fprintf(f, "NETWORK=%s\n", inet_ntoa(intf->network)); - fprintf(f, "BROADCAST=%s\n", inet_ntoa(intf->broadcast)); - if (domain) - fprintf(f, "DOMAIN=%s\n", domain); - if (dns_server.s_addr != 0) - fprintf(f, "DNS1=%s\n", inet_ntoa(dns_server)); - if (dns_server2.s_addr != 0) - fprintf(f, "DNS2=%s\n", inet_ntoa(dns_server2)); - } else if (intf->boot_proto == BOOTPROTO_ADSL_PPPOE) { - fprintf(f, "BOOTPROTO=adsl_pppoe\n"); - fprintf(f, "USER=%s\n", intf->user); - fprintf(f, "PASS=%s\n", intf->pass); - fprintf(f, "ACNAME=%s\n", intf->acname); - } - - fclose(f); - - return 0; + char * file_network = "/tmp/network"; + char file_intf[500]; + FILE * f; + + f = fopen(file_network, "w"); + if (!f) { + log_perror(file_network); + return -1; + } + + fprintf(f, "NETWORKING=yes\n"); + fprintf(f, "FORWARD_IPV4=false\n"); + + if (hostname && !intf->boot_proto == BOOTPROTO_DHCP) + fprintf(f, "HOSTNAME=%s\n", hostname); + if (gateway.s_addr != 0) + fprintf(f, "GATEWAY=%s\n", inet_ntoa(gateway)); + + fclose(f); + + + strcpy(file_intf, "/tmp/ifcfg-"); + strcat(file_intf, intf->device); + + f = fopen(file_intf, "w"); + if (!f) { + log_perror(file_intf); + return -1; + } + + fprintf(f, "DEVICE=%s\n", intf->device); + + if (intf->boot_proto == BOOTPROTO_DHCP) { + fprintf(f, "BOOTPROTO=dhcp\n"); + if (dhcp_hostname && !streq(dhcp_hostname, "")) + fprintf(f, "DHCP_HOSTNAME=%s\n", dhcp_hostname); + } else if (intf->boot_proto == BOOTPROTO_STATIC) { + fprintf(f, "BOOTPROTO=static\n"); + fprintf(f, "IPADDR=%s\n", inet_ntoa(intf->ip)); + fprintf(f, "NETMASK=%s\n", inet_ntoa(intf->netmask)); + fprintf(f, "NETWORK=%s\n", inet_ntoa(intf->network)); + fprintf(f, "BROADCAST=%s\n", inet_ntoa(intf->broadcast)); + if (domain) + fprintf(f, "DOMAIN=%s\n", domain); + if (dns_server.s_addr != 0) + fprintf(f, "DNS1=%s\n", inet_ntoa(dns_server)); + if (dns_server2.s_addr != 0) + fprintf(f, "DNS2=%s\n", inet_ntoa(dns_server2)); + } else if (intf->boot_proto == BOOTPROTO_ADSL_PPPOE) { + fprintf(f, "BOOTPROTO=adsl_pppoe\n"); + fprintf(f, "USER=%s\n", intf->user); + fprintf(f, "PASS=%s\n", intf->pass); + fprintf(f, "ACNAME=%s\n", intf->acname); + } + + fclose(f); + + return 0; } char * guess_netmask(char * ip_addr) { - struct in_addr addr; - unsigned long int tmp; - - if (streq(ip_addr, "") || !inet_aton(ip_addr, &addr)) - return ""; - - log_message("guessing netmask"); - - tmp = ntohl(addr.s_addr); - - if (((tmp & 0xFF000000) >> 24) <= 127) - return "255.0.0.0"; - else if (((tmp & 0xFF000000) >> 24) <= 191) - return "255.255.0.0"; - else - return "255.255.255.0"; + struct in_addr addr; + unsigned long int tmp; + + if (streq(ip_addr, "") || !inet_aton(ip_addr, &addr)) + return ""; + + log_message("guessing netmask"); + + tmp = ntohl(addr.s_addr); + + if (((tmp & 0xFF000000) >> 24) <= 127) + return "255.0.0.0"; + else if (((tmp & 0xFF000000) >> 24) <= 191) + return "255.255.0.0"; + else + return "255.255.255.0"; } char * guess_domain_from_hostname(char *hostname) { - char *domain = strchr(strdup(hostname), '.'); - if (!domain || domain[1] == '\0') { - log_message("unable to guess domain from hostname: %s", hostname); - return NULL; - } - return domain + 1; /* skip '.' */ + char *domain = strchr(strdup(hostname), '.'); + if (!domain || domain[1] == '\0') { + log_message("unable to guess domain from hostname: %s", hostname); + return NULL; + } + return domain + 1; /* skip '.' */ } static void static_ip_callback(char ** strings) { - struct in_addr addr; + struct in_addr addr; static int done = 0; if (done) return; - if (streq(strings[0], "") || !inet_aton(strings[0], &addr)) - return; + if (streq(strings[0], "") || !inet_aton(strings[0], &addr)) + return; done = 1; - if (!strcmp(strings[1], "")) { - char * ptr; - strings[1] = strdup(strings[0]); - ptr = strrchr(strings[1], '.'); - if (ptr) - *(ptr+1) = '\0'; - } + if (!strcmp(strings[1], "")) { + char * ptr; + strings[1] = strdup(strings[0]); + ptr = strrchr(strings[1], '.'); + if (ptr) + *(ptr+1) = '\0'; + } - if (!strcmp(strings[2], "")) - strings[2] = strdup(strings[1]); + if (!strcmp(strings[2], "")) + strings[2] = strdup(strings[1]); - if (!strcmp(strings[3], "")) - strings[3] = strdup(guess_netmask(strings[0])); + if (!strcmp(strings[3], "")) + strings[3] = strdup(guess_netmask(strings[0])); } static enum return_type setup_network_interface(struct interface_info * intf) { - enum return_type results; - char * bootprotos[] = { "DHCP", "Static", "ADSL", NULL }; - char * bootprotos_auto[] = { "dhcp", "static", "adsl" }; - char * choice; - - results = ask_from_list_auto("Please select your network connection type.", bootprotos, &choice, "network", bootprotos_auto); - if (results != RETURN_OK) - return results; - - if (!strcmp(choice, "Static")) { - char * questions[] = { "IP of this machine", "IP of DNS", "IP of default gateway", "Netmask", NULL }; - char * questions_auto[] = { "ip", "dns", "gateway", "netmask" }; - static char ** answers = NULL; - struct in_addr addr; - - results = ask_from_entries_auto("Please enter the network information. (leave netmask blank for Internet standard)", - questions, &answers, 16, questions_auto, static_ip_callback); - if (results != RETURN_OK) - return setup_network_interface(intf); - - if (streq(answers[0], "") || !inet_aton(answers[0], &addr)) { - stg1_error_message("Invalid IP address."); - return setup_network_interface(intf); - } - memcpy(&intf->ip, &addr, sizeof(addr)); - - if (!inet_aton(answers[1], &dns_server)) { - log_message("invalid DNS"); - dns_server.s_addr = 0; /* keep an understandable state */ - } - - if (streq(answers[0], answers[1])) { - log_message("IP and DNS are the same, guess you don't want a DNS, disabling it"); - dns_server.s_addr = 0; /* keep an understandable state */ - } - - if (!inet_aton(answers[2], &gateway)) { - log_message("invalid gateway"); - gateway.s_addr = 0; /* keep an understandable state */ - } - - if ((streq(answers[3], "") && inet_aton(guess_netmask(answers[0]), &addr)) - || inet_aton(answers[3], &addr)) - memcpy(&intf->netmask, &addr, sizeof(addr)); - else { - stg1_error_message("Invalid netmask."); - return setup_network_interface(intf); - } - - *((uint32_t *) &intf->broadcast) = (*((uint32_t *) &intf->ip) & - *((uint32_t *) &intf->netmask)) | ~(*((uint32_t *) &intf->netmask)); - - inet_aton("255.255.255.255", &addr); - if (!memcmp(&addr, &intf->netmask, sizeof(addr))) { - log_message("netmask is 255.255.255.255 -> point to point device"); - intf->network = gateway; - intf->is_ptp = 1; - } else { - *((uint32_t *) &intf->network) = *((uint32_t *) &intf->ip) & *((uint32_t *) &intf->netmask); - intf->is_ptp = 0; - } - intf->boot_proto = BOOTPROTO_STATIC; - - if (configure_net_device(intf)) - return RETURN_ERROR; - - } else if (streq(choice, "DHCP")) { - results = perform_dhcp(intf); - - if (results == RETURN_BACK) - return setup_network_interface(intf); - if (results == RETURN_ERROR) - return results; - intf->boot_proto = BOOTPROTO_DHCP; - - if (configure_net_device(intf)) - return RETURN_ERROR; - - } else if (streq(choice, "ADSL")) { - results = perform_adsl(intf); - - if (results == RETURN_BACK) - return setup_network_interface(intf); - if (results == RETURN_ERROR) - return results; - } else - return RETURN_ERROR; - - return add_default_route(); + enum return_type results; + char * bootprotos[] = { "DHCP", "Static", "ADSL", NULL }; + char * bootprotos_auto[] = { "dhcp", "static", "adsl" }; + char * choice; + + results = ask_from_list_auto("Please select your network connection type.", bootprotos, &choice, "network", bootprotos_auto); + if (results != RETURN_OK) + return results; + + if (!strcmp(choice, "Static")) { + char * questions[] = { "IP of this machine", "IP of DNS", "IP of default gateway", "Netmask", NULL }; + char * questions_auto[] = { "ip", "dns", "gateway", "netmask" }; + static char ** answers = NULL; + struct in_addr addr; + + results = ask_from_entries_auto("Please enter the network information. (leave netmask blank for Internet standard)", + questions, &answers, 16, questions_auto, static_ip_callback); + if (results != RETURN_OK) + return setup_network_interface(intf); + + if (streq(answers[0], "") || !inet_aton(answers[0], &addr)) { + stg1_error_message("Invalid IP address."); + return setup_network_interface(intf); + } + memcpy(&intf->ip, &addr, sizeof(addr)); + + if (!inet_aton(answers[1], &dns_server)) { + log_message("invalid DNS"); + dns_server.s_addr = 0; /* keep an understandable state */ + } + + if (streq(answers[0], answers[1])) { + log_message("IP and DNS are the same, guess you don't want a DNS, disabling it"); + dns_server.s_addr = 0; /* keep an understandable state */ + } + + if (!inet_aton(answers[2], &gateway)) { + log_message("invalid gateway"); + gateway.s_addr = 0; /* keep an understandable state */ + } + + if ((streq(answers[3], "") && inet_aton(guess_netmask(answers[0]), &addr)) + || inet_aton(answers[3], &addr)) + memcpy(&intf->netmask, &addr, sizeof(addr)); + else { + stg1_error_message("Invalid netmask."); + return setup_network_interface(intf); + } + + *((uint32_t *) &intf->broadcast) = (*((uint32_t *) &intf->ip) & + *((uint32_t *) &intf->netmask)) | ~(*((uint32_t *) &intf->netmask)); + + inet_aton("255.255.255.255", &addr); + if (!memcmp(&addr, &intf->netmask, sizeof(addr))) { + log_message("netmask is 255.255.255.255 -> point to point device"); + intf->network = gateway; + intf->is_ptp = 1; + } else { + *((uint32_t *) &intf->network) = *((uint32_t *) &intf->ip) & *((uint32_t *) &intf->netmask); + intf->is_ptp = 0; + } + intf->boot_proto = BOOTPROTO_STATIC; + + if (configure_net_device(intf)) + return RETURN_ERROR; + + } else if (streq(choice, "DHCP")) { + results = perform_dhcp(intf); + + if (results == RETURN_BACK) + return setup_network_interface(intf); + if (results == RETURN_ERROR) + return results; + intf->boot_proto = BOOTPROTO_DHCP; + + if (configure_net_device(intf)) + return RETURN_ERROR; + + } else if (streq(choice, "ADSL")) { + results = perform_adsl(intf); + + if (results == RETURN_BACK) + return setup_network_interface(intf); + if (results == RETURN_ERROR) + return results; + } else + return RETURN_ERROR; + + return add_default_route(); } static enum return_type configure_network(struct interface_info * intf) { - char * dnshostname; - - if (hostname && domain) - return RETURN_OK; - - dnshostname = mygethostbyaddr(inet_ntoa(intf->ip)); - - if (dnshostname) { - if (intf->boot_proto == BOOTPROTO_STATIC) - hostname = strdup(dnshostname); - domain = guess_domain_from_hostname(dnshostname); - if (domain) { - log_message("got hostname and domain from dns entry, %s and %s", dnshostname, domain); - return RETURN_OK; - } - } else - log_message("reverse name lookup on self failed"); - - if (domain) - return RETURN_OK; - - dnshostname = NULL; - if (dns_server.s_addr != 0) { - wait_message("Trying to resolve dns..."); - dnshostname = mygethostbyaddr(inet_ntoa(dns_server)); - remove_wait_message(); - if (dnshostname) { - log_message("got DNS fullname, %s", dnshostname); - domain = guess_domain_from_hostname(dnshostname); - } else - log_message("reverse name lookup on DNS failed"); - } else - log_message("no DNS, unable to guess domain"); - - if (domain) { - log_message("got domain from DNS fullname, %s", domain); - } else { - enum return_type results; - char * questions[] = { "Host name", "Domain name", NULL }; - char * questions_auto[] = { "hostname", "domain" }; - static char ** answers = NULL; - char * boulet; - - if (dhcp_hostname || dhcp_domain) { - answers = (char **) malloc(sizeof(questions)); - answers[0] = strdup(dhcp_hostname); - answers[1] = strdup(dhcp_domain); - } - - if (!dhcp_hostname || !dhcp_domain) { - results = ask_from_entries_auto("I could not guess hostname and domain name; please fill in this information. " - "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for " - "domain name, for a machine called `mybox.mynetwork.com' on the Internet.", - questions, &answers, 32, questions_auto, NULL); - if (results != RETURN_OK) - return results; - } - - hostname = answers[0]; - if ((boulet = strchr(hostname, '.')) != NULL) - boulet[0] = '\0'; - domain = answers[1]; - } - - log_message("using hostname %s", hostname); - log_message("using domain %s", domain); - - return RETURN_OK; + char * dnshostname; + + if (hostname && domain) + return RETURN_OK; + + dnshostname = mygethostbyaddr(inet_ntoa(intf->ip)); + + if (dnshostname) { + if (intf->boot_proto == BOOTPROTO_STATIC) + hostname = strdup(dnshostname); + domain = guess_domain_from_hostname(dnshostname); + if (domain) { + log_message("got hostname and domain from dns entry, %s and %s", dnshostname, domain); + return RETURN_OK; + } + } else + log_message("reverse name lookup on self failed"); + + if (domain) + return RETURN_OK; + + dnshostname = NULL; + if (dns_server.s_addr != 0) { + wait_message("Trying to resolve dns..."); + dnshostname = mygethostbyaddr(inet_ntoa(dns_server)); + remove_wait_message(); + if (dnshostname) { + log_message("got DNS fullname, %s", dnshostname); + domain = guess_domain_from_hostname(dnshostname); + } else + log_message("reverse name lookup on DNS failed"); + } else + log_message("no DNS, unable to guess domain"); + + if (domain) { + log_message("got domain from DNS fullname, %s", domain); + } else { + enum return_type results; + char * questions[] = { "Host name", "Domain name", NULL }; + char * questions_auto[] = { "hostname", "domain" }; + static char ** answers = NULL; + char * boulet; + + if (dhcp_hostname || dhcp_domain) { + answers = (char **) malloc(sizeof(questions)); + answers[0] = strdup(dhcp_hostname); + answers[1] = strdup(dhcp_domain); + } + + if (!dhcp_hostname || !dhcp_domain) { + results = ask_from_entries_auto("I could not guess hostname and domain name; please fill in this information. " + "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for " + "domain name, for a machine called `mybox.mynetwork.com' on the Internet.", + questions, &answers, 32, questions_auto, NULL); + if (results != RETURN_OK) + return results; + } + + hostname = answers[0]; + if ((boulet = strchr(hostname, '.')) != NULL) + boulet[0] = '\0'; + domain = answers[1]; + } + + log_message("using hostname %s", hostname); + log_message("using domain %s", domain); + + return RETURN_OK; } static enum return_type bringup_networking(struct interface_info * intf) { - static struct interface_info loopback; - enum return_type results; - int fd; - - /* try to find if module already loaded or built-in to avoid failing */ - /* badly */ - fd = open("/proc/net/packet", O_RDONLY); - if (fd < 0) - my_insmod("af_packet", ANY_DRIVER_TYPE, NULL, 1); - else - close(fd); - - do { - results = configure_wireless(intf->device); - } while (results == RETURN_ERROR); - - if (results == RETURN_BACK) - return RETURN_BACK; - - do { - results = setup_network_interface(intf); - if (results != RETURN_OK) - return results; - write_resolvconf(); - results = configure_network(intf); - } while (results == RETURN_ERROR); - - if (results == RETURN_BACK) - return bringup_networking(intf); - - write_resolvconf(); /* maybe we have now domain to write also */ - - if (loopback.is_up == 0) { - int rc; - strcpy(loopback.device, "lo"); - loopback.is_ptp = 0; - loopback.is_up = 0; - loopback.ip.s_addr = htonl(0x7f000001); - loopback.netmask.s_addr = htonl(0xff000000); - loopback.broadcast.s_addr = htonl(0x7fffffff); - loopback.network.s_addr = htonl(0x7f000000); - rc = configure_net_device(&loopback); - if (rc) - return RETURN_ERROR; - } - - return RETURN_OK; + static struct interface_info loopback; + enum return_type results; + int fd; + + /* try to find if module already loaded or built-in to avoid failing */ + /* badly */ + fd = open("/proc/net/packet", O_RDONLY); + if (fd < 0) + my_insmod("af_packet", ANY_DRIVER_TYPE, NULL, 1); + else + close(fd); + + do { + results = configure_wireless(intf->device); + } while (results == RETURN_ERROR); + + if (results == RETURN_BACK) + return RETURN_BACK; + + do { + results = setup_network_interface(intf); + if (results != RETURN_OK) + return results; + write_resolvconf(); + results = configure_network(intf); + } while (results == RETURN_ERROR); + + if (results == RETURN_BACK) + return bringup_networking(intf); + + write_resolvconf(); /* maybe we have now domain to write also */ + + if (loopback.is_up == 0) { + int rc; + strcpy(loopback.device, "lo"); + loopback.is_ptp = 0; + loopback.is_up = 0; + loopback.ip.s_addr = htonl(0x7f000001); + loopback.netmask.s_addr = htonl(0xff000000); + loopback.broadcast.s_addr = htonl(0x7fffffff); + loopback.network.s_addr = htonl(0x7f000000); + rc = configure_net_device(&loopback); + if (rc) + return RETURN_ERROR; + } + + return RETURN_OK; } @@ -622,272 +622,272 @@ static char * auto_select_up_intf(int detection_mode) #define SIOCETHTOOL 0x8946 #define ETHTOOL_GLINK 0x0000000a /* Get link status (ethtool_value) */ - struct ethtool_value { - uint32_t cmd; - uint32_t data; - }; - - char ** interfaces, ** ptr; - interfaces = get_net_devices(); - - int s; - s = socket(AF_INET, SOCK_DGRAM, 0); - if (s < 0) { - return NULL; - } - - ptr = interfaces; - while (ptr && *ptr) { - if (detection_mode != AUTO_DETECTION_WIRED || !wireless_is_aware(s, *interfaces)) { - struct ifreq ifr; - struct ethtool_value edata; - strncpy(ifr.ifr_name, *ptr, IFNAMSIZ); - edata.cmd = ETHTOOL_GLINK; - ifr.ifr_data = (caddr_t)&edata; - if (ioctl(s, SIOCETHTOOL, &ifr) == 0 && edata.data) { - close(s); - log_message("NETWORK: choosing interface %s (link beat detected)", *ptr); - return *ptr; - } - } - ptr++; - } - - log_message("NETWORK: no interface has a link beat"); - - if (detection_mode == AUTO_DETECTION_WIRED) { - ptr = interfaces; - while (ptr && *ptr) { - if (!wireless_is_aware(s, *interfaces)) { - close(s); - log_message("NETWORK: choosing interface %s (wired interface)", *ptr); - return *ptr; - } - ptr++; - } - log_message("NETWORK: no interface is wired"); - } - - close(s); - - return NULL; + struct ethtool_value { + uint32_t cmd; + uint32_t data; + }; + + char ** interfaces, ** ptr; + interfaces = get_net_devices(); + + int s; + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s < 0) { + return NULL; + } + + ptr = interfaces; + while (ptr && *ptr) { + if (detection_mode != AUTO_DETECTION_WIRED || !wireless_is_aware(s, *interfaces)) { + struct ifreq ifr; + struct ethtool_value edata; + strncpy(ifr.ifr_name, *ptr, IFNAMSIZ); + edata.cmd = ETHTOOL_GLINK; + ifr.ifr_data = (caddr_t)&edata; + if (ioctl(s, SIOCETHTOOL, &ifr) == 0 && edata.data) { + close(s); + log_message("NETWORK: choosing interface %s (link beat detected)", *ptr); + return *ptr; + } + } + ptr++; + } + + log_message("NETWORK: no interface has a link beat"); + + if (detection_mode == AUTO_DETECTION_WIRED) { + ptr = interfaces; + while (ptr && *ptr) { + if (!wireless_is_aware(s, *interfaces)) { + close(s); + log_message("NETWORK: choosing interface %s (wired interface)", *ptr); + return *ptr; + } + ptr++; + } + log_message("NETWORK: no interface is wired"); + } + + close(s); + + return NULL; } static char * interface_select(void) { - char ** interfaces, ** ptr; - char * descriptions[50]; - char * choice; - int i, count = 0; - enum return_type results; - - interfaces = get_net_devices(); - - ptr = interfaces; - while (ptr && *ptr) { - count++; - ptr++; - } - - if (count == 0) { - stg1_error_message("No NET device found."); - i = ask_insmod(NETWORK_DEVICES); - if (i == RETURN_BACK) - return NULL; - return interface_select(); - } - - if (count == 1) - return *interfaces; - - /* this can't be done in ask_from_list_comments_auto because "auto" and "wired" are not in the interfaces list */ - if (IS_AUTOMATIC) { - enum auto_detection_type auto_detect = AUTO_DETECTION_NONE; - if (streq(get_auto_value("interface"), "auto")) - auto_detect = AUTO_DETECTION_ALL; - else if (streq(get_auto_value("interface"), "wired")) - auto_detect = AUTO_DETECTION_WIRED; - if (auto_detect != AUTO_DETECTION_NONE) { - choice = auto_select_up_intf(auto_detect); - if (choice) - return choice; - } - } - - i = 0; - while (interfaces[i]) { - descriptions[i] = get_net_intf_description(interfaces[i]); - i++; - } - - results = ask_from_list_comments_auto("Please choose the NET device to use for the installation.", - interfaces, descriptions, &choice, "interface", interfaces); - - if (results != RETURN_OK) - return NULL; - - return choice; + char ** interfaces, ** ptr; + char * descriptions[50]; + char * choice; + int i, count = 0; + enum return_type results; + + interfaces = get_net_devices(); + + ptr = interfaces; + while (ptr && *ptr) { + count++; + ptr++; + } + + if (count == 0) { + stg1_error_message("No NET device found."); + i = ask_insmod(NETWORK_DEVICES); + if (i == RETURN_BACK) + return NULL; + return interface_select(); + } + + if (count == 1) + return *interfaces; + + /* this can't be done in ask_from_list_comments_auto because "auto" and "wired" are not in the interfaces list */ + if (IS_AUTOMATIC) { + enum auto_detection_type auto_detect = AUTO_DETECTION_NONE; + if (streq(get_auto_value("interface"), "auto")) + auto_detect = AUTO_DETECTION_ALL; + else if (streq(get_auto_value("interface"), "wired")) + auto_detect = AUTO_DETECTION_WIRED; + if (auto_detect != AUTO_DETECTION_NONE) { + choice = auto_select_up_intf(auto_detect); + if (choice) + return choice; + } + } + + i = 0; + while (interfaces[i]) { + descriptions[i] = get_net_intf_description(interfaces[i]); + i++; + } + + results = ask_from_list_comments_auto("Please choose the NET device to use for the installation.", + interfaces, descriptions, &choice, "interface", interfaces); + + if (results != RETURN_OK) + return NULL; + + return choice; } static enum return_type get_http_proxy(char **http_proxy_host, char **http_proxy_port) { - 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) { - *http_proxy_host = answers[0]; - *http_proxy_port = answers[1]; - } else { - *http_proxy_host = NULL; - *http_proxy_port = NULL; - } - - return results; + 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) { + *http_proxy_host = answers[0]; + *http_proxy_port = answers[1]; + } else { + *http_proxy_host = NULL; + *http_proxy_port = NULL; + } + + return results; } static int url_split(const char *url, const char *protocol, char **host, char **path) { - char *protocol_sep, *host_sep; + char *protocol_sep, *host_sep; - protocol_sep = strstr(url, "://"); - if (!protocol_sep) { - log_message("NETWORK: no protocol in \"%s\"", url); - return -1; - } + protocol_sep = strstr(url, "://"); + if (!protocol_sep) { + log_message("NETWORK: no protocol in \"%s\"", url); + return -1; + } - if (strncmp(protocol, url, protocol_sep - url)) - return -1; + if (strncmp(protocol, url, protocol_sep - url)) + return -1; - url = protocol_sep + 3; - host_sep = strchr(url, '/'); - if (!host_sep || host_sep == url) { - log_message("NETWORK: no hostname in \"%s\"", url); - return -1; - } + url = protocol_sep + 3; + host_sep = strchr(url, '/'); + if (!host_sep || host_sep == url) { + log_message("NETWORK: no hostname in \"%s\"", url); + return -1; + } - *host = strndup(url, host_sep - url); - *path = strdup(host_sep); + *host = strndup(url, host_sep - url); + *path = strdup(host_sep); - return 0; + return 0; } #define MIRRORLIST_MAX_ITEMS 500 typedef char *mirrorlist_t[2][MIRRORLIST_MAX_ITEMS+1]; static enum return_type get_mirrorlist(mirrorlist_t mirrorlist, int start, char *version, const char *protocol, char *http_proxy_host, char *http_proxy_port) { - int fd, size, line_pos = 0; - char path[1024]; - char line[1024]; - char type[100] = DISTRIB_TYPE; - int mirror_idx = start; - - int use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); - lowercase(type); - snprintf(path, sizeof(path), "%s/%s.%s.%s.list", MIRRORLIST_PATH, type, version, ARCH); - - fd = http_download_file(MIRRORLIST_HOST, path, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); - if (fd < 0) { - log_message("HTTP: unable to get mirrors list from %s (%s)", MIRRORLIST_HOST, path); - return RETURN_ERROR; - } - - while (read(fd, line + line_pos, 1) > 0) { - if (line[line_pos] == '\n') { - char *url; - line[line_pos] = '\0'; - line_pos = 0; - - /* skip medium if it does not look like a distrib path */ - if (!strstr(line, ",type=distrib,")) - continue; - - url = strstr(line, ",url="); - if (!url) - continue; - url += 5; - - if (url_split(url, protocol, &mirrorlist[0][mirror_idx], &mirrorlist[1][mirror_idx]) < 0) - continue; - - mirror_idx++; - } else { - line_pos++; - } - - if (mirror_idx >= MIRRORLIST_MAX_ITEMS) - break; - } - close(fd); - - mirrorlist[0][mirror_idx] = NULL; - mirrorlist[1][mirror_idx] = NULL; + int fd, size, line_pos = 0; + char path[1024]; + char line[1024]; + char type[100] = DISTRIB_TYPE; + int mirror_idx = start; + + int use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); + lowercase(type); + snprintf(path, sizeof(path), "%s/%s.%s.%s.list", MIRRORLIST_PATH, type, version, ARCH); + + fd = http_download_file(MIRRORLIST_HOST, path, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); + if (fd < 0) { + log_message("HTTP: unable to get mirrors list from %s (%s)", MIRRORLIST_HOST, path); + return RETURN_ERROR; + } + + while (read(fd, line + line_pos, 1) > 0) { + if (line[line_pos] == '\n') { + char *url; + line[line_pos] = '\0'; + line_pos = 0; + + /* skip medium if it does not look like a distrib path */ + if (!strstr(line, ",type=distrib,")) + continue; + + url = strstr(line, ",url="); + if (!url) + continue; + url += 5; + + if (url_split(url, protocol, &mirrorlist[0][mirror_idx], &mirrorlist[1][mirror_idx]) < 0) + continue; + + mirror_idx++; + } else { + line_pos++; + } + + if (mirror_idx >= MIRRORLIST_MAX_ITEMS) + break; + } + close(fd); + + mirrorlist[0][mirror_idx] = NULL; + mirrorlist[1][mirror_idx] = NULL; return RETURN_OK; } static int choose_mirror_from_host_list(mirrorlist_t mirrorlist, char **selected_host, char **filepath) { - enum return_type results; - int mirror_idx = 0; - - do { - results = ask_from_list_index("Please select a mirror from the list below.", - mirrorlist[0], NULL, &mirror_idx); - - if (results == RETURN_BACK) { - return RETURN_ERROR; - } else if (results == RETURN_OK) { - if (mirror_idx == 0) { - /* enter the mirror manually */ - return RETURN_OK; - } - *selected_host = strdup(mirrorlist[0][mirror_idx]); - *filepath = strdup(mirrorlist[1][mirror_idx]); - return RETURN_OK; - } - } while (results == RETURN_ERROR); - - return RETURN_ERROR; + enum return_type results; + int mirror_idx = 0; + + do { + results = ask_from_list_index("Please select a mirror from the list below.", + mirrorlist[0], NULL, &mirror_idx); + + if (results == RETURN_BACK) { + return RETURN_ERROR; + } else if (results == RETURN_OK) { + if (mirror_idx == 0) { + /* enter the mirror manually */ + return RETURN_OK; + } + *selected_host = strdup(mirrorlist[0][mirror_idx]); + *filepath = strdup(mirrorlist[1][mirror_idx]); + return RETURN_OK; + } + } while (results == RETURN_ERROR); + + return RETURN_ERROR; } 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 *versions[] = { "Specify the mirror manually", DISTRIB_NAME " " DISTRIB_VERSION, NULL }; - char *version = DISTRIB_NAME " " DISTRIB_VERSION; - - do { - results = ask_from_list("Please select a medium from the list below.", versions, &version); - - if (results == RETURN_BACK) { - return RETURN_BACK; - } else if (results == RETURN_OK) { - if (!strcmp(version, versions[0])) { - /* enter the mirror manually */ - return RETURN_OK; - } else { - /* a medium has been selected */ - mirrorlist_t mirrorlist; - mirrorlist[0][0] = "Specify the mirror manually"; - mirrorlist[1][0] = NULL; - - results = get_mirrorlist(mirrorlist, 1, DISTRIB_VERSION, protocol, http_proxy_host, http_proxy_port); - if (results == RETURN_ERROR) - return RETURN_ERROR; - - results = choose_mirror_from_host_list(mirrorlist, selected_host, filepath); - } - } - } while (results == RETURN_ERROR); - - return results; + enum return_type results; + char *versions[] = { "Specify the mirror manually", DISTRIB_NAME " " DISTRIB_VERSION, NULL }; + char *version = DISTRIB_NAME " " DISTRIB_VERSION; + + do { + results = ask_from_list("Please select a medium from the list below.", versions, &version); + + if (results == RETURN_BACK) { + return RETURN_BACK; + } else if (results == RETURN_OK) { + if (!strcmp(version, versions[0])) { + /* enter the mirror manually */ + return RETURN_OK; + } else { + /* a medium has been selected */ + mirrorlist_t mirrorlist; + mirrorlist[0][0] = "Specify the mirror manually"; + mirrorlist[1][0] = NULL; + + results = get_mirrorlist(mirrorlist, 1, DISTRIB_VERSION, protocol, http_proxy_host, http_proxy_port); + if (results == RETURN_ERROR) + return RETURN_ERROR; + + results = choose_mirror_from_host_list(mirrorlist, selected_host, filepath); + } + } + } while (results == RETURN_ERROR); + + return results; } @@ -896,149 +896,150 @@ static int choose_mirror_from_list(char *http_proxy_host, char *http_proxy_port, enum return_type intf_select_and_up() { - static struct interface_info intf[20]; - static int num_interfaces = 0; - struct interface_info * sel_intf = NULL; - int i; - enum return_type results; - char * iface = interface_select(); - - if (iface == NULL) - return RETURN_BACK; - - for (i = 0; i < num_interfaces ; i++) - if (!strcmp(intf[i].device, iface)) - sel_intf = &(intf[i]); - - if (sel_intf == NULL) { - sel_intf = &(intf[num_interfaces]); - strcpy(sel_intf->device, iface); - sel_intf->is_up = 0; - num_interfaces++; - } - - results = bringup_networking(sel_intf); - - if (results == RETURN_OK) - save_netinfo(sel_intf); - - return results; + static struct interface_info intf[20]; + static int num_interfaces = 0; + struct interface_info * sel_intf = NULL; + int i; + enum return_type results; + char * iface = interface_select(); + + if (iface == NULL) + return RETURN_BACK; + + for (i = 0; i < num_interfaces ; i++) + if (!strcmp(intf[i].device, iface)) + sel_intf = &(intf[i]); + + if (sel_intf == NULL) { + sel_intf = &(intf[num_interfaces]); + strcpy(sel_intf->device, iface); + sel_intf->is_up = 0; + num_interfaces++; + } + + results = bringup_networking(sel_intf); + + if (results == RETURN_OK) + save_netinfo(sel_intf); + + return results; } enum return_type nfs_prepare(void) { - char * questions[] = { "NFS server name", DISTRIB_NAME " directory", NULL }; - char * questions_auto[] = { "server", "directory", NULL }; - static char ** answers = NULL; - char * nfsmount_location; - enum return_type results = intf_select_and_up(NULL, NULL); - - if (results != RETURN_OK) - return results; - - do { - results = ask_from_entries_auto("Please enter the name or IP address of your NFS server, " - "and the directory containing the " DISTRIB_NAME " Distribution.", - questions, &answers, 40, questions_auto, NULL); - if (results != RETURN_OK || streq(answers[0], "")) { - unset_automatic(); /* we are in a fallback mode */ - return nfs_prepare(); - } - - nfsmount_location = malloc(strlen(answers[0]) + strlen(answers[1]) + 2); - strcpy(nfsmount_location, answers[0]); - strcat(nfsmount_location, ":"); - strcat(nfsmount_location, answers[1]); - - if (my_mount(nfsmount_location, MEDIA_LOCATION, "nfs", 0) == -1) { - stg1_error_message("I can't mount the directory from the NFS server."); - results = RETURN_BACK; - continue; - } - free(nfsmount_location); nfsmount_location = NULL; - - results = try_with_directory(MEDIA_LOCATION, "nfs", "nfs-iso"); - if (results != RETURN_OK) - umount(MEDIA_LOCATION); - if (results == RETURN_ERROR) + char * questions[] = { "NFS server name", DISTRIB_NAME " directory", NULL }; + char * questions_auto[] = { "server", "directory", NULL }; + static char ** answers = NULL; + char * nfsmount_location; + enum return_type results = intf_select_and_up(NULL, NULL); + + if (results != RETURN_OK) + return results; + + do { + results = ask_from_entries_auto("Please enter the name or IP address of your NFS server, " + "and the directory containing the " DISTRIB_NAME " Distribution.", + questions, &answers, 40, questions_auto, NULL); + if (results != RETURN_OK || streq(answers[0], "")) { + unset_automatic(); /* we are in a fallback mode */ + return nfs_prepare(); + } + + nfsmount_location = malloc(strlen(answers[0]) + strlen(answers[1]) + 2); + strcpy(nfsmount_location, answers[0]); + strcat(nfsmount_location, ":"); + strcat(nfsmount_location, answers[1]); + + if (my_mount(nfsmount_location, MEDIA_LOCATION, "nfs", 0) == -1) { + stg1_error_message("I can't mount the directory from the NFS server."); + results = RETURN_BACK; + continue; + } + free(nfsmount_location); nfsmount_location = NULL; + + results = try_with_directory(MEDIA_LOCATION, "nfs", "nfs-iso"); + if (results != RETURN_OK) + umount(MEDIA_LOCATION); + if (results == RETURN_ERROR) return RETURN_ERROR; - } - while (results == RETURN_BACK); + } + while (results == RETURN_BACK); - return RETURN_OK; + return RETURN_OK; } enum return_type ftp_prepare(void) { - 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; - struct utsname kernel_uname; - char *http_proxy_host, *http_proxy_port; - int use_http_proxy; + 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; + struct utsname kernel_uname; + char *http_proxy_host, *http_proxy_port; + int use_http_proxy; - 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.", - MEM_LIMIT_DRAKX, total_memory()); - return RETURN_ERROR; - } + 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.", + MEM_LIMIT_DRAKX, total_memory()); + return RETURN_ERROR; + } - results = intf_select_and_up(); + results = intf_select_and_up(); - if (results != RETURN_OK) - return results; + if (results != RETURN_OK) + return results; - get_http_proxy(&http_proxy_host, &http_proxy_port); - use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); + get_http_proxy(&http_proxy_host, &http_proxy_port); + use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); - uname(&kernel_uname); + uname(&kernel_uname); - do { - char location_full[500]; - int ftp_serv_response = -1; - int fd, size; - char ftp_hostname[500]; + do { + char location_full[500]; + int ftp_serv_response = -1; + int fd, size; + int need_arch = 0; + char ftp_hostname[500]; - if (!IS_AUTOMATIC) { - if (answers == NULL) - answers = (char **) malloc(sizeof(questions)); + if (!IS_AUTOMATIC) { + if (answers == NULL) + answers = (char **) malloc(sizeof(questions)); - results = choose_mirror_from_list(http_proxy_host, http_proxy_port, "ftp", &answers[0], &answers[1]); + results = choose_mirror_from_list(http_proxy_host, http_proxy_port, "ftp", &answers[0], &answers[1]); - if (results == RETURN_BACK) - return ftp_prepare(); + if (results == RETURN_BACK) + return ftp_prepare(); if (use_http_proxy) { results = ask_yes_no("Do you want to use this HTTP proxy for FTP connections too ?"); - if (results == RETURN_BACK) - return ftp_prepare(); + if (results == RETURN_BACK) + return ftp_prepare(); use_http_proxy = results == RETURN_OK; } - } - - 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). ", - questions, &answers, 40, questions_auto, NULL); - if (results != RETURN_OK || streq(answers[0], "")) { - unset_automatic(); /* we are in a fallback mode */ - return ftp_prepare(); - } - - strcpy(location_full, answers[1][0] == '/' ? "" : "/"); - strcat(location_full, answers[1]); - - if (use_http_proxy) { - log_message("FTP: don't connect to %s directly, will use proxy", answers[0]); - } else { - log_message("FTP: trying to connect to %s", answers[0]); - ftp_serv_response = ftp_open_connection(answers[0], answers[2], answers[3], ""); + } + + 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). ", + questions, &answers, 40, questions_auto, NULL); + if (results != RETURN_OK || streq(answers[0], "")) { + unset_automatic(); /* we are in a fallback mode */ + return ftp_prepare(); + } + + strcpy(location_full, answers[1][0] == '/' ? "" : "/"); + strcat(location_full, answers[1]); + + if (use_http_proxy) { + log_message("FTP: don't connect to %s directly, will use proxy", answers[0]); + } else { + log_message("FTP: trying to connect to %s", answers[0]); + ftp_serv_response = ftp_open_connection(answers[0], answers[2], answers[3], ""); if (ftp_serv_response < 0) { log_message("FTP: error connect %d", ftp_serv_response); if (ftp_serv_response == FTPERR_BAD_HOSTNAME) @@ -1052,186 +1053,199 @@ enum return_type ftp_prepare(void) } } - strcat(location_full, COMPRESSED_FILE_REL("/")); - - log_message("FTP: trying to retrieve %s", location_full); - - if (use_http_proxy) { - if (strcmp(answers[2], "")) { - strcpy(ftp_hostname, answers[2]); /* user name */ - strcat(ftp_hostname, ":"); - strcat(ftp_hostname, answers[3]); /* password */ - strcat(ftp_hostname, "@"); - } else { - strcpy(ftp_hostname, ""); - } - strcat(ftp_hostname, answers[0]); - 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); - } - - /* Try arched directory */ - if (fd < 0) { + strcat(location_full, COMPRESSED_FILE_REL("/")); + + log_message("FTP: trying to retrieve %s", location_full); + + if (use_http_proxy) { + if (strcmp(answers[2], "")) { + strcpy(ftp_hostname, answers[2]); /* user name */ + strcat(ftp_hostname, ":"); + strcat(ftp_hostname, answers[3]); /* password */ + strcat(ftp_hostname, "@"); + } else { + strcpy(ftp_hostname, ""); + } + strcat(ftp_hostname, answers[0]); + 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); + } + + /* Try arched directory */ + if (fd < 0) { log_message("%s failed.", location_full); char *with_arch = asprintf_("%s%s/%s/%s", answers[1][0] == '/' ? "" : "/", answers[1], ARCH, COMPRESSED_FILE_REL("/")); log_message("trying %s...", with_arch); - fd = http_download_file(answers[0], with_arch, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); - if (0 < fd) + if (use_http_proxy) + fd = http_download_file(answers[0], with_arch, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); + else + fd = ftp_start_download(ftp_serv_response, with_arch, &size); + if (0 < fd) { strcpy(location_full, with_arch); + need_arch = 1; + } } - if (fd < 0) { - char *msg = str_ftp_error(fd); - log_message("FTP: error get %d for remote file %s", fd, location_full); - stg1_error_message("Error: %s.", msg ? msg : "couldn't retrieve Installation program"); - results = RETURN_BACK; - continue; - } - - log_message("FTP: size of download %d bytes", size); - - results = load_compressed_fd(fd, size); - if (results == RETURN_OK) { - if (!use_http_proxy) - ftp_end_data_command(ftp_serv_response); - } else { - unset_automatic(); /* we are in a fallback mode */ - return results; - } - - if (use_http_proxy) { + if (fd < 0) { + char *msg = str_ftp_error(fd); + log_message("FTP: error get %d for remote file %s", fd, location_full); + stg1_error_message("Error: %s.", msg ? msg : "couldn't retrieve Installation program"); + results = RETURN_BACK; + continue; + } + + log_message("FTP: size of download %d bytes", size); + + results = load_compressed_fd(fd, size); + if (results == RETURN_OK) { + if (!use_http_proxy) + ftp_end_data_command(ftp_serv_response); + } else { + unset_automatic(); /* we are in a fallback mode */ + return results; + } + + if (use_http_proxy) { 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", http_proxy_host); - add_to_env("PROXYPORT", http_proxy_port); - } else { + sprintf(location_full, "ftp://%s%s", ftp_hostname, answers[1]); + if (need_arch) + strcat(location_full, "/" ARCH); + add_to_env("URLPREFIX", location_full); + 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]); - add_to_env("PREFIX", answers[1]); - if (!streq(answers[2], "")) { - add_to_env("LOGIN", answers[2]); - add_to_env("PASSWORD", answers[3]); - } - } - } - while (results == RETURN_BACK); - - return RETURN_OK; + add_to_env("HOST", answers[0]); + if (need_arch) + strcat(answers[1], "/" ARCH); + add_to_env("PREFIX", answers[1]); + if (!streq(answers[2], "")) { + add_to_env("LOGIN", answers[2]); + add_to_env("PASSWORD", answers[3]); + } + } + } + while (results == RETURN_BACK); + + return RETURN_OK; } enum return_type http_prepare(void) { - 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; + 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.", - MEM_LIMIT_DRAKX, total_memory()); - return RETURN_ERROR; - } + 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.", + MEM_LIMIT_DRAKX, total_memory()); + return RETURN_ERROR; + } - results = intf_select_and_up(); + results = intf_select_and_up(); - if (results != RETURN_OK) - return results; + if (results != RETURN_OK) + return results; get_http_proxy(&http_proxy_host, &http_proxy_port); - do { - char location_full[500]; - int fd, size; - int use_http_proxy; + do { + char location_full[500]; + int fd, size, need_arch = 0; + int use_http_proxy; - if (!IS_AUTOMATIC) { - if (answers == NULL) - answers = (char **) malloc(sizeof(questions)); + if (!IS_AUTOMATIC) { + if (answers == NULL) + answers = (char **) malloc(sizeof(questions)); - results = choose_mirror_from_list(http_proxy_host, http_proxy_port, "http", &answers[0], &answers[1]); + results = choose_mirror_from_list(http_proxy_host, http_proxy_port, "http", &answers[0], &answers[1]); - if (results == RETURN_BACK) - return ftp_prepare(); - } + if (results == RETURN_BACK) + return http_prepare(); + } - results = ask_from_entries_auto("Please enter the name or IP address of the HTTP server, " - "and the directory containing the " DISTRIB_NAME " Distribution.", - questions, &answers, 40, questions_auto, NULL); - if (results != RETURN_OK || streq(answers[0], "")) { - unset_automatic(); /* we are in a fallback mode */ - return http_prepare(); - } + results = ask_from_entries_auto("Please enter the name or IP address of the HTTP server, " + "and the directory containing the " DISTRIB_NAME " Distribution.", + questions, &answers, 40, questions_auto, NULL); + if (results != RETURN_OK || streq(answers[0], "")) { + unset_automatic(); /* we are in a fallback mode */ + return http_prepare(); + } - strcpy(location_full, answers[1][0] == '/' ? "" : "/"); - strcat(location_full, answers[1]); - strcat(location_full, COMPRESSED_FILE_REL("/")); + strcpy(location_full, answers[1][0] == '/' ? "" : "/"); + strcat(location_full, answers[1]); + strcat(location_full, COMPRESSED_FILE_REL("/")); - log_message("HTTP: trying to retrieve %s from %s", location_full, answers[0]); - - use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); + log_message("HTTP: trying to retrieve %s from %s", location_full, answers[0]); + + use_http_proxy = http_proxy_host && http_proxy_port && !streq(http_proxy_host, "") && !streq(http_proxy_port, ""); - fd = http_download_file(answers[0], location_full, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); + fd = http_download_file(answers[0], location_full, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); - /* Try arched directory */ - if (fd < 0) { + /* Try arched directory */ + if (fd < 0) { log_message("%s failed.", location_full); char *with_arch = asprintf_("%s%s/%s/%s", answers[1][0] == '/' ? "" : "/", answers[1], ARCH, COMPRESSED_FILE_REL("/")); log_message("trying %s...", with_arch); fd = http_download_file(answers[0], with_arch, &size, use_http_proxy ? "http" : NULL, http_proxy_host, http_proxy_port); - if (0 < fd) + if (0 < fd) { strcpy(location_full, with_arch); + need_arch = 1; + } } - if (fd < 0) { - log_message("HTTP: error %d", fd); - if (fd == FTPERR_FAILED_CONNECT) - stg1_error_message("Error: couldn't connect to server."); - else - stg1_error_message("Error: couldn't get file (%s).", location_full); - results = RETURN_BACK; - continue; - } - - log_message("HTTP: size of download %d bytes", size); - - if (load_compressed_fd(fd, size) != RETURN_OK) { - unset_automatic(); /* we are in a fallback mode */ - return RETURN_ERROR; + if (fd < 0) { + log_message("HTTP: error %d", fd); + if (fd == FTPERR_FAILED_CONNECT) + stg1_error_message("Error: couldn't connect to server."); + else + stg1_error_message("Error: couldn't get file (%s).", location_full); + results = RETURN_BACK; + continue; + } + + log_message("HTTP: size of download %d bytes", size); + + if (load_compressed_fd(fd, size) != RETURN_OK) { + unset_automatic(); /* we are in a fallback mode */ + return RETURN_ERROR; } add_to_env("METHOD", "http"); - sprintf(location_full, "http://%s%s%s", answers[0], answers[1][0] == '/' ? "" : "/", answers[1]); - add_to_env("URLPREFIX", location_full); + sprintf(location_full, "http://%s%s%s", answers[0], answers[1][0] == '/' ? "" : "/", answers[1]); + if (need_arch) + strcat(location_full, "/" ARCH); + add_to_env("URLPREFIX", location_full); if (!streq(http_proxy_host, "")) - add_to_env("PROXY", http_proxy_host); + add_to_env("PROXY", http_proxy_host); if (!streq(http_proxy_port, "")) - add_to_env("PROXYPORT", http_proxy_port); - } - while (results == RETURN_BACK); + add_to_env("PROXYPORT", http_proxy_port); + } + while (results == RETURN_BACK); - return RETURN_OK; + return RETURN_OK; } #ifndef DISABLE_KA enum return_type ka_prepare(void) { - enum return_type results; + enum return_type results; - if (!ramdisk_possible()) { - stg1_error_message("KA install needs more than %d Mbytes of memory (detected %d Mbytes).", - MEM_LIMIT_DRAKX, total_memory()); - return RETURN_ERROR; - } + if (!ramdisk_possible()) { + stg1_error_message("KA install needs more than %d Mbytes of memory (detected %d Mbytes).", + MEM_LIMIT_DRAKX, total_memory()); + return RETURN_ERROR; + } - results = intf_select_and_up(); + results = intf_select_and_up(); - if (results != RETURN_OK) - return results; + if (results != RETURN_OK) + return results; - return perform_ka(); + return perform_ka(); } #endif diff --git a/mdk-stage1/newt-frontend.c b/mdk-stage1/newt-frontend.c index b24577911..6bdded9d3 100644 --- a/mdk-stage1/newt-frontend.c +++ b/mdk-stage1/newt-frontend.c @@ -32,7 +32,7 @@ #include <stdio.h> #include <stdarg.h> #include <sys/time.h> -#include "newt/newt.h" +#include <newt.h> #include <probing.h> @@ -40,82 +40,82 @@ void init_frontend(char * welcome_msg) { - int i; - for (i=0; i<38; i++) printf("\n"); - newtInit(); - newtCls(); - - if (welcome_msg[0]) { - char *msg; - int cols, rows; - newtGetScreenSize(&cols, &rows); - asprintf(&msg, " %-*s", cols - 1, welcome_msg); - newtDrawRootText(0, 0, msg); - free(msg); - newtPushHelpLine(" <Alt-F1> for here, <Alt-F3> to see the logs, <Alt-F4> for kernel msg"); - } - newtRefresh(); + int i; + for (i=0; i<38; i++) printf("\n"); + newtInit(); + newtCls(); + + if (welcome_msg[0]) { + char *msg; + int cols, rows; + newtGetScreenSize(&cols, &rows); + asprintf(&msg, " %-*s", cols - 1, welcome_msg); + newtDrawRootText(0, 0, msg); + free(msg); + newtPushHelpLine(" <Alt-F1> for here, <Alt-F3> to see the logs, <Alt-F4> for kernel msg"); + } + newtRefresh(); } void finish_frontend(void) { - newtFinished(); + newtFinished(); } void verror_message(char *msg, va_list ap) { - newtWinMessagev("Error", "Ok", msg, ap); + newtWinMessagev("Error", "Ok", msg, ap); } void vinfo_message(char *msg, va_list ap) { - newtWinMessagev("Notice", "Ok", msg, ap); + newtWinMessagev("Notice", "Ok", msg, ap); } void vwait_message(char *msg, va_list ap) { - int width, height; - char * title = "Please wait..."; - newtComponent c, f; - newtGrid grid; - char * buf = NULL; - char * flowed; - int size = 0; - int i = 0; - - do { - size += 1000; - if (buf) free(buf); - buf = malloc(size); - i = vsnprintf(buf, size, msg, ap); - } while (i >= size || i == -1); - - flowed = newtReflowText(buf, 60, 5, 5, &width, &height); - - c = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP); - newtTextboxSetText(c, flowed); - - grid = newtCreateGrid(1, 1); - newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, c, 0, 0, 0, 0, 0, 0); - newtGridWrappedWindow(grid, title); - - free(flowed); - free(buf); - - f = newtForm(NULL, NULL, 0); - newtFormAddComponent(f, c); - - newtDrawForm(f); - newtRefresh(); - newtFormDestroy(f); + int width, height; + char * title = "Please wait..."; + newtComponent c, f; + newtGrid grid; + char * buf = NULL; + char * flowed; + int size = 0; + int i = 0; + + do { + size += 1000; + if (buf) free(buf); + buf = malloc(size); + i = vsnprintf(buf, size, msg, ap); + } while (i >= size || i == -1); + + flowed = newtReflowText(buf, 60, 5, 5, &width, &height); + + c = newtTextbox(-1, -1, width, height, NEWT_TEXTBOX_WRAP); + newtTextboxSetText(c, flowed); + + grid = newtCreateGrid(1, 1); + newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, c, 0, 0, 0, 0, 0, 0); + newtGridWrappedWindow(grid, title); + + free(flowed); + free(buf); + + f = newtForm(NULL, NULL, 0); + newtFormAddComponent(f, c); + + newtDrawForm(f); + newtRefresh(); + newtFormDestroy(f); } void remove_wait_message(void) { - newtPopWindow(); + newtPopWindow(); } @@ -126,101 +126,101 @@ static char * msg_progress; void init_progression_raw(char *msg, int size) { - size_progress = size; - if (size) { - actually_drawn = 0; - newtCenteredWindow(70, 5, "Please wait..."); - form = newtForm(NULL, NULL, 0); - newtFormAddComponent(form, newtLabel(1, 1, msg)); - scale = newtScale(1, 3, 68, size); - newtFormAddComponent(form, scale); - newtDrawForm(form); - newtRefresh(); - } - else { - wait_message(msg); - msg_progress = msg; - } + size_progress = size; + if (size) { + actually_drawn = 0; + newtCenteredWindow(70, 5, "Please wait..."); + form = newtForm(NULL, NULL, 0); + newtFormAddComponent(form, newtLabel(1, 1, msg)); + scale = newtScale(1, 3, 68, size); + newtFormAddComponent(form, scale); + newtDrawForm(form); + newtRefresh(); + } + else { + wait_message(msg); + msg_progress = msg; + } } void update_progression_raw(int current_size) { - if (size_progress) { - if (current_size <= size_progress) - newtScaleSet(scale, current_size); - newtRefresh(); - } - else { - struct timeval t; - int time; - static int last_time = -1; - gettimeofday(&t, NULL); - time = t.tv_sec*3 + t.tv_usec/300000; - if (time != last_time) { - char msg_prog_final[500]; - sprintf(msg_prog_final, "%s (%d bytes read) ", msg_progress, current_size); - remove_wait_message(); - wait_message(msg_prog_final); - } - last_time = time; - } + if (size_progress) { + if (current_size <= size_progress) + newtScaleSet(scale, current_size); + newtRefresh(); + } + else { + struct timeval t; + int time; + static int last_time = -1; + gettimeofday(&t, NULL); + time = t.tv_sec*3 + t.tv_usec/300000; + if (time != last_time) { + char msg_prog_final[500]; + sprintf(msg_prog_final, "%s (%d bytes read) ", msg_progress, current_size); + remove_wait_message(); + wait_message(msg_prog_final); + } + last_time = time; + } } void end_progression_raw(void) { - if (size_progress) { - newtPopWindow(); - newtFormDestroy(form); - } - else - remove_wait_message(); + if (size_progress) { + newtPopWindow(); + newtFormDestroy(form); + } + else + remove_wait_message(); } enum return_type ask_from_list_index(char *msg, char ** elems, char ** elems_comments, int * answer) { - char * items[50000]; - int rc; - - if (elems_comments) { - int i; - - i = 0; - while (elems && *elems) { - int j = (*elems_comments) ? strlen(*elems_comments) : 0; - items[i] = malloc(sizeof(char) * (strlen(*elems) + j + 4)); - strcpy(items[i], *elems); - if (*elems_comments) { - strcat(items[i], " ("); - strcat(items[i], *elems_comments); - strcat(items[i], ")"); - } - elems_comments++; - i++; - elems++; - } - items[i] = NULL; - } - - rc = newtWinMenu("Please choose...", msg, 52, 5, 5, 7, elems_comments ? items : elems, answer, "Ok", "Cancel", NULL); - - if (rc == 2) - return RETURN_BACK; - - return RETURN_OK; + char * items[50000]; + int rc; + + if (elems_comments) { + int i; + + i = 0; + while (elems && *elems) { + int j = (*elems_comments) ? strlen(*elems_comments) : 0; + items[i] = malloc(sizeof(char) * (strlen(*elems) + j + 4)); + strcpy(items[i], *elems); + if (*elems_comments) { + strcat(items[i], " ("); + strcat(items[i], *elems_comments); + strcat(items[i], ")"); + } + elems_comments++; + i++; + elems++; + } + items[i] = NULL; + } + + rc = newtWinMenu("Please choose...", msg, 52, 5, 5, 7, elems_comments ? items : elems, answer, "Ok", "Cancel", NULL); + + if (rc == 2) + return RETURN_BACK; + + return RETURN_OK; } enum return_type ask_yes_no(char *msg) { - int rc; + int rc; - rc = newtWinTernary("Please answer...", "Yes", "No", "Back", msg); + rc = newtWinTernary("Please answer...", "Yes", "No", "Back", msg); - if (rc == 1) - return RETURN_OK; - else if (rc == 3) - return RETURN_BACK; - else return RETURN_ERROR; + if (rc == 1) + return RETURN_OK; + else if (rc == 3) + return RETURN_BACK; + else return RETURN_ERROR; } @@ -228,160 +228,160 @@ static void (*callback_real_function)(char ** strings) = NULL; static void default_callback(newtComponent co __attribute__ ((unused)), void * data) { - newtComponent * entries = data; - char * strings[50], ** ptr; - - if (!callback_real_function) - return; - - ptr = strings; - while (entries && *entries) { - *ptr = newtEntryGetValue(*entries); - entries++; - ptr++; - } - - callback_real_function(strings); - - ptr = strings; - entries = data; - while (entries && *entries) { - newtEntrySet(*entries, strdup(*ptr), 1); - entries++; - ptr++; - } + newtComponent * entries = data; + char * strings[50], ** ptr; + + if (!callback_real_function) + return; + + ptr = strings; + while (entries && *entries) { + *ptr = newtEntryGetValue(*entries); + entries++; + ptr++; + } + + callback_real_function(strings); + + ptr = strings; + entries = data; + while (entries && *entries) { + newtEntrySet(*entries, strdup(*ptr), 1); + entries++; + ptr++; + } } /* only supports up to 50 buttons and entries -- shucks! */ static int mynewtWinEntries(char * title, char * text, int suggestedWidth, int flexDown, - int flexUp, int dataWidth, void (*callback_func)(char ** strings), - struct newtWinEntry * items, char * button1, ...) { - newtComponent buttons[50], result, form, textw; - newtGrid grid, buttonBar, subgrid; - int numItems; - int rc, i; - int numButtons; - char * buttonName; - newtComponent entries[50]; - - va_list args; - - textw = newtTextboxReflowed(-1, -1, text, suggestedWidth, flexDown, - flexUp, 0); - - for (numItems = 0; items[numItems].text; numItems++); - - buttonName = button1, numButtons = 0; - va_start(args, button1); - while (buttonName) { - buttons[numButtons] = newtButton(-1, -1, buttonName); - numButtons++; - buttonName = va_arg(args, char *); - } - - va_end(args); - - buttonBar = newtCreateGrid(numButtons, 1); - for (i = 0; i < numButtons; i++) { - newtGridSetField(buttonBar, i, 0, NEWT_GRID_COMPONENT, - buttons[i], - i ? 1 : 0, 0, 0, 0, 0, 0); - } - - if (callback_func) { - callback_real_function = callback_func; - entries[numItems] = NULL; - } - else - callback_real_function = NULL; - - subgrid = newtCreateGrid(2, numItems); - for (i = 0; i < numItems; i++) { - newtComponent entr = newtEntry(-1, -1, items[i].value ? - *items[i].value : NULL, dataWidth, - items[i].value, items[i].flags); - - newtGridSetField(subgrid, 0, i, NEWT_GRID_COMPONENT, - newtLabel(-1, -1, items[i].text), - 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); - newtGridSetField(subgrid, 1, i, NEWT_GRID_COMPONENT, - entr, - 1, 0, 0, 0, 0, 0); - if (callback_func) { - entries[i] = entr; - newtComponentAddCallback(entr, default_callback, entries); - } - } - - - grid = newtCreateGrid(1, 3); - form = newtForm(NULL, 0, 0); - newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, textw, - 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); - newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, subgrid, - 0, 1, 0, 0, 0, 0); - newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttonBar, - 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX); - newtGridAddComponentsToForm(grid, form, 1); - newtGridWrappedWindow(grid, title); - newtGridFree(grid, 1); - - result = newtRunForm(form); - - for (rc = 0; rc < numItems; rc++) - *items[rc].value = strdup(*items[rc].value); - - for (rc = 0; result != buttons[rc] && rc < numButtons; rc++); - if (rc == numButtons) - rc = 0; /* F12 */ - else - rc++; - - newtFormDestroy(form); - newtPopWindow(); - - return rc; + int flexUp, int dataWidth, void (*callback_func)(char ** strings), + struct newtWinEntry * items, char * button1, ...) { + newtComponent buttons[50], result, form, textw; + newtGrid grid, buttonBar, subgrid; + int numItems; + int rc, i; + int numButtons; + char * buttonName; + newtComponent entries[50]; + + va_list args; + + textw = newtTextboxReflowed(-1, -1, text, suggestedWidth, flexDown, + flexUp, 0); + + for (numItems = 0; items[numItems].text; numItems++); + + buttonName = button1, numButtons = 0; + va_start(args, button1); + while (buttonName) { + buttons[numButtons] = newtButton(-1, -1, buttonName); + numButtons++; + buttonName = va_arg(args, char *); + } + + va_end(args); + + buttonBar = newtCreateGrid(numButtons, 1); + for (i = 0; i < numButtons; i++) { + newtGridSetField(buttonBar, i, 0, NEWT_GRID_COMPONENT, + buttons[i], + i ? 1 : 0, 0, 0, 0, 0, 0); + } + + if (callback_func) { + callback_real_function = callback_func; + entries[numItems] = NULL; + } + else + callback_real_function = NULL; + + subgrid = newtCreateGrid(2, numItems); + for (i = 0; i < numItems; i++) { + newtComponent entr = newtEntry(-1, -1, items[i].value ? + *items[i].value : NULL, dataWidth, + (const char**)items[i].value, items[i].flags); + + newtGridSetField(subgrid, 0, i, NEWT_GRID_COMPONENT, + newtLabel(-1, -1, items[i].text), + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); + newtGridSetField(subgrid, 1, i, NEWT_GRID_COMPONENT, + entr, + 1, 0, 0, 0, 0, 0); + if (callback_func) { + entries[i] = entr; + newtComponentAddCallback(entr, default_callback, entries); + } + } + + + grid = newtCreateGrid(1, 3); + form = newtForm(NULL, 0, 0); + newtGridSetField(grid, 0, 0, NEWT_GRID_COMPONENT, textw, + 0, 0, 0, 0, NEWT_ANCHOR_LEFT, 0); + newtGridSetField(grid, 0, 1, NEWT_GRID_SUBGRID, subgrid, + 0, 1, 0, 0, 0, 0); + newtGridSetField(grid, 0, 2, NEWT_GRID_SUBGRID, buttonBar, + 0, 1, 0, 0, 0, NEWT_GRID_FLAG_GROWX); + newtGridAddComponentsToForm(grid, form, 1); + newtGridWrappedWindow(grid, title); + newtGridFree(grid, 1); + + result = newtRunForm(form); + + for (rc = 0; rc < numItems; rc++) + *items[rc].value = strdup(*items[rc].value); + + for (rc = 0; result != buttons[rc] && rc < numButtons; rc++); + if (rc == numButtons) + rc = 0; /* F12 */ + else + rc++; + + newtFormDestroy(form); + newtPopWindow(); + + return rc; } enum return_type ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size, void (*callback_func)(char ** strings)) { - struct newtWinEntry entries[50]; - int j, i = 0; - int rc; - char ** already_answers = NULL; - - while (questions && *questions) { - entries[i].text = *questions; - entries[i].flags = NEWT_FLAG_SCROLL | (!strcmp(*questions, "Password") ? NEWT_FLAG_PASSWORD : 0); - i++; - questions++; - } - entries[i].text = NULL; - entries[i].value = NULL; - - if (*answers == NULL) - *answers = (char **) malloc(sizeof(char *) * i); - else - already_answers = *answers; - - for (j = 0 ; j < i ; j++) { - entries[j].value = &((*answers)[j]); - if (already_answers && *already_answers) { - *(entries[j].value) = *already_answers; - already_answers++; - } else - *(entries[j].value) = NULL; - } - - rc = mynewtWinEntries("Please fill in entries...", msg, 52, 5, 5, entry_size, callback_func, entries, "Ok", "Cancel", NULL); - - if (rc == 3) - return RETURN_BACK; - if (rc != 1) - return RETURN_ERROR; - - return RETURN_OK; + struct newtWinEntry entries[50]; + int j, i = 0; + int rc; + char ** already_answers = NULL; + + while (questions && *questions) { + entries[i].text = *questions; + entries[i].flags = NEWT_FLAG_SCROLL | (!strcmp(*questions, "Password") ? NEWT_FLAG_PASSWORD : 0); + i++; + questions++; + } + entries[i].text = NULL; + entries[i].value = NULL; + + if (*answers == NULL) + *answers = (char **) malloc(sizeof(char *) * i); + else + already_answers = *answers; + + for (j = 0 ; j < i ; j++) { + entries[j].value = &((*answers)[j]); + if (already_answers && *already_answers) { + *(entries[j].value) = *already_answers; + already_answers++; + } else + *(entries[j].value) = NULL; + } + + rc = mynewtWinEntries("Please fill in entries...", msg, 52, 5, 5, entry_size, callback_func, entries, "Ok", "Cancel", NULL); + + if (rc == 3) + return RETURN_BACK; + if (rc != 1) + return RETURN_ERROR; + + return RETURN_OK; } diff --git a/mdk-stage1/nfsmount.c b/mdk-stage1/nfsmount.c index 0ad52265a..0345098f9 100644 --- a/mdk-stage1/nfsmount.c +++ b/mdk-stage1/nfsmount.c @@ -96,98 +96,98 @@ static char *nfs_strerror(int stat); -#define MAKE_VERSION(p,q,r) (65536*(p) + 256*(q) + (r)) +#define MAKE_VERSION(p,q,r) (65536*(p) + 256*(q) + (r)) #define MAX_NFSPROT ((nfs_mount_version >= 4) ? 3 : 2) bool_t xdr_fhandle3 (XDR *xdrs, fhandle3 *objp) { - if (!xdr_bytes (xdrs, (char **)&objp->fhandle3_val, (u_int *) &objp->fhandle3_len, FHSIZE3)) - return FALSE; - return TRUE; + if (!xdr_bytes (xdrs, (char **)&objp->fhandle3_val, (u_int *) &objp->fhandle3_len, FHSIZE3)) + return FALSE; + return TRUE; } bool_t xdr_mountstat3 (XDR *xdrs, mountstat3 *objp) { - if (!xdr_enum (xdrs, (enum_t *) objp)) - return FALSE; - return TRUE; + if (!xdr_enum (xdrs, (enum_t *) objp)) + return FALSE; + return TRUE; } bool_t xdr_mountres3_ok (XDR *xdrs, mountres3_ok *objp) { - if (!xdr_fhandle3 (xdrs, &objp->fhandle)) - return FALSE; - if (!xdr_array (xdrs, (char **)&objp->auth_flavours.auth_flavours_val, (u_int *) &objp->auth_flavours.auth_flavours_len, ~0, - sizeof (int), (xdrproc_t) xdr_int)) - return FALSE; - return TRUE; + if (!xdr_fhandle3 (xdrs, &objp->fhandle)) + return FALSE; + if (!xdr_array (xdrs, (char **)&objp->auth_flavours.auth_flavours_val, (u_int *) &objp->auth_flavours.auth_flavours_len, ~0, + sizeof (int), (xdrproc_t) xdr_int)) + return FALSE; + return TRUE; } bool_t xdr_mountres3 (XDR *xdrs, mountres3 *objp) { - if (!xdr_mountstat3 (xdrs, &objp->fhs_status)) - return FALSE; - switch (objp->fhs_status) { - case MNT_OK: - if (!xdr_mountres3_ok (xdrs, &objp->mountres3_u.mountinfo)) - return FALSE; - break; - default: - break; - } - return TRUE; + if (!xdr_mountstat3 (xdrs, &objp->fhs_status)) + return FALSE; + switch (objp->fhs_status) { + case MNT_OK: + if (!xdr_mountres3_ok (xdrs, &objp->mountres3_u.mountinfo)) + return FALSE; + break; + default: + break; + } + return TRUE; } bool_t xdr_dirpath (XDR *xdrs, dirpath *objp) { - if (!xdr_string (xdrs, objp, MNTPATHLEN)) - return FALSE; - return TRUE; + if (!xdr_string (xdrs, objp, MNTPATHLEN)) + return FALSE; + return TRUE; } bool_t xdr_fhandle (XDR *xdrs, fhandle objp) { - if (!xdr_opaque (xdrs, objp, FHSIZE)) - return FALSE; - return TRUE; + if (!xdr_opaque (xdrs, objp, FHSIZE)) + return FALSE; + return TRUE; } bool_t xdr_fhstatus (XDR *xdrs, fhstatus *objp) { - if (!xdr_u_int (xdrs, &objp->fhs_status)) - return FALSE; - switch (objp->fhs_status) { - case 0: - if (!xdr_fhandle (xdrs, objp->fhstatus_u.fhs_fhandle)) - return FALSE; - break; - default: - break; - } - return TRUE; + if (!xdr_u_int (xdrs, &objp->fhs_status)) + return FALSE; + switch (objp->fhs_status) { + case 0: + if (!xdr_fhandle (xdrs, objp->fhstatus_u.fhs_fhandle)) + return FALSE; + break; + default: + break; + } + return TRUE; } static int linux_version_code(void) { - struct utsname my_utsname; - int p, q, r; - - if (uname(&my_utsname) == 0) { - p = atoi(strtok(my_utsname.release, ".")); - q = atoi(strtok(NULL, ".")); - r = atoi(strtok(NULL, ".")); - return MAKE_VERSION(p,q,r); - } - return 0; + struct utsname my_utsname; + int p, q, r; + + if (uname(&my_utsname) == 0) { + p = atoi(strtok(my_utsname.release, ".")); + q = atoi(strtok(NULL, ".")); + r = atoi(strtok(NULL, ".")); + return MAKE_VERSION(p,q,r); + } + return 0; } /* @@ -197,33 +197,33 @@ linux_version_code(void) { * and figure out what version the kernel expects. * * Variables: - * NFS_MOUNT_VERSION: these nfsmount sources at compile time - * nfs_mount_version: version this source and running kernel can handle + * NFS_MOUNT_VERSION: these nfsmount sources at compile time + * nfs_mount_version: version this source and running kernel can handle */ static int find_kernel_nfs_mount_version(void) { - static int kernel_version = -1; - int nfs_mount_version = NFS_MOUNT_VERSION; - - if (kernel_version == -1) - kernel_version = linux_version_code(); - - if (kernel_version) { - if (kernel_version < MAKE_VERSION(2,1,32)) - nfs_mount_version = 1; - else if (kernel_version < MAKE_VERSION(2,2,18)) - nfs_mount_version = 3; - else if (kernel_version < MAKE_VERSION(2,3,0)) - nfs_mount_version = 4; /* since 2.2.18pre9 */ - else if (kernel_version < MAKE_VERSION(2,3,99)) - nfs_mount_version = 3; - else - nfs_mount_version = 4; /* since 2.3.99pre4 */ - } - if (nfs_mount_version > NFS_MOUNT_VERSION) - nfs_mount_version = NFS_MOUNT_VERSION; + static int kernel_version = -1; + int nfs_mount_version = NFS_MOUNT_VERSION; + + if (kernel_version == -1) + kernel_version = linux_version_code(); + + if (kernel_version) { + if (kernel_version < MAKE_VERSION(2,1,32)) + nfs_mount_version = 1; + else if (kernel_version < MAKE_VERSION(2,2,18)) + nfs_mount_version = 3; + else if (kernel_version < MAKE_VERSION(2,3,0)) + nfs_mount_version = 4; /* since 2.2.18pre9 */ + else if (kernel_version < MAKE_VERSION(2,3,99)) + nfs_mount_version = 3; + else + nfs_mount_version = 4; /* since 2.3.99pre4 */ + } + if (nfs_mount_version > NFS_MOUNT_VERSION) + nfs_mount_version = NFS_MOUNT_VERSION; log_message("nfsmount: kernel_nfs_mount_version: %d", nfs_mount_version); - return nfs_mount_version; + return nfs_mount_version; } static struct pmap * @@ -234,307 +234,307 @@ get_mountport(struct sockaddr_in *server_addr, long unsigned port, int nfs_mount_version) { - struct pmaplist *pmap; - static struct pmap p = {0, 0, 0, 0}; - - if (version > MAX_NFSPROT) - version = MAX_NFSPROT; - if (!prog) - prog = MOUNTPROG; - p.pm_prog = prog; - p.pm_vers = version; - p.pm_prot = proto; - p.pm_port = port; - - server_addr->sin_port = PMAPPORT; - pmap = pmap_getmaps(server_addr); - - while (pmap) { - if (pmap->pml_map.pm_prog != prog) - goto next; - if (!version && p.pm_vers > pmap->pml_map.pm_vers) - goto next; - if (version > 2 && pmap->pml_map.pm_vers != version) - goto next; - if (version && version <= 2 && pmap->pml_map.pm_vers > 2) - goto next; - if (pmap->pml_map.pm_vers > MAX_NFSPROT || - (proto && p.pm_prot && pmap->pml_map.pm_prot != proto) || - (port && pmap->pml_map.pm_port != port)) - goto next; - memcpy(&p, &pmap->pml_map, sizeof(p)); - next: - pmap = pmap->pml_next; - } - if (!p.pm_vers) - p.pm_vers = MOUNTVERS; - if (!p.pm_prot) - p.pm_prot = IPPROTO_TCP; - return &p; + struct pmaplist *pmap; + static struct pmap p = {0, 0, 0, 0}; + + if (version > MAX_NFSPROT) + version = MAX_NFSPROT; + if (!prog) + prog = MOUNTPROG; + p.pm_prog = prog; + p.pm_vers = version; + p.pm_prot = proto; + p.pm_port = port; + + server_addr->sin_port = PMAPPORT; + pmap = pmap_getmaps(server_addr); + + while (pmap) { + if (pmap->pml_map.pm_prog != prog) + goto next; + if (!version && p.pm_vers > pmap->pml_map.pm_vers) + goto next; + if (version > 2 && pmap->pml_map.pm_vers != version) + goto next; + if (version && version <= 2 && pmap->pml_map.pm_vers > 2) + goto next; + if (pmap->pml_map.pm_vers > MAX_NFSPROT || + (proto && p.pm_prot && pmap->pml_map.pm_prot != proto) || + (port && pmap->pml_map.pm_port != port)) + goto next; + memcpy(&p, &pmap->pml_map, sizeof(p)); + next: + pmap = pmap->pml_next; + } + if (!p.pm_vers) + p.pm_vers = MOUNTVERS; + if (!p.pm_prot) + p.pm_prot = IPPROTO_TCP; + return &p; } int nfsmount_prepare(const char *spec, char **mount_opts) { - char hostdir[1024]; - CLIENT *mclient; - char *hostname, *dirname, *mounthost = NULL; - struct timeval total_timeout; - enum clnt_stat clnt_stat; - static struct nfs_mount_data data; - int nfs_mount_version; - struct sockaddr_in server_addr; - struct sockaddr_in mount_server_addr; - struct pmap *pm_mnt; - int msock, fsock; - struct timeval retry_timeout; - union { - struct fhstatus nfsv2; - struct mountres3 nfsv3; - } status; - char *s; - int port, mountport, proto, soft, intr; - int posix, nocto, noac, broken_suid, nolock; - int tcp; - int mountprog, mountvers, nfsprog, nfsvers; - int retval; - time_t t; - time_t prevt; - - nfs_mount_version = find_kernel_nfs_mount_version(); - - retval = -1; - msock = fsock = -1; - mclient = NULL; - if (strlen(spec) >= sizeof(hostdir)) { - log_message("nfsmount: excessively long host:dir argument"); - goto fail; - } - strcpy(hostdir, spec); - if ((s = strchr(hostdir, ':'))) { - hostname = hostdir; - dirname = s + 1; - *s = '\0'; - } else { - log_message("nfsmount: directory to mount not in host:dir format"); - goto fail; - } - - server_addr.sin_family = AF_INET; + char hostdir[1024]; + CLIENT *mclient; + char *hostname, *dirname, *mounthost = NULL; + struct timeval total_timeout; + enum clnt_stat clnt_stat; + static struct nfs_mount_data data; + int nfs_mount_version; + struct sockaddr_in server_addr; + struct sockaddr_in mount_server_addr; + struct pmap *pm_mnt; + int msock, fsock; + struct timeval retry_timeout; + union { + struct fhstatus nfsv2; + struct mountres3 nfsv3; + } status; + char *s; + int port, mountport, proto, soft, intr; + int posix, nocto, noac, broken_suid, nolock; + int tcp; + int mountprog, mountvers, nfsprog, nfsvers; + int retval; + time_t t; + time_t prevt; + + nfs_mount_version = find_kernel_nfs_mount_version(); + + retval = -1; + msock = fsock = -1; + mclient = NULL; + if (strlen(spec) >= sizeof(hostdir)) { + log_message("nfsmount: excessively long host:dir argument"); + goto fail; + } + strcpy(hostdir, spec); + if ((s = strchr(hostdir, ':'))) { + hostname = hostdir; + dirname = s + 1; + *s = '\0'; + } else { + log_message("nfsmount: directory to mount not in host:dir format"); + goto fail; + } + + server_addr.sin_family = AF_INET; #ifdef HAVE_inet_aton - if (!inet_aton(hostname, &server_addr.sin_addr)) + if (!inet_aton(hostname, &server_addr.sin_addr)) #endif - { - if (mygethostbyname(hostname, &server_addr.sin_addr)) { - log_message("nfsmount: can't get address for %s", hostname); - goto fail; - } - } - - memcpy (&mount_server_addr, &server_addr, sizeof (mount_server_addr)); - - - - /* Set default options. - * rsize/wsize are set to 8192 to enable nfs install on - * old i586 machines - * timeo is filled in after we know whether it'll be TCP or UDP. */ - memset(&data, 0, sizeof(data)); - data.rsize = 8192; - data.wsize = 8192; - data.retrans = 30; - data.acregmin = 3; - data.acregmax = 60; - data.acdirmin = 30; - data.acdirmax = 60; + { + if (mygethostbyname(hostname, &server_addr.sin_addr)) { + log_message("nfsmount: can't get address for %s", hostname); + goto fail; + } + } + + memcpy (&mount_server_addr, &server_addr, sizeof (mount_server_addr)); + + + + /* Set default options. + * rsize/wsize are set to 8192 to enable nfs install on + * old i586 machines + * timeo is filled in after we know whether it'll be TCP or UDP. */ + memset(&data, 0, sizeof(data)); + data.rsize = 8192; + data.wsize = 8192; + data.retrans = 30; + data.acregmin = 3; + data.acregmax = 60; + data.acdirmin = 30; + data.acdirmax = 60; #if NFS_MOUNT_VERSION >= 2 - data.namlen = NAME_MAX; + data.namlen = NAME_MAX; #endif - soft = 1; - intr = 0; - posix = 0; - nocto = 0; - nolock = 1; - broken_suid = 0; - noac = 0; - tcp = 0; + soft = 1; + intr = 0; + posix = 0; + nocto = 0; + nolock = 1; + broken_suid = 0; + noac = 0; + tcp = 0; - mountprog = MOUNTPROG; - mountvers = 0; - port = 0; - mountport = 0; - nfsprog = NFS_PROGRAM; - nfsvers = 0; + mountprog = MOUNTPROG; + mountvers = 0; + port = 0; + mountport = 0; + nfsprog = NFS_PROGRAM; + nfsvers = 0; retry_mount: - proto = (tcp) ? IPPROTO_TCP : IPPROTO_UDP; + proto = (tcp) ? IPPROTO_TCP : IPPROTO_UDP; - data.flags = (soft ? NFS_MOUNT_SOFT : 0) - | (intr ? NFS_MOUNT_INTR : 0) - | (posix ? NFS_MOUNT_POSIX : 0) - | (nocto ? NFS_MOUNT_NOCTO : 0) - | (noac ? NFS_MOUNT_NOAC : 0); + data.flags = (soft ? NFS_MOUNT_SOFT : 0) + | (intr ? NFS_MOUNT_INTR : 0) + | (posix ? NFS_MOUNT_POSIX : 0) + | (nocto ? NFS_MOUNT_NOCTO : 0) + | (noac ? NFS_MOUNT_NOAC : 0); #if NFS_MOUNT_VERSION >= 2 - if (nfs_mount_version >= 2) - data.flags |= (tcp ? NFS_MOUNT_TCP : 0); + if (nfs_mount_version >= 2) + data.flags |= (tcp ? NFS_MOUNT_TCP : 0); #endif #if NFS_MOUNT_VERSION >= 3 - if (nfs_mount_version >= 3) - data.flags |= (nolock ? NFS_MOUNT_NONLM : 0); + if (nfs_mount_version >= 3) + data.flags |= (nolock ? NFS_MOUNT_NONLM : 0); #endif #if NFS_MOUNT_VERSION >= 4 - if (nfs_mount_version >= 4) - data.flags |= (broken_suid ? NFS_MOUNT_BROKEN_SUID : 0); + if (nfs_mount_version >= 4) + data.flags |= (broken_suid ? NFS_MOUNT_BROKEN_SUID : 0); #endif - if (nfsvers > MAX_NFSPROT) { - log_message("NFSv%d not supported!", nfsvers); - return 0; - } - if (mountvers > MAX_NFSPROT) { - log_message("NFSv%d not supported!", nfsvers); - return 0; - } - if (nfsvers && !mountvers) - mountvers = (nfsvers < 3) ? 1 : nfsvers; - if (nfsvers && nfsvers < mountvers) - mountvers = nfsvers; - - /* Adjust options if none specified */ - if (!data.timeo) - data.timeo = tcp ? 70 : 7; + if (nfsvers > MAX_NFSPROT) { + log_message("NFSv%d not supported!", nfsvers); + return 0; + } + if (mountvers > MAX_NFSPROT) { + log_message("NFSv%d not supported!", nfsvers); + return 0; + } + if (nfsvers && !mountvers) + mountvers = (nfsvers < 3) ? 1 : nfsvers; + if (nfsvers && nfsvers < mountvers) + mountvers = nfsvers; + + /* Adjust options if none specified */ + if (!data.timeo) + data.timeo = tcp ? 70 : 7; #ifdef NFS_MOUNT_DEBUG - log_message("rsize = %d, wsize = %d, timeo = %d, retrans = %d", - data.rsize, data.wsize, data.timeo, data.retrans); - log_message("acreg (min, max) = (%d, %d), acdir (min, max) = (%d, %d)", - data.acregmin, data.acregmax, data.acdirmin, data.acdirmax); - log_message("port = %d, retry = %d, flags = %.8x", - port, retry, data.flags); - log_message("mountprog = %d, mountvers = %d, nfsprog = %d, nfsvers = %d", - mountprog, mountvers, nfsprog, nfsvers); - log_message("soft = %d, intr = %d, posix = %d, nocto = %d, noac = %d", - (data.flags & NFS_MOUNT_SOFT) != 0, - (data.flags & NFS_MOUNT_INTR) != 0, - (data.flags & NFS_MOUNT_POSIX) != 0, - (data.flags & NFS_MOUNT_NOCTO) != 0, - (data.flags & NFS_MOUNT_NOAC) != 0); + log_message("rsize = %d, wsize = %d, timeo = %d, retrans = %d", + data.rsize, data.wsize, data.timeo, data.retrans); + log_message("acreg (min, max) = (%d, %d), acdir (min, max) = (%d, %d)", + data.acregmin, data.acregmax, data.acdirmin, data.acdirmax); + log_message("port = %d, retry = %d, flags = %.8x", + port, retry, data.flags); + log_message("mountprog = %d, mountvers = %d, nfsprog = %d, nfsvers = %d", + mountprog, mountvers, nfsprog, nfsvers); + log_message("soft = %d, intr = %d, posix = %d, nocto = %d, noac = %d", + (data.flags & NFS_MOUNT_SOFT) != 0, + (data.flags & NFS_MOUNT_INTR) != 0, + (data.flags & NFS_MOUNT_POSIX) != 0, + (data.flags & NFS_MOUNT_NOCTO) != 0, + (data.flags & NFS_MOUNT_NOAC) != 0); #if NFS_MOUNT_VERSION >= 2 - log_message("tcp = %d", - (data.flags & NFS_MOUNT_TCP) != 0); + log_message("tcp = %d", + (data.flags & NFS_MOUNT_TCP) != 0); #endif #endif - data.version = nfs_mount_version; - *mount_opts = (char *) &data; + data.version = nfs_mount_version; + *mount_opts = (char *) &data; - /* create mount deamon client */ - /* See if the nfs host = mount host. */ - if (mounthost) { - if (mounthost[0] >= '0' && mounthost[0] <= '9') { - mount_server_addr.sin_family = AF_INET; - mount_server_addr.sin_addr.s_addr = inet_addr(hostname); - } else { + /* create mount deamon client */ + /* See if the nfs host = mount host. */ + if (mounthost) { + if (mounthost[0] >= '0' && mounthost[0] <= '9') { + mount_server_addr.sin_family = AF_INET; + mount_server_addr.sin_addr.s_addr = inet_addr(hostname); + } else { if (mygethostbyname(mounthost, &mount_server_addr.sin_addr)) { - log_message("nfsmount: can't get address for %s", mounthost); - goto fail; - } - } - } - - /* - * The following loop implements the mount retries. On the first - * call, "running_bg" is 0. When the mount times out, and the - * "bg" option is set, the exit status EX_BG will be returned. - * For a backgrounded mount, there will be a second call by the - * child process with "running_bg" set to 1. - * - * The case where the mount point is not present and the "bg" - * option is set, is treated as a timeout. This is done to - * support nested mounts. - * - * The "retry" count specified by the user is the number of - * minutes to retry before giving up. - * - * Only the first error message will be displayed. - */ - retry_timeout.tv_sec = 3; - retry_timeout.tv_usec = 0; - total_timeout.tv_sec = 20; - total_timeout.tv_usec = 0; - prevt = 0; - t = 30; - - - /* be careful not to use too many CPU cycles */ - if (t - prevt < 30) - sleep(30); - - pm_mnt = get_mountport(&mount_server_addr, - mountprog, - mountvers, - proto, - mountport, - nfs_mount_version); - - /* contact the mount daemon via TCP */ - mount_server_addr.sin_port = htons(pm_mnt->pm_port); - msock = RPC_ANYSOCK; - - switch (pm_mnt->pm_prot) { - case IPPROTO_UDP: - mclient = clntudp_create(&mount_server_addr, - pm_mnt->pm_prog, - pm_mnt->pm_vers, - retry_timeout, - &msock); - if (mclient) - break; - mount_server_addr.sin_port = - htons(pm_mnt->pm_port); - msock = RPC_ANYSOCK; - case IPPROTO_TCP: - mclient = clnttcp_create(&mount_server_addr, - pm_mnt->pm_prog, - pm_mnt->pm_vers, - &msock, 0, 0); - break; - default: - mclient = 0; - } - - if (mclient) { - /* try to mount hostname:dirname */ - mclient->cl_auth = authunix_create_default(); - - /* make pointers in xdr_mountres3 NULL so - * that xdr_array allocates memory for us - */ - memset(&status, 0, sizeof(status)); - - log_message("nfsmount: doing client call in nfs version: %ld", pm_mnt->pm_vers); - if (pm_mnt->pm_vers == 3) - clnt_stat = clnt_call(mclient, - MOUNTPROC3_MNT, - (xdrproc_t) xdr_dirpath, - (caddr_t) &dirname, - (xdrproc_t) xdr_mountres3, - (caddr_t) &status, - total_timeout); - else - clnt_stat = clnt_call(mclient, - MOUNTPROC_MNT, - (xdrproc_t) xdr_dirpath, - (caddr_t) &dirname, - (xdrproc_t) xdr_fhstatus, - (caddr_t) &status, - total_timeout); - - if (clnt_stat == RPC_SUCCESS) + log_message("nfsmount: can't get address for %s", mounthost); + goto fail; + } + } + } + + /* + * The following loop implements the mount retries. On the first + * call, "running_bg" is 0. When the mount times out, and the + * "bg" option is set, the exit status EX_BG will be returned. + * For a backgrounded mount, there will be a second call by the + * child process with "running_bg" set to 1. + * + * The case where the mount point is not present and the "bg" + * option is set, is treated as a timeout. This is done to + * support nested mounts. + * + * The "retry" count specified by the user is the number of + * minutes to retry before giving up. + * + * Only the first error message will be displayed. + */ + retry_timeout.tv_sec = 3; + retry_timeout.tv_usec = 0; + total_timeout.tv_sec = 20; + total_timeout.tv_usec = 0; + prevt = 0; + t = 30; + + + /* be careful not to use too many CPU cycles */ + if (t - prevt < 30) + sleep(30); + + pm_mnt = get_mountport(&mount_server_addr, + mountprog, + mountvers, + proto, + mountport, + nfs_mount_version); + + /* contact the mount daemon via TCP */ + mount_server_addr.sin_port = htons(pm_mnt->pm_port); + msock = RPC_ANYSOCK; + + switch (pm_mnt->pm_prot) { + case IPPROTO_UDP: + mclient = clntudp_create(&mount_server_addr, + pm_mnt->pm_prog, + pm_mnt->pm_vers, + retry_timeout, + &msock); + if (mclient) + break; + mount_server_addr.sin_port = + htons(pm_mnt->pm_port); + msock = RPC_ANYSOCK; + case IPPROTO_TCP: + mclient = clnttcp_create(&mount_server_addr, + pm_mnt->pm_prog, + pm_mnt->pm_vers, + &msock, 0, 0); + break; + default: + mclient = 0; + } + + if (mclient) { + /* try to mount hostname:dirname */ + mclient->cl_auth = authunix_create_default(); + + /* make pointers in xdr_mountres3 NULL so + * that xdr_array allocates memory for us + */ + memset(&status, 0, sizeof(status)); + + log_message("nfsmount: doing client call in nfs version: %ld", pm_mnt->pm_vers); + if (pm_mnt->pm_vers == 3) + clnt_stat = clnt_call(mclient, + MOUNTPROC3_MNT, + (xdrproc_t) xdr_dirpath, + (caddr_t) &dirname, + (xdrproc_t) xdr_mountres3, + (caddr_t) &status, + total_timeout); + else + clnt_stat = clnt_call(mclient, + MOUNTPROC_MNT, + (xdrproc_t) xdr_dirpath, + (caddr_t) &dirname, + (xdrproc_t) xdr_fhstatus, + (caddr_t) &status, + total_timeout); + + if (clnt_stat == RPC_SUCCESS) goto succeeded; if (prevt == 0) @@ -543,135 +543,135 @@ retry_mount: clnt_destroy(mclient); mclient = 0; close(msock); - } else { + } else { log_message("could not create rpc client: host probably not found or NFS server is down"); - } - prevt = t; + } + prevt = t; - goto fail; + goto fail; succeeded: - nfsvers = (pm_mnt->pm_vers < 2) ? 2 : pm_mnt->pm_vers; + nfsvers = (pm_mnt->pm_vers < 2) ? 2 : pm_mnt->pm_vers; - if (nfsvers == 2) { - if (status.nfsv2.fhs_status != 0) { - log_message("nfsmount: %s:%s failed, reason given by server: %s", + if (nfsvers == 2) { + if (status.nfsv2.fhs_status != 0) { + log_message("nfsmount: %s:%s failed, reason given by server: %s", hostname, dirname, nfs_strerror(status.nfsv2.fhs_status)); - goto fail; - } - memcpy(data.root.data, - (char *) status.nfsv2.fhstatus_u.fhs_fhandle, - NFS_FHSIZE); + goto fail; + } + memcpy(data.root.data, + (char *) status.nfsv2.fhstatus_u.fhs_fhandle, + NFS_FHSIZE); #if NFS_MOUNT_VERSION >= 4 - data.root.size = NFS_FHSIZE; - memcpy(data.old_root.data, - (char *) status.nfsv2.fhstatus_u.fhs_fhandle, - NFS_FHSIZE); + data.root.size = NFS_FHSIZE; + memcpy(data.old_root.data, + (char *) status.nfsv2.fhstatus_u.fhs_fhandle, + NFS_FHSIZE); #endif - } else { + } else { #if NFS_MOUNT_VERSION >= 4 - fhandle3 *fhandle; - if (status.nfsv3.fhs_status != 0) { - log_message("nfsmount: %s:%s failed, reason given by server: %s", + fhandle3 *fhandle; + if (status.nfsv3.fhs_status != 0) { + log_message("nfsmount: %s:%s failed, reason given by server: %s", hostname, dirname, nfs_strerror(status.nfsv3.fhs_status)); - goto fail; - } - fhandle = &status.nfsv3.mountres3_u.mountinfo.fhandle; - memset(data.old_root.data, 0, NFS_FHSIZE); - memset(&data.root, 0, sizeof(data.root)); - data.root.size = fhandle->fhandle3_len; - memcpy(data.root.data, - (char *) fhandle->fhandle3_val, - fhandle->fhandle3_len); - - data.flags |= NFS_MOUNT_VER3; + goto fail; + } + fhandle = &status.nfsv3.mountres3_u.mountinfo.fhandle; + memset(data.old_root.data, 0, NFS_FHSIZE); + memset(&data.root, 0, sizeof(data.root)); + data.root.size = fhandle->fhandle3_len; + memcpy(data.root.data, + (char *) fhandle->fhandle3_val, + fhandle->fhandle3_len); + + data.flags |= NFS_MOUNT_VER3; #endif - } - - /* create nfs socket for kernel */ - - if (tcp) { - if (nfs_mount_version < 3) { - log_message("NFS over TCP is not supported."); - goto fail; - } - fsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - } else - fsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (fsock < 0) { - log_perror("nfs socket"); - goto fail; - } - if (bindresvport(fsock, 0) < 0) { - log_perror("nfs bindresvport"); - goto fail; - } - if (port == 0) { - server_addr.sin_port = PMAPPORT; - port = pmap_getport(&server_addr, nfsprog, nfsvers, - tcp ? IPPROTO_TCP : IPPROTO_UDP); + } + + /* create nfs socket for kernel */ + + if (tcp) { + if (nfs_mount_version < 3) { + log_message("NFS over TCP is not supported."); + goto fail; + } + fsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + } else + fsock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (fsock < 0) { + log_perror("nfs socket"); + goto fail; + } + if (bindresvport(fsock, 0) < 0) { + log_perror("nfs bindresvport"); + goto fail; + } + if (port == 0) { + server_addr.sin_port = PMAPPORT; + port = pmap_getport(&server_addr, nfsprog, nfsvers, + tcp ? IPPROTO_TCP : IPPROTO_UDP); #if 1 - /* Here we check to see if user is mounting with the - * tcp option. If so, and if the portmap returns a - * '0' for port (service unavailable), we then notify - * the user, and retry with udp. - */ - if (port == 0 && tcp == 1) { - log_message("NFS server reported TCP not available, retrying with UDP..."); - tcp = 0; - goto retry_mount; - } + /* Here we check to see if user is mounting with the + * tcp option. If so, and if the portmap returns a + * '0' for port (service unavailable), we then notify + * the user, and retry with udp. + */ + if (port == 0 && tcp == 1) { + log_message("NFS server reported TCP not available, retrying with UDP..."); + tcp = 0; + goto retry_mount; + } #endif - if (port == 0) - port = NFS_PORT; + if (port == 0) + port = NFS_PORT; #ifdef NFS_MOUNT_DEBUG - else - log_message("used portmapper to find NFS port"); + else + log_message("used portmapper to find NFS port"); #endif - } + } #ifdef NFS_MOUNT_DEBUG - log_message("using port %d for nfs deamon", port); + log_message("using port %d for nfs deamon", port); #endif - server_addr.sin_port = htons(port); - /* - * connect() the socket for kernels 1.3.10 and below only, - * to avoid problems with multihomed hosts. - * --Swen - */ - if (linux_version_code() <= 66314 - && connect(fsock, (struct sockaddr *) &server_addr, - sizeof (server_addr)) < 0) { - log_perror("nfs connect"); - goto fail; - } - - /* prepare data structure for kernel */ - - data.fd = fsock; - memcpy((char *) &data.addr, (char *) &server_addr, sizeof(data.addr)); - strncpy(data.hostname, hostname, sizeof(data.hostname)); - - /* clean up */ - - auth_destroy(mclient->cl_auth); - clnt_destroy(mclient); - close(msock); - return 0; - - /* abort */ + server_addr.sin_port = htons(port); + /* + * connect() the socket for kernels 1.3.10 and below only, + * to avoid problems with multihomed hosts. + * --Swen + */ + if (linux_version_code() <= 66314 + && connect(fsock, (struct sockaddr *) &server_addr, + sizeof (server_addr)) < 0) { + log_perror("nfs connect"); + goto fail; + } + + /* prepare data structure for kernel */ + + data.fd = fsock; + memcpy((char *) &data.addr, (char *) &server_addr, sizeof(data.addr)); + strncpy(data.hostname, hostname, sizeof(data.hostname)); + + /* clean up */ + + auth_destroy(mclient->cl_auth); + clnt_destroy(mclient); + close(msock); + return 0; + + /* abort */ fail: - if (msock != -1) { - if (mclient) { - auth_destroy(mclient->cl_auth); - clnt_destroy(mclient); - } - close(msock); - } - if (fsock != -1) - close(fsock); - return retval; + if (msock != -1) { + if (mclient) { + auth_destroy(mclient->cl_auth); + clnt_destroy(mclient); + } + close(msock); + } + if (fsock != -1) + close(fsock); + return retval; } /* @@ -684,52 +684,52 @@ retry_mount: */ #ifndef EDQUOT -#define EDQUOT ENOSPC +#define EDQUOT ENOSPC #endif static struct { - enum nfsstat stat; - int errnum; + enum nfsstat stat; + int errnum; } nfs_errtbl[] = { - { NFS_OK, 0 }, - { NFSERR_PERM, EPERM }, - { NFSERR_NOENT, ENOENT }, - { NFSERR_IO, EIO }, - { NFSERR_NXIO, ENXIO }, - { NFSERR_ACCES, EACCES }, - { NFSERR_EXIST, EEXIST }, - { NFSERR_NODEV, ENODEV }, - { NFSERR_NOTDIR, ENOTDIR }, - { NFSERR_ISDIR, EISDIR }, + { NFS_OK, 0 }, + { NFSERR_PERM, EPERM }, + { NFSERR_NOENT, ENOENT }, + { NFSERR_IO, EIO }, + { NFSERR_NXIO, ENXIO }, + { NFSERR_ACCES, EACCES }, + { NFSERR_EXIST, EEXIST }, + { NFSERR_NODEV, ENODEV }, + { NFSERR_NOTDIR, ENOTDIR }, + { NFSERR_ISDIR, EISDIR }, #ifdef NFSERR_INVAL - { NFSERR_INVAL, EINVAL }, /* that Sun forgot */ + { NFSERR_INVAL, EINVAL }, /* that Sun forgot */ #endif - { NFSERR_FBIG, EFBIG }, - { NFSERR_NOSPC, ENOSPC }, - { NFSERR_ROFS, EROFS }, - { NFSERR_NAMETOOLONG, ENAMETOOLONG }, - { NFSERR_NOTEMPTY, ENOTEMPTY }, - { NFSERR_DQUOT, EDQUOT }, - { NFSERR_STALE, ESTALE }, + { NFSERR_FBIG, EFBIG }, + { NFSERR_NOSPC, ENOSPC }, + { NFSERR_ROFS, EROFS }, + { NFSERR_NAMETOOLONG, ENAMETOOLONG }, + { NFSERR_NOTEMPTY, ENOTEMPTY }, + { NFSERR_DQUOT, EDQUOT }, + { NFSERR_STALE, ESTALE }, #ifdef EWFLUSH - { NFSERR_WFLUSH, EWFLUSH }, + { NFSERR_WFLUSH, EWFLUSH }, #endif - /* Throw in some NFSv3 values for even more fun (HP returns these) */ - { 71, EREMOTE }, + /* Throw in some NFSv3 values for even more fun (HP returns these) */ + { 71, EREMOTE }, - { -1, EIO } + { -1, EIO } }; static char *nfs_strerror(int stat) { - int i; - static char buf[256]; - - for (i = 0; nfs_errtbl[i].stat != (unsigned)-1; i++) { - if (nfs_errtbl[i].stat == (unsigned)stat) - return strerror(nfs_errtbl[i].errnum); - } - sprintf(buf, "unknown nfs status return value: %d", stat); - return buf; + int i; + static char buf[256]; + + for (i = 0; nfs_errtbl[i].stat != (unsigned)-1; i++) { + if (nfs_errtbl[i].stat == (unsigned)stat) + return strerror(nfs_errtbl[i].errnum); + } + sprintf(buf, "unknown nfs status return value: %d", stat); + return buf; } diff --git a/mdk-stage1/params.c b/mdk-stage1/params.c index 21898b3ee..692c3e511 100644 --- a/mdk-stage1/params.c +++ b/mdk-stage1/params.c @@ -29,79 +29,79 @@ static int param_number = 0; void process_cmdline(void) { - char buf[512]; - int size, i; - int fd = -1; - - if (IS_TESTING) { - log_message("TESTING: opening cmdline... "); - - if ((fd = open("cmdline", O_RDONLY)) == -1) - log_message("TESTING: could not open cmdline"); - } - - if (fd == -1) { - log_message("opening /proc/cmdline... "); - - if ((fd = open("/proc/cmdline", O_RDONLY)) == -1) - fatal_error("could not open /proc/cmdline"); - } - - size = read(fd, buf, sizeof(buf)); - buf[size-1] = '\0'; // -1 to eat the \n - close(fd); - - log_message("\t%s", buf); - - i = 0; - while (buf[i] != '\0') { - char *name, *value = NULL; - int j = i; - while (buf[i] != ' ' && buf[i] != '=' && buf[i] != '\0') - i++; - if (i == j) { - i++; - continue; - } - name = _memdup(&buf[j], i-j + 1); - name[i-j] = '\0'; - - if (buf[i] == '=') { - int k = i+1; - i++; - while (buf[i] != ' ' && buf[i] != '\0') - i++; - value = _memdup(&buf[k], i-k + 1); - value[i-k] = '\0'; - } - - params[param_number].name = name; - params[param_number].value = value; - param_number++; - if (!strcmp(name, "changedisk")) set_param(MODE_CHANGEDISK); - if (!strcmp(name, "updatemodules") || - !strcmp(name, "thirdparty")) set_param(MODE_THIRDPARTY); - if (!strcmp(name, "rescue") || - !strcmp(name, "kamethod")) set_param(MODE_RESCUE); - if (!strcmp(name, "rescue")) set_param(MODE_RESCUE); - if (!strcmp(name, "keepmounted")) set_param(MODE_KEEP_MOUNTED); - if (!strcmp(name, "noauto")) set_param(MODE_NOAUTO); - if (!strcmp(name, "netauto")) set_param(MODE_NETAUTO); - if (!strcmp(name, "debugstage1")) set_param(MODE_DEBUGSTAGE1); - if (!strcmp(name, "automatic")) { - set_param(MODE_AUTOMATIC); - grab_automatic_params(value); - } - if (buf[i] == '\0') - break; - i++; - } - - if (IS_AUTOMATIC && strcmp(get_auto_value("thirdparty"), "")) { - set_param(MODE_THIRDPARTY); - } - - log_message("\tgot %d args", param_number); + char buf[512]; + int size, i; + int fd = -1; + + if (IS_TESTING) { + log_message("TESTING: opening cmdline... "); + + if ((fd = open("cmdline", O_RDONLY)) == -1) + log_message("TESTING: could not open cmdline"); + } + + if (fd == -1) { + log_message("opening /proc/cmdline... "); + + if ((fd = open("/proc/cmdline", O_RDONLY)) == -1) + fatal_error("could not open /proc/cmdline"); + } + + size = read(fd, buf, sizeof(buf)); + buf[size-1] = '\0'; // -1 to eat the \n + close(fd); + + log_message("\t%s", buf); + + i = 0; + while (buf[i] != '\0') { + char *name, *value = NULL; + int j = i; + while (buf[i] != ' ' && buf[i] != '=' && buf[i] != '\0') + i++; + if (i == j) { + i++; + continue; + } + name = _memdup(&buf[j], i-j + 1); + name[i-j] = '\0'; + + if (buf[i] == '=') { + int k = i+1; + i++; + while (buf[i] != ' ' && buf[i] != '\0') + i++; + value = _memdup(&buf[k], i-k + 1); + value[i-k] = '\0'; + } + + params[param_number].name = name; + params[param_number].value = value; + param_number++; + if (!strcmp(name, "changedisk")) set_param(MODE_CHANGEDISK); + if (!strcmp(name, "updatemodules") || + !strcmp(name, "thirdparty")) set_param(MODE_THIRDPARTY); + if (!strcmp(name, "rescue") || + !strcmp(name, "kamethod")) set_param(MODE_RESCUE); + if (!strcmp(name, "rescue")) set_param(MODE_RESCUE); + if (!strcmp(name, "keepmounted")) set_param(MODE_KEEP_MOUNTED); + if (!strcmp(name, "noauto")) set_param(MODE_NOAUTO); + if (!strcmp(name, "netauto")) set_param(MODE_NETAUTO); + if (!strcmp(name, "debugstage1")) set_param(MODE_DEBUGSTAGE1); + if (!strcmp(name, "automatic")) { + set_param(MODE_AUTOMATIC); + grab_automatic_params(value); + } + if (buf[i] == '\0') + break; + i++; + } + + if (IS_AUTOMATIC && strcmp(get_auto_value("thirdparty"), "")) { + set_param(MODE_THIRDPARTY); + } + + log_message("\tgot %d args", param_number); } @@ -110,68 +110,68 @@ int stage1_mode = 0; int get_param(int i) { #ifdef SPAWN_INTERACTIVE - static int fd = 0; - char buf[5000]; - char * ptr; - int nb; - - if (fd <= 0) { - fd = open(interactive_fifo, O_RDONLY); - if (fd == -1) - return (stage1_mode & i); - fcntl(fd, F_SETFL, O_NONBLOCK); - } - - if (fd > 0) { - if ((nb = read(fd, buf, sizeof(buf))) > 0) { - buf[nb] = '\0'; - ptr = buf; - while ((ptr = strstr(ptr, "+ "))) { - if (!strncmp(ptr+2, "rescue", 6)) set_param(MODE_RESCUE); - ptr++; - } - ptr = buf; - while ((ptr = strstr(ptr, "- "))) { - if (!strncmp(ptr+2, "rescue", 6)) unset_param(MODE_RESCUE); - ptr++; - } - } - } + static int fd = 0; + char buf[5000]; + char * ptr; + int nb; + + if (fd <= 0) { + fd = open(interactive_fifo, O_RDONLY); + if (fd == -1) + return (stage1_mode & i); + fcntl(fd, F_SETFL, O_NONBLOCK); + } + + if (fd > 0) { + if ((nb = read(fd, buf, sizeof(buf))) > 0) { + buf[nb] = '\0'; + ptr = buf; + while ((ptr = strstr(ptr, "+ "))) { + if (!strncmp(ptr+2, "rescue", 6)) set_param(MODE_RESCUE); + ptr++; + } + ptr = buf; + while ((ptr = strstr(ptr, "- "))) { + if (!strncmp(ptr+2, "rescue", 6)) unset_param(MODE_RESCUE); + ptr++; + } + } + } #endif - return (stage1_mode & i); + return (stage1_mode & i); } char * get_param_valued(char *param_name) { - int i; - for (i = 0; i < param_number ; i++) - if (!strcmp(params[i].name, param_name)) - return params[i].value; + int i; + for (i = 0; i < param_number ; i++) + if (!strcmp(params[i].name, param_name)) + return params[i].value; - return NULL; + return NULL; } void set_param_valued(char *param_name, char *param_value) { - params[param_number].name = param_name; - params[param_number].value = param_value; - param_number++; + params[param_number].name = param_name; + params[param_number].value = param_value; + param_number++; } void set_param(int i) { - stage1_mode |= i; + stage1_mode |= i; } void unset_param(int i) { - stage1_mode &= ~i; + stage1_mode &= ~i; } void unset_automatic(void) { - log_message("unsetting automatic"); - unset_param(MODE_AUTOMATIC); - exit_bootsplash(); + log_message("unsetting automatic"); + unset_param(MODE_AUTOMATIC); + exit_bootsplash(); } diff --git a/mdk-stage1/partition.c b/mdk-stage1/partition.c index c5daf8693..83bfc5ce6 100644 --- a/mdk-stage1/partition.c +++ b/mdk-stage1/partition.c @@ -40,131 +40,131 @@ #include "partition.h" struct partition_detection_anchor { - off_t offset; - const char * anchor; + off_t offset; + const char * anchor; }; static int seek_and_compare(int fd, struct partition_detection_anchor anch) { - char buf[500]; - size_t count; - if (lseek(fd, anch.offset, SEEK_SET) == (off_t)-1) { - log_perror("seek failed"); - return -1; - } - count = read(fd, buf, strlen(anch.anchor)); - if (count != strlen(anch.anchor)) { - log_perror("read failed"); - return -1; - } - buf[count] = '\0'; - if (strcmp(anch.anchor, buf)) - return 1; - return 0; + char buf[500]; + size_t count; + if (lseek(fd, anch.offset, SEEK_SET) == (off_t)-1) { + log_perror("seek failed"); + return -1; + } + count = read(fd, buf, strlen(anch.anchor)); + if (count != strlen(anch.anchor)) { + log_perror("read failed"); + return -1; + } + buf[count] = '\0'; + if (strcmp(anch.anchor, buf)) + return 1; + return 0; } static const char * detect_partition_type(char * dev) { - struct partition_detection_info { - const char * name; - struct partition_detection_anchor anchor0; - struct partition_detection_anchor anchor1; - struct partition_detection_anchor anchor2; - }; - struct partition_detection_info partitions_signatures[] = { - { "Linux Swap", { 4086, "SWAP-SPACE" }, { 0, NULL }, { 0, NULL } }, - { "Linux Swap", { 4086, "SWAPSPACE2" }, { 0, NULL }, { 0, NULL } }, - { "Ext2", { 0x438, "\x53\xEF" }, { 0, NULL }, { 0, NULL } }, - { "ReiserFS", { 0x10034, "ReIsErFs" }, { 0, NULL }, { 0, NULL } }, - { "ReiserFS", { 0x10034, "ReIsEr2Fs" }, { 0, NULL }, { 0, NULL } }, - { "XFS", { 0, "XFSB" }, { 0x200, "XAGF" }, { 0x400, "XAGI" } }, - { "JFS", { 0x8000, "JFS1" }, { 0, NULL }, { 0, NULL } }, - { "NTFS", { 0x1FE, "\x55\xAA" }, { 0x3, "NTFS" }, { 0, NULL } }, - { "FAT32", { 0x1FE, "\x55\xAA" }, { 0x52, "FAT32" }, { 0, NULL } }, - { "FAT", { 0x1FE, "\x55\xAA" }, { 0x36, "FAT" }, { 0, NULL } }, - { "Linux LVM", { 0, "HM\1\0" }, { 0, NULL }, { 0, NULL } } - }; - int partitions_signatures_nb = sizeof(partitions_signatures) / sizeof(struct partition_detection_info); - int i; - int fd; + struct partition_detection_info { + const char * name; + struct partition_detection_anchor anchor0; + struct partition_detection_anchor anchor1; + struct partition_detection_anchor anchor2; + }; + struct partition_detection_info partitions_signatures[] = { + { "Linux Swap", { 4086, "SWAP-SPACE" }, { 0, NULL }, { 0, NULL } }, + { "Linux Swap", { 4086, "SWAPSPACE2" }, { 0, NULL }, { 0, NULL } }, + { "Ext2", { 0x438, "\x53\xEF" }, { 0, NULL }, { 0, NULL } }, + { "ReiserFS", { 0x10034, "ReIsErFs" }, { 0, NULL }, { 0, NULL } }, + { "ReiserFS", { 0x10034, "ReIsEr2Fs" }, { 0, NULL }, { 0, NULL } }, + { "XFS", { 0, "XFSB" }, { 0x200, "XAGF" }, { 0x400, "XAGI" } }, + { "JFS", { 0x8000, "JFS1" }, { 0, NULL }, { 0, NULL } }, + { "NTFS", { 0x1FE, "\x55\xAA" }, { 0x3, "NTFS" }, { 0, NULL } }, + { "FAT32", { 0x1FE, "\x55\xAA" }, { 0x52, "FAT32" }, { 0, NULL } }, + { "FAT", { 0x1FE, "\x55\xAA" }, { 0x36, "FAT" }, { 0, NULL } }, + { "Linux LVM", { 0, "HM\1\0" }, { 0, NULL }, { 0, NULL } } + }; + int partitions_signatures_nb = sizeof(partitions_signatures) / sizeof(struct partition_detection_info); + int i; + int fd; const char *part_type = NULL; - char device_fullname[50]; - strcpy(device_fullname, "/dev/"); - strcat(device_fullname, dev); - - if (ensure_dev_exists(device_fullname)) - return NULL; - log_message("guessing type of %s", device_fullname); - - if ((fd = open(device_fullname, O_RDONLY, 0)) < 0) { - log_perror("open"); - return NULL; - } - - for (i=0; i<partitions_signatures_nb; i++) { - int results = seek_and_compare(fd, partitions_signatures[i].anchor0); - if (results == -1) - goto detect_partition_type_end; - if (results == 1) - continue; - if (!partitions_signatures[i].anchor1.anchor) - goto detect_partition_found_it; - - results = seek_and_compare(fd, partitions_signatures[i].anchor1); - if (results == -1) - goto detect_partition_type_end; - if (results == 1) - continue; - if (!partitions_signatures[i].anchor2.anchor) - goto detect_partition_found_it; - - results = seek_and_compare(fd, partitions_signatures[i].anchor2); - if (results == -1) - goto detect_partition_type_end; - if (results == 1) - continue; - - detect_partition_found_it: - part_type = partitions_signatures[i].name; + char device_fullname[50]; + strcpy(device_fullname, "/dev/"); + strcat(device_fullname, dev); + + if (ensure_dev_exists(device_fullname)) + return NULL; + log_message("guessing type of %s", device_fullname); + + if ((fd = open(device_fullname, O_RDONLY, 0)) < 0) { + log_perror("open"); + return NULL; + } + + for (i=0; i<partitions_signatures_nb; i++) { + int results = seek_and_compare(fd, partitions_signatures[i].anchor0); + if (results == -1) + goto detect_partition_type_end; + if (results == 1) + continue; + if (!partitions_signatures[i].anchor1.anchor) + goto detect_partition_found_it; + + results = seek_and_compare(fd, partitions_signatures[i].anchor1); + if (results == -1) + goto detect_partition_type_end; + if (results == 1) + continue; + if (!partitions_signatures[i].anchor2.anchor) + goto detect_partition_found_it; + + results = seek_and_compare(fd, partitions_signatures[i].anchor2); + if (results == -1) + goto detect_partition_type_end; + if (results == 1) + continue; + + detect_partition_found_it: + part_type = partitions_signatures[i].name; break; - } + } detect_partition_type_end: - close(fd); - return part_type; + close(fd); + return part_type; } int list_partitions(char * dev_name, char ** parts, char ** comments) { - int major, minor, blocks; - char name[100]; - FILE * f; - int i = 0; - char buf[512]; - - if (!(f = fopen("/proc/partitions", "rb")) || !fgets(buf, sizeof(buf), f) || !fgets(buf, sizeof(buf), f)) { - log_perror(dev_name); + int major, minor, blocks; + char name[100]; + FILE * f; + int i = 0; + char buf[512]; + + if (!(f = fopen("/proc/partitions", "rb")) || !fgets(buf, sizeof(buf), f) || !fgets(buf, sizeof(buf), f)) { + log_perror(dev_name); return 1; - } - - while (fgets(buf, sizeof(buf), f)) { - memset(name, 0, sizeof(name)); - sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, name); - if ((strstr(name, dev_name) == name) && (blocks > 1) && (name[strlen(dev_name)] != '\0')) { - const char * partition_type = detect_partition_type(name); - parts[i] = strdup(name); - comments[i] = (char *) malloc(sizeof(char) * 100); - sprintf(comments[i], "size: %d Mbytes", blocks >> 10); - if (partition_type) { - strcat(comments[i], ", type: "); - strcat(comments[i], partition_type); - } - i++; - } - } - parts[i] = NULL; - fclose(f); + } + + while (fgets(buf, sizeof(buf), f)) { + memset(name, 0, sizeof(name)); + sscanf(buf, " %d %d %d %s", &major, &minor, &blocks, name); + if ((strstr(name, dev_name) == name) && (blocks > 1) && (name[strlen(dev_name)] != '\0')) { + const char * partition_type = detect_partition_type(name); + parts[i] = strdup(name); + comments[i] = (char *) malloc(sizeof(char) * 100); + sprintf(comments[i], "size: %d Mbytes", blocks >> 10); + if (partition_type) { + strcat(comments[i], ", type: "); + strcat(comments[i], partition_type); + } + i++; + } + } + parts[i] = NULL; + fclose(f); return 0; } diff --git a/mdk-stage1/pcmcia/probe.c b/mdk-stage1/pcmcia/probe.c index 222be6239..240fe3a17 100644 --- a/mdk-stage1/pcmcia/probe.c +++ b/mdk-stage1/pcmcia/probe.c @@ -12,6 +12,9 @@ * * * Code comes from /anonymous@projects.sourceforge.net:/pub/pcmcia-cs/pcmcia-cs-3.1.29.tar.bz2 + * + * FIXME: resync with latest pcmcia-cs-3.2.8 or with pcmciautils-0.18 (which uses sysfs) + * */ /*====================================================================== @@ -55,18 +58,15 @@ #include <errno.h> #include <fcntl.h> -//mdk-stage1// #include <pcmcia/config.h> #include "log.h" #include "pcmcia.h" /*====================================================================*/ -//mdk-stage1// #ifdef CONFIG_PCI - typedef struct { - u_short vendor, device; - char *modname; - char *name; + u_short vendor, device; + char *modname; + char *name; } pci_id_t; pci_id_t pci_id[] = { @@ -138,79 +138,40 @@ static int pci_probe(void) u_int device, vendor, i; FILE *f; -//mdk-stage1// if (!module) log_message("PCMCIA: probing PCI bus.."); if ((f = fopen("/proc/bus/pci/devices", "r")) != NULL) { - while (fgets(s, 256, f) != NULL) { - u_int n = strtoul(s+5, NULL, 16); - vendor = (n >> 16); device = (n & 0xffff); - if (vendor == 0x1217) { - driver = "yenta_socket"; - name = "O2 Micro|PCMCIA Controller"; - break; - } - for (i = 0; i < PCI_COUNT; i++) - if ((vendor == pci_id[i].vendor) && - (device == pci_id[i].device)) break; - if (i < PCI_COUNT) { - name = pci_id[i].name; - driver = pci_id[i].modname; - } - } + while (fgets(s, 256, f) != NULL) { + u_int n = strtoul(s+5, NULL, 16); + vendor = (n >> 16); device = (n & 0xffff); + if (vendor == 0x1217) { + driver = "yenta_socket"; + name = "O2 Micro|PCMCIA Controller"; + break; + } + for (i = 0; i < PCI_COUNT; i++) + if ((vendor == pci_id[i].vendor) && + (device == pci_id[i].device)) break; + if (i < PCI_COUNT) { + name = pci_id[i].name; + driver = pci_id[i].modname; + } + } } -//mdk-stage1// else if ((f = fopen("/proc/pci", "r")) != NULL) { -//mdk-stage1// while (fgets(s, 256, f) != NULL) { -//mdk-stage1// t = strstr(s, "Device id="); -//mdk-stage1// if (t) { -//mdk-stage1// device = strtoul(t+10, NULL, 16); -//mdk-stage1// t = strstr(s, "Vendor id="); -//mdk-stage1// vendor = strtoul(t+10, NULL, 16); -//mdk-stage1// for (i = 0; i < PCI_COUNT; i++) -//mdk-stage1// if ((vendor == pci_id[i].vendor) && -//mdk-stage1// (device == pci_id[i].device)) break; -//mdk-stage1// } else -//mdk-stage1// for (i = 0; i < PCI_COUNT; i++) -//mdk-stage1// if (strstr(s, pci_id[i].tag) != NULL) break; -//mdk-stage1// if (i != PCI_COUNT) { -//mdk-stage1// name = pci_id[i].name; -//mdk-stage1// break; -//mdk-stage1// } else { -//mdk-stage1// t = strstr(s, "CardBus bridge"); -//mdk-stage1// if (t != NULL) { -//mdk-stage1// name = t + 16; -//mdk-stage1// t = strchr(s, '('); -//mdk-stage1// t[-1] = '\0'; -//mdk-stage1// break; -//mdk-stage1// } -//mdk-stage1// } -//mdk-stage1// } -//mdk-stage1// } fclose(f); if (name) { -//mdk-stage1// if (module) -//mdk-stage1// printf("i82365\n"); -//mdk-stage1// else - log_message("\t%s found, 2 sockets (driver %s).", name, driver); - return 0; + log_message("\t%s found, 2 sockets (driver %s).", name, driver); + return 0; } else { -//mdk-stage1// if (!module) - log_message("\tnot found."); - return -ENODEV; + log_message("\tnot found."); + return -ENODEV; } } -//mdk-stage1// #endif /*====================================================================*/ -//mdk-stage1// #ifdef CONFIG_ISA -//mdk-stage1// -//mdk-stage1// #ifdef __GLIBC__ #include <sys/io.h> -//mdk-stage1// #else -//mdk-stage1// #include <asm/io.h> -//mdk-stage1// #endif typedef u_short ioaddr_t; #include "i82365.h" @@ -251,9 +212,7 @@ int i365_probe(void) int val, sock, done; char *name = "i82365sl"; -//mdk-stage1// if (!module) log_message("PCMCIA: probing for Intel PCIC (ISA).."); -//mdk-stage1// if (verbose) printf("\n"); sock = done = 0; if (ioperm(i365_base, 4, 1)) { @@ -262,39 +221,35 @@ int i365_probe(void) } ioperm(0x80, 1, 1); for (; sock < 2; sock++) { - val = i365_get(sock, I365_IDENT); -//mdk-stage1// if (verbose) -//mdk-stage1// printf(" ident(%d)=%#2.2x", sock, val); - switch (val) { - case 0x82: - name = "i82365sl A step"; - break; - case 0x83: - name = "i82365sl B step"; - break; - case 0x84: - name = "VLSI 82C146"; - break; - case 0x88: case 0x89: case 0x8a: - name = "IBM Clone"; - break; - case 0x8b: case 0x8c: - break; - default: - done = 1; - } - if (done) break; + val = i365_get(sock, I365_IDENT); + switch (val) { + case 0x82: + name = "i82365sl A step"; + break; + case 0x83: + name = "i82365sl B step"; + break; + case 0x84: + name = "VLSI 82C146"; + break; + case 0x88: case 0x89: case 0x8a: + name = "IBM Clone"; + break; + case 0x8b: case 0x8c: + break; + default: + done = 1; + } + if (done) break; } -//mdk-stage1// if (verbose) printf("\n "); if (sock == 0) { -//mdk-stage1// if (!module) - log_message("\tnot found."); - return -ENODEV; + log_message("\tnot found."); + return -ENODEV; } if ((sock == 2) && (strcmp(name, "VLSI 82C146") == 0)) - name = "i82365sl DF"; + name = "i82365sl DF"; /* Check for Vadem chips */ outb(0x0e, i365_base); @@ -302,49 +257,40 @@ int i365_probe(void) i365_bset(0, VG468_MISC, VG468_MISC_VADEMREV); val = i365_get(0, I365_IDENT); if (val & I365_IDENT_VADEM) { - if ((val & 7) < 4) - name = "Vadem VG-468"; - else - name = "Vadem VG-469"; - i365_bclr(0, VG468_MISC, VG468_MISC_VADEMREV); + if ((val & 7) < 4) + name = "Vadem VG-468"; + else + name = "Vadem VG-469"; + i365_bclr(0, VG468_MISC, VG468_MISC_VADEMREV); } /* Check for Cirrus CL-PD67xx chips */ i365_set(0, PD67_CHIP_INFO, 0); val = i365_get(0, PD67_CHIP_INFO); if ((val & PD67_INFO_CHIP_ID) == PD67_INFO_CHIP_ID) { - val = i365_get(0, PD67_CHIP_INFO); - if ((val & PD67_INFO_CHIP_ID) == 0) { - if (val & PD67_INFO_SLOTS) - name = "Cirrus CL-PD672x"; - else { - name = "Cirrus CL-PD6710"; - sock = 1; - } - i365_set(0, PD67_EXT_INDEX, 0xe5); - if (i365_get(0, PD67_EXT_INDEX) != 0xe5) - name = "VIA VT83C469"; - } + val = i365_get(0, PD67_CHIP_INFO); + if ((val & PD67_INFO_CHIP_ID) == 0) { + if (val & PD67_INFO_SLOTS) + name = "Cirrus CL-PD672x"; + else { + name = "Cirrus CL-PD6710"; + sock = 1; + } + i365_set(0, PD67_EXT_INDEX, 0xe5); + if (i365_get(0, PD67_EXT_INDEX) != 0xe5) + name = "VIA VT83C469"; + } } -//mdk-stage1// if (module) -//mdk-stage1// printf("i82365\n"); -//mdk-stage1// else - printf("\t%s found, %d sockets.\n", name, sock); + printf("\t%s found, %d sockets.\n", name, sock); return 0; } /* i365_probe */ -//mdk-stage1//#endif /* CONFIG_ISA */ - /*====================================================================*/ -//mdk-stage1//#ifdef CONFIG_ISA - #include "tcic.h" -//mdk-stage1//static ioaddr_t tcic_base = TCIC_BASE; - static u_char tcic_getb(ioaddr_t base, u_char reg) { u_char val = inb(base+reg); @@ -398,10 +344,9 @@ int tcic_probe_at(ioaddr_t base) /* Anything there?? */ for (i = 0; i < 0x10; i += 2) - if (tcic_getw(base, i) == 0xffff) - return -1; + if (tcic_getw(base, i) == 0xffff) + return -1; -//mdk-stage1// if (!module) log_message("\tat %#3.3x: ", base); fflush(stdout); /* Try to reset the chip */ @@ -412,13 +357,13 @@ int tcic_probe_at(ioaddr_t base) old = tcic_getw(base, TCIC_ADDR); tcic_setw(base, TCIC_ADDR, 0); if (tcic_getw(base, TCIC_ADDR) != 0) { - tcic_setw(base, TCIC_ADDR, old); - return -2; + tcic_setw(base, TCIC_ADDR, old); + return -2; } tcic_setw(base, TCIC_ADDR, 0xc3a5); if (tcic_getw(base, TCIC_ADDR) != 0xc3a5) - return -3; + return -3; return 2; } @@ -427,105 +372,55 @@ int tcic_probe(void) { int sock, id; -//mdk-stage1// if (!module) log_message("PCMCIA: probing for Databook TCIC-2 (ISA).."); fflush(stdout); if (ioperm(TCIC_BASE, 16, 1)) { - log_perror("PCMCIA: ioperm"); - return -1; + log_perror("PCMCIA: ioperm"); + return -1; } ioperm(0x80, 1, 1); sock = tcic_probe_at(TCIC_BASE); if (sock <= 0) { -//mdk-stage1// if (!module) - log_message("\tnot found."); - return -ENODEV; + log_message("\tnot found."); + return -ENODEV; } -//mdk-stage1// if (module) -//mdk-stage1// printf("tcic\n"); -//mdk-stage1// else { - id = get_tcic_id(TCIC_BASE); - switch (id) { - case TCIC_ID_DB86082: - log_message("DB86082"); break; - case TCIC_ID_DB86082A: - log_message("DB86082A"); break; - case TCIC_ID_DB86084: - log_message("DB86084"); break; - case TCIC_ID_DB86084A: - log_message("DB86084A"); break; - case TCIC_ID_DB86072: - log_message("DB86072"); break; - case TCIC_ID_DB86184: - log_message("DB86184"); break; - case TCIC_ID_DB86082B: - log_message("DB86082B"); break; - default: - log_message("Unknown TCIC-2 ID 0x%02x", id); - } - log_message(" found at %#6x, %d sockets.", TCIC_BASE, sock); -//mdk-stage1// } + id = get_tcic_id(TCIC_BASE); + switch (id) { + case TCIC_ID_DB86082: + log_message("DB86082"); break; + case TCIC_ID_DB86082A: + log_message("DB86082A"); break; + case TCIC_ID_DB86084: + log_message("DB86084"); break; + case TCIC_ID_DB86084A: + log_message("DB86084A"); break; + case TCIC_ID_DB86072: + log_message("DB86072"); break; + case TCIC_ID_DB86184: + log_message("DB86184"); break; + case TCIC_ID_DB86082B: + log_message("DB86082B"); break; + default: + log_message("Unknown TCIC-2 ID 0x%02x", id); + } + log_message(" found at %#6x, %d sockets.", TCIC_BASE, sock); return 0; } /* tcic_probe */ -//mdk-stage1// #endif /* CONFIG_ISA */ - -//mdk-stage1// /*====================================================================*/ -//mdk-stage1// -//mdk-stage1// int main(int argc, char *argv[]) -//mdk-stage1// { -//mdk-stage1// int optch, errflg; -//mdk-stage1// extern char *optarg; -//mdk-stage1// int verbose = 0, module = 0; -//mdk-stage1// -//mdk-stage1// errflg = 0; -//mdk-stage1// while ((optch = getopt(argc, argv, "t:vxm")) != -1) { -//mdk-stage1// switch (optch) { -//mdk-stage1// #ifdef CONFIG_ISA -//mdk-stage1// case 't': -//mdk-stage1// tcic_base = strtoul(optarg, NULL, 0); break; -//mdk-stage1// #endif -//mdk-stage1// case 'v': -//mdk-stage1// verbose = 1; break; -//mdk-stage1// case 'm': -//mdk-stage1// module = 1; break; -//mdk-stage1// default: -//mdk-stage1// errflg = 1; break; -//mdk-stage1// } -//mdk-stage1// } -//mdk-stage1// if (errflg || (optind < argc)) { -//mdk-stage1// fprintf(stderr, "usage: %s [-t tcic_base] [-v] [-m]\n", argv[0]); -//mdk-stage1// exit(EXIT_FAILURE); -//mdk-stage1// } -//mdk-stage1// -//mdk-stage1// #ifdef CONFIG_PCI -//mdk-stage1// if (pci_probe(verbose, module) == 0) -//mdk-stage1// exit(EXIT_SUCCESS); -//mdk-stage1// #endif -//mdk-stage1// #ifdef CONFIG_ISA -//mdk-stage1// if (i365_probe(verbose, module) == 0) -//mdk-stage1// exit(EXIT_SUCCESS); -//mdk-stage1// else if (tcic_probe(verbose, module, tcic_base) == 0) -//mdk-stage1// exit(EXIT_SUCCESS); -//mdk-stage1// #endif -//mdk-stage1// exit(EXIT_FAILURE); -//mdk-stage1// return 0; -//mdk-stage1// } - char * pcmcia_probe(void) { - if (!pci_probe()) - return driver; + if (!pci_probe()) + return driver; #if !defined(__x86_64__) - else if (!i365_probe()) - return "pd6729"; - else if (!tcic_probe()) - return "tcic"; + else if (!i365_probe()) + return "pd6729"; + else if (!tcic_probe()) + return "tcic"; #endif - else - return NULL; + else + return NULL; } diff --git a/mdk-stage1/pcmcia/startup.c b/mdk-stage1/pcmcia/startup.c index 4112a439c..e9004484a 100644 --- a/mdk-stage1/pcmcia/startup.c +++ b/mdk-stage1/pcmcia/startup.c @@ -1,7 +1,7 @@ /* * Startup tool for non statically mapped PCMCIA sockets * - * (C) 2005 Dominik Brodowski <linux@brodo.de> + * (C) 2005 Dominik Brodowski <linux@brodo.de> * * The initial developer of the original code is David A. Hinds * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds @@ -42,149 +42,149 @@ enum { static const char *resource_files[MAX_RESOURCE_FILES] = { - [RESOURCE_MEM] = "available_resources_mem", - [RESOURCE_IO] = "available_resources_io", + [RESOURCE_MEM] = "available_resources_mem", + [RESOURCE_IO] = "available_resources_io", }; #define PATH_TO_SOCKET "/sys/class/pcmcia_socket/" static int add_available_resource(unsigned int socket_no, unsigned int type, - unsigned int action, - unsigned long start, unsigned long end) + unsigned int action, + unsigned long start, unsigned long end) { - char file[SYSFS_PATH_MAX]; - char content[SYSFS_PATH_MAX]; - struct sysfs_attribute *attr; - int ret; - size_t len; + char file[SYSFS_PATH_MAX]; + char content[SYSFS_PATH_MAX]; + struct sysfs_attribute *attr; + int ret; + size_t len; - if (type >= MAX_RESOURCE_FILES) - return -EINVAL; + if (type >= MAX_RESOURCE_FILES) + return -EINVAL; - if (end <= start) - return -EINVAL; + if (end <= start) + return -EINVAL; - dprintf("%d %d %d 0x%lx 0x%lx\n", socket_no, type, action, start, end); + dprintf("%d %d %d 0x%lx 0x%lx\n", socket_no, type, action, start, end); - snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET "pcmcia_socket%u/%s", - socket_no, resource_files[type]); + snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET "pcmcia_socket%u/%s", + socket_no, resource_files[type]); - switch(action) { - case ADD_MANAGED_RESOURCE: - len = snprintf(content, SYSFS_PATH_MAX, - "0x%08lx - 0x%08lx", start, end); - break; + switch(action) { + case ADD_MANAGED_RESOURCE: + len = snprintf(content, SYSFS_PATH_MAX, + "0x%08lx - 0x%08lx", start, end); + break; - case REMOVE_MANAGED_RESOURCE: - len = snprintf(content, SYSFS_PATH_MAX, - "- 0x%08lx - 0x%08lx", start, end); - break; + case REMOVE_MANAGED_RESOURCE: + len = snprintf(content, SYSFS_PATH_MAX, + "- 0x%08lx - 0x%08lx", start, end); + break; - default: - return -EINVAL; - } + default: + return -EINVAL; + } - dprintf("content is %s\n", content); + dprintf("content is %s\n", content); - dprintf("file is %s\n", file); + dprintf("file is %s\n", file); - attr = sysfs_open_attribute(file); - if (!attr) - return -ENODEV; + attr = sysfs_open_attribute(file); + if (!attr) + return -ENODEV; - dprintf("open, len %d\n", len); + dprintf("open, len %d\n", len); - ret = sysfs_write_attribute(attr, content, len); + ret = sysfs_write_attribute(attr, content, len); - dprintf("ret is %d\n", ret); + dprintf("ret is %d\n", ret); - sysfs_close_attribute(attr); + sysfs_close_attribute(attr); - return (ret); + return (ret); } static int setup_done(unsigned int socket_no) { - int ret; - char file[SYSFS_PATH_MAX]; - struct sysfs_attribute *attr; + int ret; + char file[SYSFS_PATH_MAX]; + struct sysfs_attribute *attr; - snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET - "pcmcia_socket%u/available_resources_setup_done", - socket_no); + snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET + "pcmcia_socket%u/available_resources_setup_done", + socket_no); - attr = sysfs_open_attribute(file); - if (!attr) - return -ENODEV; + attr = sysfs_open_attribute(file); + if (!attr) + return -ENODEV; - ret = sysfs_write_attribute(attr, "42", 2); + ret = sysfs_write_attribute(attr, "42", 2); - sysfs_close_attribute(attr); + sysfs_close_attribute(attr); - return (ret); + return (ret); } static int disallow_irq(unsigned int socket_no, unsigned int irq) { - char file[SYSFS_PATH_MAX]; - char content[SYSFS_PATH_MAX]; - struct sysfs_attribute *attr; - unsigned int mask = 0xfff; - unsigned int new_mask; - int ret; - size_t len; - - if (irq >= 32) - return -EINVAL; - - len = snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET - "pcmcia_socket%u/card_irq_mask", - socket_no); - dprintf("file is %s\n", file); - - attr = sysfs_open_attribute(file); - if (!attr) - return -ENODEV; - - dprintf("open, len %d\n", len); - - ret = sysfs_read_attribute(attr); - if (ret) { - ret = -EINVAL; - goto out; - } + char file[SYSFS_PATH_MAX]; + char content[SYSFS_PATH_MAX]; + struct sysfs_attribute *attr; + unsigned int mask = 0xfff; + unsigned int new_mask; + int ret; + size_t len; - if (!attr->value || (attr->len < 6)) { - ret = -EIO; - goto out; - } + if (irq >= 32) + return -EINVAL; + + len = snprintf(file, SYSFS_PATH_MAX, PATH_TO_SOCKET + "pcmcia_socket%u/card_irq_mask", + socket_no); + dprintf("file is %s\n", file); + + attr = sysfs_open_attribute(file); + if (!attr) + return -ENODEV; + + dprintf("open, len %d\n", len); + + ret = sysfs_read_attribute(attr); + if (ret) { + ret = -EINVAL; + goto out; + } - ret = sscanf(attr->value, "0x%x\n", &mask); + if (!attr->value || (attr->len < 6)) { + ret = -EIO; + goto out; + } - new_mask = 1 << irq; + ret = sscanf(attr->value, "0x%x\n", &mask); - mask &= ~new_mask; + new_mask = 1 << irq; - len = snprintf(content, SYSFS_PATH_MAX, "0x%04x", mask); + mask &= ~new_mask; - dprintf("content is %s\n", content); + len = snprintf(content, SYSFS_PATH_MAX, "0x%04x", mask); - ret = sysfs_write_attribute(attr, content, len); + dprintf("content is %s\n", content); + + ret = sysfs_write_attribute(attr, content, len); out: - sysfs_close_attribute(attr); + sysfs_close_attribute(attr); - return (ret); + return (ret); } static void load_config(void) { if (chdir(configpath) != 0) { - syslog(LOG_ERR, "chdir to %s failed: %m", configpath); - exit(EXIT_FAILURE); + syslog(LOG_ERR, "chdir to %s failed: %m", configpath); + exit(EXIT_FAILURE); } parse_configfile("config.opts"); return; @@ -196,76 +196,76 @@ static void adjust_resources(unsigned int socket_no) adjust_list_t *al; for (al = root_adjust; al; al = al->next) { - switch (al->adj.Resource) { - case RES_MEMORY_RANGE: - add_available_resource(socket_no, RESOURCE_MEM, - al->adj.Action, - al->adj.resource.memory.Base, - al->adj.resource.memory.Base + - al->adj.resource.memory.Size - 1); - break; - case RES_IO_RANGE: - add_available_resource(socket_no, RESOURCE_IO, - al->adj.Action, - al->adj.resource.io.BasePort, - al->adj.resource.io.BasePort + - al->adj.resource.io.NumPorts - 1); - break; - case RES_IRQ: - if(al->adj.Action == REMOVE_MANAGED_RESOURCE) - disallow_irq(socket_no, al->adj.resource.irq.IRQ); - break; - } + switch (al->adj.Resource) { + case RES_MEMORY_RANGE: + add_available_resource(socket_no, RESOURCE_MEM, + al->adj.Action, + al->adj.resource.memory.Base, + al->adj.resource.memory.Base + + al->adj.resource.memory.Size - 1); + break; + case RES_IO_RANGE: + add_available_resource(socket_no, RESOURCE_IO, + al->adj.Action, + al->adj.resource.io.BasePort, + al->adj.resource.io.BasePort + + al->adj.resource.io.NumPorts - 1); + break; + case RES_IRQ: + if(al->adj.Action == REMOVE_MANAGED_RESOURCE) + disallow_irq(socket_no, al->adj.resource.irq.IRQ); + break; + } } } /* mdk-stage1 int main(int argc, char *argv[]) { - char *socket_no; - unsigned long socket, i; - unsigned int all_sockets = 0; - - - if ((socket_no = getenv("SOCKET_NO"))) { - socket = strtoul(socket_no, NULL, 0); - } else if (argc == 2) { - socket = strtoul(argv[1], NULL, 0); - } else if (argc == 1) { - socket = 0; - all_sockets = 1; - } else { - return -EINVAL; - } + char *socket_no; + unsigned long socket, i; + unsigned int all_sockets = 0; - load_config(); - for (i = 0; i < MAX_SOCKS; i++) { - if ((socket != i) && (!all_sockets)) - continue; + if ((socket_no = getenv("SOCKET_NO"))) { + socket = strtoul(socket_no, NULL, 0); + } else if (argc == 2) { + socket = strtoul(argv[1], NULL, 0); + } else if (argc == 1) { + socket = 0; + all_sockets = 1; + } else { + return -EINVAL; + } - adjust_resources(i); - setup_done(i); - } + load_config(); - return 0; + for (i = 0; i < MAX_SOCKS; i++) { + if ((socket != i) && (!all_sockets)) + continue; + + adjust_resources(i); + setup_done(i); + } + + return 0; } */ void pcmcia_socket_startup(int socket_no) { - unsigned long i; - unsigned int all_sockets = 0; + unsigned long i; + unsigned int all_sockets = 0; if (socket_no == -1) - all_sockets = 1; + all_sockets = 1; - load_config(); + load_config(); - for (i = 0; i < MAX_SOCKS; i++) { - if ((socket_no != i) && (!all_sockets)) - continue; + for (i = 0; i < MAX_SOCKS; i++) { + if ((socket_no != i) && (!all_sockets)) + continue; - adjust_resources(i); - setup_done(i); - } + adjust_resources(i); + setup_done(i); + } } diff --git a/mdk-stage1/probe-modules.c b/mdk-stage1/probe-modules.c index c282a8d1c..ad4f9e4cd 100644 --- a/mdk-stage1/probe-modules.c +++ b/mdk-stage1/probe-modules.c @@ -25,46 +25,46 @@ void exit_bootsplash(void) {} void stg1_error_message(char *msg, ...) { - va_list args; - va_start(args, msg); - verror_message(msg, args); - va_end(args); + va_list args; + va_start(args, msg); + verror_message(msg, args); + va_end(args); } void fatal_error(char *msg) { - log_message("FATAL ERROR IN MODULES LOADER: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg); - exit(EXIT_FAILURE); + log_message("FATAL ERROR IN MODULES LOADER: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg); + exit(EXIT_FAILURE); } int main(int argc, char **argv, char **env) { - enum media_bus bus = BUS_ANY; - char *module = NULL; - char options[500] = ""; + enum media_bus bus = BUS_ANY; + char *module = NULL; + char options[500] = ""; - if (argc > 1) { - if (streq(argv[1], "--usb")) { - bus = BUS_USB; - } else if (!ptr_begins_static_str(argv[1], "--")) { - int i; - module = argv[1]; - for (i = 2; i < argc; i++) { - strcat(options, argv[i]); - strcat(options, " "); - } - } - } + if (argc > 1) { + if (streq(argv[1], "--usb")) { + bus = BUS_USB; + } else if (!ptr_begins_static_str(argv[1], "--")) { + int i; + module = argv[1]; + for (i = 2; i < argc; i++) { + strcat(options, argv[i]); + strcat(options, " "); + } + } + } - open_log(); - init_modules_insmoding(); + open_log(); + init_modules_insmoding(); - if (module) { - my_insmod(module, ANY_DRIVER_TYPE, options, 0); - } else { - find_media(bus); - } + if (module) { + my_insmod(module, ANY_DRIVER_TYPE, options, 0); + } else { + find_media(bus); + } - close_log(); + close_log(); - return 0; + return 0; } diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c index 4f96c6e6d..5f9983efb 100644 --- a/mdk-stage1/probing.c +++ b/mdk-stage1/probing.c @@ -63,29 +63,29 @@ struct media_info { - char * name; - char * model; - enum media_type type; + char * name; + char * model; + enum media_type type; }; static void warning_insmod_failed(enum insmod_return r) { - if (IS_AUTOMATIC && r == INSMOD_FAILED_FILE_NOT_FOUND) - return; - if (r != INSMOD_OK) { - if (r == INSMOD_FAILED_FILE_NOT_FOUND) - stg1_error_message("This floppy doesn't contain the driver."); - else - stg1_error_message("Warning, installation of driver failed. (please include msg from <Alt-F3> for bugreports)"); - } + if (IS_AUTOMATIC && r == INSMOD_FAILED_FILE_NOT_FOUND) + return; + if (r != INSMOD_OK) { + if (r == INSMOD_FAILED_FILE_NOT_FOUND) + stg1_error_message("This floppy doesn't contain the driver."); + else + stg1_error_message("Warning, installation of driver failed. (please include msg from <Alt-F3> for bugreports)"); + } } #ifndef DISABLE_NETWORK struct net_description_elem { - char * intf_name; - char * intf_description; + char * intf_name; + char * intf_description; }; static struct net_description_elem net_descriptions[50]; static int net_descr_number = 0; @@ -95,52 +95,52 @@ static int net_intf_too_early_number = 0; static int net_intf_too_early_ptr = 0; const char * safe_descr(const char * text) { - return text ? text : "unknown"; + return text ? text : "unknown"; } void prepare_intf_descr(const char * intf_descr) { - intf_descr_for_discover = strdup(intf_descr); + intf_descr_for_discover = strdup(intf_descr); } void net_discovered_interface(char * intf_name) { - if (!intf_descr_for_discover) { - net_intf_too_early_name[net_intf_too_early_number++] = strdup(intf_name); - return; - } - if (!intf_name) { - if (net_intf_too_early_ptr >= net_intf_too_early_number) { - log_message("NET: was expecting another network interface (broken net module?)"); - return; - } - net_descriptions[net_descr_number].intf_name = net_intf_too_early_name[net_intf_too_early_ptr++]; - } - else - net_descriptions[net_descr_number].intf_name = strdup(intf_name); - net_descriptions[net_descr_number].intf_description = strdup(intf_descr_for_discover); - intf_descr_for_discover = NULL; - net_descr_number++; + if (!intf_descr_for_discover) { + net_intf_too_early_name[net_intf_too_early_number++] = strdup(intf_name); + return; + } + if (!intf_name) { + if (net_intf_too_early_ptr >= net_intf_too_early_number) { + log_message("NET: was expecting another network interface (broken net module?)"); + return; + } + net_descriptions[net_descr_number].intf_name = net_intf_too_early_name[net_intf_too_early_ptr++]; + } + else + net_descriptions[net_descr_number].intf_name = strdup(intf_name); + net_descriptions[net_descr_number].intf_description = strdup(intf_descr_for_discover); + intf_descr_for_discover = NULL; + net_descr_number++; } char * get_net_intf_description(char * intf_name) { - int i; - for (i = 0; i < net_descr_number ; i++) - if (!strcmp(net_descriptions[i].intf_name, intf_name)) - return net_descriptions[i].intf_description; - return strdup("unknown"); + int i; + for (i = 0; i < net_descr_number ; i++) + if (!strcmp(net_descriptions[i].intf_name, intf_name)) + return net_descriptions[i].intf_description; + return strdup("unknown"); } #endif static int device_match_modules_list(struct pciusb_entry *e, char **modules, unsigned int modules_len) { - int i; - if (!e->module) - return 0; - for (i = 0; i < modules_len; i++) - if (!strcmp(modules[i], e->module)) - return 1; - return 0; + int i; + if (!e->module) + return 0; + for (i = 0; i < modules_len; i++) + if (!strcmp(modules[i], e->module)) + return 1; + return 0; } struct pcitable_entry *detected_devices = NULL; @@ -148,171 +148,171 @@ int detected_devices_len = 0; static void detected_devices_destroy(void) { - if (detected_devices) - free(detected_devices); + if (detected_devices) + free(detected_devices); } static struct pcitable_entry *detected_device_new(void) { - static int detected_devices_maxlen = 0; - if (detected_devices_len >= detected_devices_maxlen) { - detected_devices_maxlen += 32; - if (detected_devices == NULL) - detected_devices = malloc(detected_devices_maxlen * sizeof(*detected_devices)); - else - detected_devices = realloc(detected_devices, detected_devices_maxlen * sizeof(*detected_devices)); - if (detected_devices == NULL) - log_perror("detected_device_new: could not (re)allocate table. Let it crash, sorry"); - } - return &detected_devices[detected_devices_len++]; + static int detected_devices_maxlen = 0; + if (detected_devices_len >= detected_devices_maxlen) { + detected_devices_maxlen += 32; + if (detected_devices == NULL) + detected_devices = malloc(detected_devices_maxlen * sizeof(*detected_devices)); + else + detected_devices = realloc(detected_devices, detected_devices_maxlen * sizeof(*detected_devices)); + if (detected_devices == NULL) + log_perror("detected_device_new: could not (re)allocate table. Let it crash, sorry"); + } + return &detected_devices[detected_devices_len++]; } /* FIXME: factorize with probe_that_type() */ static void add_detected_device(unsigned short vendor, unsigned short device, unsigned int subvendor, unsigned int subdevice, const char *name, const char *module) { - struct pcitable_entry *dev = detected_device_new(); - dev->vendor = vendor; - dev->device = device; - dev->subvendor = subvendor; - dev->subdevice = subdevice; - strncpy(dev->module, module, sizeof(dev->module) - 1); - dev->module[sizeof(dev->module) - 1] = '\0'; - strncpy(dev->description, safe_descr(name), sizeof(dev->description) - 1); - dev->description[sizeof(dev->description) - 1] = '\0'; - log_message("detected device (%04x, %04x, %04x, %04x, %s, %s)", vendor, device, subvendor, subdevice, name, module); + struct pcitable_entry *dev = detected_device_new(); + dev->vendor = vendor; + dev->device = device; + dev->subvendor = subvendor; + dev->subdevice = subdevice; + strncpy(dev->module, module, sizeof(dev->module) - 1); + dev->module[sizeof(dev->module) - 1] = '\0'; + strncpy(dev->description, safe_descr(name), sizeof(dev->description) - 1); + dev->description[sizeof(dev->description) - 1] = '\0'; + log_message("detected device (%04x, %04x, %04x, %04x, %s, %s)", vendor, device, subvendor, subdevice, name, module); } static int add_detected_device_if_match(struct pciusb_entry *e, char **modules, unsigned int modules_len) { - int ret = device_match_modules_list(e, modules, modules_len); - if (ret) - add_detected_device(e->vendor, e->device, e->subvendor, e->subdevice, - e->text, e->module); - return ret; + int ret = device_match_modules_list(e, modules, modules_len); + if (ret) + add_detected_device(e->vendor, e->device, e->subvendor, e->subdevice, + e->text, e->module); + return ret; } void probing_detect_devices() { static int already_detected_devices = 0; - struct pciusb_entries entries; - int i; + struct pciusb_entries entries; + int i; - if (already_detected_devices) - return; + if (already_detected_devices) + return; - entries = pci_probe(); - for (i = 0; i < entries.nb; i++) { - struct pciusb_entry *e = &entries.entries[i]; + entries = pci_probe(); + for (i = 0; i < entries.nb; i++) { + struct pciusb_entry *e = &entries.entries[i]; #ifndef DISABLE_PCIADAPTERS #ifndef DISABLE_MEDIAS - if (add_detected_device_if_match(e, medias_ide_pci_modules, medias_ide_pci_modules_len)) - continue; - if (add_detected_device_if_match(e, medias_other_pci_modules, medias_other_pci_modules_len)) - continue; + if (add_detected_device_if_match(e, medias_ide_pci_modules, medias_ide_pci_modules_len)) + continue; + if (add_detected_device_if_match(e, medias_other_pci_modules, medias_other_pci_modules_len)) + continue; #endif #ifndef DISABLE_NETWORK - if (add_detected_device_if_match(e, network_pci_modules, network_pci_modules_len)) - continue; + if (add_detected_device_if_match(e, network_pci_modules, network_pci_modules_len)) + continue; #endif #ifdef ENABLE_USB - if (add_detected_device_if_match(e, usb_controller_modules, usb_controller_modules_len)) - continue; + if (add_detected_device_if_match(e, usb_controller_modules, usb_controller_modules_len)) + continue; #endif #endif - /* device can't be found in built-in pcitables, but keep it */ - add_detected_device(e->vendor, e->device, e->subvendor, e->subdevice, e->text, e->module); - } - pciusb_free(&entries); + /* device can't be found in built-in pcitables, but keep it */ + add_detected_device(e->vendor, e->device, e->subvendor, e->subdevice, e->text, e->module); + } + pciusb_free(&entries); - already_detected_devices = 1; + already_detected_devices = 1; } void probing_destroy(void) { - detected_devices_destroy(); + detected_devices_destroy(); } #ifndef DISABLE_MEDIAS static const char * get_alternate_module(const char * name) { - struct alternate_mapping { - const char * a; - const char * b; - }; - static struct alternate_mapping mappings[] = { + struct alternate_mapping { + const char * a; + const char * b; + }; + static struct alternate_mapping mappings[] = { { "ahci", "ata_piix" }, }; - int mappings_nb = sizeof(mappings) / sizeof(struct alternate_mapping); + int mappings_nb = sizeof(mappings) / sizeof(struct alternate_mapping); int i; - for (i=0; i<mappings_nb; i++) { - const char * alternate = NULL; - if (streq(name, mappings[i].a)) - alternate = mappings[i].b; - else if (streq(name, mappings[i].b)) - alternate = mappings[i].a; - if (alternate) { - log_message("found alternate module %s for driver %s", alternate, name); - return alternate; - } - } + for (i=0; i<mappings_nb; i++) { + const char * alternate = NULL; + if (streq(name, mappings[i].a)) + alternate = mappings[i].b; + else if (streq(name, mappings[i].b)) + alternate = mappings[i].a; + if (alternate) { + log_message("found alternate module %s for driver %s", alternate, name); + return alternate; + } + } return NULL; } #endif void discovered_device(enum driver_type type, const char * description, const char * driver) { - description = safe_descr(description); + description = safe_descr(description); - enum insmod_return failed = INSMOD_FAILED; + enum insmod_return failed = INSMOD_FAILED; #ifndef DISABLE_MEDIAS - if (type == MEDIA_ADAPTERS) { - const char * alternate = NULL; - wait_message("Loading driver for media adapter:\n \n%s", description); - failed = my_insmod(driver, MEDIA_ADAPTERS, NULL, 1); - alternate = get_alternate_module(driver); - if (!IS_NOAUTO && alternate) { - failed = failed || my_insmod(alternate, MEDIA_ADAPTERS, NULL, 1); - } - remove_wait_message(); - warning_insmod_failed(failed); - } + if (type == MEDIA_ADAPTERS) { + const char * alternate = NULL; + wait_message("Loading driver for media adapter:\n \n%s", description); + failed = my_insmod(driver, MEDIA_ADAPTERS, NULL, 1); + alternate = get_alternate_module(driver); + if (!IS_NOAUTO && alternate) { + failed = failed || my_insmod(alternate, MEDIA_ADAPTERS, NULL, 1); + } + remove_wait_message(); + warning_insmod_failed(failed); + } #endif #ifndef DISABLE_NETWORK - if (type == NETWORK_DEVICES) { - wait_message("Loading driver for network device:\n \n%s", description); - prepare_intf_descr(description); - failed = my_insmod(driver, NETWORK_DEVICES, NULL, 1); - warning_insmod_failed(failed); - remove_wait_message(); - if (intf_descr_for_discover) /* for modules providing more than one net intf */ - net_discovered_interface(NULL); - } + if (type == NETWORK_DEVICES) { + wait_message("Loading driver for network device:\n \n%s", description); + prepare_intf_descr(description); + failed = my_insmod(driver, NETWORK_DEVICES, NULL, 1); + warning_insmod_failed(failed); + remove_wait_message(); + if (intf_descr_for_discover) /* for modules providing more than one net intf */ + net_discovered_interface(NULL); + } #endif #ifdef ENABLE_USB - if (type == USB_CONTROLLERS) + if (type == USB_CONTROLLERS) /* we can't allow additional modules floppy since we need usbhid for keystrokes of usb keyboards */ - failed = my_insmod(driver, USB_CONTROLLERS, NULL, 0); + failed = my_insmod(driver, USB_CONTROLLERS, NULL, 0); #endif } void probe_pci_modules(enum driver_type type, char **pci_modules, unsigned int pci_modules_len) { - struct pciusb_entries entries; - int i; - - entries = pci_probe(); - for (i = 0; i < entries.nb; i++) { - struct pciusb_entry *e = &entries.entries[i]; - if (device_match_modules_list(e, pci_modules, pci_modules_len)) { - log_message("PCI: device %04x %04x %04x %04x is \"%s\", driver is %s", - e->vendor, e->device, e->subvendor, e->subdevice, safe_descr(e->text), e->module); - discovered_device(type, e->text, e->module); - } - } - pciusb_free(&entries); + struct pciusb_entries entries; + int i; + + entries = pci_probe(); + for (i = 0; i < entries.nb; i++) { + struct pciusb_entry *e = &entries.entries[i]; + if (device_match_modules_list(e, pci_modules, pci_modules_len)) { + log_message("PCI: device %04x %04x %04x %04x is \"%s\", driver is %s", + e->vendor, e->device, e->subvendor, e->subdevice, safe_descr(e->text), e->module); + discovered_device(type, e->text, e->module); + } + } + pciusb_free(&entries); } /** Loads modules for known virtio devices @@ -325,46 +325,46 @@ void probe_pci_modules(enum driver_type type, char **pci_modules, unsigned int */ void probe_virtio_modules(void) { - struct pciusb_entries entries; - int i; - char *name; - char *options; - int loaded_pci = 0; - - entries = pci_probe(); - for (i = 0; i < entries.nb; i++) { - struct pciusb_entry *e = &entries.entries[i]; - if (e->vendor == VIRTIO_PCI_VENDOR) { - if (!loaded_pci) { - log_message("loading virtio-pci"); - my_insmod("virtio_pci", ANY_DRIVER_TYPE, NULL, 0); - loaded_pci = 1; - } - - name = NULL; - options = NULL; - - switch (e->subdevice) { - case VIRTIO_ID_NET: - name = "virtio_net"; - options = "csum=0"; - break; - case VIRTIO_ID_BLOCK: - name = "virtio_blk"; - break; - case VIRTIO_ID_BALLOON: - name = "virtio_balloon"; - break; - default: - log_message("warning: unknown virtio device %04x", e->device); - } - if (name) { - log_message("virtio: loading %s", name); - my_insmod(name, ANY_DRIVER_TYPE, options, 0); - } - } - } - pciusb_free(&entries); + struct pciusb_entries entries; + int i; + char *name; + char *options; + int loaded_pci = 0; + + entries = pci_probe(); + for (i = 0; i < entries.nb; i++) { + struct pciusb_entry *e = &entries.entries[i]; + if (e->vendor == VIRTIO_PCI_VENDOR) { + if (!loaded_pci) { + log_message("loading virtio-pci"); + my_insmod("virtio_pci", ANY_DRIVER_TYPE, NULL, 0); + loaded_pci = 1; + } + + name = NULL; + options = NULL; + + switch (e->subdevice) { + case VIRTIO_ID_NET: + name = "virtio_net"; + options = "csum=0"; + break; + case VIRTIO_ID_BLOCK: + name = "virtio_blk"; + break; + case VIRTIO_ID_BALLOON: + name = "virtio_balloon"; + break; + default: + log_message("warning: unknown virtio device %04x", e->device); + } + if (name) { + log_message("virtio: loading %s", name); + my_insmod(name, ANY_DRIVER_TYPE, options, 0); + } + } + } + pciusb_free(&entries); } #ifdef ENABLE_USB @@ -377,172 +377,167 @@ void probe_that_type(enum driver_type type, enum media_bus bus __attribute__ ((u static int already_loaded_usb_scsi = 0; static int already_probed_virtio_devices = 0; - /* ---- PCI probe ---------------------------------------------- */ - if (bus != BUS_USB) { - switch (type) { + /* ---- PCI probe ---------------------------------------------- */ + if (bus != BUS_USB) { + switch (type) { #ifndef DISABLE_PCIADAPTERS #ifndef DISABLE_MEDIAS - static int already_probed_media_adapters = 0; - case MEDIA_ADAPTERS: - if (already_probed_media_adapters) - break; - already_probed_media_adapters = 1; - probe_pci_modules(type, medias_ide_pci_modules, medias_ide_pci_modules_len); - probe_pci_modules(type, medias_other_pci_modules, medias_other_pci_modules_len); - break; + static int already_probed_media_adapters = 0; + case MEDIA_ADAPTERS: + if (already_probed_media_adapters) + break; + already_probed_media_adapters = 1; + probe_pci_modules(type, medias_ide_pci_modules, medias_ide_pci_modules_len); + probe_pci_modules(type, medias_other_pci_modules, medias_other_pci_modules_len); + break; #endif #ifndef DISABLE_NETWORK - case NETWORK_DEVICES: - probe_pci_modules(type, network_pci_modules, network_pci_modules_len); - break; + case NETWORK_DEVICES: + probe_pci_modules(type, network_pci_modules, network_pci_modules_len); + break; #endif #endif #ifdef ENABLE_USB - case USB_CONTROLLERS: - if (already_probed_usb_controllers || IS_NOAUTO) - break; - already_probed_usb_controllers = 1; - probe_pci_modules(type, usb_controller_modules, usb_controller_modules_len); - break; + case USB_CONTROLLERS: + if (already_probed_usb_controllers || IS_NOAUTO) + break; + already_probed_usb_controllers = 1; + probe_pci_modules(type, usb_controller_modules, usb_controller_modules_len); + break; #endif - case VIRTIO_DEVICES: - if (already_probed_virtio_devices) - break; - probe_virtio_modules(); - already_probed_virtio_devices = 1; - break; - default: - break; - } - } + case VIRTIO_DEVICES: + if (already_probed_virtio_devices) + break; + probe_virtio_modules(); + already_probed_virtio_devices = 1; + break; + default: + break; + } + } #ifdef ENABLE_USB - /* ---- USB probe ---------------------------------------------- */ - if ((bus == BUS_USB || bus == BUS_ANY) && !(IS_NOAUTO)) { - static int already_mounted_usbdev = 0; - struct pciusb_entries entries; - int i; - - if (!already_probed_usb_controllers) - probe_that_type(USB_CONTROLLERS, BUS_ANY); - - if (!already_mounted_usbdev) { - already_mounted_usbdev = 1; - if (mount("none", "/proc/bus/usb", "usbfs", 0, NULL) && - mount("none", "/proc/bus/usb", "usbdevfs", 0, NULL)) { - log_message("USB: couldn't mount /proc/bus/usb"); - goto end_usb_probe; - } - wait_message("Detecting USB devices."); - sleep(4); /* sucking background work */ - my_insmod("usbhid", ANY_DRIVER_TYPE, NULL, 0); - remove_wait_message(); - } - - if (type != NETWORK_DEVICES) - goto end_usb_probe; - - entries = usb_probe(); - for (i = 0; i < entries.nb; i++) { - struct pciusb_entry *e = &entries.entries[i]; - if (device_match_modules_list(e, usb_modules, usb_modules_len)) { - log_message("USB: device %04x %04x is \"%s\" (%s)", e->vendor, e->device, safe_descr(e->text), e->module); - discovered_device(type, e->text, e->module); - } - } - pciusb_free(&entries); - end_usb_probe:; - } + /* ---- USB probe ---------------------------------------------- */ + if ((bus == BUS_USB || bus == BUS_ANY) && !(IS_NOAUTO)) { + static int already_mounted_usbdev = 0; + struct pciusb_entries entries; + int i; + + if (!already_probed_usb_controllers) + probe_that_type(USB_CONTROLLERS, BUS_ANY); + + if (!already_mounted_usbdev) { + already_mounted_usbdev = 1; + wait_message("Detecting USB devices."); + sleep(4); /* sucking background work */ + my_insmod("usbhid", ANY_DRIVER_TYPE, NULL, 0); + remove_wait_message(); + } + + if (type != NETWORK_DEVICES) + goto end_usb_probe; + + entries = usb_probe(); + for (i = 0; i < entries.nb; i++) { + struct pciusb_entry *e = &entries.entries[i]; + if (device_match_modules_list(e, usb_modules, usb_modules_len)) { + log_message("USB: device %04x %04x is \"%s\" (%s)", e->vendor, e->device, safe_descr(e->text), e->module); + discovered_device(type, e->text, e->module); + } + } + pciusb_free(&entries); + end_usb_probe:; + } #endif #ifdef ENABLE_PCMCIA - /* ---- PCMCIA probe ---------------------------------------------- */ - if ((bus == BUS_PCMCIA || bus == BUS_ANY) && !(IS_NOAUTO)) { - struct pcmcia_alias * pcmciadb = NULL; - unsigned int len = 0; - char *base = "/sys/bus/pcmcia/devices"; - DIR *dir; - struct dirent *dent; - - dir = opendir(base); - if (dir == NULL) - goto end_pcmcia_probe; - - switch (type) { + /* ---- PCMCIA probe ---------------------------------------------- */ + if ((bus == BUS_PCMCIA || bus == BUS_ANY) && !(IS_NOAUTO)) { + struct pcmcia_alias * pcmciadb = NULL; + unsigned int len = 0; + char *base = "/sys/bus/pcmcia/devices"; + DIR *dir; + struct dirent *dent; + + dir = opendir(base); + if (dir == NULL) + goto end_pcmcia_probe; + + switch (type) { #ifndef DISABLE_MEDIAS - case MEDIA_ADAPTERS: - pcmciadb = medias_pcmcia_ids; - len = medias_pcmcia_num_ids; - break; + case MEDIA_ADAPTERS: + pcmciadb = medias_pcmcia_ids; + len = medias_pcmcia_num_ids; + break; #endif #ifndef DISABLE_NETWORK - case NETWORK_DEVICES: - pcmciadb = network_pcmcia_ids; - len = network_pcmcia_num_ids; - break; + case NETWORK_DEVICES: + pcmciadb = network_pcmcia_ids; + len = network_pcmcia_num_ids; + break; #endif - default: - goto end_pcmcia_probe; + default: + goto end_pcmcia_probe; } for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { - struct sysfs_attribute *modalias_attr; - char keyfile[256]; - int i, id; - - if (dent->d_name[0] == '.') - continue; - - log_message("PCMCIA: device found %s", dent->d_name); - - snprintf(keyfile, sizeof(keyfile)-1, "%s/%s/modalias", base, dent->d_name); - modalias_attr = sysfs_open_attribute(keyfile); - if (!modalias_attr) - continue; - if (sysfs_read_attribute(modalias_attr) != 0 || !modalias_attr->value) { - sysfs_close_attribute(modalias_attr); - continue; - } - - log_message("PCMCIA: device found %s", modalias_attr->value); - - for (i = 0; i < len; i++) { - if (!fnmatch(pcmciadb[i].modalias, modalias_attr->value, 0)) { - char product[256]; - - log_message("PCMCIA: device found %s (%s)", pcmciadb[i].modalias, pcmciadb[i].module); - strcpy(product, ""); - for (id = 1; id <= 4; id++) { - struct sysfs_attribute *product_attr; - snprintf(keyfile, sizeof(keyfile)-1, "%s/%s/prod_id%d", base, dent->d_name, id); - product_attr = sysfs_open_attribute(keyfile); - if (!product_attr) - continue; - if (sysfs_read_attribute(product_attr) || !product_attr->value) { - sysfs_close_attribute(product_attr); - continue; - } - snprintf(product + strlen(product), sizeof(product)-strlen(product)-1, "%s%s", product[0] ? " " : "", product_attr->value); - if (product[strlen(product)-1] == '\n') - product[strlen(product)-1] = '\0'; - sysfs_close_attribute(product_attr); - } - - if (!product[0]) - strcpy(product, "PCMCIA device"); - - log_message("PCMCIA: device found %s (%s)", product, pcmciadb[i].module); - discovered_device(type, product, pcmciadb[i].module); - } - } - - sysfs_close_attribute(modalias_attr); - } - end_pcmcia_probe:; - if (dir) - closedir(dir); - } + struct sysfs_attribute *modalias_attr; + char keyfile[256]; + int i, id; + + if (dent->d_name[0] == '.') + continue; + + log_message("PCMCIA: device found %s", dent->d_name); + + snprintf(keyfile, sizeof(keyfile)-1, "%s/%s/modalias", base, dent->d_name); + modalias_attr = sysfs_open_attribute(keyfile); + if (!modalias_attr) + continue; + if (sysfs_read_attribute(modalias_attr) != 0 || !modalias_attr->value) { + sysfs_close_attribute(modalias_attr); + continue; + } + + log_message("PCMCIA: device found %s", modalias_attr->value); + + for (i = 0; i < len; i++) { + if (!fnmatch(pcmciadb[i].modalias, modalias_attr->value, 0)) { + char product[256]; + + log_message("PCMCIA: device found %s (%s)", pcmciadb[i].modalias, pcmciadb[i].module); + strcpy(product, ""); + for (id = 1; id <= 4; id++) { + struct sysfs_attribute *product_attr; + snprintf(keyfile, sizeof(keyfile)-1, "%s/%s/prod_id%d", base, dent->d_name, id); + product_attr = sysfs_open_attribute(keyfile); + if (!product_attr) + continue; + if (sysfs_read_attribute(product_attr) || !product_attr->value) { + sysfs_close_attribute(product_attr); + continue; + } + snprintf(product + strlen(product), sizeof(product)-strlen(product)-1, "%s%s", product[0] ? " " : "", product_attr->value); + if (product[strlen(product)-1] == '\n') + product[strlen(product)-1] = '\0'; + sysfs_close_attribute(product_attr); + } + + if (!product[0]) + strcpy(product, "PCMCIA device"); + + log_message("PCMCIA: device found %s (%s)", product, pcmciadb[i].module); + discovered_device(type, product, pcmciadb[i].module); + } + } + + sysfs_close_attribute(modalias_attr); + } + end_pcmcia_probe:; + if (dir) + closedir(dir); + } #endif /* be sure to load usb-storage after media adapters, so that they are in @@ -567,202 +562,202 @@ static struct media_info * medias = NULL; void find_media(enum media_bus bus) { - char b[50]; - char buf[5000]; - struct media_info tmp[50]; - int count = 0; + char b[50]; + char buf[5000]; + struct media_info tmp[50]; + int count = 0; int fd; - if (medias) - free(medias); /* that does not free the strings, by the way */ - - log_message("looking for media adapters"); - probe_that_type(MEDIA_ADAPTERS, bus); - - /* ----------------------------------------------- */ - if (bus != BUS_IDE && bus != BUS_ANY) - goto find_media_after_ide; - log_message("looking for ide media"); - - strcpy(b, "/proc/ide/hd"); - for (b[12] = 'a'; b[12] <= 't'; b[12]++) { - int i; - char ide_disk[] = "disk"; - char ide_cdrom[] = "cdrom"; - char ide_tape[] = "tape"; - char ide_floppy[] = "floppy"; - - /* first, test if file exists (will tell if attached medium exists) */ - b[13] = '\0'; - if (access(b, R_OK)) - continue; - - tmp[count].name = strdup("hda"); - tmp[count].name[2] = b[12]; - - /* media type */ - strcpy(b + 13, "/media"); - fd = open(b, O_RDONLY); - if (fd == -1) { - log_message("failed to open %s for reading", b); - continue; - } - - i = read(fd, buf, sizeof(buf)); - if (i == -1) { - log_message("failed to read %s", b); - continue; - } - buf[i] = '\0'; - close(fd); - - if (ptr_begins_static_str(buf, ide_disk)) - tmp[count].type = DISK; - else if (ptr_begins_static_str(buf, ide_cdrom)) - tmp[count].type = CDROM; - else if (ptr_begins_static_str(buf, ide_tape)) - tmp[count].type = TAPE; - else if (ptr_begins_static_str(buf, ide_floppy)) - tmp[count].type = FLOPPY; - else - tmp[count].type = UNKNOWN_MEDIA; - - /* media model */ - strcpy(b + 13, "/model"); - fd = open(b, O_RDONLY); - if (fd == -1) { - log_message("failed to open %s for reading", b); - continue; - } - - i = read(fd, buf, sizeof(buf)); - if (i <= 0) { - log_message("failed to read %s", b); - tmp[count].model = strdup("(none)"); - } - else { - buf[i-1] = '\0'; /* eat the \n */ - tmp[count].model = strdup(buf); - } - close(fd); - - log_message("IDE/%d: %s is a %s", tmp[count].type, tmp[count].name, tmp[count].model); - count++; - } + if (medias) + free(medias); /* that does not free the strings, by the way */ + + log_message("looking for media adapters"); + probe_that_type(MEDIA_ADAPTERS, bus); + + /* ----------------------------------------------- */ + if (bus != BUS_IDE && bus != BUS_ANY) + goto find_media_after_ide; + log_message("looking for ide media"); + + strcpy(b, "/proc/ide/hd"); + for (b[12] = 'a'; b[12] <= 't'; b[12]++) { + int i; + char ide_disk[] = "disk"; + char ide_cdrom[] = "cdrom"; + char ide_tape[] = "tape"; + char ide_floppy[] = "floppy"; + + /* first, test if file exists (will tell if attached medium exists) */ + b[13] = '\0'; + if (access(b, R_OK)) + continue; + + tmp[count].name = strdup("hda"); + tmp[count].name[2] = b[12]; + + /* media type */ + strcpy(b + 13, "/media"); + fd = open(b, O_RDONLY); + if (fd == -1) { + log_message("failed to open %s for reading", b); + continue; + } + + i = read(fd, buf, sizeof(buf)); + if (i == -1) { + log_message("failed to read %s", b); + continue; + } + buf[i] = '\0'; + close(fd); + + if (ptr_begins_static_str(buf, ide_disk)) + tmp[count].type = DISK; + else if (ptr_begins_static_str(buf, ide_cdrom)) + tmp[count].type = CDROM; + else if (ptr_begins_static_str(buf, ide_tape)) + tmp[count].type = TAPE; + else if (ptr_begins_static_str(buf, ide_floppy)) + tmp[count].type = FLOPPY; + else + tmp[count].type = UNKNOWN_MEDIA; + + /* media model */ + strcpy(b + 13, "/model"); + fd = open(b, O_RDONLY); + if (fd == -1) { + log_message("failed to open %s for reading", b); + continue; + } + + i = read(fd, buf, sizeof(buf)); + if (i <= 0) { + log_message("failed to read %s", b); + tmp[count].model = strdup("(none)"); + } + else { + buf[i-1] = '\0'; /* eat the \n */ + tmp[count].model = strdup(buf); + } + close(fd); + + log_message("IDE/%d: %s is a %s", tmp[count].type, tmp[count].name, tmp[count].model); + count++; + } find_media_after_ide: - /* ----------------------------------------------- */ - if (bus != BUS_SCSI && bus != BUS_USB && bus != BUS_PCMCIA && bus != BUS_ANY) - goto find_media_after_scsi; - log_message("looking for scsi media"); + /* ----------------------------------------------- */ + if (bus != BUS_SCSI && bus != BUS_USB && bus != BUS_PCMCIA && bus != BUS_ANY) + goto find_media_after_scsi; + log_message("looking for scsi media"); - fd = open("/proc/scsi/scsi", O_RDONLY); - if (fd != -1) { + fd = open("/proc/scsi/scsi", O_RDONLY); + if (fd != -1) { FILE * f; - enum { SCSI_TOP, SCSI_HOST, SCSI_VENDOR, SCSI_TYPE } state = SCSI_TOP; - char * start, * chptr, * next, * end; - char scsi_disk_count = 'a'; - char scsi_cdrom_count = '0'; - char scsi_tape_count = '0'; - - char scsi_no_devices[] = "Attached devices: none"; - char scsi_some_devices[] = "Attached devices:"; - char scsi_host[] = "Host: "; - char scsi_vendor[] = " Vendor: "; - - int i = read(fd, &buf, sizeof(buf)-1); - if (i < 1) { - close(fd); - goto end_scsi; - } - close(fd); - buf[i] = '\0'; - - if (ptr_begins_static_str(buf, scsi_no_devices)) - goto end_scsi; - - start = buf; - while (*start) { - char tmp_model[50]; - char tmp_name[10]; - - chptr = start; - while (*chptr != '\n') chptr++; - *chptr = '\0'; - next = chptr + 1; - - switch (state) { - case SCSI_TOP: - if (!ptr_begins_static_str(start, scsi_some_devices)) - goto end_scsi; - state = SCSI_HOST; - break; - - case SCSI_HOST: - if (!ptr_begins_static_str(start, scsi_host)) - goto end_scsi; - state = SCSI_VENDOR; - break; - - case SCSI_VENDOR: - if (!ptr_begins_static_str(start, scsi_vendor)) - goto end_scsi; - - /* (1) Grab Vendor info */ - start += 10; - end = chptr = strstr(start, "Model:"); - if (!chptr) - goto end_scsi; - - chptr--; - while (*chptr == ' ') - chptr--; - if (*chptr == ':') { - chptr++; - *(chptr + 1) = '\0'; - strcpy(tmp_model,"(unknown)"); - } else { - *(chptr + 1) = '\0'; - strcpy(tmp_model, start); - } - - /* (2) Grab Model info */ - start = end; - start += 7; - - chptr = strstr(start, "Rev:"); - if (!chptr) - goto end_scsi; - - chptr--; - while (*chptr == ' ') chptr--; - *(chptr + 1) = '\0'; - - strcat(tmp_model, " "); - strcat(tmp_model, start); - - tmp[count].model = strdup(tmp_model); - - state = SCSI_TYPE; - - break; - - case SCSI_TYPE: - if (strncmp(" Type:", start, 7)) - goto end_scsi; - *tmp_name = '\0'; - - if (strstr(start, "Direct-Access")) { - sprintf(tmp_name, "sd%c", scsi_disk_count++); - tmp[count].type = DISK; - } else if (strstr(start, "Sequential-Access")) { - sprintf(tmp_name, "st%c", scsi_tape_count++); - tmp[count].type = TAPE; - } else if (strstr(start, "CD-ROM")) { - sprintf(tmp_name, "sr%c", scsi_cdrom_count++); - tmp[count].type = CDROM; - } + enum { SCSI_TOP, SCSI_HOST, SCSI_VENDOR, SCSI_TYPE } state = SCSI_TOP; + char * start, * chptr, * next, * end; + char scsi_disk_count = 'a'; + char scsi_cdrom_count = '0'; + char scsi_tape_count = '0'; + + char scsi_no_devices[] = "Attached devices: none"; + char scsi_some_devices[] = "Attached devices:"; + char scsi_host[] = "Host: "; + char scsi_vendor[] = " Vendor: "; + + int i = read(fd, &buf, sizeof(buf)-1); + if (i < 1) { + close(fd); + goto end_scsi; + } + close(fd); + buf[i] = '\0'; + + if (ptr_begins_static_str(buf, scsi_no_devices)) + goto end_scsi; + + start = buf; + while (*start) { + char tmp_model[50]; + char tmp_name[10]; + + chptr = start; + while (*chptr != '\n') chptr++; + *chptr = '\0'; + next = chptr + 1; + + switch (state) { + case SCSI_TOP: + if (!ptr_begins_static_str(start, scsi_some_devices)) + goto end_scsi; + state = SCSI_HOST; + break; + + case SCSI_HOST: + if (!ptr_begins_static_str(start, scsi_host)) + goto end_scsi; + state = SCSI_VENDOR; + break; + + case SCSI_VENDOR: + if (!ptr_begins_static_str(start, scsi_vendor)) + goto end_scsi; + + /* (1) Grab Vendor info */ + start += 10; + end = chptr = strstr(start, "Model:"); + if (!chptr) + goto end_scsi; + + chptr--; + while (*chptr == ' ') + chptr--; + if (*chptr == ':') { + chptr++; + *(chptr + 1) = '\0'; + strcpy(tmp_model,"(unknown)"); + } else { + *(chptr + 1) = '\0'; + strcpy(tmp_model, start); + } + + /* (2) Grab Model info */ + start = end; + start += 7; + + chptr = strstr(start, "Rev:"); + if (!chptr) + goto end_scsi; + + chptr--; + while (*chptr == ' ') chptr--; + *(chptr + 1) = '\0'; + + strcat(tmp_model, " "); + strcat(tmp_model, start); + + tmp[count].model = strdup(tmp_model); + + state = SCSI_TYPE; + + break; + + case SCSI_TYPE: + if (strncmp(" Type:", start, 7)) + goto end_scsi; + *tmp_name = '\0'; + + if (strstr(start, "Direct-Access")) { + sprintf(tmp_name, "sd%c", scsi_disk_count++); + tmp[count].type = DISK; + } else if (strstr(start, "Sequential-Access")) { + sprintf(tmp_name, "st%c", scsi_tape_count++); + tmp[count].type = TAPE; + } else if (strstr(start, "CD-ROM")) { + sprintf(tmp_name, "sr%c", scsi_cdrom_count++); + tmp[count].type = CDROM; + } if (!(f = fopen("/proc/partitions", "rb")) || !fgets(buf, sizeof(buf), f) || !fgets(buf, sizeof(buf), f)) { log_message("Couldn't open /proc/partitions"); @@ -783,7 +778,7 @@ void find_media(enum media_bus bus) if (stat(name, &statbuf)) mkdir(name, 0755); *ptr = '/'; - } + } if (stat(name, &statbuf) && mknod(name, S_IFBLK | 0600, makedev(major, minor))) { log_perror(name); } @@ -791,219 +786,219 @@ void find_media(enum media_bus bus) fclose(f); } - if (*tmp_name) { - tmp[count].name = strdup(tmp_name); - log_message("SCSI/%d: %s is a %s", tmp[count].type, tmp[count].name, tmp[count].model); - count++; - } - - state = SCSI_HOST; - } - - start = next; - } - - end_scsi:; - } - - /* ----------------------------------------------- */ - log_message("looking for Compaq Smart Array media"); - { - char * procfiles[] = { "/proc/driver/cpqarray/ida0", "/proc/driver/cciss/cciss0", // 2.4 style - "/proc/array/ida", "/proc/cciss/cciss", // 2.2 style - NULL }; - static char cpq_descr[] = "Compaq RAID logical disk"; - char ** procfile; - FILE * f; - - for (procfile = procfiles; procfile && *procfile; procfile++) { - if((f = fopen(*procfile, "rb"))) { - while (fgets(buf, sizeof(buf), f)) { - if (ptr_begins_static_str(buf, "ida/") || ptr_begins_static_str(buf, "cciss/")) { - char * end = strchr(buf, ':'); - if (!end) - log_message("Inconsistency in %s, line:\n%s", *procfile, buf); - else { - *end = '\0'; - tmp[count].name = strdup(buf); - tmp[count].type = DISK; - tmp[count].model = cpq_descr; - log_message("CPQ: found %s", tmp[count].name); - count++; - } - } - } - fclose(f); - } - } - } - - /* ----------------------------------------------- */ - log_message("looking for DAC960"); - { - FILE * f; - if ((f = fopen("/tmp/syslog", "rb"))) { - while (fgets(buf, sizeof(buf), f)) { - char * start; - if ((start = strstr(buf, "/dev/rd/"))) { - char * end = strchr(start, ':'); - if (!end) - log_message("Inconsistency in syslog, line:\n%s", buf); - else { - *end = '\0'; - tmp[count].name = strdup(start+5); - tmp[count].type = DISK; - start = end + 2; - end = strchr(start, ','); - if (end) { - *end = '\0'; - tmp[count].model = strdup(start); - } else - tmp[count].model = "(unknown)"; - log_message("DAC960: found %s (%s)", tmp[count].name, tmp[count].model); - count++; - } - } - } - fclose(f); - } - } - /* ----------------------------------------------- */ - log_message("looking for VirtIO"); - { - int fd, i; - char b[50]; - char *name = b+11; - strcpy(b, "/sys/block/vd"); - for (b[13] = 'a'; b[13] <= 'c'; b[13]++) { - /* first, test if file exists (will tell if attached medium exists) */ - b[14] = '\0'; - if (access(b, R_OK)) - continue; - - tmp[count].name = strdup(name); - tmp[count].type = DISK; //UNKNOWN_MEDIA; - tmp[count].model = strdup("VirtIO disk"); - - /* media type */ - strcpy(b + 14, "/capability"); - fd = open(b, O_RDONLY); - if (fd == -1) { - log_message("failed to open %s for reading", b); - //continue; - } - i = read(fd, buf, sizeof(buf)); - if (i == -1) { - log_message("Couldn't read capabilities file (%s)", b); - } else { - if (!strcmp(buf, "10")) - tmp[count].type = DISK; - } - - count++; - } - } + if (*tmp_name) { + tmp[count].name = strdup(tmp_name); + log_message("SCSI/%d: %s is a %s", tmp[count].type, tmp[count].name, tmp[count].model); + count++; + } + + state = SCSI_HOST; + } + + start = next; + } + + end_scsi:; + } + + /* ----------------------------------------------- */ + log_message("looking for Compaq Smart Array media"); + { + char * procfiles[] = { "/proc/driver/cpqarray/ida0", "/proc/driver/cciss/cciss0", // 2.4 style + "/proc/array/ida", "/proc/cciss/cciss", // 2.2 style + NULL }; + static char cpq_descr[] = "Compaq RAID logical disk"; + char ** procfile; + FILE * f; + + for (procfile = procfiles; procfile && *procfile; procfile++) { + if((f = fopen(*procfile, "rb"))) { + while (fgets(buf, sizeof(buf), f)) { + if (ptr_begins_static_str(buf, "ida/") || ptr_begins_static_str(buf, "cciss/")) { + char * end = strchr(buf, ':'); + if (!end) + log_message("Inconsistency in %s, line:\n%s", *procfile, buf); + else { + *end = '\0'; + tmp[count].name = strdup(buf); + tmp[count].type = DISK; + tmp[count].model = cpq_descr; + log_message("CPQ: found %s", tmp[count].name); + count++; + } + } + } + fclose(f); + } + } + } + + /* ----------------------------------------------- */ + log_message("looking for DAC960"); + { + FILE * f; + if ((f = fopen("/tmp/syslog", "rb"))) { + while (fgets(buf, sizeof(buf), f)) { + char * start; + if ((start = strstr(buf, "/dev/rd/"))) { + char * end = strchr(start, ':'); + if (!end) + log_message("Inconsistency in syslog, line:\n%s", buf); + else { + *end = '\0'; + tmp[count].name = strdup(start+5); + tmp[count].type = DISK; + start = end + 2; + end = strchr(start, ','); + if (end) { + *end = '\0'; + tmp[count].model = strdup(start); + } else + tmp[count].model = "(unknown)"; + log_message("DAC960: found %s (%s)", tmp[count].name, tmp[count].model); + count++; + } + } + } + fclose(f); + } + } + /* ----------------------------------------------- */ + log_message("looking for VirtIO"); + { + int fd, i; + char b[50]; + char *name = b+11; + strcpy(b, "/sys/block/vd"); + for (b[13] = 'a'; b[13] <= 'c'; b[13]++) { + /* first, test if file exists (will tell if attached medium exists) */ + b[14] = '\0'; + if (access(b, R_OK)) + continue; + + tmp[count].name = strdup(name); + tmp[count].type = DISK; //UNKNOWN_MEDIA; + tmp[count].model = strdup("VirtIO disk"); + + /* media type */ + strcpy(b + 14, "/capability"); + fd = open(b, O_RDONLY); + if (fd == -1) { + log_message("failed to open %s for reading", b); + //continue; + } + i = read(fd, buf, sizeof(buf)); + if (i == -1) { + log_message("Couldn't read capabilities file (%s)", b); + } else { + if (!strcmp(buf, "10")) + tmp[count].type = DISK; + } + + count++; + } + } find_media_after_scsi: - /* ----------------------------------------------- */ - tmp[count].name = NULL; - count++; + /* ----------------------------------------------- */ + tmp[count].name = NULL; + count++; - medias = _memdup(tmp, sizeof(struct media_info) * count); + medias = _memdup(tmp, sizeof(struct media_info) * count); } /* Finds by media */ void get_medias(enum media_type media, char *** names, char *** models, enum media_bus bus) { - struct media_info * m; - char * tmp_names[50]; - char * tmp_models[50]; - int count; - - find_media(bus); - - m = medias; - - count = 0; - while (m && m->name) { - if (m->type == media) { - tmp_names[count] = strdup(m->name); - tmp_models[count++] = strdup(m->model); - } - m++; - } - tmp_names[count] = NULL; - tmp_models[count++] = NULL; - - *names = _memdup(tmp_names, sizeof(char *) * count); - *models = _memdup(tmp_models, sizeof(char *) * count); + struct media_info * m; + char * tmp_names[50]; + char * tmp_models[50]; + int count; + + find_media(bus); + + m = medias; + + count = 0; + while (m && m->name) { + if (m->type == media) { + tmp_names[count] = strdup(m->name); + tmp_models[count++] = strdup(m->model); + } + m++; + } + tmp_names[count] = NULL; + tmp_models[count++] = NULL; + + *names = _memdup(tmp_names, sizeof(char *) * count); + *models = _memdup(tmp_models, sizeof(char *) * count); } #ifndef DISABLE_NETWORK static int is_net_interface_blacklisted(char *intf) { - /* see detect_devicess::is_lan_interface() */ - char * blacklist[] = { "lo", "ippp", "isdn", "plip", "ppp", "wifi", "sit", NULL }; - char ** ptr = blacklist; + /* see detect_devicess::is_lan_interface() */ + char * blacklist[] = { "lo", "ippp", "isdn", "plip", "ppp", "wifi", "sit", NULL }; + char ** ptr = blacklist; - while (ptr && *ptr) { - if (!strncmp(intf, *ptr, strlen(*ptr))) - return 1; - ptr++; - } + while (ptr && *ptr) { + if (!strncmp(intf, *ptr, strlen(*ptr))) + return 1; + ptr++; + } - return 0; + return 0; } char ** get_net_devices(void) { - char * tmp[50]; - static int already_probed = 0; - FILE * f; - int i = 0; - - if (!already_probed) { - already_probed = 1; /* cut off loop brought by: probe_that_type => my_insmod => get_net_devices */ - probe_that_type(NETWORK_DEVICES, BUS_ANY); - } - - /* use /proc/net/dev since SIOCGIFCONF doesn't work with some drivers (rt2500) */ - f = fopen("/proc/net/dev", "rb"); - if (f) { - char line[128]; - - /* skip the two first lines */ - fgets(line, sizeof(line), f); - fgets(line, sizeof(line), f); - - while (1) { - char *start, *end; - if (!fgets(line, sizeof(line), f)) - break; - start = line; - while (*start == ' ') - start++; - end = strchr(start, ':'); - if (end) - end[0] = '\0'; - if (!is_net_interface_blacklisted(start)) { - log_message("found net interface %s", start); - tmp[i++] = strdup(start); - } else { - log_message("found net interface %s, but blacklisted", start); - } - } - - fclose(f); - } else { - log_message("net: could not open devices file"); - } - - tmp[i++] = NULL; - - return _memdup(tmp, sizeof(char *) * i); + char * tmp[50]; + static int already_probed = 0; + FILE * f; + int i = 0; + + if (!already_probed) { + already_probed = 1; /* cut off loop brought by: probe_that_type => my_insmod => get_net_devices */ + probe_that_type(NETWORK_DEVICES, BUS_ANY); + } + + /* use /proc/net/dev since SIOCGIFCONF doesn't work with some drivers (rt2500) */ + f = fopen("/proc/net/dev", "rb"); + if (f) { + char line[128]; + + /* skip the two first lines */ + fgets(line, sizeof(line), f); + fgets(line, sizeof(line), f); + + while (1) { + char *start, *end; + if (!fgets(line, sizeof(line), f)) + break; + start = line; + while (*start == ' ') + start++; + end = strchr(start, ':'); + if (end) + end[0] = '\0'; + if (!is_net_interface_blacklisted(start)) { + log_message("found net interface %s", start); + tmp[i++] = strdup(start); + } else { + log_message("found net interface %s, but blacklisted", start); + } + } + + fclose(f); + } else { + log_message("net: could not open devices file"); + } + + tmp[i++] = NULL; + + return _memdup(tmp, sizeof(char *) * i); } #endif /* DISABLE_NETWORK */ diff --git a/mdk-stage1/rescue-gui.c b/mdk-stage1/rescue-gui.c index a93a6c14d..5a7e10de2 100644 --- a/mdk-stage1/rescue-gui.c +++ b/mdk-stage1/rescue-gui.c @@ -35,13 +35,13 @@ #include <sys/syscall.h> -#define LINUX_REBOOT_MAGIC1 0xfee1dead -#define LINUX_REBOOT_MAGIC2 672274793 -#define BMAGIC_REBOOT 0x01234567 +#define LINUX_REBOOT_MAGIC1 0xfee1dead +#define LINUX_REBOOT_MAGIC2 672274793 +#define BMAGIC_REBOOT 0x01234567 static inline long reboot(void) { - return (long) syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, BMAGIC_REBOOT, 0); + return (long) syscall(__NR_reboot, LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, BMAGIC_REBOOT, 0); } #if defined(__i386__) || defined(__x86_64__) @@ -49,16 +49,16 @@ static inline long reboot(void) #endif char * env[] = { - "PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sbin:/mnt/usr/sbin:/mnt/bin:/mnt/usr/bin", - "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib:/usr/X11R6/lib:/mnt/usr/X11R6/lib" + "PATH=/usr/bin:/bin:/sbin:/usr/sbin:/mnt/sbin:/mnt/usr/sbin:/mnt/bin:/mnt/usr/bin", + "LD_LIBRARY_PATH=/lib:/usr/lib:/mnt/lib:/mnt/usr/lib:/usr/X11R6/lib:/mnt/usr/X11R6/lib" #if defined(__x86_64__) || defined(__ppc64__) - ":/lib64:/usr/lib64:/usr/X11R6/lib64:/mnt/lib64:/mnt/usr/lib64:/mnt/usr/X11R6/lib64" + ":/lib64:/usr/lib64:/usr/X11R6/lib64:/mnt/lib64:/mnt/usr/lib64:/mnt/usr/X11R6/lib64" #endif - , - "HOME=/", - "TERM=screen", - "TERMINFO=/etc/terminfo", - NULL + , + "HOME=/", + "TERM=linux", + "TERMINFO=/etc/terminfo", + NULL }; /* pause() already exists and causes the invoking process to sleep @@ -73,96 +73,96 @@ static void PAUSE(void) { /* ------ UUURGH this is duplicated from `init.c', don't edit here........ */ void fatal_error(char *msg) { - printf("FATAL ERROR IN RESCUE: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg); - while (1); + printf("FATAL ERROR IN RESCUE: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg); + while (1); } -#define LOOP_CLR_FD 0x4C01 +#define LOOP_CLR_FD 0x4C01 void del_loop(char *device) { - int fd; - if ((fd = open(device, O_RDONLY, 0)) < 0) { - printf("del_loop open failed\n"); - return; - } - - if (ioctl(fd, LOOP_CLR_FD, 0) < 0) { - printf("del_loop ioctl failed"); - return; - } - - close(fd); + int fd; + if ((fd = open(device, O_RDONLY, 0)) < 0) { + printf("del_loop open failed\n"); + return; + } + + if (ioctl(fd, LOOP_CLR_FD, 0) < 0) { + printf("del_loop ioctl failed"); + return; + } + + close(fd); } struct filesystem { char * dev; char * name; char * fs; int mounted; }; void unmount_filesystems(void) { - int fd, size; - char buf[65535]; /* this should be big enough */ - char *p; - struct filesystem fs[500]; - int numfs = 0; - int i, nb; - - printf("unmounting filesystems...\n"); - - fd = open("/proc/mounts", O_RDONLY, 0); - if (fd < 1) { - printf("ERROR: failed to open /proc/mounts"); - sleep(2); - return; - } - - size = read(fd, buf, sizeof(buf) - 1); - buf[size] = '\0'; - - close(fd); - - p = buf; - while (*p) { - fs[numfs].mounted = 1; - fs[numfs].dev = p; - while (*p != ' ') p++; - *p++ = '\0'; - fs[numfs].name = p; - while (*p != ' ') p++; - *p++ = '\0'; - fs[numfs].fs = p; - while (*p != ' ') p++; - *p++ = '\0'; - while (*p != '\n') p++; - p++; - if (strcmp(fs[numfs].name, "/") != 0) numfs++; /* skip if root, no need to take initrd root in account */ - } - - /* Pixel's ultra-optimized sorting algorithm: - multiple passes trying to umount everything until nothing moves - anymore (a.k.a holy shotgun method) */ - do { - nb = 0; - for (i = 0; i < numfs; i++) { - /*printf("trying with %s\n", fs[i].name);*/ - if (fs[i].mounted && umount(fs[i].name) == 0) { - if (strncmp(fs[i].dev + sizeof("/dev/") - 1, "loop", - sizeof("loop") - 1) == 0) - del_loop(fs[i].dev); - - printf("\t%s\n", fs[i].name); - fs[i].mounted = 0; - nb++; - } - } - } while (nb); - - for (i = nb = 0; i < numfs; i++) - if (fs[i].mounted) { - printf("\t%s umount failed\n", fs[i].name); - if (strcmp(fs[i].fs, "ext2") == 0) nb++; /* don't count not-ext2 umount failed */ - } - - if (nb) { - printf("failed to umount some filesystems\n"); - while (1); - } + int fd, size; + char buf[65535]; /* this should be big enough */ + char *p; + struct filesystem fs[500]; + int numfs = 0; + int i, nb; + + printf("unmounting filesystems...\n"); + + fd = open("/proc/mounts", O_RDONLY, 0); + if (fd < 1) { + printf("ERROR: failed to open /proc/mounts"); + sleep(2); + return; + } + + size = read(fd, buf, sizeof(buf) - 1); + buf[size] = '\0'; + + close(fd); + + p = buf; + while (*p) { + fs[numfs].mounted = 1; + fs[numfs].dev = p; + while (*p != ' ') p++; + *p++ = '\0'; + fs[numfs].name = p; + while (*p != ' ') p++; + *p++ = '\0'; + fs[numfs].fs = p; + while (*p != ' ') p++; + *p++ = '\0'; + while (*p != '\n') p++; + p++; + if (strcmp(fs[numfs].name, "/") != 0) numfs++; /* skip if root, no need to take initrd root in account */ + } + + /* Pixel's ultra-optimized sorting algorithm: + multiple passes trying to umount everything until nothing moves + anymore (a.k.a holy shotgun method) */ + do { + nb = 0; + for (i = 0; i < numfs; i++) { + /*printf("trying with %s\n", fs[i].name);*/ + if (fs[i].mounted && umount(fs[i].name) == 0) { + if (strncmp(fs[i].dev + sizeof("/dev/") - 1, "loop", + sizeof("loop") - 1) == 0) + del_loop(fs[i].dev); + + printf("\t%s\n", fs[i].name); + fs[i].mounted = 0; + nb++; + } + } + } while (nb); + + for (i = nb = 0; i < numfs; i++) + if (fs[i].mounted) { + printf("\t%s umount failed\n", fs[i].name); + if (strcmp(fs[i].fs, "ext2") == 0) nb++; /* don't count not-ext2 umount failed */ + } + + if (nb) { + printf("failed to umount some filesystems\n"); + while (1); + } } /* ------ UUURGH -- end */ @@ -174,132 +174,132 @@ void exit_bootsplash(void) {} int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))) { - enum return_type results; + enum return_type results; - char install_bootloader[] = "Re-install Boot Loader"; + char install_bootloader[] = "Re-install Boot Loader"; #if ENABLE_RESCUE_MS_BOOT - char restore_ms_boot[] = "Restore Windows Boot Loader"; + char restore_ms_boot[] = "Restore Windows Boot Loader"; #endif - char mount_parts[] = "Mount your partitions under /mnt"; - char go_to_console[] = "Go to console"; - char reboot_[] = "Reboot"; - char doc[] = "Doc: what's addressed by this Rescue?"; - - char upgrade[] = "Upgrade to New Version"; - char rootpass[] = "Reset Root Password"; - char userpass[] = "Reset User Password"; - char factory[] = "Reset to Factory Defaults"; - char backup[] = "Backup User Files"; - char restore[] = "Restore User Files from Backup"; - char badblocks[] = "Test Key for Badblocks"; - - char * actions_default[] = { install_bootloader, + char mount_parts[] = "Mount your partitions under /mnt"; + char go_to_console[] = "Go to console"; + char reboot_[] = "Reboot"; + char doc[] = "Doc: what's addressed by this Rescue?"; + + char upgrade[] = "Upgrade to New Version"; + char rootpass[] = "Reset Root Password"; + char userpass[] = "Reset User Password"; + char factory[] = "Reset to Factory Defaults"; + char backup[] = "Backup User Files"; + char restore[] = "Restore User Files from Backup"; + char badblocks[] = "Test Key for Badblocks"; + + char * actions_default[] = { install_bootloader, #if ENABLE_RESCUE_MS_BOOT - restore_ms_boot, + restore_ms_boot, #endif - mount_parts, go_to_console, reboot_, doc, NULL }; - char * actions_flash_rescue[] = { rootpass, userpass, factory, backup, restore, - badblocks, go_to_console, reboot_, NULL }; - char * actions_flash_upgrade[] = { upgrade, go_to_console, reboot_, NULL }; + mount_parts, go_to_console, reboot_, doc, NULL }; + char * actions_flash_rescue[] = { rootpass, userpass, factory, backup, restore, + badblocks, go_to_console, reboot_, NULL }; + char * actions_flash_upgrade[] = { upgrade, go_to_console, reboot_, NULL }; - char * flash_mode; - char ** actions; - char * choice; + char * flash_mode; + char ** actions; + char * choice; - process_cmdline(); - flash_mode = get_param_valued("flash"); - actions = !flash_mode ? - actions_default : - streq(flash_mode, "upgrade") ? actions_flash_upgrade : actions_flash_rescue; + process_cmdline(); + flash_mode = get_param_valued("flash"); + actions = !flash_mode ? + actions_default : + streq(flash_mode, "upgrade") ? actions_flash_upgrade : actions_flash_rescue; - init_frontend("Welcome to " DISTRIB_NAME " Rescue (" DISTRIB_VERSION ") " __DATE__ " " __TIME__); + init_frontend("Welcome to " DISTRIB_NAME " Rescue (" DISTRIB_VERSION ") " __DATE__ " " __TIME__); - do { - int pid; - char * binary = NULL; + do { + int pid; + char * binary = NULL; - choice = ""; - results = ask_from_list("Please choose the desired action.", actions, &choice); + choice = ""; + results = ask_from_list("Please choose the desired action.", actions, &choice); - if (ptr_begins_static_str(choice, install_bootloader)) { - binary = "/usr/bin/install_bootloader"; - } + if (ptr_begins_static_str(choice, install_bootloader)) { + binary = "/usr/bin/install_bootloader"; + } #if ENABLE_RESCUE_MS_BOOT - if (ptr_begins_static_str(choice, restore_ms_boot)) { - binary = "/usr/bin/restore_ms_boot"; - } + if (ptr_begins_static_str(choice, restore_ms_boot)) { + binary = "/usr/bin/restore_ms_boot"; + } #endif - if (ptr_begins_static_str(choice, mount_parts)) { - binary = "/usr/bin/guessmounts"; - } - if (ptr_begins_static_str(choice, reboot_)) { - finish_frontend(); + if (ptr_begins_static_str(choice, mount_parts)) { + binary = "/usr/bin/guessmounts"; + } + if (ptr_begins_static_str(choice, reboot_)) { + finish_frontend(); sync(); sync(); sleep(2); - unmount_filesystems(); + unmount_filesystems(); sync(); sync(); - printf("rebooting system\n"); - sleep(2); - reboot(); - } - if (ptr_begins_static_str(choice, doc)) { - binary = "/usr/bin/rescue-doc"; - } - - /* Mandriva Flash entries */ - if (ptr_begins_static_str(choice, rootpass)) { - binary = "/usr/bin/reset_rootpass"; - } - if (ptr_begins_static_str(choice, userpass)) { - binary = "/usr/bin/reset_userpass"; - } - if (ptr_begins_static_str(choice, factory)) { - binary = "/usr/bin/clear_systemloop"; - } - if (ptr_begins_static_str(choice, backup)) { - binary = "/usr/bin/backup_systemloop"; - } - if (ptr_begins_static_str(choice, restore)) { - binary = "/usr/bin/restore_systemloop"; - } - if (ptr_begins_static_str(choice, badblocks)) { - binary = "/usr/bin/test_badblocks"; - } - if (ptr_begins_static_str(choice, upgrade)) { - binary = "/usr/bin/upgrade"; - } - - if (binary) { - int wait_status; - suspend_to_console(); - if (!(pid = fork())) { - - char * child_argv[2]; - child_argv[0] = binary; - child_argv[1] = NULL; - - execve(child_argv[0], child_argv, env); - printf("Can't execute binary (%s)\n<press Enter>\n", binary); - PAUSE(); - - return 33; - } - while (wait4(-1, &wait_status, 0, NULL) != pid) {}; - printf("<press Enter to return to Rescue menu>"); - PAUSE(); - resume_from_suspend(); - if (!WIFEXITED(wait_status) || WEXITSTATUS(wait_status) != 0) { - error_message("Program exited abnormally (return code %d).", WEXITSTATUS(wait_status)); - if (WIFSIGNALED(wait_status)) - error_message("(received signal %d)", WTERMSIG(wait_status)); - } - } - - } while (results == RETURN_OK && !ptr_begins_static_str(choice, go_to_console)); - - finish_frontend(); - printf("Bye.\n"); - - return 0; + printf("rebooting system\n"); + sleep(2); + reboot(); + } + if (ptr_begins_static_str(choice, doc)) { + binary = "/usr/bin/rescue-doc"; + } + + /* Mandriva Flash entries */ + if (ptr_begins_static_str(choice, rootpass)) { + binary = "/usr/bin/reset_rootpass"; + } + if (ptr_begins_static_str(choice, userpass)) { + binary = "/usr/bin/reset_userpass"; + } + if (ptr_begins_static_str(choice, factory)) { + binary = "/usr/bin/clear_systemloop"; + } + if (ptr_begins_static_str(choice, backup)) { + binary = "/usr/bin/backup_systemloop"; + } + if (ptr_begins_static_str(choice, restore)) { + binary = "/usr/bin/restore_systemloop"; + } + if (ptr_begins_static_str(choice, badblocks)) { + binary = "/usr/bin/test_badblocks"; + } + if (ptr_begins_static_str(choice, upgrade)) { + binary = "/usr/bin/upgrade"; + } + + if (binary) { + int wait_status; + suspend_to_console(); + if (!(pid = fork())) { + + char * child_argv[2]; + child_argv[0] = binary; + child_argv[1] = NULL; + + execve(child_argv[0], child_argv, env); + printf("Can't execute binary (%s)\n<press Enter>\n", binary); + PAUSE(); + + return 33; + } + while (wait4(-1, &wait_status, 0, NULL) != pid) {}; + printf("<press Enter to return to Rescue menu>"); + PAUSE(); + resume_from_suspend(); + if (!WIFEXITED(wait_status) || WEXITSTATUS(wait_status) != 0) { + error_message("Program exited abnormally (return code %d).", WEXITSTATUS(wait_status)); + if (WIFSIGNALED(wait_status)) + error_message("(received signal %d)", WTERMSIG(wait_status)); + } + } + + } while (results == RETURN_OK && !ptr_begins_static_str(choice, go_to_console)); + + finish_frontend(); + printf("Bye.\n"); + + return 0; } diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c index 1a9a9d623..be9b08301 100644 --- a/mdk-stage1/stage1.c +++ b/mdk-stage1/stage1.c @@ -72,8 +72,8 @@ void fatal_error(char *msg) { - printf("FATAL ERROR IN STAGE1: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg); - while (1); + printf("FATAL ERROR IN STAGE1: %s\n\nI can't recover from this.\nYou may reboot your system.\n", msg); + while (1); } @@ -83,33 +83,33 @@ void fatal_error(char *msg) void stg1_error_message(char *msg, ...) { - va_list args; - va_start(args, msg); - unset_automatic(); - verror_message(msg, args); - va_end(args); + va_list args; + va_start(args, msg); + unset_automatic(); + verror_message(msg, args); + va_end(args); } void stg1_fatal_message(char *msg, ...) { - va_list args; - va_start(args, msg); - unset_automatic(); - verror_message(msg, args); - va_end(args); + va_list args; + va_start(args, msg); + unset_automatic(); + verror_message(msg, args); + va_end(args); exit(1); } void stg1_info_message(char *msg, ...) { - va_list args; - va_start(args, msg); - if (IS_AUTOMATIC) { - vlog_message(msg, args); - return; - } - vinfo_message(msg, args); - va_end(args); + va_list args; + va_start(args, msg); + if (IS_AUTOMATIC) { + vlog_message(msg, args); + return; + } + vinfo_message(msg, args); + va_end(args); } @@ -120,39 +120,39 @@ static pid_t shell_pid = 0; * spawns a shell on console #2 */ static void spawn_shell(void) { - int fd; - char * shell_name[] = { "/sbin/sh", NULL }; - - log_message("spawning a shell"); - - if (!IS_TESTING) { - fd = open("/dev/tty2", O_RDWR); - if (fd == -1) { - log_message("cannot open /dev/tty2 -- no shell will be provided"); - return; - } - else if (access(shell_name[0], X_OK)) { - log_message("cannot open shell - %s doesn't exist", shell_name[0]); - return; - } - - if (!(shell_pid = fork())) { - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - - close(fd); - setsid(); - if (ioctl(0, TIOCSCTTY, NULL)) - log_perror("could not set new controlling tty"); - - execv(shell_name[0], shell_name); - log_message("execve of %s failed: %s", shell_name[0], strerror(errno)); - exit(-1); - } - - close(fd); - } + int fd; + char * shell_name[] = { "/sbin/sh", NULL }; + + log_message("spawning a shell"); + + if (!IS_TESTING) { + fd = open("/dev/tty2", O_RDWR); + if (fd == -1) { + log_message("cannot open /dev/tty2 -- no shell will be provided"); + return; + } + else if (access(shell_name[0], X_OK)) { + log_message("cannot open shell - %s doesn't exist", shell_name[0]); + return; + } + + if (!(shell_pid = fork())) { + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + + close(fd); + setsid(); + if (ioctl(0, TIOCSCTTY, NULL)) + log_perror("could not set new controlling tty"); + + execv(shell_name[0], shell_name); + log_message("execve of %s failed: %s", shell_name[0], strerror(errno)); + exit(-1); + } + + close(fd); + } } #endif @@ -163,54 +163,54 @@ static pid_t interactive_pid = 0; /* spawns my small interactive on console #6 */ static void spawn_interactive(void) { - int fd; - char * dev = "/dev/tty6"; - - printf("spawning my interactive on %s\n", dev); - - if (!IS_TESTING) { - fd = open(dev, O_RDWR); - if (fd == -1) { - printf("cannot open %s -- no interactive\n", dev); - return; - } - - if (mkfifo(interactive_fifo, O_RDWR)) { - printf("cannot create fifo -- no interactive\n"); - return; - } - - if (!(interactive_pid = fork())) { - int fif_out; - - dup2(fd, 0); - dup2(fd, 1); - dup2(fd, 2); - - close(fd); - setsid(); - if (ioctl(0, TIOCSCTTY, NULL)) - perror("could not set new controlling tty"); - - fif_out = open(interactive_fifo, O_WRONLY); - printf("Please enter your command (availables: [+,-] [rescue]).\n"); - - while (1) { - char s[50]; - int i = 0; - printf("? "); - fflush(stdout); - read(0, &(s[i++]), 1); - fcntl(0, F_SETFL, O_NONBLOCK); - while (read(0, &(s[i++]), 1) > 0 && i < sizeof(s)); - fcntl(0, F_SETFL, 0); - write(fif_out, s, i-2); - printf("Ok.\n"); - } - } - - close(fd); - } + int fd; + char * dev = "/dev/tty6"; + + printf("spawning my interactive on %s\n", dev); + + if (!IS_TESTING) { + fd = open(dev, O_RDWR); + if (fd == -1) { + printf("cannot open %s -- no interactive\n", dev); + return; + } + + if (mkfifo(interactive_fifo, O_RDWR)) { + printf("cannot create fifo -- no interactive\n"); + return; + } + + if (!(interactive_pid = fork())) { + int fif_out; + + dup2(fd, 0); + dup2(fd, 1); + dup2(fd, 2); + + close(fd); + setsid(); + if (ioctl(0, TIOCSCTTY, NULL)) + perror("could not set new controlling tty"); + + fif_out = open(interactive_fifo, O_WRONLY); + printf("Please enter your command (availables: [+,-] [rescue]).\n"); + + while (1) { + char s[50]; + int i = 0; + printf("? "); + fflush(stdout); + read(0, &(s[i++]), 1); + fcntl(0, F_SETFL, O_NONBLOCK); + while (read(0, &(s[i++]), 1) > 0 && i < sizeof(s)); + fcntl(0, F_SETFL, 0); + write(fif_out, s, i-2); + printf("Ok.\n"); + } + } + + close(fd); + } } #endif @@ -220,36 +220,37 @@ static void handle_pcmcia(void) { char * pcmcia_adapter; - pcmcia_adapter = pcmcia_probe(); - if (!pcmcia_adapter) { - log_message("no pcmcia adapter found"); - return; - } - my_insmod("pcmcia_core", ANY_DRIVER_TYPE, NULL, 0); - my_insmod(pcmcia_adapter, ANY_DRIVER_TYPE, NULL, 0); - /* ds is an alias for pcmcia in recent 2.6 kernels + pcmcia_adapter = pcmcia_probe(); + if (!pcmcia_adapter) { + log_message("no pcmcia adapter found"); + return; + } + my_insmod("pcmcia_core", ANY_DRIVER_TYPE, NULL, 0); + my_insmod(pcmcia_adapter, ANY_DRIVER_TYPE, NULL, 0); + /* ds is an alias for pcmcia in recent 2.6 kernels but we don't have modules.alias in install, so try to load both */ - my_insmod("ds", ANY_DRIVER_TYPE, NULL, 0); - my_insmod("pcmcia", ANY_DRIVER_TYPE, NULL, 0); - + my_insmod("ds", ANY_DRIVER_TYPE, NULL, 0); + my_insmod("pcmcia", ANY_DRIVER_TYPE, NULL, 0); + /* setup a dynamic resource database for non statically mapped PCMCIA sockets */ - pcmcia_socket_startup(-1); + pcmcia_socket_startup(-1); - add_to_env("PCMCIA", pcmcia_adapter); + add_to_env("PCMCIA", pcmcia_adapter); } #endif #ifndef ENABLE_NETWORK_STANDALONE static void handle_hid(void) { - struct hid_entries entry_list; - unsigned int i; - - entry_list = hid_probe(); - for (i = 0; i < entry_list.nb; i++) { - if (entry_list.entries[i].module != NULL) - my_insmod(entry_list.entries[i].module, ANY_DRIVER_TYPE, NULL, 0); - } + struct hid_entries entry_list; + unsigned int i; + + entry_list = hid_probe(); + for (i = 0; i < entry_list.nb; i++) { + if (entry_list.entries[i].module != NULL) + my_insmod(entry_list.entries[i].module, ANY_DRIVER_TYPE, NULL, 0); + } + my_insmod("hid_generic", ANY_DRIVER_TYPE, NULL, 0); } @@ -258,85 +259,85 @@ static void handle_hid(void) static void method_select_and_prepare(void) { - enum return_type results; - char * choice; - char * means[10], * means_auto[10]; - int i; + enum return_type results; + char * choice; + char * means[10], * means_auto[10]; + int i; #ifndef DISABLE_DISK - char * disk_install = "Hard disk"; char * disk_install_auto = "disk"; + char * disk_install = "Hard disk"; char * disk_install_auto = "disk"; #endif #ifndef DISABLE_CDROM - char * cdrom_install = "CDROM drive"; char * cdrom_install_auto = "cdrom"; + char * cdrom_install = "CDROM drive"; char * cdrom_install_auto = "cdrom"; #endif #ifndef DISABLE_NETWORK - char * network_nfs_install = "NFS server"; char * network_nfs_install_auto = "nfs"; - char * network_ftp_install = "FTP server"; char * network_ftp_install_auto = "ftp"; - char * network_http_install = "HTTP server"; char * network_http_install_auto = "http"; + char * network_nfs_install = "NFS server"; char * network_nfs_install_auto = "nfs"; + char * network_ftp_install = "FTP server"; char * network_ftp_install_auto = "ftp"; + char * network_http_install = "HTTP server"; char * network_http_install_auto = "http"; #ifndef DISABLE_KA - char * network_ka_install = "KA server"; char * network_ka_install_auto = "ka"; + char * network_ka_install = "KA server"; char * network_ka_install_auto = "ka"; #endif #endif - char * thirdparty_install = "Load third party modules"; char * thirdparty_install_auto = "thirdparty"; + char * thirdparty_install = "Load third party modules"; char * thirdparty_install_auto = "thirdparty"; - i = 0; + i = 0; #ifndef DISABLE_NETWORK - means[i] = network_nfs_install; means_auto[i++] = network_nfs_install_auto; - means[i] = network_ftp_install; means_auto[i++] = network_ftp_install_auto; - means[i] = network_http_install; means_auto[i++] = network_http_install_auto; + means[i] = network_nfs_install; means_auto[i++] = network_nfs_install_auto; + means[i] = network_ftp_install; means_auto[i++] = network_ftp_install_auto; + means[i] = network_http_install; means_auto[i++] = network_http_install_auto; #ifndef DISABLE_KA - means[i] = network_ka_install; means_auto[i++] = network_ka_install_auto; + means[i] = network_ka_install; means_auto[i++] = network_ka_install_auto; #endif #endif #ifndef DISABLE_CDROM - means[i] = cdrom_install; means_auto[i++] = cdrom_install_auto; + means[i] = cdrom_install; means_auto[i++] = cdrom_install_auto; #endif #ifndef DISABLE_DISK - means[i] = disk_install; means_auto[i++] = disk_install_auto; + means[i] = disk_install; means_auto[i++] = disk_install_auto; #endif - means[i] = thirdparty_install; means_auto[i++] = thirdparty_install_auto; - means[i] = NULL; + means[i] = thirdparty_install; means_auto[i++] = thirdparty_install_auto; + means[i] = NULL; - unlink(IMAGE_LOCATION); + unlink(IMAGE_LOCATION); - results = ask_from_list_auto("Please choose the installation method.", means, &choice, "method", means_auto); + results = ask_from_list_auto("Please choose the installation method.", means, &choice, "method", means_auto); - if (results != RETURN_OK) - return method_select_and_prepare(); + if (results != RETURN_OK) + return method_select_and_prepare(); #ifndef DISABLE_CDROM - if (!strcmp(choice, cdrom_install)) - results = cdrom_prepare(); + if (!strcmp(choice, cdrom_install)) + results = cdrom_prepare(); #endif #ifndef DISABLE_DISK - if (!strcmp(choice, disk_install)) - results = disk_prepare(); + if (!strcmp(choice, disk_install)) + results = disk_prepare(); #endif - + #ifndef DISABLE_NETWORK - if (!strcmp(choice, network_nfs_install)) - results = nfs_prepare(); + if (!strcmp(choice, network_nfs_install)) + results = nfs_prepare(); - if (!strcmp(choice, network_ftp_install)) - results = ftp_prepare(); - - if (!strcmp(choice, network_http_install)) - results = http_prepare(); + if (!strcmp(choice, network_ftp_install)) + results = ftp_prepare(); + + if (!strcmp(choice, network_http_install)) + results = http_prepare(); #ifndef DISABLE_KA - if (!strcmp(choice, network_ka_install)) - results = ka_prepare(); + if (!strcmp(choice, network_ka_install)) + results = ka_prepare(); #endif #endif - if (!strcmp(choice, thirdparty_install)) { - thirdparty_load_modules(); - return method_select_and_prepare(); + if (!strcmp(choice, thirdparty_install)) { + thirdparty_load_modules(); + return method_select_and_prepare(); } - if (results != RETURN_OK) - return method_select_and_prepare(); + if (results != RETURN_OK) + return method_select_and_prepare(); /* try to find third party modules on the install media */ thirdparty_load_media_modules(); @@ -355,9 +356,9 @@ static enum return_type create_initial_fs_symlinks(char* symlinks) buf[strlen(buf)-1] = '\0'; // trim \n if (sscanf(buf, "%s %s", oldpath, newpath) != 2) { sprintf(oldpath, "%s%s", STAGE2_LOCATION, buf); - sprintf(newpath, "%s", buf); + sprintf(newpath, "%s", buf); } - recursiveRemove_if_it_exists(newpath); + recursiveRemove_if_it_exists(newpath); log_message("creating symlink %s -> %s", oldpath, newpath); if (scall(symlink(oldpath, newpath), "symlink")) return RETURN_ERROR; @@ -368,23 +369,23 @@ static enum return_type create_initial_fs_symlinks(char* symlinks) void finish_preparing(void) { - recursiveRemove("/init"); + recursiveRemove("/init"); - if (create_initial_fs_symlinks(STAGE2_LOCATION "/usr/share/symlinks") != RETURN_OK) - stg1_fatal_message("Fatal error finishing initialization."); + if (create_initial_fs_symlinks(STAGE2_LOCATION "/usr/share/symlinks") != RETURN_OK) + stg1_fatal_message("Fatal error finishing initialization."); - /* /tmp/syslog is used by the second init, so it must be copied now, not in stage2 */ - /* we remove it to ensure the old one is not copied over it in stage2 */ + /* /tmp/syslog is used by the second init, so it must be copied now, not in stage2 */ + /* we remove it to ensure the old one is not copied over it in stage2 */ #ifdef SPAWN_SHELL - if (shell_pid != 0) { - int fd; - const char *clear = "\033[H\033[J"; - kill(shell_pid, 9); - log_message("killed shell"); - fd = open("/dev/tty2", O_RDWR); - write(fd, clear, strlen(clear)); - close(fd); + if (shell_pid != 0) { + int fd; + const char *clear = "\033[H\033[J"; + kill(shell_pid, 9); + log_message("killed shell"); + fd = open("/dev/tty2", O_RDWR); + write(fd, clear, strlen(clear)); + close(fd); } #endif } @@ -392,83 +393,83 @@ void finish_preparing(void) int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused)), char **env) { #ifdef ENABLE_NETWORK_STANDALONE - open_log(); - init_frontend(""); + open_log(); + init_frontend(""); - unlink("/etc/resolv.conf"); /* otherwise it is read-only */ - set_param(MODE_AUTOMATIC); - grab_automatic_params("network:dhcp"); + unlink("/etc/resolv.conf"); /* otherwise it is read-only */ + set_param(MODE_AUTOMATIC); + grab_automatic_params("network:dhcp"); - intf_select_and_up(); - finish_frontend(); - return 0; + intf_select_and_up(); + finish_frontend(); + return 0; #else - if (getenv("DEBUGSTAGE1")) { - set_param(MODE_DEBUGSTAGE1); - set_param(MODE_TESTING); + if (getenv("DEBUGSTAGE1")) { + set_param(MODE_DEBUGSTAGE1); + set_param(MODE_TESTING); } #ifdef SPAWN_INTERACTIVE - spawn_interactive(); + spawn_interactive(); #endif - open_log(); - log_message("welcome to the " DISTRIB_NAME " install (mdk-stage1, version " DISTRIB_VERSION " built " __DATE__ " " __TIME__")"); - process_cmdline(); + open_log(); + log_message("welcome to the " DISTRIB_NAME " install (mdk-stage1, version " DISTRIB_VERSION " built " __DATE__ " " __TIME__")"); + process_cmdline(); #ifdef SPAWN_SHELL - spawn_shell(); + spawn_shell(); #endif - init_modules_insmoding(); - init_firmware_loader(); - init_frontend("Welcome to " DISTRIB_DESCR ", " __DATE__ " " __TIME__); + init_modules_insmoding(); + init_firmware_loader(); + init_frontend("Welcome to " DISTRIB_DESCR ", " __DATE__ " " __TIME__); - probe_that_type(VIRTIO_DEVICES, BUS_ANY); + probe_that_type(VIRTIO_DEVICES, BUS_ANY); /* load usb interface as soon as possible, helps usb mouse detection in stage2 */ - probe_that_type(USB_CONTROLLERS, BUS_USB); + probe_that_type(USB_CONTROLLERS, BUS_USB); - if (IS_THIRDPARTY) - thirdparty_load_modules(); + if (IS_THIRDPARTY) + thirdparty_load_modules(); #ifdef ENABLE_PCMCIA - if (!IS_NOAUTO) - handle_pcmcia(); + if (!IS_NOAUTO) + handle_pcmcia(); #endif - handle_hid(); + handle_hid(); - if (IS_CHANGEDISK) - stg1_info_message("You are starting the installation with an alternate booting method. " - "Please change your disk, and insert the Installation disk."); + if (IS_CHANGEDISK) + stg1_info_message("You are starting the installation with an alternate booting method. " + "Please change your disk, and insert the Installation disk."); - if (IS_RESCUE && total_memory() < MEM_LIMIT_RESCUE) { - stg1_error_message("You are starting the rescue with a low memory configuration. " - "Our experience shows that your system may crash at any point " - "or lock up for no apparent reason. Continue at " - "your own risk. Alternatively, you may reboot your system now."); - } + if (IS_RESCUE && total_memory() < MEM_LIMIT_RESCUE) { + stg1_error_message("You are starting the rescue with a low memory configuration. " + "Our experience shows that your system may crash at any point " + "or lock up for no apparent reason. Continue at " + "your own risk. Alternatively, you may reboot your system now."); + } method_select_and_prepare(); - thirdparty_destroy(); + thirdparty_destroy(); - if (access(STAGE2_LOCATION, R_OK) != 0) - if (symlink(IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL, STAGE2_LOCATION) != 0) - log_perror("symlink from " IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL " to " STAGE2_LOCATION " failed"); + if (access(STAGE2_LOCATION, R_OK) != 0) + if (symlink(IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL, STAGE2_LOCATION) != 0) + log_perror("symlink from " IMAGE_LOCATION_REL "/" LIVE_LOCATION_REL " to " STAGE2_LOCATION " failed"); #ifdef SPAWN_INTERACTIVE - if (interactive_pid != 0) - kill(interactive_pid, 9); + if (interactive_pid != 0) + kill(interactive_pid, 9); #endif - finish_preparing(); + finish_preparing(); - finish_frontend(); - close_log(); + finish_frontend(); + close_log(); - if (IS_RESCUE) - return 66; /* ask init to exec new init */ - else - return 0x35; /* ask init to run stage2 binary */ + if (IS_RESCUE) + return 66; /* ask init to exec new init */ + else + return 0x35; /* ask init to run stage2 binary */ #endif } diff --git a/mdk-stage1/stdio-frontend.c b/mdk-stage1/stdio-frontend.c index 8006947a2..d82f4852d 100644 --- a/mdk-stage1/stdio-frontend.c +++ b/mdk-stage1/stdio-frontend.c @@ -34,8 +34,8 @@ void init_frontend(char * welcome_msg) { - printf(welcome_msg); - printf("\n"); + printf(welcome_msg); + printf("\n"); } @@ -45,152 +45,152 @@ void finish_frontend(void) static void get_any_response(void) { - unsigned char t; - printf("\n\t(press <enter> to proceed)"); - fflush(stdout); - read(0, &t, 1); - fcntl(0, F_SETFL, O_NONBLOCK); - while (read(0, &t, 1) > 0); - fcntl(0, F_SETFL, 0); + unsigned char t; + printf("\n\t(press <enter> to proceed)"); + fflush(stdout); + read(0, &t, 1); + fcntl(0, F_SETFL, O_NONBLOCK); + while (read(0, &t, 1) > 0); + fcntl(0, F_SETFL, 0); } static int get_int_response(void) { - char s[50]; - int j = 0; - unsigned int i = 0; /* (0) tied to Cancel */ - fflush(stdout); - read(0, &(s[i++]), 1); - fcntl(0, F_SETFL, O_NONBLOCK); - do { - int v = s[i-1]; - if (v >= '0' && v <= '9') - j = j*10 + (v - '0'); - } while (read(0, &(s[i++]), 1) > 0 && i < sizeof(s)); - fcntl(0, F_SETFL, 0); - return j; + char s[50]; + int j = 0; + unsigned int i = 0; /* (0) tied to Cancel */ + fflush(stdout); + read(0, &(s[i++]), 1); + fcntl(0, F_SETFL, O_NONBLOCK); + do { + int v = s[i-1]; + if (v >= '0' && v <= '9') + j = j*10 + (v - '0'); + } while (read(0, &(s[i++]), 1) > 0 && i < sizeof(s)); + fcntl(0, F_SETFL, 0); + return j; } static char * get_string_response(char * initial_string) { - /* I won't use a scanf/%s since I also want the null string to be accepted -- also, I want the initial_string */ - char s[500]; - int i = 0; - int b_index = 0; - char b; - - struct termios t; - - memset(s, '\0', sizeof(s)); - - if (initial_string) { - printf(initial_string); - strcpy(s, initial_string); - i = strlen(s); - } - - /* from ncurses/tinfo/lib_raw.c:(cbreak) */ - tcgetattr(0, &t); - t.c_lflag &= ~ICANON; - t.c_lflag |= ISIG; - t.c_lflag &= ~ECHO; - t.c_iflag &= ~ICRNL; - t.c_cc[VMIN] = 1; - t.c_cc[VTIME] = 0; - tcsetattr(0, TCSADRAIN, &t); - - fflush(stdout); - - fcntl(0, F_SETFL, O_NONBLOCK); - - while (1) { - if (read(0, &b, 1) > 0) { - if (b_index == 1) { - if (b == 91) { - b_index++; - continue; - } - else - b_index = 0; - } - if (b_index == 2) { - if (b == 67) { - if (s[i] != '\0') { - printf("\033[C"); - i++; - } - } - if (b == 68) { - if (i > 0) { - printf("\033[D"); - i--; - } - } - b_index = 0; - continue; - } - - if (b == 13) - break; - if (b == 127) { - if (i > 0) { - printf("\033[D"); - printf(" "); - printf("\033[D"); - if (s[i] == '\0') - s[i-1] = '\0'; - else - s[i-1] = ' '; - i--; - } - } else if (b == 27) { - b_index++; - } else { - printf("%c", b); - s[i] = b; - i++; - } - } - } - - t.c_lflag |= ICANON; - t.c_lflag |= ECHO; - t.c_iflag |= ICRNL; - tcsetattr(0, TCSADRAIN, &t); - - fcntl(0, F_SETFL, 0); - - printf("\n"); - return strdup(s); + /* I won't use a scanf/%s since I also want the null string to be accepted -- also, I want the initial_string */ + char s[500]; + int i = 0; + int b_index = 0; + char b; + + struct termios t; + + memset(s, '\0', sizeof(s)); + + if (initial_string) { + printf(initial_string); + strcpy(s, initial_string); + i = strlen(s); + } + + /* from ncurses/tinfo/lib_raw.c:(cbreak) */ + tcgetattr(0, &t); + t.c_lflag &= ~ICANON; + t.c_lflag |= ISIG; + t.c_lflag &= ~ECHO; + t.c_iflag &= ~ICRNL; + t.c_cc[VMIN] = 1; + t.c_cc[VTIME] = 0; + tcsetattr(0, TCSADRAIN, &t); + + fflush(stdout); + + fcntl(0, F_SETFL, O_NONBLOCK); + + while (1) { + if (read(0, &b, 1) > 0) { + if (b_index == 1) { + if (b == 91) { + b_index++; + continue; + } + else + b_index = 0; + } + if (b_index == 2) { + if (b == 67) { + if (s[i] != '\0') { + printf("\033[C"); + i++; + } + } + if (b == 68) { + if (i > 0) { + printf("\033[D"); + i--; + } + } + b_index = 0; + continue; + } + + if (b == 13) + break; + if (b == 127) { + if (i > 0) { + printf("\033[D"); + printf(" "); + printf("\033[D"); + if (s[i] == '\0') + s[i-1] = '\0'; + else + s[i-1] = ' '; + i--; + } + } else if (b == 27) { + b_index++; + } else { + printf("%c", b); + s[i] = b; + i++; + } + } + } + + t.c_lflag |= ICANON; + t.c_lflag |= ECHO; + t.c_iflag |= ICRNL; + tcsetattr(0, TCSADRAIN, &t); + + fcntl(0, F_SETFL, 0); + + printf("\n"); + return strdup(s); } static void blocking_msg(char *type, char *fmt, va_list ap) { - printf(type); - vprintf(fmt, ap); - get_any_response(); + printf(type); + vprintf(fmt, ap); + get_any_response(); } void verror_message(char *msg, va_list ap) { - blocking_msg("> Error! ", msg, ap); + blocking_msg("> Error! ", msg, ap); } void vinfo_message(char *msg, va_list ap) { - blocking_msg("> Notice: ", msg, ap); + blocking_msg("> Notice: ", msg, ap); } void vwait_message(char *msg, va_list ap) { - printf("Please wait: "); - vprintf(msg, ap); - fflush(stdout); + printf("Please wait: "); + vprintf(msg, ap); + fflush(stdout); } void remove_wait_message(void) { - printf("\n"); + printf("\n"); } @@ -199,154 +199,154 @@ static int actually_drawn; #define PROGRESS_SIZE 45 void init_progression_raw(char *msg, int size) { - int i; - size_progress = size; - printf("%s ", msg); - if (size) { - actually_drawn = 0; - for (i=0; i<PROGRESS_SIZE; i++) - printf("."); - printf("]\033[G%s [", msg); /* only works on ANSI-compatibles */ - fflush(stdout); - } else - printf("\n"); + int i; + size_progress = size; + printf("%s ", msg); + if (size) { + actually_drawn = 0; + for (i=0; i<PROGRESS_SIZE; i++) + printf("."); + printf("]\033[G%s [", msg); /* only works on ANSI-compatibles */ + fflush(stdout); + } else + printf("\n"); } void update_progression_raw(int current_size) { - if (size_progress) { - if (current_size > size_progress) - current_size = size_progress; - while ((int)((current_size*PROGRESS_SIZE)/size_progress) > actually_drawn) { - printf("*"); - actually_drawn++; - } - } else - printf("\033[GStatus: [%8d] bytes loaded...", current_size); - - fflush(stdout); + if (size_progress) { + if (current_size > size_progress) + current_size = size_progress; + while ((int)((current_size*PROGRESS_SIZE)/size_progress) > actually_drawn) { + printf("*"); + actually_drawn++; + } + } else + printf("\033[GStatus: [%8d] bytes loaded...", current_size); + + fflush(stdout); } void end_progression_raw(void) { - if (size_progress) { - update_progression_raw(size_progress); - printf("]\n"); - } else - printf(" done.\n"); + if (size_progress) { + update_progression_raw(size_progress); + printf("]\n"); + } else + printf(" done.\n"); } enum return_type ask_from_list_index(char *msg, char ** elems, char ** elems_comments, int *answer) { - int justify_number = 1; - void print_choice_number(int i) { - char tmp[500]; - snprintf(tmp, sizeof(tmp), "[%%%dd]", justify_number); - printf(tmp, i); - } - int i = 1; - int j = 0; - - if (string_array_length(elems) >= 10) - justify_number = 2; - - i = 1; - - printf("> %s\n", msg); - print_choice_number(0); - printf(" Cancel"); - - while (elems && *elems) { - if (elems_comments && *elems_comments) { - printf("\n"); - print_choice_number(i); - printf(" %s (%s)", *elems, *elems_comments); - j = 0; - } else { - if (j == 0) - printf("\n"); - print_choice_number(i); - printf(" %-14s ", *elems); - j++; - } - if (j == 4) - j = 0; - - if (elems_comments) - elems_comments++; - i++; - elems++; - } - - printf("\n? "); - - j = get_int_response(); - - if (j == 0) - return RETURN_BACK; - - if (j >= 1 && j <= i) { - *answer = j - 1; - return RETURN_OK; - } - - return RETURN_ERROR; + int justify_number = 1; + void print_choice_number(int i) { + char tmp[500]; + snprintf(tmp, sizeof(tmp), "[%%%dd]", justify_number); + printf(tmp, i); + } + int i = 1; + int j = 0; + + if (string_array_length(elems) >= 10) + justify_number = 2; + + i = 1; + + printf("> %s\n", msg); + print_choice_number(0); + printf(" Cancel"); + + while (elems && *elems) { + if (elems_comments && *elems_comments) { + printf("\n"); + print_choice_number(i); + printf(" %s (%s)", *elems, *elems_comments); + j = 0; + } else { + if (j == 0) + printf("\n"); + print_choice_number(i); + printf(" %-14s ", *elems); + j++; + } + if (j == 4) + j = 0; + + if (elems_comments) + elems_comments++; + i++; + elems++; + } + + printf("\n? "); + + j = get_int_response(); + + if (j == 0) + return RETURN_BACK; + + if (j >= 1 && j <= i) { + *answer = j - 1; + return RETURN_OK; + } + + return RETURN_ERROR; } enum return_type ask_yes_no(char *msg) { - int j; + int j; - printf("> %s\n[0] Yes [1] No [2] Back\n? ", msg); + printf("> %s\n[0] Yes [1] No [2] Back\n? ", msg); - j = get_int_response(); + j = get_int_response(); - if (j == 0) - return RETURN_OK; - else if (j == 2) - return RETURN_BACK; - else return RETURN_ERROR; + if (j == 0) + return RETURN_OK; + else if (j == 2) + return RETURN_BACK; + else return RETURN_ERROR; } enum return_type ask_from_entries(char *msg, char ** questions, char *** answers, int entry_size UNUSED, void (*callback_func)(char ** strings) UNUSED) { - int j, i = 0; - char ** already_answers = NULL; - - printf("> %s\n", msg); - - while (questions && *questions) { - printf("(%c) %s\n", i + 'a', *questions); - i++; - questions++; - } - - if (*answers == NULL) - *answers = (char **) malloc(sizeof(char *) * i); - else - already_answers = *answers; - - while (1) { - int r; - for (j = 0 ; j < i ; j++) { - printf("(%c) ? ", j + 'a'); - if (already_answers && *already_answers) { - (*answers)[j] = get_string_response(*already_answers); - already_answers++; - } else - (*answers)[j] = get_string_response(NULL); - - } - printf("[0] Cancel [1] Accept [2] Re-enter answers\n? "); - r = get_int_response(); - if (r == 0) - return RETURN_BACK; - if (r == 1) - return RETURN_OK; - } + int j, i = 0; + char ** already_answers = NULL; + + printf("> %s\n", msg); + + while (questions && *questions) { + printf("(%c) %s\n", i + 'a', *questions); + i++; + questions++; + } + + if (*answers == NULL) + *answers = (char **) malloc(sizeof(char *) * i); + else + already_answers = *answers; + + while (1) { + int r; + for (j = 0 ; j < i ; j++) { + printf("(%c) ? ", j + 'a'); + if (already_answers && *already_answers) { + (*answers)[j] = get_string_response(*already_answers); + already_answers++; + } else + (*answers)[j] = get_string_response(NULL); + + } + printf("[0] Cancel [1] Accept [2] Re-enter answers\n? "); + r = get_int_response(); + if (r == 0) + return RETURN_BACK; + if (r == 1) + return RETURN_OK; + } } diff --git a/mdk-stage1/thirdparty.c b/mdk-stage1/thirdparty.c index aefe223e0..57f38a2a4 100644 --- a/mdk-stage1/thirdparty.c +++ b/mdk-stage1/thirdparty.c @@ -40,421 +40,421 @@ static int pcitable_len = 0; static enum return_type thirdparty_choose_device(char ** device, int probe_only) { - char ** medias, ** medias_models; - char ** ptr, ** ptr_models; + char ** medias, ** medias_models; + char ** ptr, ** ptr_models; #ifndef DISABLE_DISK - char ** disk_medias, ** disk_medias_models; - int disk_count; - char * parts[50]; - char * parts_comments[50]; + char ** disk_medias, ** disk_medias_models; + int disk_count; + char * parts[50]; + char * parts_comments[50]; #endif #ifndef DISABLE_CDROM - char ** cdrom_medias, ** cdrom_medias_models; - int cdrom_count; + char ** cdrom_medias, ** cdrom_medias_models; + int cdrom_count; #endif - char * floppy_dev; - enum return_type results; - int count = 0; + char * floppy_dev; + enum return_type results; + int count = 0; - wait_message("Looking for floppy, disk and cdrom devices ..."); + wait_message("Looking for floppy, disk and cdrom devices ..."); #ifndef DISABLE_DISK - disk_count = get_disks(&disk_medias, &disk_medias_models); - count += disk_count; + disk_count = get_disks(&disk_medias, &disk_medias_models); + count += disk_count; #endif #ifndef DISABLE_CDROM cdrom_count = get_cdroms(&cdrom_medias, &cdrom_medias_models); count += cdrom_count; #endif - floppy_dev = floppy_device(); - if (floppy_dev && strstr(floppy_dev, "/dev/") == floppy_dev) { - floppy_dev = floppy_dev + 5; - } - if (floppy_dev) - count += 1; + floppy_dev = floppy_device(); + if (floppy_dev && strstr(floppy_dev, "/dev/") == floppy_dev) { + floppy_dev = floppy_dev + 5; + } + if (floppy_dev) + count += 1; - remove_wait_message(); + remove_wait_message(); - if (count == 0) { - stg1_error_message("I can't find any floppy, disk or cdrom on this system. " - "No third-party kernel modules will be used."); - return RETURN_BACK; - } + if (count == 0) { + stg1_error_message("I can't find any floppy, disk or cdrom on this system. " + "No third-party kernel modules will be used."); + return RETURN_BACK; + } - if (probe_only) { + if (probe_only) { #ifndef DISABLE_DISK - free(disk_medias); - free(disk_medias_models); + free(disk_medias); + free(disk_medias_models); #endif #ifndef DISABLE_CDROM - free(cdrom_medias); - free(cdrom_medias_models); + free(cdrom_medias); + free(cdrom_medias_models); #endif - return RETURN_OK; - } + return RETURN_OK; + } - ptr = medias = malloc((count + 1) * sizeof(char *)); - ptr_models =medias_models = malloc((count + 1) * sizeof(char *)); + ptr = medias = malloc((count + 1) * sizeof(char *)); + ptr_models =medias_models = malloc((count + 1) * sizeof(char *)); #ifndef DISABLE_DISK - memcpy(ptr, disk_medias, disk_count * sizeof(char *)); - memcpy(ptr_models, disk_medias_models, disk_count * sizeof(char *)); - free(disk_medias); - free(disk_medias_models); - ptr += disk_count; - ptr_models += disk_count; + memcpy(ptr, disk_medias, disk_count * sizeof(char *)); + memcpy(ptr_models, disk_medias_models, disk_count * sizeof(char *)); + free(disk_medias); + free(disk_medias_models); + ptr += disk_count; + ptr_models += disk_count; #endif #ifndef DISABLE_CDROM - memcpy(ptr, cdrom_medias, cdrom_count * sizeof(char *)); - memcpy(ptr_models, cdrom_medias_models, cdrom_count * sizeof(char *)); - free(cdrom_medias); - free(cdrom_medias_models); - cdrom_medias = ptr; /* used later to know if a cdrom is selected */ - ptr += cdrom_count; - ptr_models += cdrom_count; + memcpy(ptr, cdrom_medias, cdrom_count * sizeof(char *)); + memcpy(ptr_models, cdrom_medias_models, cdrom_count * sizeof(char *)); + free(cdrom_medias); + free(cdrom_medias_models); + cdrom_medias = ptr; /* used later to know if a cdrom is selected */ + ptr += cdrom_count; + ptr_models += cdrom_count; #endif - if (floppy_dev) { - ptr[0] = floppy_dev; - ptr_models[0] = "Floppy device"; - ptr++; - ptr_models++; - } - ptr[0] = NULL; - ptr_models[0] = NULL; - - if (count == 1) { - *device = medias[0]; - } else { - results = ask_from_list_comments("If you want to insert third-party kernel modules, " - "please select the disk containing the modules.", - medias, medias_models, device); - if (results != RETURN_OK) - return results; - } + if (floppy_dev) { + ptr[0] = floppy_dev; + ptr_models[0] = "Floppy device"; + ptr++; + ptr_models++; + } + ptr[0] = NULL; + ptr_models[0] = NULL; + + if (count == 1) { + *device = medias[0]; + } else { + results = ask_from_list_comments("If you want to insert third-party kernel modules, " + "please select the disk containing the modules.", + medias, medias_models, device); + if (results != RETURN_OK) + return results; + } - if (floppy_dev && streq(*device, floppy_dev)) { - /* a floppy is selected, don't try to list partitions */ - return RETURN_OK; - } + if (floppy_dev && streq(*device, floppy_dev)) { + /* a floppy is selected, don't try to list partitions */ + return RETURN_OK; + } #ifndef DISABLE_CDROM for (ptr = cdrom_medias; ptr < cdrom_medias + cdrom_count; ptr++) { - if (*device == *ptr) { - /* a cdrom is selected, don't try to list partitions */ - log_message("thirdparty: a cdrom is selected, using it (%s)", *device); - return RETURN_OK; - } - } + if (*device == *ptr) { + /* a cdrom is selected, don't try to list partitions */ + log_message("thirdparty: a cdrom is selected, using it (%s)", *device); + return RETURN_OK; + } + } #endif #ifndef DISABLE_DISK - /* a disk or usb key is selected */ - if (list_partitions(*device, parts, parts_comments)) { - stg1_error_message("Could not read partitions information."); - return RETURN_ERROR; - } - - if (parts[0] == NULL) { - stg1_error_message("No partition found."); - return RETURN_ERROR; - } - - /* only one partition has been discovered, don't ask which one to use */ - if (parts[1] == NULL) { - log_message("thirdparty: found only one partition on device (%s)", parts[0]); - *device = parts[0]; - return RETURN_OK; + /* a disk or usb key is selected */ + if (list_partitions(*device, parts, parts_comments)) { + stg1_error_message("Could not read partitions information."); + return RETURN_ERROR; + } + + if (parts[0] == NULL) { + stg1_error_message("No partition found."); + return RETURN_ERROR; + } + + /* only one partition has been discovered, don't ask which one to use */ + if (parts[1] == NULL) { + log_message("thirdparty: found only one partition on device (%s)", parts[0]); + *device = parts[0]; + return RETURN_OK; } - results = ask_from_list_comments("Please select the partition containing " - "the third party modules.", - parts, parts_comments, device); - if (results == RETURN_OK) - return RETURN_OK; + results = ask_from_list_comments("Please select the partition containing " + "the third party modules.", + parts, parts_comments, device); + if (results == RETURN_OK) + return RETURN_OK; #endif - stg1_error_message("Sorry, no third party device can be used."); + stg1_error_message("Sorry, no third party device can be used."); - return RETURN_BACK; + return RETURN_BACK; } static enum return_type thirdparty_mount_device(char * device) { log_message("third party: trying to mount device %s", device); - if (try_mount(device, THIRDPARTY_MOUNT_LOCATION) != 0) { - stg1_error_message("I can't mount the selected device (%s).", device); - return RETURN_ERROR; - } - return RETURN_OK; + if (try_mount(device, THIRDPARTY_MOUNT_LOCATION) != 0) { + stg1_error_message("I can't mount the selected device (%s).", device); + return RETURN_ERROR; + } + return RETURN_OK; } static enum return_type thirdparty_prompt_modules(const char *modules_location, char ** modules_list) { - enum return_type results; - char final_name[500]; - char *module_name; - int rc; - char * questions[] = { "Options", NULL }; - static char ** answers = NULL; - - while (1) { - results = ask_from_list("Which driver would you like to insmod?", modules_list, &module_name); - if (results != RETURN_OK) - break; - - sprintf(final_name, "%s/%s", modules_location, module_name); - - results = ask_from_entries("Please enter the options:", questions, &answers, 24, NULL); - if (results != RETURN_OK) - continue; - - rc = insmod_local_file(final_name, answers[0]); - if (rc) { - log_message("\tfailed"); - stg1_error_message("Insmod failed."); - } - } - return RETURN_OK; + enum return_type results; + char final_name[500]; + char *module_name; + int rc; + char * questions[] = { "Options", NULL }; + static char ** answers = NULL; + + while (1) { + results = ask_from_list("Which driver would you like to insmod?", modules_list, &module_name); + if (results != RETURN_OK) + break; + + sprintf(final_name, "%s/%s", modules_location, module_name); + + results = ask_from_entries("Please enter the options:", questions, &answers, 24, NULL); + if (results != RETURN_OK) + continue; + + rc = insmod_local_file(final_name, answers[0]); + if (rc) { + log_message("\tfailed"); + stg1_error_message("Insmod failed."); + } + } + return RETURN_OK; } static int pcitable_orderer(const void *a, const void *b) { - int ret; - struct pcitable_entry *ap = (struct pcitable_entry *)a; - struct pcitable_entry *bp = (struct pcitable_entry *)b; - - if ((ret = ap->vendor - bp->vendor) != 0) - return ret; - if ((ret = ap->device - bp->device) != 0) - return ret; - if ((ret = ap->subvendor - bp->subvendor) != 0) - return ret; - if ((ret = ap->subdevice - bp->subdevice) != 0) - return ret; - - return 0; + int ret; + struct pcitable_entry *ap = (struct pcitable_entry *)a; + struct pcitable_entry *bp = (struct pcitable_entry *)b; + + if ((ret = ap->vendor - bp->vendor) != 0) + return ret; + if ((ret = ap->device - bp->device) != 0) + return ret; + if ((ret = ap->subvendor - bp->subvendor) != 0) + return ret; + if ((ret = ap->subdevice - bp->subdevice) != 0) + return ret; + + return 0; } static void thirdparty_load_pcitable(const char *modules_location) { - char pcitable_filename[100]; - FILE * f = NULL; - - sprintf(pcitable_filename, "%s/pcitable", modules_location); - if (!(f = fopen(pcitable_filename, "rb"))) { - log_message("third_party: no external pcitable found"); - return; - } - pcitable_len = 0; - while (pcitable_len < N_PCITABLE_ENTRIES) { - char buf[200]; - struct pcitable_entry *e; - if (!fgets(buf, sizeof(buf), f)) break; - e = &pcitable[pcitable_len++]; - if (sscanf(buf, "%hx\t%hx\t\"%[^ \"]\"\t\"%[^\"]\"", &e->vendor, &e->device, e->module, e->description) == 4) - e->subvendor = e->subdevice = PCITABLE_MATCH_ALL; - else - sscanf(buf, "%hx\t%hx\t%x\t%x\t\"%[^ \"]\"\t\"%[^\"]\"", &e->vendor, &e->device, &e->subvendor, &e->subdevice, e->module, e->description); - } - fclose(f); - - /* sort pcitable by most specialised entries first */ - qsort(pcitable, pcitable_len, sizeof(pcitable[0]), pcitable_orderer); + char pcitable_filename[100]; + FILE * f = NULL; + + sprintf(pcitable_filename, "%s/pcitable", modules_location); + if (!(f = fopen(pcitable_filename, "rb"))) { + log_message("third_party: no external pcitable found"); + return; + } + pcitable_len = 0; + while (pcitable_len < N_PCITABLE_ENTRIES) { + char buf[200]; + struct pcitable_entry *e; + if (!fgets(buf, sizeof(buf), f)) break; + e = &pcitable[pcitable_len++]; + if (sscanf(buf, "%hx\t%hx\t\"%[^ \"]\"\t\"%[^\"]\"", &e->vendor, &e->device, e->module, e->description) == 4) + e->subvendor = e->subdevice = PCITABLE_MATCH_ALL; + else + sscanf(buf, "%hx\t%hx\t%x\t%x\t\"%[^ \"]\"\t\"%[^\"]\"", &e->vendor, &e->device, &e->subvendor, &e->subdevice, e->module, e->description); + } + fclose(f); + + /* sort pcitable by most specialised entries first */ + qsort(pcitable, pcitable_len, sizeof(pcitable[0]), pcitable_orderer); } static int thirdparty_is_detected(char *driver) { - int i, j; - - for (i = 0; i < detected_devices_len ; i++) { - /* first look for the IDs in the third-party pcitable */ - for (j = 0; j < pcitable_len ; j++) { - if (pcitable[j].vendor == detected_devices[i].vendor && - pcitable[j].device == detected_devices[i].device && - !strcmp(pcitable[j].module, driver)) { - const int subvendor = pcitable[j].subvendor; - const int subdevice = pcitable[j].subdevice; - if ((subvendor == PCITABLE_MATCH_ALL && subdevice == PCITABLE_MATCH_ALL) || - (subvendor == detected_devices[i].subvendor && subdevice == detected_devices[i].subdevice)) { - log_message("probing: found device for module %s", driver); - return 1; - } - } - } - /* if not found, compare with the detected driver */ - if (!strcmp(detected_devices[i].module, driver)) { - log_message("probing: found device for module %s", driver); - return 1; - } - } - - return 0; + int i, j; + + for (i = 0; i < detected_devices_len ; i++) { + /* first look for the IDs in the third-party pcitable */ + for (j = 0; j < pcitable_len ; j++) { + if (pcitable[j].vendor == detected_devices[i].vendor && + pcitable[j].device == detected_devices[i].device && + !strcmp(pcitable[j].module, driver)) { + const int subvendor = pcitable[j].subvendor; + const int subdevice = pcitable[j].subdevice; + if ((subvendor == PCITABLE_MATCH_ALL && subdevice == PCITABLE_MATCH_ALL) || + (subvendor == detected_devices[i].subvendor && subdevice == detected_devices[i].subdevice)) { + log_message("probing: found device for module %s", driver); + return 1; + } + } + } + /* if not found, compare with the detected driver */ + if (!strcmp(detected_devices[i].module, driver)) { + log_message("probing: found device for module %s", driver); + return 1; + } + } + + return 0; } static enum return_type thirdparty_autoload_modules(const char *modules_location, char ** modules_list, FILE *f, int load_detected_only) { - while (1) { - char final_name[500]; - char module[500]; - char * options; - char ** entry = modules_list; - - if (!fgets(module, sizeof(module), f)) break; - if (module[0] == '#' || strlen(module) == 0) - continue; - - while (module[strlen(module)-1] == '\n') - module[strlen(module)-1] = '\0'; - options = strchr(module, ' '); - if (options) { - options[0] = '\0'; - options++; - } - - if (load_detected_only && !thirdparty_is_detected(module)) { - log_message("third party: no device detected for module %s, skipping", module); - continue; - } - - log_message("third party: auto-loading module (%s) with options (%s)", module, options); - while (entry && *entry) { - if (!strncmp(*entry, module, strlen(module)) && (*entry)[strlen(module)] == '.') { - sprintf(final_name, "%s/%s", modules_location, *entry); - if (insmod_local_file(final_name, options)) { - log_message("\t%s (third party media): failed", *entry); - stg1_error_message("Insmod %s (third party media) failed.", *entry); - } - break; - } - entry++; - } - if (!entry || !*entry) { - enum insmod_return ret = my_insmod(module, ANY_DRIVER_TYPE, options, 0); - if (ret != INSMOD_OK) { - log_message("\t%s (marfile): failed", module); - stg1_error_message("Insmod %s (marfile) failed.", module); - } - } - } - - return RETURN_OK; + while (1) { + char final_name[500]; + char module[500]; + char * options; + char ** entry = modules_list; + + if (!fgets(module, sizeof(module), f)) break; + if (module[0] == '#' || strlen(module) == 0) + continue; + + while (module[strlen(module)-1] == '\n') + module[strlen(module)-1] = '\0'; + options = strchr(module, ' '); + if (options) { + options[0] = '\0'; + options++; + } + + if (load_detected_only && !thirdparty_is_detected(module)) { + log_message("third party: no device detected for module %s, skipping", module); + continue; + } + + log_message("third party: auto-loading module (%s) with options (%s)", module, options); + while (entry && *entry) { + if (!strncmp(*entry, module, strlen(module)) && (*entry)[strlen(module)] == '.') { + sprintf(final_name, "%s/%s", modules_location, *entry); + if (insmod_local_file(final_name, options)) { + log_message("\t%s (third party media): failed", *entry); + stg1_error_message("Insmod %s (third party media) failed.", *entry); + } + break; + } + entry++; + } + if (!entry || !*entry) { + enum insmod_return ret = my_insmod(module, ANY_DRIVER_TYPE, options, 0); + if (ret != INSMOD_OK) { + log_message("\t%s (marfile): failed", module); + stg1_error_message("Insmod %s (marfile) failed.", module); + } + } + } + + return RETURN_OK; } static enum return_type thirdparty_try_directory(char * root_directory, int interactive) { - char modules_location[100]; - char modules_location_release[100]; - char *list_filename; - FILE *f_load, *f_detect; - char **modules_list, **modules_list_release; - struct utsname kernel_uname; - - /* look first in the specific third-party directory */ - snprintf(modules_location, sizeof(modules_location), "%s" THIRDPARTY_DIRECTORY, root_directory); - modules_list = list_directory(modules_location); - - /* if it's empty, look in the root of selected device */ - if (!modules_list || !modules_list[0]) { - modules_location[strlen(root_directory)] = '\0'; - modules_list = list_directory(modules_location); - if (interactive) - add_to_env("THIRDPARTY_DIR", ""); - } else { - if (interactive) - add_to_env("THIRDPARTY_DIR", THIRDPARTY_DIRECTORY); + char modules_location[100]; + char modules_location_release[100]; + char *list_filename; + FILE *f_load, *f_detect; + char **modules_list, **modules_list_release; + struct utsname kernel_uname; + + /* look first in the specific third-party directory */ + snprintf(modules_location, sizeof(modules_location), "%s" THIRDPARTY_DIRECTORY, root_directory); + modules_list = list_directory(modules_location); + + /* if it's empty, look in the root of selected device */ + if (!modules_list || !modules_list[0]) { + modules_location[strlen(root_directory)] = '\0'; + modules_list = list_directory(modules_location); + if (interactive) + add_to_env("THIRDPARTY_DIR", ""); + } else { + if (interactive) + add_to_env("THIRDPARTY_DIR", THIRDPARTY_DIRECTORY); } - if (uname(&kernel_uname)) { - log_perror("uname failed"); - return RETURN_ERROR; - } - snprintf(modules_location_release, sizeof(modules_location_release), "%s/%s", modules_location, kernel_uname.release); - modules_list_release = list_directory(modules_location_release); - if (modules_list_release && modules_list_release[0]) { - strcpy(modules_location, modules_location_release); - modules_list = modules_list_release; - } - - log_message("third party: using modules location %s", modules_location); - - if (!modules_list || !*modules_list) { - log_message("third party: no modules found"); - if (interactive) - stg1_error_message("No modules found on selected device."); - return RETURN_ERROR; + if (uname(&kernel_uname)) { + log_perror("uname failed"); + return RETURN_ERROR; + } + snprintf(modules_location_release, sizeof(modules_location_release), "%s/%s", modules_location, kernel_uname.release); + modules_list_release = list_directory(modules_location_release); + if (modules_list_release && modules_list_release[0]) { + strcpy(modules_location, modules_location_release); + modules_list = modules_list_release; + } + + log_message("third party: using modules location %s", modules_location); + + if (!modules_list || !*modules_list) { + log_message("third party: no modules found"); + if (interactive) + stg1_error_message("No modules found on selected device."); + return RETURN_ERROR; } - list_filename = alloca(strlen(modules_location) + 10 /* max: "/to_detect" */ + 1); - - sprintf(list_filename, "%s/to_load", modules_location); - f_load = fopen(list_filename, "rb"); - if (f_load) { - thirdparty_autoload_modules(modules_location, modules_list, f_load, 0); - fclose(f_load); - } - - sprintf(list_filename, "%s/to_detect", modules_location); - f_detect = fopen(list_filename, "rb"); - if (f_detect) { - probing_detect_devices(); - thirdparty_load_pcitable(modules_location); - thirdparty_autoload_modules(modules_location, modules_list, f_detect, 1); - fclose(f_detect); - } - - if (f_load || f_detect) - return RETURN_OK; - else if (interactive) { - if (IS_AUTOMATIC) - stg1_error_message("I can't find a \"to_load\" file. Please select the modules manually."); - log_message("third party: no \"to_load\" file, prompting for modules"); - return thirdparty_prompt_modules(modules_location, modules_list); - } else { - return RETURN_OK; - } + list_filename = alloca(strlen(modules_location) + 10 /* max: "/to_detect" */ + 1); + + sprintf(list_filename, "%s/to_load", modules_location); + f_load = fopen(list_filename, "rb"); + if (f_load) { + thirdparty_autoload_modules(modules_location, modules_list, f_load, 0); + fclose(f_load); + } + + sprintf(list_filename, "%s/to_detect", modules_location); + f_detect = fopen(list_filename, "rb"); + if (f_detect) { + probing_detect_devices(); + thirdparty_load_pcitable(modules_location); + thirdparty_autoload_modules(modules_location, modules_list, f_detect, 1); + fclose(f_detect); + } + + if (f_load || f_detect) + return RETURN_OK; + else if (interactive) { + if (IS_AUTOMATIC) + stg1_error_message("I can't find a \"to_load\" file. Please select the modules manually."); + log_message("third party: no \"to_load\" file, prompting for modules"); + return thirdparty_prompt_modules(modules_location, modules_list); + } else { + return RETURN_OK; + } } void thirdparty_load_media_modules(void) { - thirdparty_try_directory(IMAGE_LOCATION, 0); + thirdparty_try_directory(IMAGE_LOCATION, 0); } void thirdparty_load_modules(void) { - enum return_type results; - char * device; - - device = NULL; - if (IS_AUTOMATIC) { - device = get_auto_value("thirdparty"); - thirdparty_choose_device(NULL, 1); /* probe only to create devices */ - log_message("third party: trying automatic device %s", device); - if (thirdparty_mount_device(device) != RETURN_OK) - device = NULL; - } - - while (!device || streq(device, "")) { - results = thirdparty_choose_device(&device, 0); - if (results == RETURN_BACK) - return; - if (thirdparty_mount_device(device) != RETURN_OK) - device = NULL; - } - - log_message("third party: using device %s", device); - add_to_env("THIRDPARTY_DEVICE", device); - - results = thirdparty_try_directory(THIRDPARTY_MOUNT_LOCATION, 1); - umount(THIRDPARTY_MOUNT_LOCATION); - - if (results != RETURN_OK) - return thirdparty_load_modules(); + enum return_type results; + char * device; + + device = NULL; + if (IS_AUTOMATIC) { + device = get_auto_value("thirdparty"); + thirdparty_choose_device(NULL, 1); /* probe only to create devices */ + log_message("third party: trying automatic device %s", device); + if (thirdparty_mount_device(device) != RETURN_OK) + device = NULL; + } + + while (!device || streq(device, "")) { + results = thirdparty_choose_device(&device, 0); + if (results == RETURN_BACK) + return; + if (thirdparty_mount_device(device) != RETURN_OK) + device = NULL; + } + + log_message("third party: using device %s", device); + add_to_env("THIRDPARTY_DEVICE", device); + + results = thirdparty_try_directory(THIRDPARTY_MOUNT_LOCATION, 1); + umount(THIRDPARTY_MOUNT_LOCATION); + + if (results != RETURN_OK) + return thirdparty_load_modules(); } void thirdparty_destroy(void) { - probing_destroy(); + probing_destroy(); } diff --git a/mdk-stage1/tools.c b/mdk-stage1/tools.c index 5674c4f3b..14374661f 100644 --- a/mdk-stage1/tools.c +++ b/mdk-stage1/tools.c @@ -49,48 +49,48 @@ int image_has_stage2() { - return access(COMPRESSED_FILE_REL(IMAGE_LOCATION "/"), R_OK) == 0 || - access(IMAGE_LOCATION "/" LIVE_LOCATION_REL, R_OK) == 0; + return access(COMPRESSED_FILE_REL(IMAGE_LOCATION "/"), R_OK) == 0 || + access(IMAGE_LOCATION "/" LIVE_LOCATION_REL, R_OK) == 0; } enum return_type create_IMAGE_LOCATION(char *location_full) { - struct stat statbuf; - int offset = strncmp(location_full, IMAGE_LOCATION_DIR, sizeof(IMAGE_LOCATION_DIR) - 1) == 0 ? sizeof(IMAGE_LOCATION_DIR) - 1 : 0; - char *with_arch = asprintf_("%s/%s", location_full, ARCH); + struct stat statbuf; + int offset = strncmp(location_full, IMAGE_LOCATION_DIR, sizeof(IMAGE_LOCATION_DIR) - 1) == 0 ? sizeof(IMAGE_LOCATION_DIR) - 1 : 0; + char *with_arch = asprintf_("%s/%s", location_full, ARCH); - log_message("trying %s", with_arch); + log_message("trying %s", with_arch); - if (stat(with_arch, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) - location_full = with_arch; + if (stat(with_arch, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) + location_full = with_arch; - log_message("assuming %s is a mirror tree", location_full + offset); + log_message("assuming %s is a mirror tree", location_full + offset); - unlink(IMAGE_LOCATION); - if (symlink(location_full + offset, IMAGE_LOCATION) != 0) - return RETURN_ERROR; + unlink(IMAGE_LOCATION); + if (symlink(location_full + offset, IMAGE_LOCATION) != 0) + return RETURN_ERROR; - return RETURN_OK; + return RETURN_OK; } int ramdisk_possible(void) { - if (total_memory() > (IS_RESCUE ? MEM_LIMIT_RESCUE : MEM_LIMIT_DRAKX)) - return 1; - else { - log_message("warning, ramdisk is not possible due to low mem!"); - return 0; - } + if (total_memory() > (IS_RESCUE ? MEM_LIMIT_RESCUE : MEM_LIMIT_DRAKX)) + return 1; + else { + log_message("warning, ramdisk is not possible due to low mem!"); + return 0; + } } int compressed_image_preload(void) { - if (total_memory() > (IS_RESCUE ? MEM_LIMIT_RESCUE_PRELOAD : MEM_LIMIT_DRAKX_PRELOAD)) - return 1; - else { - log_message("warning, not preloading compressed due to low mem"); - return 0; - } + if (total_memory() > (IS_RESCUE ? MEM_LIMIT_RESCUE_PRELOAD : MEM_LIMIT_DRAKX_PRELOAD)) + return 1; + else { + log_message("warning, not preloading compressed due to low mem"); + return 0; + } } enum return_type save_fd(int from_fd, char * to, void (*callback_func)(int overall)) @@ -106,16 +106,16 @@ enum return_type save_fd(int from_fd, char * to, void (*callback_func)(int overa } do { - quantity = read(from_fd, buf, sizeof(buf)); - if (quantity > 0) { + quantity = read(from_fd, buf, sizeof(buf)); + if (quantity > 0) { if (fwrite(buf, 1, quantity, f_to) != quantity) { log_message("short write (%s)", strerror(errno)); goto cleanup; } } else if (quantity == -1) { - log_message("an error occured: %s", strerror(errno)); - goto cleanup; - } + log_message("an error occured: %s", strerror(errno)); + goto cleanup; + } if (callback_func) { overall += quantity; @@ -137,12 +137,12 @@ enum return_type copy_file(char * from, char * to, void (*callback_func)(int ove { int from_fd; - log_message("copy_file: %s -> %s", from, to); + log_message("copy_file: %s -> %s", from, to); - from_fd = open(from, O_RDONLY); - if (from_fd != -1) { - return save_fd(from_fd, to, callback_func); - } else { + from_fd = open(from, O_RDONLY); + if (from_fd != -1) { + return save_fd(from_fd, to, callback_func); + } else { log_perror(from); return RETURN_ERROR; } @@ -150,137 +150,138 @@ enum return_type copy_file(char * from, char * to, void (*callback_func)(int ove enum return_type recursiveRemove(char *file) { - struct stat sb; - - if (lstat(file, &sb) != 0) { - log_message("failed to stat %s: %d", file, errno); - return RETURN_ERROR; - } - - /* only descend into subdirectories if device is same as dir */ - if (S_ISDIR(sb.st_mode)) { - char * strBuf = alloca(strlen(file) + 1024); - DIR * dir; - struct dirent * d; - - if (!(dir = opendir(file))) { - log_message("error opening %s: %d", file, errno); - return RETURN_ERROR; - } - while ((d = readdir(dir))) { - if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")) - continue; - - strcpy(strBuf, file); - strcat(strBuf, "/"); - strcat(strBuf, d->d_name); - - if (recursiveRemove(strBuf) != 0) { - closedir(dir); - return RETURN_ERROR; - } - } - closedir(dir); - - if (rmdir(file)) { - log_message("failed to rmdir %s: %d", file, errno); - return RETURN_ERROR; - } - } else { - if (unlink(file) != 0) { - log_message("failed to remove %s: %d", file, errno); - return RETURN_ERROR; - } - } - return RETURN_OK; + struct stat sb; + + if (lstat(file, &sb) != 0) { + log_message("failed to stat %s: %d", file, errno); + return RETURN_ERROR; + } + + /* only descend into subdirectories if device is same as dir */ + if (S_ISDIR(sb.st_mode)) { + char * strBuf = alloca(strlen(file) + 1024); + DIR * dir; + struct dirent * d; + + if (!(dir = opendir(file))) { + log_message("error opening %s: %d", file, errno); + return RETURN_ERROR; + } + while ((d = readdir(dir))) { + if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")) + continue; + + strcpy(strBuf, file); + strcat(strBuf, "/"); + strcat(strBuf, d->d_name); + + if (recursiveRemove(strBuf) != 0) { + closedir(dir); + return RETURN_ERROR; + } + } + closedir(dir); + + if (rmdir(file)) { + log_message("failed to rmdir %s: %d", file, errno); + return RETURN_ERROR; + } + } else { + if (unlink(file) != 0) { + log_message("failed to remove %s: %d", file, errno); + return RETURN_ERROR; + } + } + return RETURN_OK; } enum return_type recursiveRemove_if_it_exists(char *file) { - struct stat sb; + struct stat sb; - if (lstat(file, &sb) != 0) { - /* if file doesn't exist, simply return OK */ - return RETURN_OK; - } + if (lstat(file, &sb) != 0) { + /* if file doesn't exist, simply return OK */ + return RETURN_OK; + } - return recursiveRemove(file); + return recursiveRemove(file); } enum return_type mount_compressed_image(char *compressed_image, char *location_mount) { - if (lomount(compressed_image, location_mount, NULL, 1)) { + if (lomount(compressed_image, location_mount, NULL, 1)) { stg1_error_message("Could not mount compressed loopback :(."); return RETURN_ERROR; } - return RETURN_OK; + return RETURN_OK; } enum return_type preload_mount_compressed_fd(int compressed_fd, int image_size, char *image_name, char *location_mount) { - int ret; - char *compressed_tmpfs = asprintf_("/tmp/%s", image_name); - char *buf = "Loading program into memory..."; - init_progression(buf, image_size); - ret = save_fd(compressed_fd, compressed_tmpfs, update_progression); - end_progression(); - if (ret != RETURN_OK) - return ret; - - return mount_compressed_image(compressed_tmpfs, location_mount); + int ret; + char *compressed_tmpfs = asprintf_("/tmp/%s", image_name); + char *buf = "Loading program into memory..."; + init_progression(buf, image_size); + ret = save_fd(compressed_fd, compressed_tmpfs, update_progression); + end_progression(); + if (ret != RETURN_OK) + return ret; + + return mount_compressed_image(compressed_tmpfs, location_mount); } enum return_type mount_compressed_image_may_preload(char *image_name, char *location_mount, int preload) { - char *compressed_image = asprintf_("%s/%s", COMPRESSED_LOCATION, image_name); + char *compressed_image = asprintf_("%s/%s", COMPRESSED_LOCATION, image_name); - log_message("mount_compressed_may_preload: %s into %s (preload = %d)", compressed_image, location_mount, preload); + log_message("mount_compressed_may_preload: %s into %s (preload = %d)", compressed_image, location_mount, preload); if (access(compressed_image, R_OK) != 0) return RETURN_ERROR; if (preload) { - int compressed_fd = open(compressed_image, O_RDONLY); - if (compressed_fd != -1) { - return preload_mount_compressed_fd(compressed_fd, file_size(compressed_image), image_name, location_mount); - } else { - log_perror(compressed_image); - return RETURN_ERROR; - } - } else { - return mount_compressed_image(compressed_image, location_mount); - } + int compressed_fd = open(compressed_image, O_RDONLY); + if (compressed_fd != -1) { + return preload_mount_compressed_fd(compressed_fd, file_size(compressed_image), image_name, location_mount); + } else { + log_perror(compressed_image); + return RETURN_ERROR; + } + } else { + return mount_compressed_image(compressed_image, location_mount); + } } enum return_type may_load_compressed_image(void) { - if (!IS_RESCUE && access(IMAGE_LOCATION "/" LIVE_LOCATION_REL, R_OK) == 0) { - /* LIVE install */ - return RETURN_OK; - } else { - /* compressed install */ - return mount_compressed_image_may_preload(COMPRESSED_NAME(""), STAGE2_LOCATION, compressed_image_preload()); - } + if (!IS_RESCUE && access(IMAGE_LOCATION "/" LIVE_LOCATION_REL, R_OK) == 0) { + /* LIVE install */ + return RETURN_OK; + } else { + /* compressed install */ + return mount_compressed_image_may_preload(COMPRESSED_NAME(""), STAGE2_LOCATION, compressed_image_preload()); + } } enum return_type load_compressed_fd(int fd, int size) { - return preload_mount_compressed_fd(fd, size, COMPRESSED_NAME(""), STAGE2_LOCATION); + return preload_mount_compressed_fd(fd, size, COMPRESSED_NAME(""), STAGE2_LOCATION); } +// FIXME: guess right module from partition type (using libblkid?) int try_mount(char * dev, char * location) { - char device_fullname[50]; - snprintf(device_fullname, sizeof(device_fullname), "/dev/%s", dev); - - if (my_mount(device_fullname, location, "ext4", 0) == -1 && - my_mount(device_fullname, location, "btrfs", 0) == -1 && - my_mount(device_fullname, location, "vfat", 0) == -1 && - my_mount(device_fullname, location, "ntfs", 0) == -1 && - my_mount(device_fullname, location, "reiserfs", 0) == -1 && - my_mount(device_fullname, location, "reiser4", 0) == -1 && - my_mount(device_fullname, location, "jfs", 0) == -1 && - my_mount(device_fullname, location, "xfs", 0) == -1 && - my_mount(device_fullname, location, "iso9660", 0) == -1) { + char device_fullname[50]; + snprintf(device_fullname, sizeof(device_fullname), "/dev/%s", dev); + + if (my_mount(device_fullname, location, "ext4", 0) == -1 && + my_mount(device_fullname, location, "btrfs", 0) == -1 && + my_mount(device_fullname, location, "vfat", 0) == -1 && + my_mount(device_fullname, location, "ntfs", 0) == -1 && + my_mount(device_fullname, location, "reiserfs", 0) == -1 && + my_mount(device_fullname, location, "reiser4", 0) == -1 && + my_mount(device_fullname, location, "jfs", 0) == -1 && + my_mount(device_fullname, location, "xfs", 0) == -1 && + my_mount(device_fullname, location, "iso9660", 0) == -1) { return 1; } @@ -290,19 +291,19 @@ int try_mount(char * dev, char * location) #ifndef DISABLE_DISK int get_disks(char *** names, char *** models) { - char ** ptr; - int count = 0; + char ** ptr; + int count = 0; - my_insmod("ide_disk", ANY_DRIVER_TYPE, NULL, 0); - my_insmod("sd_mod", ANY_DRIVER_TYPE, NULL, 0); + my_insmod("ide_disk", ANY_DRIVER_TYPE, NULL, 0); + my_insmod("sd_mod", ANY_DRIVER_TYPE, NULL, 0); - get_medias(DISK, names, models, BUS_ANY); + get_medias(DISK, names, models, BUS_ANY); - ptr = *names; - while (ptr && *ptr) { - count++; - ptr++; - } + ptr = *names; + while (ptr && *ptr) { + count++; + ptr++; + } return count; } @@ -311,21 +312,21 @@ int get_disks(char *** names, char *** models) #ifndef DISABLE_CDROM int get_cdroms(char *** names, char *** models) { - char ** ptr; - int count = 0; + char ** ptr; + int count = 0; - my_insmod("ide_cd_mod", ANY_DRIVER_TYPE, NULL, 0); - my_insmod("sr_mod", ANY_DRIVER_TYPE, NULL, 0); + my_insmod("ide_cd_mod", ANY_DRIVER_TYPE, NULL, 0); + my_insmod("sr_mod", ANY_DRIVER_TYPE, NULL, 0); - get_medias(CDROM, names, models, BUS_ANY); + get_medias(CDROM, names, models, BUS_ANY); - ptr = *names; - while (ptr && *ptr) { - count++; - ptr++; - } + ptr = *names; + while (ptr && *ptr) { + count++; + ptr++; + } - return count; + return count; } #endif @@ -333,7 +334,7 @@ char * floppy_device(void) { char ** names, ** models; int fd; - my_insmod("floppy", ANY_DRIVER_TYPE, NULL, 0); + my_insmod("floppy", ANY_DRIVER_TYPE, NULL, 0); fd = open("/dev/fd0", O_RDONLY|O_NONBLOCK); if (fd != -1) { char drivtyp[17]; @@ -354,8 +355,8 @@ char * floppy_device(void) } log_message("seems that you don't have a regular floppy drive"); my_insmod("sd_mod", ANY_DRIVER_TYPE, NULL, 0); - get_medias(FLOPPY, &names, &models, BUS_ANY); - if (names && *names) + get_medias(FLOPPY, &names, &models, BUS_ANY); + if (names && *names) return asprintf_("/dev/%s", *names); else return NULL; diff --git a/mdk-stage1/url.c b/mdk-stage1/url.c index 305f5ce0f..b9af3c689 100644 --- a/mdk-stage1/url.c +++ b/mdk-stage1/url.c @@ -1,560 +1,5732 @@ -/* - * Guillaume Cottenceau (gc) - * - * Copyright 2000 Mandriva - * - * This software may be freely redistributed under the terms of the GNU - * public license. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -/* - * Portions from Erik Troan <ewt@redhat.com> and Matt Wilson <msw@redhat.com> - * - * Copyright 1999 Red Hat, Inc. - * - */ - -#include <alloca.h> -#include <sys/socket.h> -#include <sys/types.h> -#include <netinet/in_systm.h> - -#include <ctype.h> -#include <errno.h> -#include <fcntl.h> -#include <netdb.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <strings.h> -#include <sys/socket.h> -#include <sys/time.h> -#include <sys/types.h> -#include <unistd.h> -#include <sys/poll.h> - -#include <netinet/in.h> -#include <netinet/ip.h> -#include <arpa/inet.h> - -#include "dns.h" -#include "log.h" -#include "tools.h" -#include "utils.h" - -#include "url.h" - - -#define TIMEOUT_SECS 60 -#define BUFFER_SIZE 4096 -#define HTTP_MAX_RECURSION 5 - - -static int ftp_check_response(int sock, char ** str) -{ - static char buf[BUFFER_SIZE + 1]; - int bufLength = 0; - struct pollfd polls; - char * chptr, * start; - int bytesRead, rc = 0; - int doesContinue = 1; - char errorCode[4]; - - errorCode[0] = '\0'; - - do { - polls.fd = sock; - polls.events = POLLIN; - if (poll(&polls, 1, TIMEOUT_SECS*1000) != 1) - return FTPERR_BAD_SERVER_RESPONSE; - - bytesRead = read(sock, buf + bufLength, sizeof(buf) - bufLength - 1); - - bufLength += bytesRead; - - buf[bufLength] = '\0'; - - /* divide the response into lines, checking each one to see if - we are finished or need to continue */ - - start = chptr = buf; - - do { - while (*chptr != '\n' && *chptr) chptr++; - - if (*chptr == '\n') { - *chptr = '\0'; - if (*(chptr - 1) == '\r') *(chptr - 1) = '\0'; - if (str) *str = start; - - if (errorCode[0]) { - if (!strncmp(start, errorCode, 3) && start[3] == ' ') - doesContinue = 0; - } else { - strncpy(errorCode, start, 3); - errorCode[3] = '\0'; - if (start[3] != '-') { - doesContinue = 0; - } - } - - start = chptr + 1; - chptr++; - } else { - chptr++; - } - } while (*chptr); - - if (doesContinue && chptr > start) { - memcpy(buf, start, chptr - start - 1); - bufLength = chptr - start - 1; - } else { - bufLength = 0; - } - } while (doesContinue); - - if (*errorCode == '4' || *errorCode == '5') { - if (!strncmp(errorCode, "550", 3)) { - return FTPERR_FILE_NOT_FOUND; - } - - return FTPERR_BAD_SERVER_RESPONSE; - } - - if (rc) return rc; - - return 0; -} - -static int ftp_command(int sock, char * command, char * param) -{ - char buf[500]; - int rc; - - snprintf(buf, sizeof(buf), "%s%s%s\r\n", command, param ? " " : "", param ? param : ""); - - if (write(sock, buf, strlen(buf)) != (ssize_t)strlen(buf)) { - return FTPERR_SERVER_IO_ERROR; - } - - if ((rc = ftp_check_response(sock, NULL))) - return rc; - - return 0; -} - -static int get_host_address(char * host, struct in_addr * address) -{ - if (isdigit(host[0])) { - if (!inet_aton(host, address)) { - return FTPERR_BAD_HOST_ADDR; - } - } else { - if (mygethostbyname(host, address)) - return FTPERR_BAD_HOSTNAME; - } - - return 0; -} - -int ftp_open_connection(char * host, char * name, char * password, char * proxy) -{ - int sock; - struct in_addr serverAddress; - struct sockaddr_in destPort; - int rc; - int port = 21; - - if (!strcmp(name, "")) { - name = "anonymous"; - password = "-drakx@"; - } - - if (strcmp(proxy, "")) { - name = asprintf_("%s@%s", name, host); - host = proxy; - } - - if ((rc = get_host_address(host, &serverAddress))) return rc; - - sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - if (sock < 0) { - return FTPERR_FAILED_CONNECT; - } - - destPort.sin_family = AF_INET; - destPort.sin_port = htons(port); - destPort.sin_addr = serverAddress; - - if (connect(sock, (struct sockaddr *) &destPort, sizeof(destPort))) { - close(sock); - return FTPERR_FAILED_CONNECT; - } - - /* ftpCheckResponse() assumes the socket is nonblocking */ - if (fcntl(sock, F_SETFL, O_NONBLOCK)) { - close(sock); - return FTPERR_FAILED_CONNECT; - } - - if ((rc = ftp_check_response(sock, NULL))) { - return rc; - } - - if ((rc = ftp_command(sock, "USER", name))) { - close(sock); - return rc; - } - - if ((rc = ftp_command(sock, "PASS", password))) { - close(sock); - return rc; - } - - if ((rc = ftp_command(sock, "TYPE", "I"))) { - close(sock); - return rc; - } - - return sock; -} - - -int ftp_data_command(int sock, char * command, char * param) -{ - int dataSocket; - struct sockaddr_in dataAddress; - int i, j; - char * passReply; - char * chptr; - char retrCommand[500]; - int rc; - - if (write(sock, "PASV\r\n", 6) != 6) { - return FTPERR_SERVER_IO_ERROR; - } - if ((rc = ftp_check_response(sock, &passReply))) - return FTPERR_PASSIVE_ERROR; - - chptr = passReply; - while (*chptr && *chptr != '(') chptr++; - if (*chptr != '(') return FTPERR_PASSIVE_ERROR; - chptr++; - passReply = chptr; - while (*chptr && *chptr != ')') chptr++; - if (*chptr != ')') return FTPERR_PASSIVE_ERROR; - *chptr-- = '\0'; - - while (*chptr && *chptr != ',') chptr--; - if (*chptr != ',') return FTPERR_PASSIVE_ERROR; - chptr--; - while (*chptr && *chptr != ',') chptr--; - if (*chptr != ',') return FTPERR_PASSIVE_ERROR; - *chptr++ = '\0'; - - /* now passReply points to the IP portion, and chptr points to the - port number portion */ - - dataAddress.sin_family = AF_INET; - if (sscanf(chptr, "%d,%d", &i, &j) != 2) { - return FTPERR_PASSIVE_ERROR; - } - dataAddress.sin_port = htons((i << 8) + j); - - chptr = passReply; - while (*chptr++) { - if (*chptr == ',') *chptr = '.'; - } - - if (!inet_aton(passReply, &dataAddress.sin_addr)) - return FTPERR_PASSIVE_ERROR; - - dataSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - if (dataSocket < 0) { - return FTPERR_FAILED_CONNECT; - } - - if (!param) - sprintf(retrCommand, "%s\r\n", command); - else - sprintf(retrCommand, "%s %s\r\n", command, param); - - i = strlen(retrCommand); - - if (write(sock, retrCommand, i) != i) { - return FTPERR_SERVER_IO_ERROR; - } - - if (connect(dataSocket, (struct sockaddr *) &dataAddress, - sizeof(dataAddress))) { - close(dataSocket); - return FTPERR_FAILED_DATA_CONNECT; - } - - if ((rc = ftp_check_response(sock, NULL))) { - close(dataSocket); - return rc; - } - - return dataSocket; -} - - -int ftp_get_filesize(int sock, char * remotename) -{ - int size = 0; - char buf[2000]; - char file[500]; - char * ptr; - int fd, rc, tot; - int i; - - strcpy(buf, remotename); - ptr = strrchr(buf, '/'); - if (!*ptr) - return -1; - *ptr = '\0'; - - strcpy(file, ptr+1); - - if ((rc = ftp_command(sock, "CWD", buf))) { - return -1; - } - - fd = ftp_data_command(sock, "LIST", file); - if (fd <= 0) { - close(sock); - return -1; - } - - ptr = buf; - while ((tot = read(fd, ptr, sizeof(buf) - (ptr - buf) - 1)) != 0) - ptr += tot; - *ptr = '\0'; - close(fd); - - if (!(ptr = strstr(buf, file))) { - log_message("FTP/get_filesize: Bad mood, directory does not contain searched file (%s)", file); - if (ftp_end_data_command(sock)) - close(sock); - return -1; - } - - for (i=0; i<4; i++) { - while (*ptr && *ptr != ' ') - ptr--; - while (*ptr && *ptr == ' ') - ptr--; - } - while (*ptr && *ptr != ' ') - ptr--; - - if (ptr) - size = charstar_to_int(ptr+1); - else - size = 0; - - if (ftp_end_data_command(sock)) { - close(sock); - return -1; - } - - return size; -} - - -int ftp_start_download(int sock, char * remotename, int * size) -{ - if ((*size = ftp_get_filesize(sock, remotename)) == -1) { - log_message("FTP: could not get filesize (trying to continue)"); - *size = 0; - } - return ftp_data_command(sock, "RETR", remotename); -} - - -int ftp_end_data_command(int sock) -{ - if (ftp_check_response(sock, NULL)) - return FTPERR_BAD_SERVER_RESPONSE; - - return 0; -} - - -char *str_ftp_error(int error) -{ - return error == FTPERR_PASSIVE_ERROR ? "error with passive connection" : - error == FTPERR_FAILED_CONNECT ? "couldn't connect to server" : - error == FTPERR_FILE_NOT_FOUND ? "file not found" : - error == FTPERR_BAD_SERVER_RESPONSE ? "bad server response (server too busy?)" : - NULL; -} - - -static int _http_download_file(char * hostname, char * remotename, int * size, char * proxyprotocol, char * proxyname, char * proxyport, int recursion) -{ - char * buf; - char headers[4096]; - char * nextChar = headers; - int statusCode; - struct in_addr serverAddress; - struct pollfd polls; - int sock; - int rc; - struct sockaddr_in destPort; - const char * header_content_length = "Content-Length: "; - const char * header_location = "Location: http://"; - char * http_server_name; - int http_server_port; - - if (proxyprotocol) { - http_server_name = proxyname; - http_server_port = atoi(proxyport); - } else { - http_server_name = hostname; - http_server_port = 80; - } - - log_message("HTTP: connecting to server %s:%i (%s)", - http_server_name, http_server_port, - proxyprotocol ? "proxy" : "no proxy"); - - if ((rc = get_host_address(http_server_name, &serverAddress))) return rc; - - sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - if (sock < 0) { - return FTPERR_FAILED_CONNECT; - } - - destPort.sin_family = AF_INET; - destPort.sin_port = htons(http_server_port); - destPort.sin_addr = serverAddress; - - if (connect(sock, (struct sockaddr *) &destPort, sizeof(destPort))) { - close(sock); - return FTPERR_FAILED_CONNECT; - } - - buf = proxyprotocol ? asprintf_("GET %s://%s%s HTTP/1.0\r\nHost: %s\r\n\r\n", proxyprotocol, hostname, remotename, hostname) - : asprintf_("GET %s HTTP/1.0\r\nHost: %s\r\n\r\n", remotename, hostname); - - write(sock, buf, strlen(buf)); - - /* This is fun; read the response a character at a time until we: - - 1) Get our first \r\n; which lets us check the return code - 2) Get a \r\n\r\n, which means we're done */ - - *nextChar = '\0'; - statusCode = 0; - while (!strstr(headers, "\r\n\r\n")) { - polls.fd = sock; - polls.events = POLLIN; - rc = poll(&polls, 1, TIMEOUT_SECS*1000); - - if (rc == 0) { - close(sock); - return FTPERR_SERVER_TIMEOUT; - } else if (rc < 0) { - close(sock); - return FTPERR_SERVER_IO_ERROR; - } - - if (read(sock, nextChar, 1) != 1) { - close(sock); - return FTPERR_SERVER_IO_ERROR; - } - - nextChar++; - *nextChar = '\0'; - - if (nextChar - headers == sizeof(headers)) { - close(sock); - return FTPERR_SERVER_IO_ERROR; - } - - if (!statusCode && strstr(headers, "\r\n")) { - char * start, * end; - - start = headers; - while (!isspace(*start) && *start) start++; - if (!*start) { - close(sock); - return FTPERR_SERVER_IO_ERROR; - } - start++; - - end = start; - while (!isspace(*end) && *end) end++; - if (!*end) { - close(sock); - return FTPERR_SERVER_IO_ERROR; - } - - *end = '\0'; - log_message("HTTP: server response '%s'", start); - if (streq(start, "404")) { - close(sock); - return FTPERR_FILE_NOT_FOUND; - } else if (streq(start, "302")) { - log_message("HTTP: found, but document has moved"); - statusCode = 302; - } else if (streq(start, "200")) { - statusCode = 200; - } else { - close(sock); - return FTPERR_BAD_SERVER_RESPONSE; - } - - *end = ' '; - } - } - - if (statusCode == 302) { - if (recursion >= HTTP_MAX_RECURSION) { - log_message("HTTP: too many levels of recursion, aborting"); - close(sock); - return FTPERR_UNKNOWN; - } - if ((buf = strstr(headers, header_location))) { - char * found_host; - char *found_file; - found_host = buf + strlen(header_location); - if ((found_file = index(found_host, '/'))) { - if ((buf = index(found_file, '\r'))) { - buf[0] = '\0'; - remotename = strdup(found_file); - found_file[0] = '\0'; - hostname = strdup(found_host); - log_message("HTTP: redirected to new host \"%s\" and file \"%s\"", hostname, remotename); - } - } - - } - /* - * don't fail if new URL can't be parsed, - * asking the same URL may work if the DNS server are doing round-robin - */ - return _http_download_file(hostname, remotename, size, proxyprotocol, proxyname, proxyport, recursion + 1); - } - - if ((buf = strstr(headers, header_content_length))) - *size = charstar_to_int(buf + strlen(header_content_length)); - else - *size = 0; - - return sock; -} - - -int http_download_file(char * hostname, char * remotename, int * size, char * proxyprotocol, char * proxyname, char * proxyport) -{ - return _http_download_file(hostname, remotename, size, proxyprotocol, proxyname, proxyport, 0); -} + + + + + + + + + + + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" +"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<!-- ViewVC :: http://www.viewvc.org/ --> +<head> +<title>[soft] Contents of /drakx/trunk/mdk-stage1/url.c</title> +<meta name="generator" content="ViewVC 1.1.15" /> +<link rel="shortcut icon" href="/viewvc/images/favicon.ico" /> +<link rel="stylesheet" href="/viewvc/styles.css" type="text/css" /> + +</head> +<body> +<div class="vc_navheader"> +<table><tr> +<td><strong><a href="/"><span class="pathdiv">/</span></a><a href="/soft/?pathrev=6430">[soft]</a><span class="pathdiv">/</span><a href="/soft/drakx/?pathrev=6430">drakx</a><span class="pathdiv">/</span><a href="/soft/drakx/trunk/?pathrev=6430">trunk</a><span class="pathdiv">/</span><a href="/soft/drakx/trunk/mdk-stage1/?pathrev=6430">mdk-stage1</a><span class="pathdiv">/</span><a href="/soft/drakx/trunk/mdk-stage1/url.c?view=log&pathrev=6430">url.c</a></strong></td> +<td style="text-align: right;"></td> +</tr></table> +</div> +<div style="float: right; padding: 5px;"><a href="http://www.viewvc.org/" title="ViewVC Home"><img src="/viewvc/images/viewvc-logo.png" alt="ViewVC logotype" width="240" height="70" /></a></div> +<h1>Contents of /drakx/trunk/mdk-stage1/url.c</h1> + +<p style="margin:0;"> + +<a href="/soft/drakx/trunk/mdk-stage1/?pathrev=6430"><img src="/viewvc/images/back_small.png" class="vc_icon" alt="Parent Directory" /> Parent Directory</a> + +| <a href="/soft/drakx/trunk/mdk-stage1/url.c?view=log&pathrev=6430"><img src="/viewvc/images/log.png" class="vc_icon" alt="Revision Log" /> Revision Log</a> + + + + +</p> + +<hr /> +<div class="vc_summary"> +Revision <a href="/soft?view=revision&revision=2834"><strong>2834</strong></a> - +(<a href="/soft/drakx/trunk/mdk-stage1/url.c?annotate=2834&pathrev=6430"><strong>show annotations</strong></a>) +(<a href="/soft/drakx/trunk/mdk-stage1/url.c?revision=2834&view=co&pathrev=6430"><strong>download</strong></a>) +(<a href="/soft/drakx/trunk/mdk-stage1/url.c?view=co&revision=2834&content-type=text%2Fplain&pathrev=6430"><strong>as text</strong></a>) + +<br /><em>Fri Jan 27 07:14:12 2012 UTC</em> +(9 months, 2 weeks ago) +by <em>tv</em> + + + + + + +<br />File MIME type: text/x-c + + +<br />File size: 12365 byte(s) + + + + + + +<pre class="vc_log">kill dead emails +</pre> + +</div> + + + + + + +<div id="vc_file"> +<table cellspacing="0" cellpadding="0"> + + + + + + + + +<tr class="vc_row_odd" id="l1"> +<td class="vc_file_line_number">1</td> + +<td class="vc_file_line_text"><span class="pygments-cm">/*</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l2"> +<td class="vc_file_line_number">2</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> * Guillaume Cottenceau (gc)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l3"> +<td class="vc_file_line_number">3</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> *</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l4"> +<td class="vc_file_line_number">4</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> * Copyright 2000 Mandriva</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l5"> +<td class="vc_file_line_number">5</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> *</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l6"> +<td class="vc_file_line_number">6</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> * This software may be freely redistributed under the terms of the GNU</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l7"> +<td class="vc_file_line_number">7</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> * public license.</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l8"> +<td class="vc_file_line_number">8</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> *</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l9"> +<td class="vc_file_line_number">9</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> * You should have received a copy of the GNU General Public License</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l10"> +<td class="vc_file_line_number">10</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> * along with this program; if not, write to the Free Software</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l11"> +<td class="vc_file_line_number">11</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l12"> +<td class="vc_file_line_number">12</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> *</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l13"> +<td class="vc_file_line_number">13</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> */</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l14"> +<td class="vc_file_line_number">14</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l15"> +<td class="vc_file_line_number">15</td> + +<td class="vc_file_line_text"><span class="pygments-cm">/*</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l16"> +<td class="vc_file_line_number">16</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> * Portions from Erik Troan <ewt@redhat.com> and Matt Wilson <msw@redhat.com></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l17"> +<td class="vc_file_line_number">17</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> *</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l18"> +<td class="vc_file_line_number">18</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> * Copyright 1999 Red Hat, Inc.</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l19"> +<td class="vc_file_line_number">19</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> *</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l20"> +<td class="vc_file_line_number">20</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> */</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l21"> +<td class="vc_file_line_number">21</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l22"> +<td class="vc_file_line_number">22</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <alloca.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l23"> +<td class="vc_file_line_number">23</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <sys/socket.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l24"> +<td class="vc_file_line_number">24</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <sys/types.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l25"> +<td class="vc_file_line_number">25</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <netinet/in_systm.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l26"> +<td class="vc_file_line_number">26</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l27"> +<td class="vc_file_line_number">27</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <ctype.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l28"> +<td class="vc_file_line_number">28</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <errno.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l29"> +<td class="vc_file_line_number">29</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <fcntl.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l30"> +<td class="vc_file_line_number">30</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <netdb.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l31"> +<td class="vc_file_line_number">31</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <stdarg.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l32"> +<td class="vc_file_line_number">32</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <stdio.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l33"> +<td class="vc_file_line_number">33</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <stdlib.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l34"> +<td class="vc_file_line_number">34</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <string.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l35"> +<td class="vc_file_line_number">35</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <strings.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l36"> +<td class="vc_file_line_number">36</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <sys/socket.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l37"> +<td class="vc_file_line_number">37</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <sys/time.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l38"> +<td class="vc_file_line_number">38</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <sys/types.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l39"> +<td class="vc_file_line_number">39</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <unistd.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l40"> +<td class="vc_file_line_number">40</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <sys/poll.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l41"> +<td class="vc_file_line_number">41</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l42"> +<td class="vc_file_line_number">42</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <netinet/in.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l43"> +<td class="vc_file_line_number">43</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <netinet/ip.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l44"> +<td class="vc_file_line_number">44</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include <arpa/inet.h></span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l45"> +<td class="vc_file_line_number">45</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l46"> +<td class="vc_file_line_number">46</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include "dns.h"</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l47"> +<td class="vc_file_line_number">47</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include "log.h"</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l48"> +<td class="vc_file_line_number">48</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include "tools.h"</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l49"> +<td class="vc_file_line_number">49</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include "utils.h"</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l50"> +<td class="vc_file_line_number">50</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l51"> +<td class="vc_file_line_number">51</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#include "url.h"</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l52"> +<td class="vc_file_line_number">52</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l53"> +<td class="vc_file_line_number">53</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l54"> +<td class="vc_file_line_number">54</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#define TIMEOUT_SECS 60</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l55"> +<td class="vc_file_line_number">55</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#define BUFFER_SIZE 4096</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l56"> +<td class="vc_file_line_number">56</td> + +<td class="vc_file_line_text"><span class="pygments-cp">#define HTTP_MAX_RECURSION 5</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l57"> +<td class="vc_file_line_number">57</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l58"> +<td class="vc_file_line_number">58</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l59"> +<td class="vc_file_line_number">59</td> + +<td class="vc_file_line_text"><span class="pygments-k">static</span> <span class="pygments-kt">int</span> <span class="pygments-nf">ftp_check_response</span><span class="pygments-p">(</span><span class="pygments-kt">int</span> <span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">**</span> <span class="pygments-n">str</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l60"> +<td class="vc_file_line_number">60</td> + +<td class="vc_file_line_text"><span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l61"> +<td class="vc_file_line_number">61</td> + +<td class="vc_file_line_text"> <span class="pygments-k">static</span> <span class="pygments-kt">char</span> <span class="pygments-n">buf</span><span class="pygments-p">[</span><span class="pygments-n">BUFFER_SIZE</span> <span class="pygments-o">+</span> <span class="pygments-mi">1</span><span class="pygments-p">];</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l62"> +<td class="vc_file_line_number">62</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">bufLength</span> <span class="pygments-o">=</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l63"> +<td class="vc_file_line_number">63</td> + +<td class="vc_file_line_text"> <span class="pygments-k">struct</span> <span class="pygments-n">pollfd</span> <span class="pygments-n">polls</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l64"> +<td class="vc_file_line_number">64</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">chptr</span><span class="pygments-p">,</span> <span class="pygments-o">*</span> <span class="pygments-n">start</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l65"> +<td class="vc_file_line_number">65</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">bytesRead</span><span class="pygments-p">,</span> <span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l66"> +<td class="vc_file_line_number">66</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">doesContinue</span> <span class="pygments-o">=</span> <span class="pygments-mi">1</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l67"> +<td class="vc_file_line_number">67</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-n">errorCode</span><span class="pygments-p">[</span><span class="pygments-mi">4</span><span class="pygments-p">];</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l68"> +<td class="vc_file_line_number">68</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l69"> +<td class="vc_file_line_number">69</td> + +<td class="vc_file_line_text"> <span class="pygments-n">errorCode</span><span class="pygments-p">[</span><span class="pygments-mi">0</span><span class="pygments-p">]</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l70"> +<td class="vc_file_line_number">70</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l71"> +<td class="vc_file_line_number">71</td> + +<td class="vc_file_line_text"> <span class="pygments-k">do</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l72"> +<td class="vc_file_line_number">72</td> + +<td class="vc_file_line_text"> <span class="pygments-n">polls</span><span class="pygments-p">.</span><span class="pygments-n">fd</span> <span class="pygments-o">=</span> <span class="pygments-n">sock</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l73"> +<td class="vc_file_line_number">73</td> + +<td class="vc_file_line_text"> <span class="pygments-n">polls</span><span class="pygments-p">.</span><span class="pygments-n">events</span> <span class="pygments-o">=</span> <span class="pygments-n">POLLIN</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l74"> +<td class="vc_file_line_number">74</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">poll</span><span class="pygments-p">(</span><span class="pygments-o">&</span><span class="pygments-n">polls</span><span class="pygments-p">,</span> <span class="pygments-mi">1</span><span class="pygments-p">,</span> <span class="pygments-n">TIMEOUT_SECS</span><span class="pygments-o">*</span><span class="pygments-mi">1000</span><span class="pygments-p">)</span> <span class="pygments-o">!=</span> <span class="pygments-mi">1</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l75"> +<td class="vc_file_line_number">75</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_BAD_SERVER_RESPONSE</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l76"> +<td class="vc_file_line_number">76</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l77"> +<td class="vc_file_line_number">77</td> + +<td class="vc_file_line_text"> <span class="pygments-n">bytesRead</span> <span class="pygments-o">=</span> <span class="pygments-n">read</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-n">buf</span> <span class="pygments-o">+</span> <span class="pygments-n">bufLength</span><span class="pygments-p">,</span> <span class="pygments-k">sizeof</span><span class="pygments-p">(</span><span class="pygments-n">buf</span><span class="pygments-p">)</span> <span class="pygments-o">-</span> <span class="pygments-n">bufLength</span> <span class="pygments-o">-</span> <span class="pygments-mi">1</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l78"> +<td class="vc_file_line_number">78</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l79"> +<td class="vc_file_line_number">79</td> + +<td class="vc_file_line_text"> <span class="pygments-n">bufLength</span> <span class="pygments-o">+=</span> <span class="pygments-n">bytesRead</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l80"> +<td class="vc_file_line_number">80</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l81"> +<td class="vc_file_line_number">81</td> + +<td class="vc_file_line_text"> <span class="pygments-n">buf</span><span class="pygments-p">[</span><span class="pygments-n">bufLength</span><span class="pygments-p">]</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l82"> +<td class="vc_file_line_number">82</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l83"> +<td class="vc_file_line_number">83</td> + +<td class="vc_file_line_text"> <span class="pygments-cm">/* divide the response into lines, checking each one to see if </span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l84"> +<td class="vc_file_line_number">84</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> we are finished or need to continue */</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l85"> +<td class="vc_file_line_number">85</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l86"> +<td class="vc_file_line_number">86</td> + +<td class="vc_file_line_text"> <span class="pygments-n">start</span> <span class="pygments-o">=</span> <span class="pygments-n">chptr</span> <span class="pygments-o">=</span> <span class="pygments-n">buf</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l87"> +<td class="vc_file_line_number">87</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l88"> +<td class="vc_file_line_number">88</td> + +<td class="vc_file_line_text"> <span class="pygments-k">do</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l89"> +<td class="vc_file_line_number">89</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">!=</span> <span class="pygments-sc">'\n'</span> <span class="pygments-o">&&</span> <span class="pygments-o">*</span><span class="pygments-n">chptr</span><span class="pygments-p">)</span> <span class="pygments-n">chptr</span><span class="pygments-o">++</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l90"> +<td class="vc_file_line_number">90</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l91"> +<td class="vc_file_line_number">91</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">==</span> <span class="pygments-sc">'\n'</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l92"> +<td class="vc_file_line_number">92</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l93"> +<td class="vc_file_line_number">93</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-p">(</span><span class="pygments-n">chptr</span> <span class="pygments-o">-</span> <span class="pygments-mi">1</span><span class="pygments-p">)</span> <span class="pygments-o">==</span> <span class="pygments-sc">'\r'</span><span class="pygments-p">)</span> <span class="pygments-o">*</span><span class="pygments-p">(</span><span class="pygments-n">chptr</span> <span class="pygments-o">-</span> <span class="pygments-mi">1</span><span class="pygments-p">)</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l94"> +<td class="vc_file_line_number">94</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">str</span><span class="pygments-p">)</span> <span class="pygments-o">*</span><span class="pygments-n">str</span> <span class="pygments-o">=</span> <span class="pygments-n">start</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l95"> +<td class="vc_file_line_number">95</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l96"> +<td class="vc_file_line_number">96</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">errorCode</span><span class="pygments-p">[</span><span class="pygments-mi">0</span><span class="pygments-p">])</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l97"> +<td class="vc_file_line_number">97</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">!</span><span class="pygments-n">strncmp</span><span class="pygments-p">(</span><span class="pygments-n">start</span><span class="pygments-p">,</span> <span class="pygments-n">errorCode</span><span class="pygments-p">,</span> <span class="pygments-mi">3</span><span class="pygments-p">)</span> <span class="pygments-o">&&</span> <span class="pygments-n">start</span><span class="pygments-p">[</span><span class="pygments-mi">3</span><span class="pygments-p">]</span> <span class="pygments-o">==</span> <span class="pygments-sc">' '</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l98"> +<td class="vc_file_line_number">98</td> + +<td class="vc_file_line_text"> <span class="pygments-n">doesContinue</span> <span class="pygments-o">=</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l99"> +<td class="vc_file_line_number">99</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> <span class="pygments-k">else</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l100"> +<td class="vc_file_line_number">100</td> + +<td class="vc_file_line_text"> <span class="pygments-n">strncpy</span><span class="pygments-p">(</span><span class="pygments-n">errorCode</span><span class="pygments-p">,</span> <span class="pygments-n">start</span><span class="pygments-p">,</span> <span class="pygments-mi">3</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l101"> +<td class="vc_file_line_number">101</td> + +<td class="vc_file_line_text"> <span class="pygments-n">errorCode</span><span class="pygments-p">[</span><span class="pygments-mi">3</span><span class="pygments-p">]</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l102"> +<td class="vc_file_line_number">102</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">start</span><span class="pygments-p">[</span><span class="pygments-mi">3</span><span class="pygments-p">]</span> <span class="pygments-o">!=</span> <span class="pygments-sc">'-'</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l103"> +<td class="vc_file_line_number">103</td> + +<td class="vc_file_line_text"> <span class="pygments-n">doesContinue</span> <span class="pygments-o">=</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l104"> +<td class="vc_file_line_number">104</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l105"> +<td class="vc_file_line_number">105</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l106"> +<td class="vc_file_line_number">106</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l107"> +<td class="vc_file_line_number">107</td> + +<td class="vc_file_line_text"> <span class="pygments-n">start</span> <span class="pygments-o">=</span> <span class="pygments-n">chptr</span> <span class="pygments-o">+</span> <span class="pygments-mi">1</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l108"> +<td class="vc_file_line_number">108</td> + +<td class="vc_file_line_text"> <span class="pygments-n">chptr</span><span class="pygments-o">++</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l109"> +<td class="vc_file_line_number">109</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> <span class="pygments-k">else</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l110"> +<td class="vc_file_line_number">110</td> + +<td class="vc_file_line_text"> <span class="pygments-n">chptr</span><span class="pygments-o">++</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l111"> +<td class="vc_file_line_number">111</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l112"> +<td class="vc_file_line_number">112</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l113"> +<td class="vc_file_line_number">113</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l114"> +<td class="vc_file_line_number">114</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">doesContinue</span> <span class="pygments-o">&&</span> <span class="pygments-n">chptr</span> <span class="pygments-o">></span> <span class="pygments-n">start</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l115"> +<td class="vc_file_line_number">115</td> + +<td class="vc_file_line_text"> <span class="pygments-n">memcpy</span><span class="pygments-p">(</span><span class="pygments-n">buf</span><span class="pygments-p">,</span> <span class="pygments-n">start</span><span class="pygments-p">,</span> <span class="pygments-n">chptr</span> <span class="pygments-o">-</span> <span class="pygments-n">start</span> <span class="pygments-o">-</span> <span class="pygments-mi">1</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l116"> +<td class="vc_file_line_number">116</td> + +<td class="vc_file_line_text"> <span class="pygments-n">bufLength</span> <span class="pygments-o">=</span> <span class="pygments-n">chptr</span> <span class="pygments-o">-</span> <span class="pygments-n">start</span> <span class="pygments-o">-</span> <span class="pygments-mi">1</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l117"> +<td class="vc_file_line_number">117</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> <span class="pygments-k">else</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l118"> +<td class="vc_file_line_number">118</td> + +<td class="vc_file_line_text"> <span class="pygments-n">bufLength</span> <span class="pygments-o">=</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l119"> +<td class="vc_file_line_number">119</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l120"> +<td class="vc_file_line_number">120</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-n">doesContinue</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l121"> +<td class="vc_file_line_number">121</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l122"> +<td class="vc_file_line_number">122</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">errorCode</span> <span class="pygments-o">==</span> <span class="pygments-sc">'4'</span> <span class="pygments-o">||</span> <span class="pygments-o">*</span><span class="pygments-n">errorCode</span> <span class="pygments-o">==</span> <span class="pygments-sc">'5'</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l123"> +<td class="vc_file_line_number">123</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">!</span><span class="pygments-n">strncmp</span><span class="pygments-p">(</span><span class="pygments-n">errorCode</span><span class="pygments-p">,</span> <span class="pygments-s">"550"</span><span class="pygments-p">,</span> <span class="pygments-mi">3</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l124"> +<td class="vc_file_line_number">124</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_FILE_NOT_FOUND</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l125"> +<td class="vc_file_line_number">125</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l126"> +<td class="vc_file_line_number">126</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l127"> +<td class="vc_file_line_number">127</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_BAD_SERVER_RESPONSE</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l128"> +<td class="vc_file_line_number">128</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l129"> +<td class="vc_file_line_number">129</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l130"> +<td class="vc_file_line_number">130</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">rc</span><span class="pygments-p">)</span> <span class="pygments-k">return</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l131"> +<td class="vc_file_line_number">131</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l132"> +<td class="vc_file_line_number">132</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l133"> +<td class="vc_file_line_number">133</td> + +<td class="vc_file_line_text"><span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l134"> +<td class="vc_file_line_number">134</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l135"> +<td class="vc_file_line_number">135</td> + +<td class="vc_file_line_text"><span class="pygments-k">static</span> <span class="pygments-kt">int</span> <span class="pygments-nf">ftp_command</span><span class="pygments-p">(</span><span class="pygments-kt">int</span> <span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">command</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">param</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l136"> +<td class="vc_file_line_number">136</td> + +<td class="vc_file_line_text"><span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l137"> +<td class="vc_file_line_number">137</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-n">buf</span><span class="pygments-p">[</span><span class="pygments-mi">500</span><span class="pygments-p">];</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l138"> +<td class="vc_file_line_number">138</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l139"> +<td class="vc_file_line_number">139</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l140"> +<td class="vc_file_line_number">140</td> + +<td class="vc_file_line_text"> <span class="pygments-n">snprintf</span><span class="pygments-p">(</span><span class="pygments-n">buf</span><span class="pygments-p">,</span> <span class="pygments-k">sizeof</span><span class="pygments-p">(</span><span class="pygments-n">buf</span><span class="pygments-p">),</span> <span class="pygments-s">"%s%s%s</span><span class="pygments-se">\r\n</span><span class="pygments-s">"</span><span class="pygments-p">,</span> <span class="pygments-n">command</span><span class="pygments-p">,</span> <span class="pygments-n">param</span> <span class="pygments-o">?</span> <span class="pygments-s">" "</span> <span class="pygments-o">:</span> <span class="pygments-s">""</span><span class="pygments-p">,</span> <span class="pygments-n">param</span> <span class="pygments-o">?</span> <span class="pygments-n">param</span> <span class="pygments-o">:</span> <span class="pygments-s">""</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l141"> +<td class="vc_file_line_number">141</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l142"> +<td class="vc_file_line_number">142</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">write</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-n">buf</span><span class="pygments-p">,</span> <span class="pygments-n">strlen</span><span class="pygments-p">(</span><span class="pygments-n">buf</span><span class="pygments-p">))</span> <span class="pygments-o">!=</span> <span class="pygments-p">(</span><span class="pygments-kt">ssize_t</span><span class="pygments-p">)</span><span class="pygments-n">strlen</span><span class="pygments-p">(</span><span class="pygments-n">buf</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l143"> +<td class="vc_file_line_number">143</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_SERVER_IO_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l144"> +<td class="vc_file_line_number">144</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l145"> +<td class="vc_file_line_number">145</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l146"> +<td class="vc_file_line_number">146</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-n">ftp_check_response</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-nb">NULL</span><span class="pygments-p">)))</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l147"> +<td class="vc_file_line_number">147</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l148"> +<td class="vc_file_line_number">148</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l149"> +<td class="vc_file_line_number">149</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l150"> +<td class="vc_file_line_number">150</td> + +<td class="vc_file_line_text"><span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l151"> +<td class="vc_file_line_number">151</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l152"> +<td class="vc_file_line_number">152</td> + +<td class="vc_file_line_text"><span class="pygments-k">static</span> <span class="pygments-kt">int</span> <span class="pygments-nf">get_host_address</span><span class="pygments-p">(</span><span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">host</span><span class="pygments-p">,</span> <span class="pygments-k">struct</span> <span class="pygments-n">in_addr</span> <span class="pygments-o">*</span> <span class="pygments-n">address</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l153"> +<td class="vc_file_line_number">153</td> + +<td class="vc_file_line_text"><span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l154"> +<td class="vc_file_line_number">154</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">isdigit</span><span class="pygments-p">(</span><span class="pygments-n">host</span><span class="pygments-p">[</span><span class="pygments-mi">0</span><span class="pygments-p">]))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l155"> +<td class="vc_file_line_number">155</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">!</span><span class="pygments-n">inet_aton</span><span class="pygments-p">(</span><span class="pygments-n">host</span><span class="pygments-p">,</span> <span class="pygments-n">address</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l156"> +<td class="vc_file_line_number">156</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_BAD_HOST_ADDR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l157"> +<td class="vc_file_line_number">157</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l158"> +<td class="vc_file_line_number">158</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> <span class="pygments-k">else</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l159"> +<td class="vc_file_line_number">159</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">mygethostbyname</span><span class="pygments-p">(</span><span class="pygments-n">host</span><span class="pygments-p">,</span> <span class="pygments-n">address</span><span class="pygments-p">))</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l160"> +<td class="vc_file_line_number">160</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_BAD_HOSTNAME</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l161"> +<td class="vc_file_line_number">161</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l162"> +<td class="vc_file_line_number">162</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l163"> +<td class="vc_file_line_number">163</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l164"> +<td class="vc_file_line_number">164</td> + +<td class="vc_file_line_text"><span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l165"> +<td class="vc_file_line_number">165</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l166"> +<td class="vc_file_line_number">166</td> + +<td class="vc_file_line_text"><span class="pygments-kt">int</span> <span class="pygments-nf">ftp_open_connection</span><span class="pygments-p">(</span><span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">host</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">name</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">password</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">proxy</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l167"> +<td class="vc_file_line_number">167</td> + +<td class="vc_file_line_text"><span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l168"> +<td class="vc_file_line_number">168</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">sock</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l169"> +<td class="vc_file_line_number">169</td> + +<td class="vc_file_line_text"> <span class="pygments-k">struct</span> <span class="pygments-n">in_addr</span> <span class="pygments-n">serverAddress</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l170"> +<td class="vc_file_line_number">170</td> + +<td class="vc_file_line_text"> <span class="pygments-k">struct</span> <span class="pygments-n">sockaddr_in</span> <span class="pygments-n">destPort</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l171"> +<td class="vc_file_line_number">171</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l172"> +<td class="vc_file_line_number">172</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">port</span> <span class="pygments-o">=</span> <span class="pygments-mi">21</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l173"> +<td class="vc_file_line_number">173</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l174"> +<td class="vc_file_line_number">174</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">!</span><span class="pygments-n">strcmp</span><span class="pygments-p">(</span><span class="pygments-n">name</span><span class="pygments-p">,</span> <span class="pygments-s">""</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l175"> +<td class="vc_file_line_number">175</td> + +<td class="vc_file_line_text"> <span class="pygments-n">name</span> <span class="pygments-o">=</span> <span class="pygments-s">"anonymous"</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l176"> +<td class="vc_file_line_number">176</td> + +<td class="vc_file_line_text"> <span class="pygments-n">password</span> <span class="pygments-o">=</span> <span class="pygments-s">"-drakx@"</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l177"> +<td class="vc_file_line_number">177</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l178"> +<td class="vc_file_line_number">178</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l179"> +<td class="vc_file_line_number">179</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">strcmp</span><span class="pygments-p">(</span><span class="pygments-n">proxy</span><span class="pygments-p">,</span> <span class="pygments-s">""</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l180"> +<td class="vc_file_line_number">180</td> + +<td class="vc_file_line_text"> <span class="pygments-n">name</span> <span class="pygments-o">=</span> <span class="pygments-n">asprintf_</span><span class="pygments-p">(</span><span class="pygments-s">"%s@%s"</span><span class="pygments-p">,</span> <span class="pygments-n">name</span><span class="pygments-p">,</span> <span class="pygments-n">host</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l181"> +<td class="vc_file_line_number">181</td> + +<td class="vc_file_line_text"> <span class="pygments-n">host</span> <span class="pygments-o">=</span> <span class="pygments-n">proxy</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l182"> +<td class="vc_file_line_number">182</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l183"> +<td class="vc_file_line_number">183</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l184"> +<td class="vc_file_line_number">184</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-n">get_host_address</span><span class="pygments-p">(</span><span class="pygments-n">host</span><span class="pygments-p">,</span> <span class="pygments-o">&</span><span class="pygments-n">serverAddress</span><span class="pygments-p">)))</span> <span class="pygments-k">return</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l185"> +<td class="vc_file_line_number">185</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l186"> +<td class="vc_file_line_number">186</td> + +<td class="vc_file_line_text"> <span class="pygments-n">sock</span> <span class="pygments-o">=</span> <span class="pygments-n">socket</span><span class="pygments-p">(</span><span class="pygments-n">AF_INET</span><span class="pygments-p">,</span> <span class="pygments-n">SOCK_STREAM</span><span class="pygments-p">,</span> <span class="pygments-n">IPPROTO_IP</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l187"> +<td class="vc_file_line_number">187</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">sock</span> <span class="pygments-o"><</span> <span class="pygments-mi">0</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l188"> +<td class="vc_file_line_number">188</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_FAILED_CONNECT</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l189"> +<td class="vc_file_line_number">189</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l190"> +<td class="vc_file_line_number">190</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l191"> +<td class="vc_file_line_number">191</td> + +<td class="vc_file_line_text"> <span class="pygments-n">destPort</span><span class="pygments-p">.</span><span class="pygments-n">sin_family</span> <span class="pygments-o">=</span> <span class="pygments-n">AF_INET</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l192"> +<td class="vc_file_line_number">192</td> + +<td class="vc_file_line_text"> <span class="pygments-n">destPort</span><span class="pygments-p">.</span><span class="pygments-n">sin_port</span> <span class="pygments-o">=</span> <span class="pygments-n">htons</span><span class="pygments-p">(</span><span class="pygments-n">port</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l193"> +<td class="vc_file_line_number">193</td> + +<td class="vc_file_line_text"> <span class="pygments-n">destPort</span><span class="pygments-p">.</span><span class="pygments-n">sin_addr</span> <span class="pygments-o">=</span> <span class="pygments-n">serverAddress</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l194"> +<td class="vc_file_line_number">194</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l195"> +<td class="vc_file_line_number">195</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">connect</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-p">(</span><span class="pygments-k">struct</span> <span class="pygments-n">sockaddr</span> <span class="pygments-o">*</span><span class="pygments-p">)</span> <span class="pygments-o">&</span><span class="pygments-n">destPort</span><span class="pygments-p">,</span> <span class="pygments-k">sizeof</span><span class="pygments-p">(</span><span class="pygments-n">destPort</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l196"> +<td class="vc_file_line_number">196</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l197"> +<td class="vc_file_line_number">197</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_FAILED_CONNECT</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l198"> +<td class="vc_file_line_number">198</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l199"> +<td class="vc_file_line_number">199</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l200"> +<td class="vc_file_line_number">200</td> + +<td class="vc_file_line_text"> <span class="pygments-cm">/* ftpCheckResponse() assumes the socket is nonblocking */</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l201"> +<td class="vc_file_line_number">201</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">fcntl</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-n">F_SETFL</span><span class="pygments-p">,</span> <span class="pygments-n">O_NONBLOCK</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l202"> +<td class="vc_file_line_number">202</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l203"> +<td class="vc_file_line_number">203</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_FAILED_CONNECT</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l204"> +<td class="vc_file_line_number">204</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l205"> +<td class="vc_file_line_number">205</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l206"> +<td class="vc_file_line_number">206</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-n">ftp_check_response</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-nb">NULL</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l207"> +<td class="vc_file_line_number">207</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l208"> +<td class="vc_file_line_number">208</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l209"> +<td class="vc_file_line_number">209</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l210"> +<td class="vc_file_line_number">210</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-n">ftp_command</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-s">"USER"</span><span class="pygments-p">,</span> <span class="pygments-n">name</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l211"> +<td class="vc_file_line_number">211</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l212"> +<td class="vc_file_line_number">212</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l213"> +<td class="vc_file_line_number">213</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l214"> +<td class="vc_file_line_number">214</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l215"> +<td class="vc_file_line_number">215</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-n">ftp_command</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-s">"PASS"</span><span class="pygments-p">,</span> <span class="pygments-n">password</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l216"> +<td class="vc_file_line_number">216</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l217"> +<td class="vc_file_line_number">217</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l218"> +<td class="vc_file_line_number">218</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l219"> +<td class="vc_file_line_number">219</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l220"> +<td class="vc_file_line_number">220</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-n">ftp_command</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-s">"TYPE"</span><span class="pygments-p">,</span> <span class="pygments-s">"I"</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l221"> +<td class="vc_file_line_number">221</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l222"> +<td class="vc_file_line_number">222</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l223"> +<td class="vc_file_line_number">223</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l224"> +<td class="vc_file_line_number">224</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l225"> +<td class="vc_file_line_number">225</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">sock</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l226"> +<td class="vc_file_line_number">226</td> + +<td class="vc_file_line_text"><span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l227"> +<td class="vc_file_line_number">227</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l228"> +<td class="vc_file_line_number">228</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l229"> +<td class="vc_file_line_number">229</td> + +<td class="vc_file_line_text"><span class="pygments-kt">int</span> <span class="pygments-nf">ftp_data_command</span><span class="pygments-p">(</span><span class="pygments-kt">int</span> <span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">command</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">param</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l230"> +<td class="vc_file_line_number">230</td> + +<td class="vc_file_line_text"><span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l231"> +<td class="vc_file_line_number">231</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">dataSocket</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l232"> +<td class="vc_file_line_number">232</td> + +<td class="vc_file_line_text"> <span class="pygments-k">struct</span> <span class="pygments-n">sockaddr_in</span> <span class="pygments-n">dataAddress</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l233"> +<td class="vc_file_line_number">233</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">i</span><span class="pygments-p">,</span> <span class="pygments-n">j</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l234"> +<td class="vc_file_line_number">234</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">passReply</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l235"> +<td class="vc_file_line_number">235</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">chptr</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l236"> +<td class="vc_file_line_number">236</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-n">retrCommand</span><span class="pygments-p">[</span><span class="pygments-mi">500</span><span class="pygments-p">];</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l237"> +<td class="vc_file_line_number">237</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l238"> +<td class="vc_file_line_number">238</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l239"> +<td class="vc_file_line_number">239</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">write</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-s">"PASV</span><span class="pygments-se">\r\n</span><span class="pygments-s">"</span><span class="pygments-p">,</span> <span class="pygments-mi">6</span><span class="pygments-p">)</span> <span class="pygments-o">!=</span> <span class="pygments-mi">6</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l240"> +<td class="vc_file_line_number">240</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_SERVER_IO_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l241"> +<td class="vc_file_line_number">241</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l242"> +<td class="vc_file_line_number">242</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-n">ftp_check_response</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-o">&</span><span class="pygments-n">passReply</span><span class="pygments-p">)))</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l243"> +<td class="vc_file_line_number">243</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_PASSIVE_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l244"> +<td class="vc_file_line_number">244</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l245"> +<td class="vc_file_line_number">245</td> + +<td class="vc_file_line_text"> <span class="pygments-n">chptr</span> <span class="pygments-o">=</span> <span class="pygments-n">passReply</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l246"> +<td class="vc_file_line_number">246</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">&&</span> <span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">!=</span> <span class="pygments-sc">'('</span><span class="pygments-p">)</span> <span class="pygments-n">chptr</span><span class="pygments-o">++</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l247"> +<td class="vc_file_line_number">247</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">!=</span> <span class="pygments-sc">'('</span><span class="pygments-p">)</span> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_PASSIVE_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l248"> +<td class="vc_file_line_number">248</td> + +<td class="vc_file_line_text"> <span class="pygments-n">chptr</span><span class="pygments-o">++</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l249"> +<td class="vc_file_line_number">249</td> + +<td class="vc_file_line_text"> <span class="pygments-n">passReply</span> <span class="pygments-o">=</span> <span class="pygments-n">chptr</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l250"> +<td class="vc_file_line_number">250</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">&&</span> <span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">!=</span> <span class="pygments-sc">')'</span><span class="pygments-p">)</span> <span class="pygments-n">chptr</span><span class="pygments-o">++</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l251"> +<td class="vc_file_line_number">251</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">!=</span> <span class="pygments-sc">')'</span><span class="pygments-p">)</span> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_PASSIVE_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l252"> +<td class="vc_file_line_number">252</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">chptr</span><span class="pygments-o">--</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l253"> +<td class="vc_file_line_number">253</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l254"> +<td class="vc_file_line_number">254</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">&&</span> <span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">!=</span> <span class="pygments-sc">','</span><span class="pygments-p">)</span> <span class="pygments-n">chptr</span><span class="pygments-o">--</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l255"> +<td class="vc_file_line_number">255</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">!=</span> <span class="pygments-sc">','</span><span class="pygments-p">)</span> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_PASSIVE_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l256"> +<td class="vc_file_line_number">256</td> + +<td class="vc_file_line_text"> <span class="pygments-n">chptr</span><span class="pygments-o">--</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l257"> +<td class="vc_file_line_number">257</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">&&</span> <span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">!=</span> <span class="pygments-sc">','</span><span class="pygments-p">)</span> <span class="pygments-n">chptr</span><span class="pygments-o">--</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l258"> +<td class="vc_file_line_number">258</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">!=</span> <span class="pygments-sc">','</span><span class="pygments-p">)</span> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_PASSIVE_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l259"> +<td class="vc_file_line_number">259</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">chptr</span><span class="pygments-o">++</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l260"> +<td class="vc_file_line_number">260</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l261"> +<td class="vc_file_line_number">261</td> + +<td class="vc_file_line_text"> <span class="pygments-cm">/* now passReply points to the IP portion, and chptr points to the</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l262"> +<td class="vc_file_line_number">262</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> port number portion */</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l263"> +<td class="vc_file_line_number">263</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l264"> +<td class="vc_file_line_number">264</td> + +<td class="vc_file_line_text"> <span class="pygments-n">dataAddress</span><span class="pygments-p">.</span><span class="pygments-n">sin_family</span> <span class="pygments-o">=</span> <span class="pygments-n">AF_INET</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l265"> +<td class="vc_file_line_number">265</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">sscanf</span><span class="pygments-p">(</span><span class="pygments-n">chptr</span><span class="pygments-p">,</span> <span class="pygments-s">"%d,%d"</span><span class="pygments-p">,</span> <span class="pygments-o">&</span><span class="pygments-n">i</span><span class="pygments-p">,</span> <span class="pygments-o">&</span><span class="pygments-n">j</span><span class="pygments-p">)</span> <span class="pygments-o">!=</span> <span class="pygments-mi">2</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l266"> +<td class="vc_file_line_number">266</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_PASSIVE_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l267"> +<td class="vc_file_line_number">267</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l268"> +<td class="vc_file_line_number">268</td> + +<td class="vc_file_line_text"> <span class="pygments-n">dataAddress</span><span class="pygments-p">.</span><span class="pygments-n">sin_port</span> <span class="pygments-o">=</span> <span class="pygments-n">htons</span><span class="pygments-p">((</span><span class="pygments-n">i</span> <span class="pygments-o"><<</span> <span class="pygments-mi">8</span><span class="pygments-p">)</span> <span class="pygments-o">+</span> <span class="pygments-n">j</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l269"> +<td class="vc_file_line_number">269</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l270"> +<td class="vc_file_line_number">270</td> + +<td class="vc_file_line_text"> <span class="pygments-n">chptr</span> <span class="pygments-o">=</span> <span class="pygments-n">passReply</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l271"> +<td class="vc_file_line_number">271</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span><span class="pygments-o">++</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l272"> +<td class="vc_file_line_number">272</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">==</span> <span class="pygments-sc">','</span><span class="pygments-p">)</span> <span class="pygments-o">*</span><span class="pygments-n">chptr</span> <span class="pygments-o">=</span> <span class="pygments-sc">'.'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l273"> +<td class="vc_file_line_number">273</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l274"> +<td class="vc_file_line_number">274</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l275"> +<td class="vc_file_line_number">275</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">!</span><span class="pygments-n">inet_aton</span><span class="pygments-p">(</span><span class="pygments-n">passReply</span><span class="pygments-p">,</span> <span class="pygments-o">&</span><span class="pygments-n">dataAddress</span><span class="pygments-p">.</span><span class="pygments-n">sin_addr</span><span class="pygments-p">))</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l276"> +<td class="vc_file_line_number">276</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_PASSIVE_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l277"> +<td class="vc_file_line_number">277</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l278"> +<td class="vc_file_line_number">278</td> + +<td class="vc_file_line_text"> <span class="pygments-n">dataSocket</span> <span class="pygments-o">=</span> <span class="pygments-n">socket</span><span class="pygments-p">(</span><span class="pygments-n">AF_INET</span><span class="pygments-p">,</span> <span class="pygments-n">SOCK_STREAM</span><span class="pygments-p">,</span> <span class="pygments-n">IPPROTO_IP</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l279"> +<td class="vc_file_line_number">279</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">dataSocket</span> <span class="pygments-o"><</span> <span class="pygments-mi">0</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l280"> +<td class="vc_file_line_number">280</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_FAILED_CONNECT</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l281"> +<td class="vc_file_line_number">281</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l282"> +<td class="vc_file_line_number">282</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l283"> +<td class="vc_file_line_number">283</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">!</span><span class="pygments-n">param</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l284"> +<td class="vc_file_line_number">284</td> + +<td class="vc_file_line_text"> <span class="pygments-n">sprintf</span><span class="pygments-p">(</span><span class="pygments-n">retrCommand</span><span class="pygments-p">,</span> <span class="pygments-s">"%s</span><span class="pygments-se">\r\n</span><span class="pygments-s">"</span><span class="pygments-p">,</span> <span class="pygments-n">command</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l285"> +<td class="vc_file_line_number">285</td> + +<td class="vc_file_line_text"> <span class="pygments-k">else</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l286"> +<td class="vc_file_line_number">286</td> + +<td class="vc_file_line_text"> <span class="pygments-n">sprintf</span><span class="pygments-p">(</span><span class="pygments-n">retrCommand</span><span class="pygments-p">,</span> <span class="pygments-s">"%s %s</span><span class="pygments-se">\r\n</span><span class="pygments-s">"</span><span class="pygments-p">,</span> <span class="pygments-n">command</span><span class="pygments-p">,</span> <span class="pygments-n">param</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l287"> +<td class="vc_file_line_number">287</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l288"> +<td class="vc_file_line_number">288</td> + +<td class="vc_file_line_text"> <span class="pygments-n">i</span> <span class="pygments-o">=</span> <span class="pygments-n">strlen</span><span class="pygments-p">(</span><span class="pygments-n">retrCommand</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l289"> +<td class="vc_file_line_number">289</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l290"> +<td class="vc_file_line_number">290</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">write</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-n">retrCommand</span><span class="pygments-p">,</span> <span class="pygments-n">i</span><span class="pygments-p">)</span> <span class="pygments-o">!=</span> <span class="pygments-n">i</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l291"> +<td class="vc_file_line_number">291</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_SERVER_IO_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l292"> +<td class="vc_file_line_number">292</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l293"> +<td class="vc_file_line_number">293</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l294"> +<td class="vc_file_line_number">294</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">connect</span><span class="pygments-p">(</span><span class="pygments-n">dataSocket</span><span class="pygments-p">,</span> <span class="pygments-p">(</span><span class="pygments-k">struct</span> <span class="pygments-n">sockaddr</span> <span class="pygments-o">*</span><span class="pygments-p">)</span> <span class="pygments-o">&</span><span class="pygments-n">dataAddress</span><span class="pygments-p">,</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l295"> +<td class="vc_file_line_number">295</td> + +<td class="vc_file_line_text"> <span class="pygments-k">sizeof</span><span class="pygments-p">(</span><span class="pygments-n">dataAddress</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l296"> +<td class="vc_file_line_number">296</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">dataSocket</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l297"> +<td class="vc_file_line_number">297</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_FAILED_DATA_CONNECT</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l298"> +<td class="vc_file_line_number">298</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l299"> +<td class="vc_file_line_number">299</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l300"> +<td class="vc_file_line_number">300</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-n">ftp_check_response</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-nb">NULL</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l301"> +<td class="vc_file_line_number">301</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">dataSocket</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l302"> +<td class="vc_file_line_number">302</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l303"> +<td class="vc_file_line_number">303</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l304"> +<td class="vc_file_line_number">304</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l305"> +<td class="vc_file_line_number">305</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">dataSocket</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l306"> +<td class="vc_file_line_number">306</td> + +<td class="vc_file_line_text"><span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l307"> +<td class="vc_file_line_number">307</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l308"> +<td class="vc_file_line_number">308</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l309"> +<td class="vc_file_line_number">309</td> + +<td class="vc_file_line_text"><span class="pygments-kt">int</span> <span class="pygments-nf">ftp_get_filesize</span><span class="pygments-p">(</span><span class="pygments-kt">int</span> <span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">remotename</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l310"> +<td class="vc_file_line_number">310</td> + +<td class="vc_file_line_text"><span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l311"> +<td class="vc_file_line_number">311</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">size</span> <span class="pygments-o">=</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l312"> +<td class="vc_file_line_number">312</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-n">buf</span><span class="pygments-p">[</span><span class="pygments-mi">2000</span><span class="pygments-p">];</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l313"> +<td class="vc_file_line_number">313</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-n">file</span><span class="pygments-p">[</span><span class="pygments-mi">500</span><span class="pygments-p">];</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l314"> +<td class="vc_file_line_number">314</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">ptr</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l315"> +<td class="vc_file_line_number">315</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">fd</span><span class="pygments-p">,</span> <span class="pygments-n">rc</span><span class="pygments-p">,</span> <span class="pygments-n">tot</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l316"> +<td class="vc_file_line_number">316</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">i</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l317"> +<td class="vc_file_line_number">317</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l318"> +<td class="vc_file_line_number">318</td> + +<td class="vc_file_line_text"> <span class="pygments-n">strcpy</span><span class="pygments-p">(</span><span class="pygments-n">buf</span><span class="pygments-p">,</span> <span class="pygments-n">remotename</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l319"> +<td class="vc_file_line_number">319</td> + +<td class="vc_file_line_text"> <span class="pygments-n">ptr</span> <span class="pygments-o">=</span> <span class="pygments-n">strrchr</span><span class="pygments-p">(</span><span class="pygments-n">buf</span><span class="pygments-p">,</span> <span class="pygments-sc">'/'</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l320"> +<td class="vc_file_line_number">320</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">!*</span><span class="pygments-n">ptr</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l321"> +<td class="vc_file_line_number">321</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-o">-</span><span class="pygments-mi">1</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l322"> +<td class="vc_file_line_number">322</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">ptr</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l323"> +<td class="vc_file_line_number">323</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l324"> +<td class="vc_file_line_number">324</td> + +<td class="vc_file_line_text"> <span class="pygments-n">strcpy</span><span class="pygments-p">(</span><span class="pygments-n">file</span><span class="pygments-p">,</span> <span class="pygments-n">ptr</span><span class="pygments-o">+</span><span class="pygments-mi">1</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l325"> +<td class="vc_file_line_number">325</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l326"> +<td class="vc_file_line_number">326</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-n">ftp_command</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-s">"CWD"</span><span class="pygments-p">,</span> <span class="pygments-n">buf</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l327"> +<td class="vc_file_line_number">327</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-o">-</span><span class="pygments-mi">1</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l328"> +<td class="vc_file_line_number">328</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l329"> +<td class="vc_file_line_number">329</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l330"> +<td class="vc_file_line_number">330</td> + +<td class="vc_file_line_text"> <span class="pygments-n">fd</span> <span class="pygments-o">=</span> <span class="pygments-n">ftp_data_command</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-s">"LIST"</span><span class="pygments-p">,</span> <span class="pygments-n">file</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l331"> +<td class="vc_file_line_number">331</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">fd</span> <span class="pygments-o"><=</span> <span class="pygments-mi">0</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l332"> +<td class="vc_file_line_number">332</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l333"> +<td class="vc_file_line_number">333</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-o">-</span><span class="pygments-mi">1</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l334"> +<td class="vc_file_line_number">334</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l335"> +<td class="vc_file_line_number">335</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l336"> +<td class="vc_file_line_number">336</td> + +<td class="vc_file_line_text"> <span class="pygments-n">ptr</span> <span class="pygments-o">=</span> <span class="pygments-n">buf</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l337"> +<td class="vc_file_line_number">337</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">((</span><span class="pygments-n">tot</span> <span class="pygments-o">=</span> <span class="pygments-n">read</span><span class="pygments-p">(</span><span class="pygments-n">fd</span><span class="pygments-p">,</span> <span class="pygments-n">ptr</span><span class="pygments-p">,</span> <span class="pygments-k">sizeof</span><span class="pygments-p">(</span><span class="pygments-n">buf</span><span class="pygments-p">)</span> <span class="pygments-o">-</span> <span class="pygments-p">(</span><span class="pygments-n">ptr</span> <span class="pygments-o">-</span> <span class="pygments-n">buf</span><span class="pygments-p">)</span> <span class="pygments-o">-</span> <span class="pygments-mi">1</span><span class="pygments-p">))</span> <span class="pygments-o">!=</span> <span class="pygments-mi">0</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l338"> +<td class="vc_file_line_number">338</td> + +<td class="vc_file_line_text"> <span class="pygments-n">ptr</span> <span class="pygments-o">+=</span> <span class="pygments-n">tot</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l339"> +<td class="vc_file_line_number">339</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">ptr</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l340"> +<td class="vc_file_line_number">340</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">fd</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l341"> +<td class="vc_file_line_number">341</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l342"> +<td class="vc_file_line_number">342</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">!</span><span class="pygments-p">(</span><span class="pygments-n">ptr</span> <span class="pygments-o">=</span> <span class="pygments-n">strstr</span><span class="pygments-p">(</span><span class="pygments-n">buf</span><span class="pygments-p">,</span> <span class="pygments-n">file</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l343"> +<td class="vc_file_line_number">343</td> + +<td class="vc_file_line_text"> <span class="pygments-n">log_message</span><span class="pygments-p">(</span><span class="pygments-s">"FTP/get_filesize: Bad mood, directory does not contain searched file (%s)"</span><span class="pygments-p">,</span> <span class="pygments-n">file</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l344"> +<td class="vc_file_line_number">344</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">ftp_end_data_command</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">))</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l345"> +<td class="vc_file_line_number">345</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l346"> +<td class="vc_file_line_number">346</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-o">-</span><span class="pygments-mi">1</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l347"> +<td class="vc_file_line_number">347</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l348"> +<td class="vc_file_line_number">348</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l349"> +<td class="vc_file_line_number">349</td> + +<td class="vc_file_line_text"> <span class="pygments-k">for</span> <span class="pygments-p">(</span><span class="pygments-n">i</span><span class="pygments-o">=</span><span class="pygments-mi">0</span><span class="pygments-p">;</span> <span class="pygments-n">i</span><span class="pygments-o"><</span><span class="pygments-mi">4</span><span class="pygments-p">;</span> <span class="pygments-n">i</span><span class="pygments-o">++</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l350"> +<td class="vc_file_line_number">350</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">ptr</span> <span class="pygments-o">&&</span> <span class="pygments-o">*</span><span class="pygments-n">ptr</span> <span class="pygments-o">!=</span> <span class="pygments-sc">' '</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l351"> +<td class="vc_file_line_number">351</td> + +<td class="vc_file_line_text"> <span class="pygments-n">ptr</span><span class="pygments-o">--</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l352"> +<td class="vc_file_line_number">352</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">ptr</span> <span class="pygments-o">&&</span> <span class="pygments-o">*</span><span class="pygments-n">ptr</span> <span class="pygments-o">==</span> <span class="pygments-sc">' '</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l353"> +<td class="vc_file_line_number">353</td> + +<td class="vc_file_line_text"> <span class="pygments-n">ptr</span><span class="pygments-o">--</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l354"> +<td class="vc_file_line_number">354</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l355"> +<td class="vc_file_line_number">355</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">ptr</span> <span class="pygments-o">&&</span> <span class="pygments-o">*</span><span class="pygments-n">ptr</span> <span class="pygments-o">!=</span> <span class="pygments-sc">' '</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l356"> +<td class="vc_file_line_number">356</td> + +<td class="vc_file_line_text"> <span class="pygments-n">ptr</span><span class="pygments-o">--</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l357"> +<td class="vc_file_line_number">357</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l358"> +<td class="vc_file_line_number">358</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">ptr</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l359"> +<td class="vc_file_line_number">359</td> + +<td class="vc_file_line_text"> <span class="pygments-n">size</span> <span class="pygments-o">=</span> <span class="pygments-n">charstar_to_int</span><span class="pygments-p">(</span><span class="pygments-n">ptr</span><span class="pygments-o">+</span><span class="pygments-mi">1</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l360"> +<td class="vc_file_line_number">360</td> + +<td class="vc_file_line_text"> <span class="pygments-k">else</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l361"> +<td class="vc_file_line_number">361</td> + +<td class="vc_file_line_text"> <span class="pygments-n">size</span> <span class="pygments-o">=</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l362"> +<td class="vc_file_line_number">362</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l363"> +<td class="vc_file_line_number">363</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">ftp_end_data_command</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l364"> +<td class="vc_file_line_number">364</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l365"> +<td class="vc_file_line_number">365</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-o">-</span><span class="pygments-mi">1</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l366"> +<td class="vc_file_line_number">366</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l367"> +<td class="vc_file_line_number">367</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l368"> +<td class="vc_file_line_number">368</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">size</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l369"> +<td class="vc_file_line_number">369</td> + +<td class="vc_file_line_text"><span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l370"> +<td class="vc_file_line_number">370</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l371"> +<td class="vc_file_line_number">371</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l372"> +<td class="vc_file_line_number">372</td> + +<td class="vc_file_line_text"><span class="pygments-kt">int</span> <span class="pygments-nf">ftp_start_download</span><span class="pygments-p">(</span><span class="pygments-kt">int</span> <span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">remotename</span><span class="pygments-p">,</span> <span class="pygments-kt">int</span> <span class="pygments-o">*</span> <span class="pygments-n">size</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l373"> +<td class="vc_file_line_number">373</td> + +<td class="vc_file_line_text"><span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l374"> +<td class="vc_file_line_number">374</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-o">*</span><span class="pygments-n">size</span> <span class="pygments-o">=</span> <span class="pygments-n">ftp_get_filesize</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-n">remotename</span><span class="pygments-p">))</span> <span class="pygments-o">==</span> <span class="pygments-o">-</span><span class="pygments-mi">1</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l375"> +<td class="vc_file_line_number">375</td> + +<td class="vc_file_line_text"> <span class="pygments-n">log_message</span><span class="pygments-p">(</span><span class="pygments-s">"FTP: could not get filesize (trying to continue)"</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l376"> +<td class="vc_file_line_number">376</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">size</span> <span class="pygments-o">=</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l377"> +<td class="vc_file_line_number">377</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l378"> +<td class="vc_file_line_number">378</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">ftp_data_command</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-s">"RETR"</span><span class="pygments-p">,</span> <span class="pygments-n">remotename</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l379"> +<td class="vc_file_line_number">379</td> + +<td class="vc_file_line_text"><span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l380"> +<td class="vc_file_line_number">380</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l381"> +<td class="vc_file_line_number">381</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l382"> +<td class="vc_file_line_number">382</td> + +<td class="vc_file_line_text"><span class="pygments-kt">int</span> <span class="pygments-nf">ftp_end_data_command</span><span class="pygments-p">(</span><span class="pygments-kt">int</span> <span class="pygments-n">sock</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l383"> +<td class="vc_file_line_number">383</td> + +<td class="vc_file_line_text"><span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l384"> +<td class="vc_file_line_number">384</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">ftp_check_response</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-nb">NULL</span><span class="pygments-p">))</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l385"> +<td class="vc_file_line_number">385</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_BAD_SERVER_RESPONSE</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l386"> +<td class="vc_file_line_number">386</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l387"> +<td class="vc_file_line_number">387</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l388"> +<td class="vc_file_line_number">388</td> + +<td class="vc_file_line_text"><span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l389"> +<td class="vc_file_line_number">389</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l390"> +<td class="vc_file_line_number">390</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l391"> +<td class="vc_file_line_number">391</td> + +<td class="vc_file_line_text"><span class="pygments-kt">char</span> <span class="pygments-o">*</span><span class="pygments-nf">str_ftp_error</span><span class="pygments-p">(</span><span class="pygments-kt">int</span> <span class="pygments-n">error</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l392"> +<td class="vc_file_line_number">392</td> + +<td class="vc_file_line_text"><span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l393"> +<td class="vc_file_line_number">393</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">error</span> <span class="pygments-o">==</span> <span class="pygments-n">FTPERR_PASSIVE_ERROR</span> <span class="pygments-o">?</span> <span class="pygments-s">"error with passive connection"</span> <span class="pygments-o">:</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l394"> +<td class="vc_file_line_number">394</td> + +<td class="vc_file_line_text"> <span class="pygments-n">error</span> <span class="pygments-o">==</span> <span class="pygments-n">FTPERR_FAILED_CONNECT</span> <span class="pygments-o">?</span> <span class="pygments-s">"couldn't connect to server"</span> <span class="pygments-o">:</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l395"> +<td class="vc_file_line_number">395</td> + +<td class="vc_file_line_text"> <span class="pygments-n">error</span> <span class="pygments-o">==</span> <span class="pygments-n">FTPERR_FILE_NOT_FOUND</span> <span class="pygments-o">?</span> <span class="pygments-s">"file not found"</span> <span class="pygments-o">:</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l396"> +<td class="vc_file_line_number">396</td> + +<td class="vc_file_line_text"> <span class="pygments-n">error</span> <span class="pygments-o">==</span> <span class="pygments-n">FTPERR_BAD_SERVER_RESPONSE</span> <span class="pygments-o">?</span> <span class="pygments-s">"bad server response (server too busy?)"</span> <span class="pygments-o">:</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l397"> +<td class="vc_file_line_number">397</td> + +<td class="vc_file_line_text"> <span class="pygments-nb">NULL</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l398"> +<td class="vc_file_line_number">398</td> + +<td class="vc_file_line_text"><span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l399"> +<td class="vc_file_line_number">399</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l400"> +<td class="vc_file_line_number">400</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l401"> +<td class="vc_file_line_number">401</td> + +<td class="vc_file_line_text"><span class="pygments-k">static</span> <span class="pygments-kt">int</span> <span class="pygments-nf">_http_download_file</span><span class="pygments-p">(</span><span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">hostname</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">remotename</span><span class="pygments-p">,</span> <span class="pygments-kt">int</span> <span class="pygments-o">*</span> <span class="pygments-n">size</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">proxyprotocol</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">proxyname</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">proxyport</span><span class="pygments-p">,</span> <span class="pygments-kt">int</span> <span class="pygments-n">recursion</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l402"> +<td class="vc_file_line_number">402</td> + +<td class="vc_file_line_text"><span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l403"> +<td class="vc_file_line_number">403</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">buf</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l404"> +<td class="vc_file_line_number">404</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-n">headers</span><span class="pygments-p">[</span><span class="pygments-mi">4096</span><span class="pygments-p">];</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l405"> +<td class="vc_file_line_number">405</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">nextChar</span> <span class="pygments-o">=</span> <span class="pygments-n">headers</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l406"> +<td class="vc_file_line_number">406</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">statusCode</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l407"> +<td class="vc_file_line_number">407</td> + +<td class="vc_file_line_text"> <span class="pygments-k">struct</span> <span class="pygments-n">in_addr</span> <span class="pygments-n">serverAddress</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l408"> +<td class="vc_file_line_number">408</td> + +<td class="vc_file_line_text"> <span class="pygments-k">struct</span> <span class="pygments-n">pollfd</span> <span class="pygments-n">polls</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l409"> +<td class="vc_file_line_number">409</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">sock</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l410"> +<td class="vc_file_line_number">410</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l411"> +<td class="vc_file_line_number">411</td> + +<td class="vc_file_line_text"> <span class="pygments-k">struct</span> <span class="pygments-n">sockaddr_in</span> <span class="pygments-n">destPort</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l412"> +<td class="vc_file_line_number">412</td> + +<td class="vc_file_line_text"> <span class="pygments-k">const</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">header_content_length</span> <span class="pygments-o">=</span> <span class="pygments-s">"Content-Length: "</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l413"> +<td class="vc_file_line_number">413</td> + +<td class="vc_file_line_text"> <span class="pygments-k">const</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">header_location</span> <span class="pygments-o">=</span> <span class="pygments-s">"Location: http://"</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l414"> +<td class="vc_file_line_number">414</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">http_server_name</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l415"> +<td class="vc_file_line_number">415</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">int</span> <span class="pygments-n">http_server_port</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l416"> +<td class="vc_file_line_number">416</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l417"> +<td class="vc_file_line_number">417</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">proxyprotocol</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l418"> +<td class="vc_file_line_number">418</td> + +<td class="vc_file_line_text"> <span class="pygments-n">http_server_name</span> <span class="pygments-o">=</span> <span class="pygments-n">proxyname</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l419"> +<td class="vc_file_line_number">419</td> + +<td class="vc_file_line_text"> <span class="pygments-n">http_server_port</span> <span class="pygments-o">=</span> <span class="pygments-n">atoi</span><span class="pygments-p">(</span><span class="pygments-n">proxyport</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l420"> +<td class="vc_file_line_number">420</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> <span class="pygments-k">else</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l421"> +<td class="vc_file_line_number">421</td> + +<td class="vc_file_line_text"> <span class="pygments-n">http_server_name</span> <span class="pygments-o">=</span> <span class="pygments-n">hostname</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l422"> +<td class="vc_file_line_number">422</td> + +<td class="vc_file_line_text"> <span class="pygments-n">http_server_port</span> <span class="pygments-o">=</span> <span class="pygments-mi">80</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l423"> +<td class="vc_file_line_number">423</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l424"> +<td class="vc_file_line_number">424</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l425"> +<td class="vc_file_line_number">425</td> + +<td class="vc_file_line_text"> <span class="pygments-n">log_message</span><span class="pygments-p">(</span><span class="pygments-s">"HTTP: connecting to server %s:%i (%s)"</span><span class="pygments-p">,</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l426"> +<td class="vc_file_line_number">426</td> + +<td class="vc_file_line_text"> <span class="pygments-n">http_server_name</span><span class="pygments-p">,</span> <span class="pygments-n">http_server_port</span><span class="pygments-p">,</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l427"> +<td class="vc_file_line_number">427</td> + +<td class="vc_file_line_text"> <span class="pygments-n">proxyprotocol</span> <span class="pygments-o">?</span> <span class="pygments-s">"proxy"</span> <span class="pygments-o">:</span> <span class="pygments-s">"no proxy"</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l428"> +<td class="vc_file_line_number">428</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l429"> +<td class="vc_file_line_number">429</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-n">get_host_address</span><span class="pygments-p">(</span><span class="pygments-n">http_server_name</span><span class="pygments-p">,</span> <span class="pygments-o">&</span><span class="pygments-n">serverAddress</span><span class="pygments-p">)))</span> <span class="pygments-k">return</span> <span class="pygments-n">rc</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l430"> +<td class="vc_file_line_number">430</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l431"> +<td class="vc_file_line_number">431</td> + +<td class="vc_file_line_text"> <span class="pygments-n">sock</span> <span class="pygments-o">=</span> <span class="pygments-n">socket</span><span class="pygments-p">(</span><span class="pygments-n">AF_INET</span><span class="pygments-p">,</span> <span class="pygments-n">SOCK_STREAM</span><span class="pygments-p">,</span> <span class="pygments-n">IPPROTO_IP</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l432"> +<td class="vc_file_line_number">432</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">sock</span> <span class="pygments-o"><</span> <span class="pygments-mi">0</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l433"> +<td class="vc_file_line_number">433</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_FAILED_CONNECT</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l434"> +<td class="vc_file_line_number">434</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l435"> +<td class="vc_file_line_number">435</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l436"> +<td class="vc_file_line_number">436</td> + +<td class="vc_file_line_text"> <span class="pygments-n">destPort</span><span class="pygments-p">.</span><span class="pygments-n">sin_family</span> <span class="pygments-o">=</span> <span class="pygments-n">AF_INET</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l437"> +<td class="vc_file_line_number">437</td> + +<td class="vc_file_line_text"> <span class="pygments-n">destPort</span><span class="pygments-p">.</span><span class="pygments-n">sin_port</span> <span class="pygments-o">=</span> <span class="pygments-n">htons</span><span class="pygments-p">(</span><span class="pygments-n">http_server_port</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l438"> +<td class="vc_file_line_number">438</td> + +<td class="vc_file_line_text"> <span class="pygments-n">destPort</span><span class="pygments-p">.</span><span class="pygments-n">sin_addr</span> <span class="pygments-o">=</span> <span class="pygments-n">serverAddress</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l439"> +<td class="vc_file_line_number">439</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l440"> +<td class="vc_file_line_number">440</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">connect</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-p">(</span><span class="pygments-k">struct</span> <span class="pygments-n">sockaddr</span> <span class="pygments-o">*</span><span class="pygments-p">)</span> <span class="pygments-o">&</span><span class="pygments-n">destPort</span><span class="pygments-p">,</span> <span class="pygments-k">sizeof</span><span class="pygments-p">(</span><span class="pygments-n">destPort</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l441"> +<td class="vc_file_line_number">441</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l442"> +<td class="vc_file_line_number">442</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_FAILED_CONNECT</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l443"> +<td class="vc_file_line_number">443</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l444"> +<td class="vc_file_line_number">444</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l445"> +<td class="vc_file_line_number">445</td> + +<td class="vc_file_line_text"> <span class="pygments-n">buf</span> <span class="pygments-o">=</span> <span class="pygments-n">proxyprotocol</span> <span class="pygments-o">?</span> <span class="pygments-n">asprintf_</span><span class="pygments-p">(</span><span class="pygments-s">"GET %s://%s%s HTTP/1.0</span><span class="pygments-se">\r\n</span><span class="pygments-s">Host: %s</span><span class="pygments-se">\r\n\r\n</span><span class="pygments-s">"</span><span class="pygments-p">,</span> <span class="pygments-n">proxyprotocol</span><span class="pygments-p">,</span> <span class="pygments-n">hostname</span><span class="pygments-p">,</span> <span class="pygments-n">remotename</span><span class="pygments-p">,</span> <span class="pygments-n">hostname</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l446"> +<td class="vc_file_line_number">446</td> + +<td class="vc_file_line_text"> <span class="pygments-o">:</span> <span class="pygments-n">asprintf_</span><span class="pygments-p">(</span><span class="pygments-s">"GET %s HTTP/1.0</span><span class="pygments-se">\r\n</span><span class="pygments-s">Host: %s</span><span class="pygments-se">\r\n\r\n</span><span class="pygments-s">"</span><span class="pygments-p">,</span> <span class="pygments-n">remotename</span><span class="pygments-p">,</span> <span class="pygments-n">hostname</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l447"> +<td class="vc_file_line_number">447</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l448"> +<td class="vc_file_line_number">448</td> + +<td class="vc_file_line_text"> <span class="pygments-n">write</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-n">buf</span><span class="pygments-p">,</span> <span class="pygments-n">strlen</span><span class="pygments-p">(</span><span class="pygments-n">buf</span><span class="pygments-p">));</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l449"> +<td class="vc_file_line_number">449</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l450"> +<td class="vc_file_line_number">450</td> + +<td class="vc_file_line_text"> <span class="pygments-cm">/* This is fun; read the response a character at a time until we:</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l451"> +<td class="vc_file_line_number">451</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l452"> +<td class="vc_file_line_number">452</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> 1) Get our first \r\n; which lets us check the return code</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l453"> +<td class="vc_file_line_number">453</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> 2) Get a \r\n\r\n, which means we're done */</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l454"> +<td class="vc_file_line_number">454</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l455"> +<td class="vc_file_line_number">455</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">nextChar</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l456"> +<td class="vc_file_line_number">456</td> + +<td class="vc_file_line_text"> <span class="pygments-n">statusCode</span> <span class="pygments-o">=</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l457"> +<td class="vc_file_line_number">457</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">!</span><span class="pygments-n">strstr</span><span class="pygments-p">(</span><span class="pygments-n">headers</span><span class="pygments-p">,</span> <span class="pygments-s">"</span><span class="pygments-se">\r\n\r\n</span><span class="pygments-s">"</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l458"> +<td class="vc_file_line_number">458</td> + +<td class="vc_file_line_text"> <span class="pygments-n">polls</span><span class="pygments-p">.</span><span class="pygments-n">fd</span> <span class="pygments-o">=</span> <span class="pygments-n">sock</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l459"> +<td class="vc_file_line_number">459</td> + +<td class="vc_file_line_text"> <span class="pygments-n">polls</span><span class="pygments-p">.</span><span class="pygments-n">events</span> <span class="pygments-o">=</span> <span class="pygments-n">POLLIN</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l460"> +<td class="vc_file_line_number">460</td> + +<td class="vc_file_line_text"> <span class="pygments-n">rc</span> <span class="pygments-o">=</span> <span class="pygments-n">poll</span><span class="pygments-p">(</span><span class="pygments-o">&</span><span class="pygments-n">polls</span><span class="pygments-p">,</span> <span class="pygments-mi">1</span><span class="pygments-p">,</span> <span class="pygments-n">TIMEOUT_SECS</span><span class="pygments-o">*</span><span class="pygments-mi">1000</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l461"> +<td class="vc_file_line_number">461</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l462"> +<td class="vc_file_line_number">462</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">rc</span> <span class="pygments-o">==</span> <span class="pygments-mi">0</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l463"> +<td class="vc_file_line_number">463</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l464"> +<td class="vc_file_line_number">464</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_SERVER_TIMEOUT</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l465"> +<td class="vc_file_line_number">465</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> <span class="pygments-k">else</span> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">rc</span> <span class="pygments-o"><</span> <span class="pygments-mi">0</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l466"> +<td class="vc_file_line_number">466</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l467"> +<td class="vc_file_line_number">467</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_SERVER_IO_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l468"> +<td class="vc_file_line_number">468</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l469"> +<td class="vc_file_line_number">469</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l470"> +<td class="vc_file_line_number">470</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">read</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">,</span> <span class="pygments-n">nextChar</span><span class="pygments-p">,</span> <span class="pygments-mi">1</span><span class="pygments-p">)</span> <span class="pygments-o">!=</span> <span class="pygments-mi">1</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l471"> +<td class="vc_file_line_number">471</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l472"> +<td class="vc_file_line_number">472</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_SERVER_IO_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l473"> +<td class="vc_file_line_number">473</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l474"> +<td class="vc_file_line_number">474</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l475"> +<td class="vc_file_line_number">475</td> + +<td class="vc_file_line_text"> <span class="pygments-n">nextChar</span><span class="pygments-o">++</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l476"> +<td class="vc_file_line_number">476</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">nextChar</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l477"> +<td class="vc_file_line_number">477</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l478"> +<td class="vc_file_line_number">478</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">nextChar</span> <span class="pygments-o">-</span> <span class="pygments-n">headers</span> <span class="pygments-o">==</span> <span class="pygments-k">sizeof</span><span class="pygments-p">(</span><span class="pygments-n">headers</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l479"> +<td class="vc_file_line_number">479</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l480"> +<td class="vc_file_line_number">480</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_SERVER_IO_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l481"> +<td class="vc_file_line_number">481</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l482"> +<td class="vc_file_line_number">482</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l483"> +<td class="vc_file_line_number">483</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">!</span><span class="pygments-n">statusCode</span> <span class="pygments-o">&&</span> <span class="pygments-n">strstr</span><span class="pygments-p">(</span><span class="pygments-n">headers</span><span class="pygments-p">,</span> <span class="pygments-s">"</span><span class="pygments-se">\r\n</span><span class="pygments-s">"</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l484"> +<td class="vc_file_line_number">484</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">start</span><span class="pygments-p">,</span> <span class="pygments-o">*</span> <span class="pygments-n">end</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l485"> +<td class="vc_file_line_number">485</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l486"> +<td class="vc_file_line_number">486</td> + +<td class="vc_file_line_text"> <span class="pygments-n">start</span> <span class="pygments-o">=</span> <span class="pygments-n">headers</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l487"> +<td class="vc_file_line_number">487</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">!</span><span class="pygments-n">isspace</span><span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">start</span><span class="pygments-p">)</span> <span class="pygments-o">&&</span> <span class="pygments-o">*</span><span class="pygments-n">start</span><span class="pygments-p">)</span> <span class="pygments-n">start</span><span class="pygments-o">++</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l488"> +<td class="vc_file_line_number">488</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">!*</span><span class="pygments-n">start</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l489"> +<td class="vc_file_line_number">489</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l490"> +<td class="vc_file_line_number">490</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_SERVER_IO_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l491"> +<td class="vc_file_line_number">491</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l492"> +<td class="vc_file_line_number">492</td> + +<td class="vc_file_line_text"> <span class="pygments-n">start</span><span class="pygments-o">++</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l493"> +<td class="vc_file_line_number">493</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l494"> +<td class="vc_file_line_number">494</td> + +<td class="vc_file_line_text"> <span class="pygments-n">end</span> <span class="pygments-o">=</span> <span class="pygments-n">start</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l495"> +<td class="vc_file_line_number">495</td> + +<td class="vc_file_line_text"> <span class="pygments-k">while</span> <span class="pygments-p">(</span><span class="pygments-o">!</span><span class="pygments-n">isspace</span><span class="pygments-p">(</span><span class="pygments-o">*</span><span class="pygments-n">end</span><span class="pygments-p">)</span> <span class="pygments-o">&&</span> <span class="pygments-o">*</span><span class="pygments-n">end</span><span class="pygments-p">)</span> <span class="pygments-n">end</span><span class="pygments-o">++</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l496"> +<td class="vc_file_line_number">496</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-o">!*</span><span class="pygments-n">end</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l497"> +<td class="vc_file_line_number">497</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l498"> +<td class="vc_file_line_number">498</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_SERVER_IO_ERROR</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l499"> +<td class="vc_file_line_number">499</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l500"> +<td class="vc_file_line_number">500</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l501"> +<td class="vc_file_line_number">501</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">end</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l502"> +<td class="vc_file_line_number">502</td> + +<td class="vc_file_line_text"> <span class="pygments-n">log_message</span><span class="pygments-p">(</span><span class="pygments-s">"HTTP: server response '%s'"</span><span class="pygments-p">,</span> <span class="pygments-n">start</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l503"> +<td class="vc_file_line_number">503</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">streq</span><span class="pygments-p">(</span><span class="pygments-n">start</span><span class="pygments-p">,</span> <span class="pygments-s">"404"</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l504"> +<td class="vc_file_line_number">504</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l505"> +<td class="vc_file_line_number">505</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_FILE_NOT_FOUND</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l506"> +<td class="vc_file_line_number">506</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> <span class="pygments-k">else</span> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">streq</span><span class="pygments-p">(</span><span class="pygments-n">start</span><span class="pygments-p">,</span> <span class="pygments-s">"302"</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l507"> +<td class="vc_file_line_number">507</td> + +<td class="vc_file_line_text"> <span class="pygments-n">log_message</span><span class="pygments-p">(</span><span class="pygments-s">"HTTP: found, but document has moved"</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l508"> +<td class="vc_file_line_number">508</td> + +<td class="vc_file_line_text"> <span class="pygments-n">statusCode</span> <span class="pygments-o">=</span> <span class="pygments-mi">302</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l509"> +<td class="vc_file_line_number">509</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> <span class="pygments-k">else</span> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">streq</span><span class="pygments-p">(</span><span class="pygments-n">start</span><span class="pygments-p">,</span> <span class="pygments-s">"200"</span><span class="pygments-p">))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l510"> +<td class="vc_file_line_number">510</td> + +<td class="vc_file_line_text"> <span class="pygments-n">statusCode</span> <span class="pygments-o">=</span> <span class="pygments-mi">200</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l511"> +<td class="vc_file_line_number">511</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> <span class="pygments-k">else</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l512"> +<td class="vc_file_line_number">512</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l513"> +<td class="vc_file_line_number">513</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_BAD_SERVER_RESPONSE</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l514"> +<td class="vc_file_line_number">514</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l515"> +<td class="vc_file_line_number">515</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l516"> +<td class="vc_file_line_number">516</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">end</span> <span class="pygments-o">=</span> <span class="pygments-sc">' '</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l517"> +<td class="vc_file_line_number">517</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l518"> +<td class="vc_file_line_number">518</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l519"> +<td class="vc_file_line_number">519</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l520"> +<td class="vc_file_line_number">520</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">statusCode</span> <span class="pygments-o">==</span> <span class="pygments-mi">302</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l521"> +<td class="vc_file_line_number">521</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">(</span><span class="pygments-n">recursion</span> <span class="pygments-o">>=</span> <span class="pygments-n">HTTP_MAX_RECURSION</span><span class="pygments-p">)</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l522"> +<td class="vc_file_line_number">522</td> + +<td class="vc_file_line_text"> <span class="pygments-n">log_message</span><span class="pygments-p">(</span><span class="pygments-s">"HTTP: too many levels of recursion, aborting"</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l523"> +<td class="vc_file_line_number">523</td> + +<td class="vc_file_line_text"> <span class="pygments-n">close</span><span class="pygments-p">(</span><span class="pygments-n">sock</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l524"> +<td class="vc_file_line_number">524</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">FTPERR_UNKNOWN</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l525"> +<td class="vc_file_line_number">525</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l526"> +<td class="vc_file_line_number">526</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">buf</span> <span class="pygments-o">=</span> <span class="pygments-n">strstr</span><span class="pygments-p">(</span><span class="pygments-n">headers</span><span class="pygments-p">,</span> <span class="pygments-n">header_location</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l527"> +<td class="vc_file_line_number">527</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">found_host</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l528"> +<td class="vc_file_line_number">528</td> + +<td class="vc_file_line_text"> <span class="pygments-kt">char</span> <span class="pygments-o">*</span><span class="pygments-n">found_file</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l529"> +<td class="vc_file_line_number">529</td> + +<td class="vc_file_line_text"> <span class="pygments-n">found_host</span> <span class="pygments-o">=</span> <span class="pygments-n">buf</span> <span class="pygments-o">+</span> <span class="pygments-n">strlen</span><span class="pygments-p">(</span><span class="pygments-n">header_location</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l530"> +<td class="vc_file_line_number">530</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">found_file</span> <span class="pygments-o">=</span> <span class="pygments-n">index</span><span class="pygments-p">(</span><span class="pygments-n">found_host</span><span class="pygments-p">,</span> <span class="pygments-sc">'/'</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l531"> +<td class="vc_file_line_number">531</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">buf</span> <span class="pygments-o">=</span> <span class="pygments-n">index</span><span class="pygments-p">(</span><span class="pygments-n">found_file</span><span class="pygments-p">,</span> <span class="pygments-sc">'\r'</span><span class="pygments-p">)))</span> <span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l532"> +<td class="vc_file_line_number">532</td> + +<td class="vc_file_line_text"> <span class="pygments-n">buf</span><span class="pygments-p">[</span><span class="pygments-mi">0</span><span class="pygments-p">]</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l533"> +<td class="vc_file_line_number">533</td> + +<td class="vc_file_line_text"> <span class="pygments-n">remotename</span> <span class="pygments-o">=</span> <span class="pygments-n">strdup</span><span class="pygments-p">(</span><span class="pygments-n">found_file</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l534"> +<td class="vc_file_line_number">534</td> + +<td class="vc_file_line_text"> <span class="pygments-n">found_file</span><span class="pygments-p">[</span><span class="pygments-mi">0</span><span class="pygments-p">]</span> <span class="pygments-o">=</span> <span class="pygments-sc">'\0'</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l535"> +<td class="vc_file_line_number">535</td> + +<td class="vc_file_line_text"> <span class="pygments-n">hostname</span> <span class="pygments-o">=</span> <span class="pygments-n">strdup</span><span class="pygments-p">(</span><span class="pygments-n">found_host</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l536"> +<td class="vc_file_line_number">536</td> + +<td class="vc_file_line_text"> <span class="pygments-n">log_message</span><span class="pygments-p">(</span><span class="pygments-s">"HTTP: redirected to new host </span><span class="pygments-se">\"</span><span class="pygments-s">%s</span><span class="pygments-se">\"</span><span class="pygments-s"> and file </span><span class="pygments-se">\"</span><span class="pygments-s">%s</span><span class="pygments-se">\"</span><span class="pygments-s">"</span><span class="pygments-p">,</span> <span class="pygments-n">hostname</span><span class="pygments-p">,</span> <span class="pygments-n">remotename</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l537"> +<td class="vc_file_line_number">537</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l538"> +<td class="vc_file_line_number">538</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l539"> +<td class="vc_file_line_number">539</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l540"> +<td class="vc_file_line_number">540</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l541"> +<td class="vc_file_line_number">541</td> + +<td class="vc_file_line_text"> <span class="pygments-cm">/*</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l542"> +<td class="vc_file_line_number">542</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> * don't fail if new URL can't be parsed,</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l543"> +<td class="vc_file_line_number">543</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> * asking the same URL may work if the DNS server are doing round-robin</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l544"> +<td class="vc_file_line_number">544</td> + +<td class="vc_file_line_text"><span class="pygments-cm"> */</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l545"> +<td class="vc_file_line_number">545</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">_http_download_file</span><span class="pygments-p">(</span><span class="pygments-n">hostname</span><span class="pygments-p">,</span> <span class="pygments-n">remotename</span><span class="pygments-p">,</span> <span class="pygments-n">size</span><span class="pygments-p">,</span> <span class="pygments-n">proxyprotocol</span><span class="pygments-p">,</span> <span class="pygments-n">proxyname</span><span class="pygments-p">,</span> <span class="pygments-n">proxyport</span><span class="pygments-p">,</span> <span class="pygments-n">recursion</span> <span class="pygments-o">+</span> <span class="pygments-mi">1</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l546"> +<td class="vc_file_line_number">546</td> + +<td class="vc_file_line_text"> <span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l547"> +<td class="vc_file_line_number">547</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l548"> +<td class="vc_file_line_number">548</td> + +<td class="vc_file_line_text"> <span class="pygments-k">if</span> <span class="pygments-p">((</span><span class="pygments-n">buf</span> <span class="pygments-o">=</span> <span class="pygments-n">strstr</span><span class="pygments-p">(</span><span class="pygments-n">headers</span><span class="pygments-p">,</span> <span class="pygments-n">header_content_length</span><span class="pygments-p">)))</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l549"> +<td class="vc_file_line_number">549</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">size</span> <span class="pygments-o">=</span> <span class="pygments-n">charstar_to_int</span><span class="pygments-p">(</span><span class="pygments-n">buf</span> <span class="pygments-o">+</span> <span class="pygments-n">strlen</span><span class="pygments-p">(</span><span class="pygments-n">header_content_length</span><span class="pygments-p">));</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l550"> +<td class="vc_file_line_number">550</td> + +<td class="vc_file_line_text"> <span class="pygments-k">else</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l551"> +<td class="vc_file_line_number">551</td> + +<td class="vc_file_line_text"> <span class="pygments-o">*</span><span class="pygments-n">size</span> <span class="pygments-o">=</span> <span class="pygments-mi">0</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l552"> +<td class="vc_file_line_number">552</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l553"> +<td class="vc_file_line_number">553</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">sock</span><span class="pygments-p">;</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l554"> +<td class="vc_file_line_number">554</td> + +<td class="vc_file_line_text"><span class="pygments-p">}</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l555"> +<td class="vc_file_line_number">555</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l556"> +<td class="vc_file_line_number">556</td> + +<td class="vc_file_line_text"> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l557"> +<td class="vc_file_line_number">557</td> + +<td class="vc_file_line_text"><span class="pygments-kt">int</span> <span class="pygments-nf">http_download_file</span><span class="pygments-p">(</span><span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">hostname</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">remotename</span><span class="pygments-p">,</span> <span class="pygments-kt">int</span> <span class="pygments-o">*</span> <span class="pygments-n">size</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">proxyprotocol</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">proxyname</span><span class="pygments-p">,</span> <span class="pygments-kt">char</span> <span class="pygments-o">*</span> <span class="pygments-n">proxyport</span><span class="pygments-p">)</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l558"> +<td class="vc_file_line_number">558</td> + +<td class="vc_file_line_text"><span class="pygments-p">{</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l559"> +<td class="vc_file_line_number">559</td> + +<td class="vc_file_line_text"> <span class="pygments-k">return</span> <span class="pygments-n">_http_download_file</span><span class="pygments-p">(</span><span class="pygments-n">hostname</span><span class="pygments-p">,</span> <span class="pygments-n">remotename</span><span class="pygments-p">,</span> <span class="pygments-n">size</span><span class="pygments-p">,</span> <span class="pygments-n">proxyprotocol</span><span class="pygments-p">,</span> <span class="pygments-n">proxyname</span><span class="pygments-p">,</span> <span class="pygments-n">proxyport</span><span class="pygments-p">,</span> <span class="pygments-mi">0</span><span class="pygments-p">);</span> +</td> +</tr> + + + + +<tr class="vc_row_odd" id="l560"> +<td class="vc_file_line_number">560</td> + +<td class="vc_file_line_text"><span class="pygments-p">}</span> +</td> +</tr> + + +</table> +</div> + + + +<hr/> +<div class="vc_properties"> +<h2>Properties</h2> +<table cellspacing="1" cellpadding="2" class="auto"> +<thead> +<tr> +<th class="vc_header_sort">Name</th> +<th class="vc_header">Value</th> +</tr> +</thead> +<tbody> + +<tr class="vc_row_even"> +<td><strong>svn:eol-style</strong></td> + +<td style="white-space: pre;">native +</td> + +</tr> + +</tbody> +</table> +</div> + + + +<hr /> +<table> +<tr> +<td> </td> +<td style="text-align: right;"><strong><a href="/viewvc/help_rootview.html">ViewVC Help</a></strong></td> +</tr> +<tr> +<td>Powered by <a href="http://viewvc.tigris.org/">ViewVC 1.1.15</a></td> +<td style="text-align: right;"> </td> +</tr> +</table> +</body> +</html> + diff --git a/mdk-stage1/utils.c b/mdk-stage1/utils.c index dc71b6a43..af5ee9af3 100644 --- a/mdk-stage1/utils.c +++ b/mdk-stage1/utils.c @@ -31,73 +31,73 @@ // - it stops on first non-digit char int charstar_to_int(const char * s) { - int number = 0; - while (*s && isdigit(*s)) { - number = (number * 10) + (*s - '0'); - s++; - } - return number; + int number = 0; + while (*s && isdigit(*s)) { + number = (number * 10) + (*s - '0'); + s++; + } + return number; } off_t file_size(const char * path) { - struct stat statr; - if (stat(path, &statr)) - return -1; + struct stat statr; + if (stat(path, &statr)) + return -1; else return statr.st_size; } char * cat_file(const char * file, struct stat * s) { - char * buf; - int fd = open(file, O_RDONLY); - if (fd == -1) { - log_perror(file); - return NULL; - } - - fstat(fd, s); - buf = malloc(s->st_size + 1); - if (read(fd, buf, s->st_size) != (ssize_t)s->st_size) { - close(fd); - free(buf); - log_perror(file); - return NULL; - } - buf[s->st_size] = '\0'; - close(fd); - - return buf; + char * buf; + int fd = open(file, O_RDONLY); + if (fd == -1) { + log_perror(file); + return NULL; + } + + fstat(fd, s); + buf = malloc(s->st_size + 1); + if (read(fd, buf, s->st_size) != (ssize_t)s->st_size) { + close(fd); + free(buf); + log_perror(file); + return NULL; + } + buf[s->st_size] = '\0'; + close(fd); + + return buf; } int line_counts(const char * buf) { - const char * ptr = buf; - int line = 0; - while (ptr) { - line++; - ptr = strchr(ptr + 1, '\n'); - } - return line; + const char * ptr = buf; + int line = 0; + while (ptr) { + line++; + ptr = strchr(ptr + 1, '\n'); + } + return line; } int total_memory(void) { - int value; + int value; - /* drakx powered: use /proc/kcore and rounds every 4 Mbytes */ - value = 4 * ((int)((float)file_size("/proc/kcore") / 1024 / 1024 / 4 + 0.5)); - log_message("Total Memory: %d Mbytes", value); + /* drakx powered: use /proc/kcore and rounds every 4 Mbytes */ + value = 4 * ((int)((float)file_size("/proc/kcore") / 1024 / 1024 / 4 + 0.5)); + log_message("Total Memory: %d Mbytes", value); - return value; + return value; } /* pixel's */ void * _memdup(void *src, size_t size) { - void * r; - r = malloc(size); - memcpy(r, src, size); - return r; + void * r; + r = malloc(size); + memcpy(r, src, size); + return r; } @@ -115,33 +115,33 @@ void add_to_env(char * name, char * value) char ** list_directory(char * direct) { - char * tmp[50000]; /* in /dev there can be many many files.. */ - int i = 0; - struct dirent *ep; - DIR *dp = opendir(direct); - while (dp && (ep = readdir(dp))) { - if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) { - tmp[i] = strdup(ep->d_name); - i++; - } - } - if (dp) - closedir(dp); - tmp[i] = NULL; - return _memdup(tmp, sizeof(char*) * (i+1)); + char * tmp[50000]; /* in /dev there can be many many files.. */ + int i = 0; + struct dirent *ep; + DIR *dp = opendir(direct); + while (dp && (ep = readdir(dp))) { + if (strcmp(ep->d_name, ".") && strcmp(ep->d_name, "..")) { + tmp[i] = strdup(ep->d_name); + i++; + } + } + if (dp) + closedir(dp); + tmp[i] = NULL; + return _memdup(tmp, sizeof(char*) * (i+1)); } int string_array_length(char ** a) { - int i = 0; - if (!a) - return -1; - while (a && *a) { - a++; - i++; - } - return i; + int i = 0; + if (!a) + return -1; + while (a && *a) { + a++; + i++; + } + return i; } char * asprintf_(const char *msg, ...) @@ -164,7 +164,7 @@ char * asprintf_(const char *msg, ...) int scall_(int retval, char * msg, char * file, int line) { - char tmp[5000]; + char tmp[5000]; sprintf(tmp, "%s(%s:%d) failed", msg, file, line); if (retval) log_perror(tmp); diff --git a/mdk-stage1/wireless.c b/mdk-stage1/wireless.c index 1004ed651..c9e363048 100644 --- a/mdk-stage1/wireless.c +++ b/mdk-stage1/wireless.c @@ -37,124 +37,124 @@ static int wireless_set_essid(int socket, const char *ifname, const char *essid) int wireless_open_socket() { - return socket(AF_INET, SOCK_DGRAM, 0); + return socket(AF_INET, SOCK_DGRAM, 0); } int wireless_close_socket(int socket) { - return close(socket); + return close(socket); } static int wireless_ioctl(int socket, const char *ifname, int request, struct iwreq *wrq) { - strncpy(wrq->ifr_name, ifname, IFNAMSIZ); - return ioctl(socket, request, wrq); + strncpy(wrq->ifr_name, ifname, IFNAMSIZ); + return ioctl(socket, request, wrq); } int wireless_is_aware(int socket, const char *ifname) { - struct iwreq wrq; - return wireless_ioctl(socket, ifname, SIOCGIWNAME, &wrq) == 0; + struct iwreq wrq; + return wireless_ioctl(socket, ifname, SIOCGIWNAME, &wrq) == 0; } static int wireless_set_mode_managed(int socket, const char *ifname) { - struct iwreq wrq; + struct iwreq wrq; - wrq.u.mode = IW_MODE_INFRA; /* managed */ + wrq.u.mode = IW_MODE_INFRA; /* managed */ - return wireless_ioctl(socket, ifname, SIOCSIWMODE, &wrq) == 0; + return wireless_ioctl(socket, ifname, SIOCSIWMODE, &wrq) == 0; } static int wireless_set_essid(int socket, const char *ifname, const char *essid) { - struct iwreq wrq; + struct iwreq wrq; - wrq.u.essid.flags = 1; - wrq.u.essid.pointer = (void *) essid; - wrq.u.essid.length = strlen(essid) + 1; + wrq.u.essid.flags = 1; + wrq.u.essid.pointer = (void *) essid; + wrq.u.essid.length = strlen(essid) + 1; - return wireless_ioctl(socket, ifname, SIOCSIWESSID, &wrq) == 0; + return wireless_ioctl(socket, ifname, SIOCSIWESSID, &wrq) == 0; } static int wireless_disable_key(int socket, const char *ifname) { - struct iwreq wrq; + struct iwreq wrq; - wrq.u.data.flags = IW_ENCODE_DISABLED; - wrq.u.data.pointer = NULL; - wrq.u.data.length = 0; + wrq.u.data.flags = IW_ENCODE_DISABLED; + wrq.u.data.pointer = NULL; + wrq.u.data.length = 0; - return wireless_ioctl(socket, ifname, SIOCSIWENCODE, &wrq) == 0; + return wireless_ioctl(socket, ifname, SIOCSIWENCODE, &wrq) == 0; } static int wireless_set_restricted_key(int socket, const char *ifname, const char *key) { - struct iwreq wrq; - char real_key[IW_ENCODING_TOKEN_MAX]; - int key_len = 0; - unsigned int tmp; + struct iwreq wrq; + char real_key[IW_ENCODING_TOKEN_MAX]; + int key_len = 0; + unsigned int tmp; - while (sscanf(key + 2*key_len, "%2X", &tmp) == 1) - real_key[key_len++] = (char) tmp; + while (sscanf(key + 2*key_len, "%2X", &tmp) == 1) + real_key[key_len++] = (char) tmp; - wrq.u.data.flags = IW_ENCODE_RESTRICTED; - wrq.u.data.pointer = (char *) real_key; - wrq.u.data.length = key_len; + wrq.u.data.flags = IW_ENCODE_RESTRICTED; + wrq.u.data.pointer = (char *) real_key; + wrq.u.data.length = key_len; - return wireless_ioctl(socket, ifname, SIOCSIWENCODE, &wrq) == 0; + return wireless_ioctl(socket, ifname, SIOCSIWENCODE, &wrq) == 0; } enum return_type configure_wireless(const char *ifname) { - enum return_type results; - char * questions[] = { "ESSID", "WEP key", NULL }; - char * questions_auto[] = { "essid", "wep_key" }; - static char ** answers = NULL; - int wsock = wireless_open_socket(); - - if (!wireless_is_aware(wsock, ifname)) { - log_message("interface %s doesn't support wireless", ifname); - wireless_close_socket(wsock); - return RETURN_OK; - } - - results = ask_from_entries_auto("Please enter your wireless settings. " + enum return_type results; + char * questions[] = { "ESSID", "WEP key", NULL }; + char * questions_auto[] = { "essid", "wep_key" }; + static char ** answers = NULL; + int wsock = wireless_open_socket(); + + if (!wireless_is_aware(wsock, ifname)) { + log_message("interface %s doesn't support wireless", ifname); + wireless_close_socket(wsock); + return RETURN_OK; + } + + results = ask_from_entries_auto("Please enter your wireless settings. " "The ESSID is your wireless network identifier. " "The WEP key must be entered in hexadecimal, without any separator.", - questions, &answers, 32, questions_auto, NULL); - if (results != RETURN_OK) { - wireless_close_socket(wsock); - return RETURN_BACK; - } - - if (!wireless_set_mode_managed(wsock, ifname)) { - stg1_error_message("unable to set mode Managed on device \"%s\": %s", ifname, strerror(errno)); - wireless_close_socket(wsock); - return RETURN_ERROR; - } - - if (answers[1] && !streq(answers[1], "")) { - log_message("setting WEP key \"%s\" on device \"%s\"", answers[1], ifname); - if (!wireless_set_restricted_key(wsock, ifname, answers[1])) { - stg1_error_message("unable to set WEP key \"%s\" on device \"%s\": %s", answers[1], ifname, strerror(errno)); - return RETURN_ERROR; - } - } else { - log_message("disabling WEP key on device \"%s\"", ifname); - if (!wireless_disable_key(wsock, ifname)) { - stg1_error_message("unable to disable WEP key on device \"%s\": %s", ifname, strerror(errno)); - return RETURN_ERROR; - } - } + questions, &answers, 32, questions_auto, NULL); + if (results != RETURN_OK) { + wireless_close_socket(wsock); + return RETURN_BACK; + } + + if (!wireless_set_mode_managed(wsock, ifname)) { + stg1_error_message("unable to set mode Managed on device \"%s\": %s", ifname, strerror(errno)); + wireless_close_socket(wsock); + return RETURN_ERROR; + } + + if (answers[1] && !streq(answers[1], "")) { + log_message("setting WEP key \"%s\" on device \"%s\"", answers[1], ifname); + if (!wireless_set_restricted_key(wsock, ifname, answers[1])) { + stg1_error_message("unable to set WEP key \"%s\" on device \"%s\": %s", answers[1], ifname, strerror(errno)); + return RETURN_ERROR; + } + } else { + log_message("disabling WEP key on device \"%s\"", ifname); + if (!wireless_disable_key(wsock, ifname)) { + stg1_error_message("unable to disable WEP key on device \"%s\": %s", ifname, strerror(errno)); + return RETURN_ERROR; + } + } /* most devices perform discovery when ESSID is set, it needs to be last */ - log_message("setting ESSID \"%s\" on device \"%s\"", answers[0], ifname); - if (!wireless_set_essid(wsock, ifname, answers[0])) { - stg1_error_message("unable to set ESSID \"%s\" on device \"%s\": %s", answers[0], ifname, strerror(errno)); - return RETURN_ERROR; - } - - wireless_close_socket(wsock); - return RETURN_OK; + log_message("setting ESSID \"%s\" on device \"%s\"", answers[0], ifname); + if (!wireless_set_essid(wsock, ifname, answers[0])) { + stg1_error_message("unable to set ESSID \"%s\" on device \"%s\": %s", answers[0], ifname, strerror(errno)); + return RETURN_ERROR; + } + + wireless_close_socket(wsock); + return RETURN_OK; } diff --git a/mdk-stage1/zlibsupport.c b/mdk-stage1/zlibsupport.c index e201b8217..2b171e72d 100644 --- a/mdk-stage1/zlibsupport.c +++ b/mdk-stage1/zlibsupport.c @@ -23,270 +23,270 @@ #include <lzma.h> typedef struct lzma_file { - uint8_t buf[1<<14]; - lzma_stream strm; - FILE *fp; - lzma_bool eof; + uint8_t buf[1<<14]; + lzma_stream strm; + FILE *fp; + lzma_bool eof; } lzma_FILE; #else typedef unsigned char lzma_bool; -typedef int lzma_ret; -#define LZMA_OK 0 +typedef int lzma_ret; +#define LZMA_OK 0 #endif typedef enum xFile_e { - XF_NONE, - XF_GZIP, - XF_XZ, - XF_FAIL + XF_NONE, + XF_GZIP, + XF_XZ, + XF_FAIL } xFile_t; typedef struct xFile_s { - xFile_t type; - lzma_bool eof; - union { - gzFile gz; + xFile_t type; + lzma_bool eof; + union { + gzFile gz; #ifdef CONFIG_USE_LIBLZMA - lzma_FILE *xz; + lzma_FILE *xz; #endif - } f; - FILE *fp; + } f; + FILE *fp; } xFile; #ifdef CONFIG_USE_LIBLZMA static lzma_FILE *lzma_open(lzma_ret *lzma_error, FILE *fp) { - lzma_ret *ret = lzma_error; - lzma_FILE *lzma_file; - lzma_stream tmp = LZMA_STREAM_INIT; + lzma_ret *ret = lzma_error; + lzma_FILE *lzma_file; + lzma_stream tmp = LZMA_STREAM_INIT; - lzma_file = calloc(1, sizeof(*lzma_file)); + lzma_file = calloc(1, sizeof(*lzma_file)); - lzma_file->fp = fp; - lzma_file->eof = 0; - lzma_file->strm = tmp; + lzma_file->fp = fp; + lzma_file->eof = 0; + lzma_file->strm = tmp; - *ret = lzma_auto_decoder(&lzma_file->strm, -1, 0); + *ret = lzma_auto_decoder(&lzma_file->strm, -1, 0); - if (*ret != LZMA_OK) { - (void) fclose(lzma_file->fp); - free(lzma_file); - return NULL; - } - return lzma_file; + if (*ret != LZMA_OK) { + (void) fclose(lzma_file->fp); + free(lzma_file); + return NULL; + } + return lzma_file; } static ssize_t lzma_read(lzma_ret *lzma_error, lzma_FILE *lzma_file, void *buf, size_t len) { - lzma_ret *ret = lzma_error; - lzma_bool eof = 0; - - if (!lzma_file) - return -1; - if (lzma_file->eof) - return 0; - - lzma_file->strm.next_out = buf; - lzma_file->strm.avail_out = len; - for (;;) { - if (!lzma_file->strm.avail_in) { - lzma_file->strm.next_in = (uint8_t *)lzma_file->buf; - lzma_file->strm.avail_in = fread(lzma_file->buf, 1, sizeof(lzma_file->buf), lzma_file->fp); - if (!lzma_file->strm.avail_in) - eof = 1; - } - *ret = lzma_code(&lzma_file->strm, LZMA_RUN); - if (*ret == LZMA_STREAM_END) { - lzma_file->eof = 1; - return len - lzma_file->strm.avail_out; - } - if (*ret != LZMA_OK) - return -1; - if (!lzma_file->strm.avail_out) - return len; - if (eof) - return -1; - } + lzma_ret *ret = lzma_error; + lzma_bool eof = 0; + + if (!lzma_file) + return -1; + if (lzma_file->eof) + return 0; + + lzma_file->strm.next_out = buf; + lzma_file->strm.avail_out = len; + for (;;) { + if (!lzma_file->strm.avail_in) { + lzma_file->strm.next_in = (uint8_t *)lzma_file->buf; + lzma_file->strm.avail_in = fread(lzma_file->buf, 1, sizeof(lzma_file->buf), lzma_file->fp); + if (!lzma_file->strm.avail_in) + eof = 1; + } + *ret = lzma_code(&lzma_file->strm, LZMA_RUN); + if (*ret == LZMA_STREAM_END) { + lzma_file->eof = 1; + return len - lzma_file->strm.avail_out; + } + if (*ret != LZMA_OK) + return -1; + if (!lzma_file->strm.avail_out) + return len; + if (eof) + return -1; + } } #endif static xFile xOpen(int fd, const char *filename) { - xFile xF = {XF_FAIL, 0, {NULL}, NULL}; - lzma_ret ret = LZMA_OK; - unsigned char buf[8]; - - if (fd == -1 && filename != NULL) - if ((fd = open(filename, O_RDONLY)) < 0) - return xF; - if (read(fd, buf, sizeof(buf)) < 0) - return xF; - lseek(fd, 0, SEEK_SET); - if (filename != NULL) { - close(fd); - fd = -1; - } - if (buf[0] == 0xFD && buf[1] == '7' && buf[2] == 'z' && - buf[3] == 'X' && buf[4] == 'Z' && buf[5] == 0x00) - xF.type = XF_XZ; - else if (buf[0] == 0x1F && buf[1] == 0x8B) - xF.type = XF_GZIP; - else - xF.type = XF_NONE; - - switch(xF.type) { - case XF_GZIP: - xF.f.gz = (fd == -1 && filename != NULL) ? gzopen(filename, "rb") : gzdopen(fd, "rb"); - if(xF.f.gz == NULL) - xF.type = XF_FAIL; - break; - case XF_NONE: - xF.fp = (fd == -1 && filename != NULL) ? fopen(filename, "rb") : fdopen(fd, "rb"); - break; + xFile xF = {XF_FAIL, 0, {NULL}, NULL}; + lzma_ret ret = LZMA_OK; + unsigned char buf[8]; + + if (fd == -1 && filename != NULL) + if ((fd = open(filename, O_RDONLY)) < 0) + return xF; + if (read(fd, buf, sizeof(buf)) < 0) + return xF; + lseek(fd, 0, SEEK_SET); + if (filename != NULL) { + close(fd); + fd = -1; + } + if (buf[0] == 0xFD && buf[1] == '7' && buf[2] == 'z' && + buf[3] == 'X' && buf[4] == 'Z' && buf[5] == 0x00) + xF.type = XF_XZ; + else if (buf[0] == 0x1F && buf[1] == 0x8B) + xF.type = XF_GZIP; + else + xF.type = XF_NONE; + + switch(xF.type) { + case XF_GZIP: + xF.f.gz = (fd == -1 && filename != NULL) ? gzopen(filename, "rb") : gzdopen(fd, "rb"); + if(xF.f.gz == NULL) + xF.type = XF_FAIL; + break; + case XF_NONE: + xF.fp = (fd == -1 && filename != NULL) ? fopen(filename, "rb") : fdopen(fd, "rb"); + break; #ifdef CONFIG_USE_LIBLZMA - case XF_XZ: - xF.fp = (fd == -1 && filename != NULL) ? fopen(filename, "rb") : fdopen(fd, "rb"); - if(xF.fp == NULL) - xF.type = XF_FAIL; - if(xF.type == XF_NONE || xF.type == XF_FAIL) break; - xF.f.xz = lzma_open(&ret, xF.fp); - if(ret != LZMA_OK) - xF.type = XF_FAIL; - break; + case XF_XZ: + xF.fp = (fd == -1 && filename != NULL) ? fopen(filename, "rb") : fdopen(fd, "rb"); + if(xF.fp == NULL) + xF.type = XF_FAIL; + if(xF.type == XF_NONE || xF.type == XF_FAIL) break; + xF.f.xz = lzma_open(&ret, xF.fp); + if(ret != LZMA_OK) + xF.type = XF_FAIL; + break; #endif - default: - break; - } + default: + break; + } - return xF; + return xF; } static int xClose(xFile *xF) { - int ret = -1; - switch(xF->type) { - case XF_GZIP: - ret = gzclose(xF->f.gz); - break; + int ret = -1; + switch(xF->type) { + case XF_GZIP: + ret = gzclose(xF->f.gz); + break; #ifdef CONFIG_USE_LIBLZMA - case XF_XZ: - lzma_end(&xF->f.xz->strm); - free(xF->f.xz); + case XF_XZ: + lzma_end(&xF->f.xz->strm); + free(xF->f.xz); #endif - case XF_NONE: - ret = fclose(xF->fp); - break; - default: - break; - } - return ret; + case XF_NONE: + ret = fclose(xF->fp); + break; + default: + break; + } + return ret; } static ssize_t xRead(xFile *xF, lzma_ret *ret, void *buf, size_t len) { - ssize_t sz; - switch(xF->type) { - case XF_GZIP: - sz = gzread(xF->f.gz, buf, len); - xF->eof = gzeof(xF->f.gz); - break; + ssize_t sz; + switch(xF->type) { + case XF_GZIP: + sz = gzread(xF->f.gz, buf, len); + xF->eof = gzeof(xF->f.gz); + break; #ifdef CONFIG_USE_LIBLZMA - case XF_XZ: - sz = lzma_read(ret, xF->f.xz, buf, len); - xF->eof = xF->f.xz->eof; - break; + case XF_XZ: + sz = lzma_read(ret, xF->f.xz, buf, len); + xF->eof = xF->f.xz->eof; + break; #endif - case XF_NONE: - sz = fread(buf, 1, len, xF->fp); - xF->eof = feof(xF->fp); - break; - default: - sz = -1; - break; - } - return sz; + case XF_NONE: + sz = fread(buf, 1, len, xF->fp); + xF->eof = feof(xF->fp); + break; + default: + sz = -1; + break; + } + return sz; } void *grab_contents(xFile *xF, unsigned long *size) { - unsigned int max = 16384; - void *buffer = calloc(1, max); - lzma_ret ret; + unsigned int max = 16384; + void *buffer = calloc(1, max); + lzma_ret ret; - if (!buffer) - return NULL; + if (!buffer) + return NULL; - *size = 0; - while ((ret = xRead(xF, &ret, buffer + *size, max - *size)) > 0) { - *size += ret; - if (*size == max) { - void *p; + *size = 0; + while ((ret = xRead(xF, &ret, buffer + *size, max - *size)) > 0) { + *size += ret; + if (*size == max) { + void *p; - p = realloc(buffer, max *= 2); - if (!p) - goto out_err; + p = realloc(buffer, max *= 2); + if (!p) + goto out_err; - buffer = p; - } - } - if (ret < 0) - goto out_err; + buffer = p; + } + } + if (ret < 0) + goto out_err; - return buffer; + return buffer; out_err: - free(buffer); - return NULL; + free(buffer); + return NULL; } /* gzopen handles uncompressed files transparently. */ void *grab_file(const char *filename, unsigned long *size) { - xFile xF; - void *buffer; - - xF = xOpen(-1, filename); - if (xF.type == XF_FAIL) - return NULL; - buffer = grab_contents(&xF, size); - xClose(&xF); - return buffer; + xFile xF; + void *buffer; + + xF = xOpen(-1, filename); + if (xF.type == XF_FAIL) + return NULL; + buffer = grab_contents(&xF, size); + xClose(&xF); + return buffer; } void release_file(void *data, unsigned long size) { - free(data); + free(data); } #else /* ... !CONFIG_USE_ZLIB */ void *grab_fd(int fd, unsigned long *size) { - struct stat st; - void *map; - int ret; - - ret = fstat(fd, &st); - if (ret < 0) - return NULL; - *size = st.st_size; - map = mmap(0, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); - if (map == MAP_FAILED) - map = NULL; - return map; + struct stat st; + void *map; + int ret; + + ret = fstat(fd, &st); + if (ret < 0) + return NULL; + *size = st.st_size; + map = mmap(0, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); + if (map == MAP_FAILED) + map = NULL; + return map; } void *grab_file(const char *filename, unsigned long *size) { - int fd; - void *map; - - fd = open(filename, O_RDONLY, 0); - if (fd < 0) - return NULL; - map = grab_fd(fd, size); - close(fd); - return map; + int fd; + void *map; + + fd = open(filename, O_RDONLY, 0); + if (fd < 0) + return NULL; + map = grab_fd(fd, size); + close(fd); + return map; } void release_file(void *data, unsigned long size) { - munmap(data, size); + munmap(data, size); } #endif |