diff options
author | Danny Kukawka <danny.kukawka@web.de> | 2008-10-01 21:22:07 +0200 |
---|---|---|
committer | Danny Kukawka <danny.kukawka@web.de> | 2008-10-01 21:22:07 +0200 |
commit | a7023c197856fc30ef3c25d687c283081e342d87 (patch) | |
tree | 8e703f84d0c04e4955e417be000d11d33af2a14f | |
parent | 48cf6988c6448a3ddf0d62fd13d83c6188a2fa55 (diff) |
get storage.model for SCSI via HDIO_GET_IDENTITY instead of sysfs
Get storage.model for SCSI devices via the storage prober from
the device (via HDIO_GET_IDENTITY ioctl) intead of reading it from
sysfs.
This should prevent truncated model strings (after 16 chars) if the
device is a IDE device managed via the SCSI layer.
Moved hal_util_strdup_valid_utf8() from util.[c,h] to util_helper.[c,h]
to be able to reuse the function in probe-storage.c. Cleaned up
util_helper_priv.h, removed not implemented functions from the file.
-rw-r--r-- | hald/linux/addons/Makefile.am | 4 | ||||
-rw-r--r-- | hald/linux/coldplug.c | 1 | ||||
-rw-r--r-- | hald/linux/osspec.c | 1 | ||||
-rw-r--r-- | hald/linux/probing/Makefile.am | 4 | ||||
-rw-r--r-- | hald/linux/probing/probe-storage.c | 47 | ||||
-rw-r--r-- | hald/util.c | 25 | ||||
-rw-r--r-- | hald/util.h | 2 | ||||
-rw-r--r-- | hald/util_helper.c | 28 | ||||
-rw-r--r-- | hald/util_helper.h | 3 | ||||
-rw-r--r-- | hald/util_helper_priv.h | 3 |
10 files changed, 84 insertions, 34 deletions
diff --git a/hald/linux/addons/Makefile.am b/hald/linux/addons/Makefile.am index 2e03111d..46b41cfb 100644 --- a/hald/linux/addons/Makefile.am +++ b/hald/linux/addons/Makefile.am @@ -76,7 +76,7 @@ endif endif hald_addon_acpi_SOURCES = addon-acpi.c ../../logger.c ../../util_helper.c -hald_addon_acpi_LDADD = $(top_builddir)/libhal/libhal.la +hald_addon_acpi_LDADD = @GLIB_LIBS@ $(top_builddir)/libhal/libhal.la if BUILD_ACPI_TOSHIBA hald_addon_acpi_buttons_toshiba_SOURCES = addon-acpi-buttons-toshiba.c ../../logger.c ../../util_helper.c @@ -90,7 +90,7 @@ hald_addon_input_SOURCES = addon-input.c ../../logger.c ../../util_helper.c hald_addon_input_LDADD = $(top_builddir)/libhal/libhal.la @GLIB_LIBS@ hald_addon_pmu_SOURCES = addon-pmu.c ../../logger.c ../../util_helper.c -hald_addon_pmu_LDADD = $(top_builddir)/libhal/libhal.la +hald_addon_pmu_LDADD = @GLIB_LIBS@ $(top_builddir)/libhal/libhal.la hald_addon_storage_SOURCES = addon-storage.c ../../logger.c ../../util_helper.c hald_addon_storage_LDADD = $(top_builddir)/libhal/libhal.la @GLIB_LIBS@ diff --git a/hald/linux/coldplug.c b/hald/linux/coldplug.c index 0ba71825..d22fdd1e 100644 --- a/hald/linux/coldplug.c +++ b/hald/linux/coldplug.c @@ -39,6 +39,7 @@ #include "../logger.h" #include "../osspec.h" #include "../util.h" +#include "../util_helper.h" #include "osspec_linux.h" #include "hotplug.h" #include "coldplug.h" diff --git a/hald/linux/osspec.c b/hald/linux/osspec.c index e91a8aa2..6d6472bf 100644 --- a/hald/linux/osspec.c +++ b/hald/linux/osspec.c @@ -55,6 +55,7 @@ #include "../logger.h" #include "../osspec.h" #include "../util.h" +#include "../util_helper.h" #include "../ids.h" #include "acpi.h" diff --git a/hald/linux/probing/Makefile.am b/hald/linux/probing/Makefile.am index 274b8704..10bba43a 100644 --- a/hald/linux/probing/Makefile.am +++ b/hald/linux/probing/Makefile.am @@ -39,8 +39,8 @@ hald_probe_hiddev_LDADD = $(top_builddir)/libhal/libhal.la hald_probe_serial_SOURCES = probe-serial.c ../../logger.c hald_probe_serial_LDADD = $(top_builddir)/libhal/libhal.la -hald_probe_storage_SOURCES = probe-storage.c linux_dvd_rw_utils.c linux_dvd_rw_utils.h ../../logger.c -hald_probe_storage_LDADD = $(top_builddir)/libhal/libhal.la $(top_builddir)/partutil/libpartutil.la @GLIB_LIBS@ @VOLUME_ID_LIBS@ +hald_probe_storage_SOURCES = probe-storage.c linux_dvd_rw_utils.c linux_dvd_rw_utils.h ../../util_helper.c ../../logger.c +hald_probe_storage_LDADD = @GLIB_LIBS@ @VOLUME_ID_LIBS@ $(top_builddir)/libhal/libhal.la $(top_builddir)/partutil/libpartutil.la hald_probe_pc_floppy_SOURCES = probe-pc-floppy.c ../../logger.c diff --git a/hald/linux/probing/probe-storage.c b/hald/linux/probing/probe-storage.c index f13d0154..a8b8d79b 100644 --- a/hald/linux/probing/probe-storage.c +++ b/hald/linux/probing/probe-storage.c @@ -32,6 +32,7 @@ #include <errno.h> #include <fcntl.h> #include <linux/kdev_t.h> +#include <linux/hdreg.h> #include <linux/cdrom.h> #include <linux/fs.h> #include <mntent.h> @@ -50,6 +51,8 @@ #include "linux_dvd_rw_utils.h" #include "../../logger.h" +#include "../../util_helper.h" + static void vid_log(int priority, const char *file, int line, const char *format, ...) { @@ -154,6 +157,49 @@ main (int argc, char *argv[]) HAL_DEBUG (("Doing probe-storage for %s (bus %s) (drive_type %s) (udi=%s) (--only-check-for-fs==%d)", device_file, bus, drive_type, udi, only_check_for_fs)); + /* get model from SCSI/IDE layer and not via sysfs to prevent truncated strings (see bnc#394390) */ + if (strcmp (bus, "scsi") == 0){ + struct hd_driveid id; + gchar *model = NULL; + + fd = open(device_file, O_RDONLY|O_NONBLOCK); + if (fd < 0) { + HAL_WARNING(("unable to open '%s', error: '%s'", device_file, strerror (errno))); + } else { + if (ioctl(fd, HDIO_GET_IDENTITY, &id)) { + HAL_WARNING (("HDIO_GET_IDENTITY unsupported or failed for: '%s' with error: '%s'", device_file, strerror (errno))); + } else { + char str[41]; + size_t i, len; + + i = 0; + len = 40; + + while (len && isspace(id.model[len-1])) + len--; + + while (i < len) { + str[i] = id.model[i]; + i++; + } + str[i] = '\0'; + + g_strstrip(str); + + if ((model = hal_util_strdup_valid_utf8(str)) != NULL) { + model = g_strdelimit(model, "/", '_'); + } + } + close(fd); + } + + if (model != NULL) { + libhal_changeset_set_property_string (cs, "storage.model", model); + libhal_changeset_set_property_string (cs, "info.product", model); + g_free (model); + } + } + /* Get properties for CD-ROM drive */ if (strcmp (drive_type, "cdrom") == 0) { int capabilities; @@ -489,6 +535,7 @@ main (int argc, char *argv[]) } close (fd); } + out: if (cs != NULL) { diff --git a/hald/util.c b/hald/util.c index 51f5d8a8..901e64f1 100644 --- a/hald/util.c +++ b/hald/util.c @@ -1022,31 +1022,6 @@ out: ; } -gchar * -hal_util_strdup_valid_utf8 (const char *str) -{ - char *endchar; - char *newstr; - unsigned int count = 0; - - if (str == NULL) - return NULL; - - newstr = g_strdup (str); - - while (!g_utf8_validate (newstr, -1, (const char **) &endchar)) { - *endchar = '?'; - count++; - } - - if (strlen(newstr) == count) { - g_free (newstr); - return NULL; - } else { - return newstr; - } -} - void hal_util_hexdump (const void *mem, unsigned int size) { diff --git a/hald/util.h b/hald/util.h index e1783e2c..510c36c9 100644 --- a/hald/util.h +++ b/hald/util.h @@ -107,8 +107,6 @@ void hal_util_callout_device_add (HalDevice *d, HalCalloutsDone callback, gpoint void hal_util_callout_device_remove (HalDevice *d, HalCalloutsDone callback, gpointer userdata1, gpointer userdata2); void hal_util_callout_device_preprobe (HalDevice *d, HalCalloutsDone callback, gpointer userdata1, gpointer userdata2); -gchar *hal_util_strdup_valid_utf8 (const char *str); - void hal_util_hexdump (const void *buf, unsigned int size); gboolean hal_util_is_mounted_by_hald (const char *mount_point); diff --git a/hald/util_helper.c b/hald/util_helper.c index ee97026a..80416b01 100644 --- a/hald/util_helper.c +++ b/hald/util_helper.c @@ -35,6 +35,8 @@ #include <pwd.h> #include <unistd.h> +#include <glib.h> + #include "logger.h" #include "util_helper.h" @@ -186,3 +188,29 @@ out: #endif } +gchar * +hal_util_strdup_valid_utf8 (const char *str) +{ + char *endchar; + char *newstr; + unsigned int count = 0; + + if (str == NULL) + return NULL; + + newstr = g_strdup (str); + + while (!g_utf8_validate (newstr, -1, (const char **) &endchar)) { + *endchar = '?'; + count++; + } + + if (strlen(newstr) == count) { + g_free (newstr); + return NULL; + } else { + return newstr; + } +} + + diff --git a/hald/util_helper.h b/hald/util_helper.h index b9309f4a..99fa584e 100644 --- a/hald/util_helper.h +++ b/hald/util_helper.h @@ -26,8 +26,11 @@ #ifndef UTIL_HELPER_H #define UTIL_HELPER_H +#include <glib.h> + void drop_privileges (int keep_auxgroups); void hal_set_proc_title_init (int argc, char *argv[]); void hal_set_proc_title (const char *format, ...); +gchar *hal_util_strdup_valid_utf8 (const char *str); #endif /* UTIL_HELPER_H */ diff --git a/hald/util_helper_priv.h b/hald/util_helper_priv.h index e32bb149..f5e3f9b8 100644 --- a/hald/util_helper_priv.h +++ b/hald/util_helper_priv.h @@ -28,9 +28,6 @@ #include <glib.h> #include "../libhal/libhal.h" -void drop_privileges (int keep_auxgroups); -void hal_set_proc_title_init (int argc, char *argv[]); -void hal_set_proc_title (const char *format, ...); gboolean check_priv ( LibHalContext *halctx, DBusConnection *connection, DBusMessage *message, const char *udi, const char *action); #endif /* UTIL_HELPER_PRIV_H */ |