diff options
Diffstat (limited to 'mdk-stage1/thirdparty.c')
-rw-r--r-- | mdk-stage1/thirdparty.c | 664 |
1 files changed, 332 insertions, 332 deletions
diff --git a/mdk-stage1/thirdparty.c b/mdk-stage1/thirdparty.c index 57f38a2a4..aefe223e0 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(); } |