int mod_list_loaded_modules(char ***list, module_t ***mod_list, dia_align_t align) { static char **item = NULL; static module_t **mods = NULL; static int max_mods = 0; char *s, *t; int i, items = 0; module_t *mod; file_t *f0, *f; if(item) { for(i = 0; i < max_mods; i++) if(item[i]) free(item[i]); free(item); free(mods); } f0 = file_read_file("/proc/modules", kf_none); for(max_mods = 2, f = f0; f && f->next; f = f->next) max_mods++; item = calloc(max_mods, sizeof *item); mods = calloc(max_mods, sizeof *mods); for(; f; f = f->prev) { mod = mod_get_entry(f->key_str); if(mod && mod->descr) { t = *mod->descr ? mod->descr : mod->name; if(align == align_left) { s = malloc(MENU_WIDTH); strncpy(s, t, MENU_WIDTH); s[MENU_WIDTH - 1] = 0; util_fill_string(s, MENU_WIDTH - 4); } else { s = strdup(t); } mods[items] = mod; item[items++] = s; if(items >= max_mods - 1) break; } } file_free_file(f0); mods[items] = NULL; item[items] = NULL; if(list) *list = item; if(mod_list) *mod_list = mods; return items; }
int mod_is_loaded(char *module) { file_t *f0, *f; f0 = file_read_file("/proc/modules", kf_none); for(f = f0; f; f = f->next) { if(!mod_cmp(f->key_str, module)) break; } file_free_file(f0); return f ? 1 : 0; }
/* * return values: * -1 : abort (aka ESC) * 0 : ok * other: stay in menu */ int set_expert_cb(dia_item_t di) { int i; file_t *f; di_set_expert_last = di; switch(di) { case di_expert_info: info_menu(); break; case di_expert_modules: mod_menu(); break; case di_expert_eject: util_eject_cdrom(config.cdrom); break; case di_extras_info: util_status_info(0); break; case di_extras_change: i = dia_input2("Change config", &config.change_config, 35, 0); if(!i) { f = file_parse_buffer(config.change_config, kf_cfg + kf_cmd + kf_cmd_early); file_do_info(f, kf_cfg + kf_cmd + kf_cmd_early); file_free_file(f); net_update_ifcfg(IFCFG_IFUP); } break; case di_extras_shell: util_run_debugshell(); break; default: break; } return 1; }
/* * return values: * -1 : abort (aka ESC) * 0 : ok * other: stay in menu */ int set_expert_cb(dia_item_t di) { int i; char *dev = NULL; file_t *f; di_set_expert_last = di; switch(di) { case di_expert_info: info_menu(); break; case di_expert_modules: mod_menu(); break; case di_expert_verify: util_choose_disk_device(&dev, 2, "Please choose the device to check.", "Enter the device to check."); if(dev) digest_media_verify(dev); break; case di_expert_eject: util_eject_cdrom(config.cdrom); break; case di_extras_info: util_status_info(0); break; case di_extras_change: i = dia_input2("Change config", &config.change_config, 35, 0); if(!i) { f = file_parse_buffer(config.change_config, kf_cfg + kf_cmd + kf_cmd_early); file_do_info(f, kf_cfg + kf_cmd + kf_cmd_early); file_free_file(f); net_update_ifcfg(IFCFG_IFUP); } break; case di_extras_shell: kbd_end(0); if(config.win) { disp_cursor_on(); } if(!config.linemode) { printf("\033c"); if(config.utf8) printf("\033%%G"); fflush(stdout); } char *cmd = NULL; strprintf(&cmd, "PS1='\\w # ' %s 2>&1", config.debugshell ?: "/bin/sh"); system(cmd); free(cmd); kbd_init(0); if(config.win) { disp_cursor_off(); if(!config.linemode) disp_restore_screen(); } break; default: break; } return 1; }