[PATCH] udevadm-info: add query for properties with quoted output

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Harald Hoyer <harald@xxxxxxxxxx>

$ udevadm info --query=shproperty --name=/dev/sda
UDEV_LOG='3'
DEVPATH='/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda'
MAJOR='8'
MINOR='0'
DEVNAME='/dev/sda'
DEVTYPE='disk'
...
DEVLINKS='/dev/block/8:0 /dev/disk/by-id/ata-APPLE_SSD_TS128B_60CS105MT4RZ /dev/disk/by-id/scsi-SATA_APPLE_SSD_TS128_60CS105MT4RZ /dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0'

This enables the use of "eval" in shell scripts:
$ eval $(udevadm info --query=shenv --name=/dev/sda)
$ echo $DEVLINKS
/dev/block/8:0 /dev/disk/by-id/ata-APPLE_SSD_TS128B_60CS105MT4RZ /dev/disk/by-id/scsi-SATA_APPLE_SSD_TS128_60CS105MT4RZ /dev/disk/by-path/pci-0000:00:1f.2-scsi-0:0:0:0
---
 libudev/libudev-private.h |    1 +
 libudev/libudev-util.c    |   25 +++++++++++++++++++++++++
 udev/udevadm-info.c       |   19 +++++++++++++++++++
 3 files changed, 45 insertions(+), 0 deletions(-)

diff --git a/libudev/libudev-private.h b/libudev/libudev-private.h
index c9ed462..277a8bf 100644
--- a/libudev/libudev-private.h
+++ b/libudev/libudev-private.h
@@ -197,6 +197,7 @@ ssize_t util_get_sys_subsystem(struct udev *udev, const char *syspath, char *sub
 ssize_t util_get_sys_driver(struct udev *udev, const char *syspath, char *driver, size_t size);
 int util_resolve_sys_link(struct udev *udev, char *syspath, size_t size);
 int util_log_priority(const char *priority);
+size_t util_shell_encode(const char *src, char *dest, size_t size);
 size_t util_path_encode(const char *src, char *dest, size_t size);
 size_t util_path_decode(char *s);
 void util_remove_trailing_chars(char *path, char c);
diff --git a/libudev/libudev-util.c b/libudev/libudev-util.c
index 030b78c..12b2b3d 100644
--- a/libudev/libudev-util.c
+++ b/libudev/libudev-util.c
@@ -98,6 +98,31 @@ int util_log_priority(const char *priority)
 	return 0;
 }
 
+size_t util_shell_encode(const char *src, char *dest, size_t size)
+{
+	size_t i, j;
+
+	for (i = 0, j = 0; src[i] != '\0'; i++) {
+		if (src[i] == '\'') {
+			if (j+4 >= size) {
+				j = 0;
+				break;
+			}
+			memcpy(&dest[j], "'\\''", 4);
+			j += 4;
+		} else {
+			if (j+1 >= size) {
+				j = 0;
+				break;
+			}
+			dest[j] = src[i];
+			j++;
+		}
+	}
+	dest[j] = '\0';
+	return j;
+}
+
 size_t util_path_encode(const char *src, char *dest, size_t size)
 {
 	size_t i, j;
diff --git a/udev/udevadm-info.c b/udev/udevadm-info.c
index 9bd60c7..6e0feea 100644
--- a/udev/udevadm-info.c
+++ b/udev/udevadm-info.c
@@ -235,6 +235,7 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
 		QUERY_PATH,
 		QUERY_SYMLINK,
 		QUERY_PROPERTY,
+		QUERY_PROPERTY_QUOTED,
 		QUERY_ALL,
 	} query = QUERY_NONE;
 
@@ -307,6 +308,8 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
 			action = ACTION_QUERY;
 			if (strcmp(optarg, "property") == 0 || strcmp(optarg, "env") == 0) {
 				query = QUERY_PROPERTY;
+			} else if (strcmp(optarg, "shproperty") == 0 || strcmp(optarg, "shenv") == 0) {
+				query = QUERY_PROPERTY_QUOTED;
 			} else if (strcmp(optarg, "name") == 0) {
 				query = QUERY_NAME;
 			} else if (strcmp(optarg, "symlink") == 0) {
@@ -352,6 +355,7 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
 			       "      symlink                  pointing to node\n"
 			       "      path                     sys device path\n"
 			       "      property                 the device properties\n"
+			       "      shproperty               the device properties in shell style key='value'\n"
 			       "      all                      all values\n"
 			       "  --path=<syspath>           sys device path used for query or attribute walk\n"
 			       "  --name=<name>              node or symlink name used for query or attribute walk\n"
@@ -421,6 +425,21 @@ int udevadm_info(struct udev *udev, int argc, char *argv[])
 				list_entry = udev_list_entry_get_next(list_entry);
 			}
 			break;
+		case QUERY_PROPERTY_QUOTED:
+			list_entry = udev_device_get_properties_list_entry(device);
+			while (list_entry != NULL) {
+				char *val = NULL;
+				const char *oval = udev_list_entry_get_value(list_entry);
+				size_t len = strlen(oval)*4 + 1;
+				val = malloc(len);
+				if (val) {
+					util_shell_encode(oval, val, len);
+					printf("%s='%s'\n", udev_list_entry_get_name(list_entry), val);
+					list_entry = udev_list_entry_get_next(list_entry);
+					free(val);
+				}
+			}
+			break;
 		case QUERY_ALL:
 			print_record(device);
 			break;
-- 
1.7.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-hotplug" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel]     [Linux DVB]     [Asterisk Internet PBX]     [DCCP]     [Netdev]     [X.org]     [Util Linux NG]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux