gboolean binreloc_init(gboolean try_hardcoded) { GError *error = NULL; gchar *tmp; DEBUG("initializing binreloc (hardcoded = %d)", try_hardcoded); /* If the runtime data directories we previously found, don't even try to find them again. */ if (params.path_data && params.path_lib) { DEBUG("data and lib path already found."); return TRUE; } if (try_hardcoded || !gbr_init(&error)) { /* We were asked to try hardcoded paths or BinReloc failed to initialize. */ params.path_data = g_strdup(PREFIX); params.path_lib = g_strdup(LIBPREFIX); if (error) { g_error_free(error); } DEBUG("%strying hardcoded paths.", try_hardcoded ? "" : "binreloc init failed. "); } else { /* If we were able to initialize BinReloc, build the default data and library paths. */ DEBUG("done, trying to use binreloc paths."); tmp = gbr_find_data_dir(PREFIX); params.path_data = g_build_filename(tmp, "hardinfo", NULL); g_free(tmp); tmp = gbr_find_lib_dir(PREFIX); params.path_lib = g_build_filename(tmp, "hardinfo", NULL); g_free(tmp); } DEBUG("searching for runtime data on these locations:"); DEBUG(" lib: %s", params.path_lib); DEBUG(" data: %s", params.path_data); /* Try to see if the uidefs.xml file isn't missing. This isn't the definitive test, but it should do okay for most situations. */ tmp = g_build_filename(params.path_data, "benchmark.data", NULL); if (!g_file_test(tmp, G_FILE_TEST_EXISTS)) { DEBUG("runtime data not found"); g_free(params.path_data); g_free(params.path_lib); g_free(tmp); params.path_data = params.path_lib = NULL; if (try_hardcoded) { /* We tried the hardcoded paths, but still was unable to find the runtime data. Give up. */ DEBUG("giving up"); return FALSE; } else { /* Even though BinReloc worked OK, the runtime data was not found. Try the hardcoded paths. */ DEBUG("trying to find elsewhere"); return binreloc_init(TRUE); } } g_free(tmp); DEBUG("runtime data found!"); /* We found the runtime data; hope everything is fine */ return TRUE; }
int main(int argc, char **argv) { GSList *modules; DEBUG("HardInfo version " VERSION ". Debug version."); DEBUG("g_thread_init()"); if (!g_thread_supported()) g_thread_init(NULL); /* parse all command line parameters */ parameters_init(&argc, &argv, ¶ms); /* show version information and quit */ if (params.show_version) { g_print("HardInfo version " VERSION "\n"); g_print ("Copyright (C) 2003-2009 Leandro A. F. Pereira. See COPYING for details.\n\n"); g_print("Compile-time options:\n" " Release version: %s (%s)\n" " BinReloc enabled: %s\n" " Data prefix: %s\n" " Library prefix: %s\n" " Compiled on: %s %s (%s)\n", RELEASE ? "Yes" : "No (" VERSION ")", ARCH, ENABLE_BINRELOC ? "Yes" : "No", PREFIX, LIBPREFIX, PLATFORM, KERNEL, HOSTNAME); DEBUG(" Debugging is enabled."); /* show also available modules */ params.list_modules = TRUE; } /* initialize the binreloc library, so we can load program data */ if (!binreloc_init(FALSE)) g_error("Failed to find runtime data.\n\n" "\342\200\242 Is HardInfo correctly installed?\n" "\342\200\242 See if %s and %s exists and you have read permision.", PREFIX, LIBPREFIX); /* list all module names */ if (params.list_modules) { g_print("Modules:\n" "%-20s%-15s%-12s\n", "File Name", "Name", "Version"); for (modules = modules_load_all(); modules; modules = modules->next) { ShellModule *module = (ShellModule *) modules->data; ModuleAbout *ma = module_get_about(module); gchar *name = g_path_get_basename(g_module_name(module->dll)); g_print("%-20s%-15s%-12s\n", name, module->name, ma->version); g_free(name); } return 0; } if (!params.create_report && !params.run_benchmark && !params.run_xmlrpc_server) { /* we only try to open the UI if the user didn't asked for a report. */ params.gui_running = ui_init(&argc, &argv); /* as a fallback, if GTK+ initialization failed, run in report generation mode. */ if (!params.gui_running) params.create_report = TRUE; } if (params.use_modules) { /* load only selected modules */ DEBUG("loading user-selected modules"); modules = modules_load_selected(); } else { /* load all modules */ DEBUG("loading all modules"); modules = modules_load_all(); } /* initialize vendor database */ vendor_init(); if (params.run_xmlrpc_server) { g_type_init(); xmlrpc_server_init(); xmlrpc_server_start(); } else if (params.run_benchmark) { gchar *result; result = module_call_method_param("benchmark::runBenchmark", params.run_benchmark); if (!result) { g_error("Unknown benchmark ``%s'' or benchmark.so not loaded", params.run_benchmark); } else { g_print("Benchmark result: %s\n", result); g_free(result); } } else if (params.gui_running) { /* initialize gui and start gtk+ main loop */ icon_cache_init(); stock_icons_init(); shell_init(modules); DEBUG("entering gtk+ main loop"); gtk_main(); } else if (params.create_report) { /* generate report */ gchar *report; DEBUG("generating report"); report = report_create_from_module_list_format(modules, params. report_format); g_print("%s", report); g_free(report); } else { g_error("Don't know what to do. Exiting."); } DEBUG("finished"); return 0; }