diff options
Diffstat (limited to 'hardinfo2')
| -rw-r--r-- | hardinfo2/arch/linux/common/inputdevices.h | 4 | ||||
| -rw-r--r-- | hardinfo2/arch/linux/common/modules.h | 11 | ||||
| -rw-r--r-- | hardinfo2/arch/linux/common/pci.h | 4 | ||||
| -rw-r--r-- | hardinfo2/arch/linux/common/storage.h | 8 | ||||
| -rw-r--r-- | hardinfo2/arch/linux/common/usb.h | 4 | ||||
| -rw-r--r-- | hardinfo2/computer.c | 63 | ||||
| -rw-r--r-- | hardinfo2/computer.h | 2 | ||||
| -rw-r--r-- | hardinfo2/devices.c | 110 | ||||
| -rw-r--r-- | hardinfo2/hardinfo.h | 6 | ||||
| -rw-r--r-- | hardinfo2/shell.h | 6 | ||||
| -rw-r--r-- | hardinfo2/util.c | 65 | 
11 files changed, 218 insertions, 65 deletions
| diff --git a/hardinfo2/arch/linux/common/inputdevices.h b/hardinfo2/arch/linux/common/inputdevices.h index a3fb3e4a..e9deffa7 100644 --- a/hardinfo2/arch/linux/common/inputdevices.h +++ b/hardinfo2/arch/linux/common/inputdevices.h @@ -55,7 +55,7 @@ scan_inputdevices(void)  	return;      if (input_list) { -	g_hash_table_foreach_remove(devices, remove_input_devices, NULL); +	g_hash_table_foreach_remove(moreinfo, remove_input_devices, NULL);  	g_free(input_list);  	g_free(input_icons);      } @@ -127,7 +127,7 @@ scan_inputdevices(void)  				      "Version=0x%x\n"  				      "Connected to=%s\n",  				      strhash, product, version, phys); -	    g_hash_table_insert(devices, tmp, strhash); +	    g_hash_table_insert(moreinfo, tmp, strhash);  	    g_free(phys);  	    g_free(name); diff --git a/hardinfo2/arch/linux/common/modules.h b/hardinfo2/arch/linux/common/modules.h index 933823d7..3acf4aba 100644 --- a/hardinfo2/arch/linux/common/modules.h +++ b/hardinfo2/arch/linux/common/modules.h @@ -16,6 +16,13 @@   *    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA   */ +#define GET_STR(field_name,ptr)      					\ +  if (!ptr && strstr(tmp[0], field_name)) {				\ +    ptr = g_markup_escape_text(g_strstrip(tmp[1]), strlen(tmp[1]));	\ +    g_strfreev(tmp);                 					\ +    continue;                        					\ +  } +  static gboolean  remove_module_devices(gpointer key, gpointer value, gpointer data)  { @@ -40,7 +47,7 @@ scan_modules(void)          module_list = NULL;      } -    g_hash_table_foreach_remove(devices, remove_module_devices, NULL); +    g_hash_table_foreach_remove(moreinfo, remove_module_devices, NULL);      lsmod = popen("/sbin/lsmod", "r");      if (!lsmod) @@ -137,7 +144,7 @@ scan_modules(void)  	    g_free(deps);  	} -	g_hash_table_insert(devices, hashkey, strmodule); +	g_hash_table_insert(moreinfo, hashkey, strmodule);  	g_free(license);  	g_free(description); diff --git a/hardinfo2/arch/linux/common/pci.h b/hardinfo2/arch/linux/common/pci.h index e7c940bb..5f48ba44 100644 --- a/hardinfo2/arch/linux/common/pci.h +++ b/hardinfo2/arch/linux/common/pci.h @@ -126,7 +126,7 @@ scan_pci(void)  	    gpointer start, end;  	    if (strdevice != NULL && strhash != NULL) { -		g_hash_table_insert(devices, strhash, strdevice); +		g_hash_table_insert(moreinfo, strhash, strdevice);                  g_free(category);                  g_free(name);  	    } @@ -194,7 +194,7 @@ scan_pci(void)          pci_list = g_strconcat(pci_list, "No PCI devices found=\n", NULL);      } else if (strhash) {  	/* insert the last device */ -        g_hash_table_insert(devices, strhash, strdevice); +        g_hash_table_insert(moreinfo, strhash, strdevice);          g_free(category);          g_free(name);      } diff --git a/hardinfo2/arch/linux/common/storage.h b/hardinfo2/arch/linux/common/storage.h index 4c9b5633..3397570d 100644 --- a/hardinfo2/arch/linux/common/storage.h +++ b/hardinfo2/arch/linux/common/storage.h @@ -43,7 +43,7 @@ scan_scsi(void)      gchar *vendor = NULL, *revision = NULL, *model = NULL;      /* remove old devices from global device table */ -    g_hash_table_foreach_remove(devices, remove_scsi_devices, NULL); +    g_hash_table_foreach_remove(moreinfo, remove_scsi_devices, NULL);      if (!g_file_test("/proc/scsi/scsi", G_FILE_TEST_EXISTS))  	return; @@ -136,7 +136,7 @@ scan_scsi(void)  					     scsi_channel,  					     scsi_id,  					     scsi_lun); -	    g_hash_table_insert(devices, devid, strhash); +	    g_hash_table_insert(moreinfo, devid, strhash);  	    g_free(model);  	    g_free(revision); @@ -169,7 +169,7 @@ scan_ide(void)      gchar *capab = NULL, *speed = NULL, *driver = NULL;      /* remove old devices from global device table */ -    g_hash_table_foreach_remove(devices, remove_ide_devices, NULL); +    g_hash_table_foreach_remove(moreinfo, remove_ide_devices, NULL);      storage_list = g_strdup_printf("%s\n[IDE Disks]\n", storage_list); @@ -345,7 +345,7 @@ scan_ide(void)                  speed = NULL;              } -	    g_hash_table_insert(devices, devid, strhash); +	    g_hash_table_insert(moreinfo, devid, strhash);  	    g_free(model);  	    model = ""; diff --git a/hardinfo2/arch/linux/common/usb.h b/hardinfo2/arch/linux/common/usb.h index 4fd6ee21..286d9380 100644 --- a/hardinfo2/arch/linux/common/usb.h +++ b/hardinfo2/arch/linux/common/usb.h @@ -47,7 +47,7 @@ scan_usb(void)  	return;      if (usb_list) { -	g_hash_table_foreach_remove(devices, remove_usb_devices, NULL); +	g_hash_table_foreach_remove(moreinfo, remove_usb_devices, NULL);  	g_free(usb_list);      }      usb_list = g_strdup(""); @@ -125,7 +125,7 @@ scan_usb(void)                                                   ver, rev, classid,                                                   vendor, prodid, bus, level); -                g_hash_table_insert(devices, tmp, strhash); +                g_hash_table_insert(moreinfo, tmp, strhash);              }  	    g_free(manuf); diff --git a/hardinfo2/computer.c b/hardinfo2/computer.c index 1d8e0b70..8499bb20 100644 --- a/hardinfo2/computer.c +++ b/hardinfo2/computer.c @@ -30,16 +30,12 @@  #include <shell.h>  #include <vendor.h> -#include <expr.h> - -#include "socket.h"  enum {      COMPUTER_SUMMARY, -    COMPUTER_PROCESSORS,      COMPUTER_OPERATING_SYSTEM, +    COMPUTER_KERNEL_MODULES,      COMPUTER_LANGUAGE, -    COMPUTER_SENSORS,      COMPUTER_FILESYSTEMS,      COMPUTER_SHARES,      COMPUTER_DISPLAY, @@ -49,10 +45,9 @@ enum {  static ModuleEntry hi_entries[] = {      {"Summary",			"summary.png"}, -    {"Processor",		"processor.png"},      {"Operating System",	"os.png"}, +    {"Kernel Modules",		"module.png"},      {"Languages",		"language.png"}, -    {"Sensors",			"therm.png"},      {"Filesystems",		"dev_removable.png"},      {"Shared Directories",	"shares.png"},      {"Display",			"monitor.png"}, @@ -63,19 +58,19 @@ static ModuleEntry hi_entries[] = {  #include "computer.h"  static GHashTable *moreinfo = NULL; +static gchar *module_list = NULL; +#include <arch/this/modules.h>  #include <arch/common/languages.h>  #include <arch/this/alsa.h>  #include <arch/common/display.h>  #include <arch/this/loadavg.h>  #include <arch/this/memory.h>  #include <arch/this/uptime.h> -#include <arch/this/processor.h>  #include <arch/this/os.h>  #include <arch/this/filesystem.h>  #include <arch/this/samba.h>  #include <arch/this/nfs.h> -#include <arch/this/sensors.h>  #include <arch/this/net.h>  #include <arch/common/users.h> @@ -96,9 +91,6 @@ computer_get_info(void)      moreinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL); -    shell_status_update("Getting processor information..."); -    computer->processors = computer_get_processors(); -      shell_status_update("Getting memory information...");      computer->memory = computer_get_memory(); @@ -118,9 +110,6 @@ computer_get_info(void)      scan_samba_shared_directories();      scan_nfs_shared_directories(); -    shell_status_update("Reading sensors..."); -    read_sensors(); -      shell_status_update("Obtaining network information...");      scan_net_interfaces(); @@ -135,15 +124,15 @@ void  hi_reload(gint entry)  {      switch (entry) { +    case COMPUTER_KERNEL_MODULES: +        scan_modules(); +        break;      case COMPUTER_FILESYSTEMS:  	scan_filesystems();  	break;      case COMPUTER_NETWORK:  	scan_net_interfaces();  	break; -    case COMPUTER_SENSORS: -	read_sensors(); -	break;      case COMPUTER_USERS:          scan_users();          break; @@ -193,13 +182,23 @@ gchar *  hi_info(gint entry)  {      static Computer *computer = NULL; -    static gchar *tmp = NULL; +    static gchar *tmp1, *tmp2;      if (!computer) {  	computer = computer_get_info();      }      switch (entry) { +    case COMPUTER_KERNEL_MODULES: +        if (!module_list) { +            shell_status_update("Getting loaded module information..."); +            scan_modules(); +        } +	return g_strdup_printf("[Loaded Modules]\n" +			       "%s" +			       "[$ShellParam$]\n" +			       "ViewType=1", +			       module_list);      case COMPUTER_NETWORK:          return g_strdup_printf("[$ShellParam$]\n"                                 "ReloadInterval=3000\n" @@ -213,10 +212,6 @@ hi_info(gint entry)                                 "%s\n"                                 "[System Users]\n"                                 "%s\n", human_users, sys_users); -    case COMPUTER_SENSORS: -        return g_strdup_printf("[$ShellParam$]\n" -                               "ReloadInterval=5000\n" -                               "%s", sensors);      case COMPUTER_SHARES:          return g_strdup_printf("[SAMBA]\n"                                 "%s\n" @@ -228,11 +223,11 @@ hi_info(gint entry)  			       "ReloadInterval=5000\n"  			       "[Mounted File Systems]\n%s\n", fs_list);      case COMPUTER_SUMMARY: -        if (tmp) g_free(tmp); -        tmp = computer_get_alsacards(computer); +        tmp1 = computer_get_alsacards(computer); +        tmp2 = module_call_method("devices::getProcessorName"); -        /* FIXME: We assume all processors have the same name */ -        Processor *processor = (Processor*) computer->processors->data; +        schedule_free(tmp1); +        schedule_free(tmp2);  	return g_strdup_printf("[$ShellParam$]\n"  			       "UpdateInterval$Memory=1000\n" @@ -249,7 +244,7 @@ hi_info(gint entry)  			       "X11 Vendor=%s\n"  			       "[Multimedia]\n"  			       "%s\n", -			       processor->model_name, +			       tmp2,  			       computer->os->distro,  			       computer->os->username,  			       computer->date_time, @@ -257,7 +252,7 @@ hi_info(gint entry)  			       computer->display->height,  			       computer->display->ogl_renderer,  			       computer->display->vendor, -			       tmp); +			       tmp1);      case COMPUTER_DISPLAY:          return g_strdup_printf("[Display]\n"                                 "Resolution=%dx%d pixels\n" @@ -314,8 +309,6 @@ hi_info(gint entry)  			       "ViewType=1\n"  			       "[Available Languages]\n"  			       "%s", computer->os->languages); -    case COMPUTER_PROCESSORS: -        return processor_get_info(computer->processors);      default:  	return g_strdup("[Empty]\nNo info available=");      } @@ -350,3 +343,11 @@ hi_module_weight(void)  {      return 80;  } + +gchar ** +hi_module_depends_on(void) +{ +    static gchar *deps[] = { "devices.so", NULL }; +     +    return deps; +} diff --git a/hardinfo2/computer.h b/hardinfo2/computer.h index 4fa771f8..d721df64 100644 --- a/hardinfo2/computer.h +++ b/hardinfo2/computer.h @@ -44,7 +44,6 @@ static struct {  };  typedef struct _Computer	Computer; -typedef struct _Processor	Processor;  typedef struct _OperatingSystem	OperatingSystem;  typedef struct _MemoryInfo	MemoryInfo;  typedef struct _UptimeInfo	UptimeInfo; @@ -100,7 +99,6 @@ struct _UptimeInfo {  };  struct _Computer { -    GSList *processors;      MemoryInfo *memory;      OperatingSystem *os;      DisplayInfo *display; diff --git a/hardinfo2/devices.c b/hardinfo2/devices.c index 4eced276..a88f8e2b 100644 --- a/hardinfo2/devices.c +++ b/hardinfo2/devices.c @@ -24,28 +24,35 @@  #include <shell.h>  #include <iconcache.h> +#include <expr.h> +#include <socket.h> +  enum { -    DEVICES_KERNEL_MODULES, +    DEVICES_PROCESSORS, +    DEVICES_MEMORY,      DEVICES_PCI,      DEVICES_USB,      DEVICES_PRINTERS,      DEVICES_BATTERY, +    DEVICES_SENSORS,      DEVICES_INPUT,      DEVICES_STORAGE,  } Entries;  static ModuleEntry hi_entries[] = { -    {"Kernel Modules",	"module.png"}, +    {"Processor",	"processor.png"}, +    {"Memory",		"memory.png"},      {"PCI Devices",	"devices.png"},      {"USB Devices",	"usb.png"},      {"Printers",	"printer.png"},      {"Battery",		"battery.png"}, +    {"Sensors",		"therm.png"},      {"Input Devices",	"keyboard.png"},      {"Storage",		"hdd.png"},  }; -static GHashTable *devices = NULL; -static gchar *module_list = NULL; +static GHashTable *moreinfo = NULL; +static GSList *processors = NULL;  static gchar *printer_list = NULL;  static gchar *pci_list = "";  static gchar *input_list = NULL; @@ -61,23 +68,62 @@ static gchar *battery_list = NULL;      continue;                        					\    } +#define get_str(field_name,ptr)               \ +  if (g_str_has_prefix(tmp[0], field_name)) { \ +    ptr = g_strdup(tmp[1]);                   \ +    g_strfreev(tmp);                          \ +    continue;                                 \ +  } +#define get_int(field_name,ptr)               \ +  if (g_str_has_prefix(tmp[0], field_name)) { \ +    ptr = atoi(tmp[1]);                       \ +    g_strfreev(tmp);                          \ +    continue;                                 \ +  } +#define get_float(field_name,ptr)             \ +  if (g_str_has_prefix(tmp[0], field_name)) { \ +    ptr = atof(tmp[1]);                       \ +    g_strfreev(tmp);                          \ +    continue;                                 \ +  } +  #include <vendor.h> +typedef struct _Processor	Processor; +struct _Processor { +    gchar *model_name; +    gchar *vendor_id; +    gchar *flags; +    gint cache_size; +    gfloat bogomips, cpu_mhz; + +    gchar *has_fpu; +    gchar *bug_fdiv, *bug_hlt, *bug_f00f, *bug_coma; +     +    gint model, family, stepping; +    gchar *strmodel; +     +    gint id; +}; + +#include <arch/this/processor.h> +  #include <arch/this/pci.h> -#include <arch/this/modules.h>  #include <arch/common/printers.h>  #include <arch/this/inputdevices.h>  #include <arch/this/usb.h>  #include <arch/this/storage.h>  #include <arch/this/battery.h> +#include <arch/this/sensors.h>  static void  detect_devices(void)  { -    devices = g_hash_table_new(g_str_hash, g_str_equal); +    moreinfo = g_hash_table_new(g_str_hash, g_str_equal); -    shell_status_update("Getting loaded modules information..."); -    scan_modules(); +    shell_status_update("Getting processor information..."); +    if (!processors) +        processors = computer_get_processors();      shell_status_update("Scanning PCI devices...");      scan_pci(); @@ -99,12 +145,36 @@ detect_devices(void)      shell_status_update("Scanning batteries...");      scan_battery(); + +    shell_status_update("Reading sensors..."); +    read_sensors(); +} + +gchar * +get_processor_name(void) +{ +    if (!processors) { +        processors = computer_get_processors(); +    } +     +    Processor *p = (Processor *) processors->data; +    return p->model_name; +} + +ShellModuleMethod *hi_exported_methods(void) +{ +    static ShellModuleMethod m[] = { +      { "getProcessorName", get_processor_name }, +      { NULL } +    }; +     +    return m;  }  gchar *  hi_more_info(gchar * entry)  { -    gchar *info = (gchar *) g_hash_table_lookup(devices, entry); +    gchar *info = (gchar *) g_hash_table_lookup(moreinfo, entry);      if (info)  	return g_strdup(info); @@ -115,9 +185,6 @@ void  hi_reload(gint entry)  {      switch (entry) { -    case DEVICES_KERNEL_MODULES: -        scan_modules(); -        break;      case DEVICES_BATTERY:          scan_battery();          break; @@ -130,6 +197,9 @@ hi_reload(gint entry)      case DEVICES_USB:  	scan_usb();  	break; +    case DEVICES_SENSORS: +	read_sensors(); +	break;      case DEVICES_STORAGE:  	if (storage_list) {  	    g_free(storage_list); @@ -146,27 +216,29 @@ hi_reload(gint entry)  gchar *  hi_info(gint entry)  { -    if (!devices) { +    if (!moreinfo) {  	detect_devices();      }      switch (entry) { +    case DEVICES_PROCESSORS: +        return processor_get_info(processors); +    case DEVICES_MEMORY: +        return g_strdup("[Memory]\nNot implemented=\n");      case DEVICES_BATTERY:          return g_strdup_printf("%s\n"                                 "[$ShellParam$]\n"                                 "ReloadInterval=4000\n", battery_list); -    case DEVICES_KERNEL_MODULES: -	return g_strdup_printf("[Loaded Modules]\n" -			       "%s" -			       "[$ShellParam$]\n" -			       "ViewType=1", -			       module_list);      case DEVICES_PCI:  	return g_strdup_printf("[PCI Devices]\n"  			       "%s"  			       "[$ShellParam$]\n"  			       "ViewType=1\n",  			       pci_list); +    case DEVICES_SENSORS: +        return g_strdup_printf("[$ShellParam$]\n" +                               "ReloadInterval=5000\n" +                               "%s", sensors);      case DEVICES_PRINTERS:  	return g_strdup_printf("%s\n"  			       "[$ShellParam$]\n" diff --git a/hardinfo2/hardinfo.h b/hardinfo2/hardinfo.h index 1f850cc9..eb78d99a 100644 --- a/hardinfo2/hardinfo.h +++ b/hardinfo2/hardinfo.h @@ -20,6 +20,7 @@  #define __HARDINFO_H__  #include <gtk/gtk.h> +#include <shell.h>  typedef struct _ModuleEntry		ModuleEntry;  typedef struct _FileTypes		FileTypes; @@ -69,6 +70,7 @@ gchar    *file_chooser_build_filename(GtkWidget *chooser, gchar *extension);  gpointer  file_types_get_data_by_name(FileTypes *file_types, gchar *name);  /* Misc utility functions */ +void	      schedule_free(gpointer ptr);  inline gchar *size_human_readable(gfloat size);  void          nonblock_sleep(guint msec);  void          open_url(gchar *url); @@ -83,4 +85,8 @@ gboolean ui_init(int *argc, char ***argv);  void     parameters_init(int *argc, char ***argv, ProgramParameters *params);  extern   ProgramParameters params; +/* Module stuff */ +void		 module_register(ShellModule *module); +gchar		*module_call_method(gchar *method); +  #endif				/* __HARDINFO_H__ */ diff --git a/hardinfo2/shell.h b/hardinfo2/shell.h index f9ac39e5..c1204233 100644 --- a/hardinfo2/shell.h +++ b/hardinfo2/shell.h @@ -26,6 +26,7 @@ typedef struct _ShellTree		ShellTree;  typedef struct _ShellInfoTree		ShellInfoTree;  typedef struct _ShellModule		ShellModule; +typedef struct _ShellModuleMethod	ShellModuleMethod;  typedef struct _ShellModuleEntry	ShellModuleEntry;  typedef struct _ShellFieldUpdate	ShellFieldUpdate; @@ -111,6 +112,11 @@ struct _ShellModule {      GSList		*entries;  }; +struct _ShellModuleMethod { +    gchar	*name; +    gchar	*(*function) (void); +}; +  struct _ShellModuleEntry {      gchar		*name;      GdkPixbuf		*icon; diff --git a/hardinfo2/util.c b/hardinfo2/util.c index 86ba47a3..d95770ff 100644 --- a/hardinfo2/util.c +++ b/hardinfo2/util.c @@ -368,7 +368,52 @@ gchar *strreplace(gchar * string, gchar * replace, gchar new_char)      return string;  } -static ShellModule *module_load(gchar *filename) { +static GHashTable *__modules = NULL; + +void module_register(ShellModule *module) +{ +    ShellModuleMethod *(*get_methods) (void); +    gchar *method_name; + +    if (__modules == NULL) { +        __modules = g_hash_table_new(g_str_hash, g_str_equal); +    } + +    if (g_module_symbol(module->dll, "hi_exported_methods", (gpointer) &get_methods)) { +        ShellModuleMethod *methods = get_methods(); +         +        while (TRUE) { +            ShellModuleMethod method = *methods; +            gchar *name = g_path_get_basename(g_module_name(module->dll)); +             +            strend(name, '.'); +             +            method_name = g_strdup_printf("%s::%s", name, method.name); +            g_hash_table_insert(__modules, method_name, method.function); +            g_free(name); +             +            if (!(*(++methods)).name) +                break; +        } +    } + +} + +gchar *module_call_method(gchar *method) +{ +    gchar *(*function) (void); +     +    if (__modules == NULL) { +        return NULL; +    } + +    function = g_hash_table_lookup(__modules, method); +    return function ? g_strdup(function()) : +                      g_strdup_printf("{Unknown method: \"%s\"}", method); +} + +static ShellModule *module_load(gchar *filename) +{      ShellModule *module;      gchar *tmp; @@ -441,6 +486,8 @@ static ShellModule *module_load(gchar *filename) {          module = NULL;      } +    module_register(module); +          return module;  } @@ -541,6 +588,9 @@ void tree_view_save_image(gchar *filename)  {      /* this is ridiculously complicated :/ why in the hell gtk+ makes this kind of         thing so difficult?  */ +     +    /* FIXME: this does not work if the window (or part of it) isn't visible. does +              anyone know how to fix this? :/ */      Shell		*shell = shell_get_main_shell();      GtkWidget		*widget = shell->info->view; @@ -631,3 +681,16 @@ void tree_view_save_image(gchar *filename)      gtk_widget_set_sensitive(widget, tv_enabled);  } + + +static gboolean __schedule_free_do(gpointer ptr) +{ +    g_free(ptr); + +    return FALSE; +} + +void schedule_free(gpointer ptr) +{ +    g_timeout_add(5000, __schedule_free_do, ptr); +} | 
