summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2020-12-14 16:26:13 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2020-12-16 02:14:47 +0900
commit393fcaf733d8e50f18a70be7de1e088fb61f1ff4 (patch)
tree191ca1b192c59bdf15423f3844a3cedea8970afd
parent9a56b87717ae6c24576b939b6484f3af175514d6 (diff)
downloadsystemd-393fcaf733d8e50f18a70be7de1e088fb61f1ff4.tar.gz
udev: move util_replace_chars() to udev-util.c
-rw-r--r--src/libudev/libudev-util.c43
-rw-r--r--src/libudev/libudev-util.h2
-rw-r--r--src/shared/udev-util.c45
-rw-r--r--src/shared/udev-util.h1
-rw-r--r--src/udev/ata_id/ata_id.c6
-rw-r--r--src/udev/scsi_id/scsi_id.c12
-rw-r--r--src/udev/udev-builtin-usb_id.c14
-rw-r--r--src/udev/udev-event.c2
-rw-r--r--src/udev/udev-event.h1
-rw-r--r--src/udev/udev-rules.c8
10 files changed, 68 insertions, 66 deletions
diff --git a/src/libudev/libudev-util.c b/src/libudev/libudev-util.c
index f4f686fc88..8a6b56be5c 100644
--- a/src/libudev/libudev-util.c
+++ b/src/libudev/libudev-util.c
@@ -75,49 +75,6 @@ int util_resolve_subsys_kernel(const char *string, char *result, size_t maxsize,
return 0;
}
-/* allow chars in allow list, plain ascii, hex-escaping and valid utf8 */
-size_t util_replace_chars(char *str, const char *allow) {
- size_t i = 0, replaced = 0;
-
- assert(str);
-
- while (str[i] != '\0') {
- int len;
-
- if (allow_listed_char_for_devnode(str[i], allow)) {
- i++;
- continue;
- }
-
- /* accept hex encoding */
- if (str[i] == '\\' && str[i+1] == 'x') {
- i += 2;
- continue;
- }
-
- /* accept valid utf8 */
- len = utf8_encoded_valid_unichar(str + i, (size_t) -1);
- if (len > 1) {
- i += len;
- continue;
- }
-
- /* if space is allowed, replace whitespace with ordinary space */
- if (isspace(str[i]) && allow && strchr(allow, ' ')) {
- str[i] = ' ';
- i++;
- replaced++;
- continue;
- }
-
- /* everything else is replaced with '_' */
- str[i] = '_';
- i++;
- replaced++;
- }
- return replaced;
-}
-
/**
* udev_util_encode_string:
* @str: input string to be encoded
diff --git a/src/libudev/libudev-util.h b/src/libudev/libudev-util.h
index dd0561d90e..547981311e 100644
--- a/src/libudev/libudev-util.h
+++ b/src/libudev/libudev-util.h
@@ -9,8 +9,6 @@
#define UTIL_PATH_SIZE 1024
#define UTIL_NAME_SIZE 512
#define UTIL_LINE_SIZE 16384
-#define UDEV_ALLOWED_CHARS_INPUT "/ $%?,"
-size_t util_replace_chars(char *str, const char *white);
int util_resolve_subsys_kernel(const char *string, char *result, size_t maxsize, bool read_value);
/* Cleanup functions */
diff --git a/src/shared/udev-util.c b/src/shared/udev-util.c
index 17b9ed137b..d03e4bbe6f 100644
--- a/src/shared/udev-util.c
+++ b/src/shared/udev-util.c
@@ -5,6 +5,7 @@
#include <unistd.h>
#include "alloc-util.h"
+#include "device-nodes.h"
#include "device-util.h"
#include "env-file.h"
#include "escape.h"
@@ -426,3 +427,47 @@ size_t udev_replace_whitespace(const char *str, char *to, size_t len) {
to[j] = '\0';
return j;
}
+
+size_t udev_replace_chars(char *str, const char *allow) {
+ size_t i = 0, replaced = 0;
+
+ assert(str);
+
+ /* allow chars in allow list, plain ascii, hex-escaping and valid utf8. */
+
+ while (str[i] != '\0') {
+ int len;
+
+ if (allow_listed_char_for_devnode(str[i], allow)) {
+ i++;
+ continue;
+ }
+
+ /* accept hex encoding */
+ if (str[i] == '\\' && str[i+1] == 'x') {
+ i += 2;
+ continue;
+ }
+
+ /* accept valid utf8 */
+ len = utf8_encoded_valid_unichar(str + i, (size_t) -1);
+ if (len > 1) {
+ i += len;
+ continue;
+ }
+
+ /* if space is allowed, replace whitespace with ordinary space */
+ if (isspace(str[i]) && allow && strchr(allow, ' ')) {
+ str[i] = ' ';
+ i++;
+ replaced++;
+ continue;
+ }
+
+ /* everything else is replaced with '_' */
+ str[i] = '_';
+ i++;
+ replaced++;
+ }
+ return replaced;
+}
diff --git a/src/shared/udev-util.h b/src/shared/udev-util.h
index d0ebbede41..f20e32b4d2 100644
--- a/src/shared/udev-util.h
+++ b/src/shared/udev-util.h
@@ -37,3 +37,4 @@ void log_device_uevent(sd_device *device, const char *str);
int udev_rule_parse_value(char *str, char **ret_value, char **ret_endpos);
size_t udev_replace_whitespace(const char *str, char *to, size_t len);
+size_t udev_replace_chars(char *str, const char *allow);
diff --git a/src/udev/ata_id/ata_id.c b/src/udev/ata_id/ata_id.c
index 434b8765aa..9d22be81b2 100644
--- a/src/udev/ata_id/ata_id.c
+++ b/src/udev/ata_id/ata_id.c
@@ -485,11 +485,11 @@ int main(int argc, char *argv[]) {
model[40] = '\0';
udev_util_encode_string(model, model_enc, sizeof(model_enc));
udev_replace_whitespace((char *) id.model, model, 40);
- util_replace_chars(model, NULL);
+ udev_replace_chars(model, NULL);
udev_replace_whitespace((char *) id.serial_no, serial, 20);
- util_replace_chars(serial, NULL);
+ udev_replace_chars(serial, NULL);
udev_replace_whitespace((char *) id.fw_rev, revision, 8);
- util_replace_chars(revision, NULL);
+ udev_replace_chars(revision, NULL);
if (export) {
/* Set this to convey the disk speaks the ATA protocol */
diff --git a/src/udev/scsi_id/scsi_id.c b/src/udev/scsi_id/scsi_id.c
index 162bd4e7df..5d61e38d5e 100644
--- a/src/udev/scsi_id/scsi_id.c
+++ b/src/udev/scsi_id/scsi_id.c
@@ -457,12 +457,12 @@ static int set_inq_values(struct scsi_id_device *dev_scsi, const char *path) {
udev_util_encode_string(dev_scsi->model, model_enc_str, sizeof(model_enc_str));
udev_replace_whitespace(dev_scsi->vendor, vendor_str, sizeof(vendor_str)-1);
- util_replace_chars(vendor_str, NULL);
+ udev_replace_chars(vendor_str, NULL);
udev_replace_whitespace(dev_scsi->model, model_str, sizeof(model_str)-1);
- util_replace_chars(model_str, NULL);
+ udev_replace_chars(model_str, NULL);
set_type(dev_scsi->type, type_str, sizeof(type_str));
udev_replace_whitespace(dev_scsi->revision, revision_str, sizeof(revision_str)-1);
- util_replace_chars(revision_str, NULL);
+ udev_replace_chars(revision_str, NULL);
return 0;
}
@@ -503,10 +503,10 @@ static int scsi_id(char *maj_min_dev) {
printf("ID_TYPE=%s\n", type_str);
if (dev_scsi.serial[0] != '\0') {
udev_replace_whitespace(dev_scsi.serial, serial_str, sizeof(serial_str)-1);
- util_replace_chars(serial_str, NULL);
+ udev_replace_chars(serial_str, NULL);
printf("ID_SERIAL=%s\n", serial_str);
udev_replace_whitespace(dev_scsi.serial_short, serial_str, sizeof(serial_str)-1);
- util_replace_chars(serial_str, NULL);
+ udev_replace_chars(serial_str, NULL);
printf("ID_SERIAL_SHORT=%s\n", serial_str);
}
if (dev_scsi.wwn[0] != '\0') {
@@ -533,7 +533,7 @@ static int scsi_id(char *maj_min_dev) {
char serial_str[MAX_SERIAL_LEN];
udev_replace_whitespace(dev_scsi.serial, serial_str, sizeof(serial_str)-1);
- util_replace_chars(serial_str, NULL);
+ udev_replace_chars(serial_str, NULL);
printf("%s\n", serial_str);
goto out;
}
diff --git a/src/udev/udev-builtin-usb_id.c b/src/udev/udev-builtin-usb_id.c
index aa501a894e..b74f7c057a 100644
--- a/src/udev/udev-builtin-usb_id.c
+++ b/src/udev/udev-builtin-usb_id.c
@@ -331,7 +331,7 @@ static int builtin_usb_id(sd_device *dev, int argc, char *argv[], bool test) {
}
udev_util_encode_string(scsi_vendor, vendor_str_enc, sizeof(vendor_str_enc));
udev_replace_whitespace(scsi_vendor, vendor_str, sizeof(vendor_str)-1);
- util_replace_chars(vendor_str, NULL);
+ udev_replace_chars(vendor_str, NULL);
r = sd_device_get_sysattr_value(dev_scsi, "model", &scsi_model);
if (r < 0) {
@@ -340,7 +340,7 @@ static int builtin_usb_id(sd_device *dev, int argc, char *argv[], bool test) {
}
udev_util_encode_string(scsi_model, model_str_enc, sizeof(model_str_enc));
udev_replace_whitespace(scsi_model, model_str, sizeof(model_str)-1);
- util_replace_chars(model_str, NULL);
+ udev_replace_chars(model_str, NULL);
r = sd_device_get_sysattr_value(dev_scsi, "type", &scsi_type);
if (r < 0) {
@@ -355,7 +355,7 @@ static int builtin_usb_id(sd_device *dev, int argc, char *argv[], bool test) {
goto fallback;
}
udev_replace_whitespace(scsi_rev, revision_str, sizeof(revision_str)-1);
- util_replace_chars(revision_str, NULL);
+ udev_replace_chars(revision_str, NULL);
/*
* some broken devices have the same identifiers
@@ -381,7 +381,7 @@ fallback:
usb_vendor = vendor_id;
udev_util_encode_string(usb_vendor, vendor_str_enc, sizeof(vendor_str_enc));
udev_replace_whitespace(usb_vendor, vendor_str, sizeof(vendor_str)-1);
- util_replace_chars(vendor_str, NULL);
+ udev_replace_chars(vendor_str, NULL);
}
if (model_str[0] == '\0') {
@@ -391,7 +391,7 @@ fallback:
usb_model = product_id;
udev_util_encode_string(usb_model, model_str_enc, sizeof(model_str_enc));
udev_replace_whitespace(usb_model, model_str, sizeof(model_str)-1);
- util_replace_chars(model_str, NULL);
+ udev_replace_chars(model_str, NULL);
}
if (revision_str[0] == '\0') {
@@ -399,7 +399,7 @@ fallback:
if (sd_device_get_sysattr_value(dev_usb, "bcdDevice", &usb_rev) >= 0) {
udev_replace_whitespace(usb_rev, revision_str, sizeof(revision_str)-1);
- util_replace_chars(revision_str, NULL);
+ udev_replace_chars(revision_str, NULL);
}
}
@@ -418,7 +418,7 @@ fallback:
if (usb_serial) {
udev_replace_whitespace(usb_serial, serial_str, sizeof(serial_str)-1);
- util_replace_chars(serial_str, NULL);
+ udev_replace_chars(serial_str, NULL);
}
}
}
diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c
index bc12e4df79..f5831ed28d 100644
--- a/src/udev/udev-event.c
+++ b/src/udev/udev-event.c
@@ -364,7 +364,7 @@ static ssize_t udev_event_subst_format(
if (val != vbuf)
strscpy(vbuf, sizeof(vbuf), val);
delete_trailing_chars(vbuf, NULL);
- count = util_replace_chars(vbuf, UDEV_ALLOWED_CHARS_INPUT);
+ count = udev_replace_chars(vbuf, UDEV_ALLOWED_CHARS_INPUT);
if (count > 0)
log_device_debug(dev, "%i character(s) replaced", count);
l = strpcpy(&s, l, vbuf);
diff --git a/src/udev/udev-event.h b/src/udev/udev-event.h
index 27bf8f9372..ecbe957b4f 100644
--- a/src/udev/udev-event.h
+++ b/src/udev/udev-event.h
@@ -16,6 +16,7 @@
#define READ_END 0
#define WRITE_END 1
+#define UDEV_ALLOWED_CHARS_INPUT "/ $%?,"
typedef struct UdevEvent {
sd_device *dev;
diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c
index 48fd33fded..7bfc25fdb5 100644
--- a/src/udev/udev-rules.c
+++ b/src/udev/udev-rules.c
@@ -1684,7 +1684,7 @@ static int udev_rule_apply_token_to_event(
}
delete_trailing_chars(result, "\n");
- count = util_replace_chars(result, UDEV_ALLOWED_CHARS_INPUT);
+ count = udev_replace_chars(result, UDEV_ALLOWED_CHARS_INPUT);
if (count > 0)
log_rule_debug(dev, rules, "Replaced %zu character(s) in result of \"%s\"",
count, buf);
@@ -2048,7 +2048,7 @@ static int udev_rule_apply_token_to_event(
(void) udev_event_apply_format(event, token->value, buf, sizeof(buf), false);
if (IN_SET(event->esc, ESCAPE_UNSET, ESCAPE_REPLACE)) {
- count = util_replace_chars(buf, "/");
+ count = udev_replace_chars(buf, "/");
if (count > 0)
log_rule_debug(dev, rules, "Replaced %zu character(s) from result of NAME=\"%s\"",
count, token->value);
@@ -2082,9 +2082,9 @@ static int udev_rule_apply_token_to_event(
/* allow multiple symlinks separated by spaces */
(void) udev_event_apply_format(event, token->value, buf, sizeof(buf), event->esc != ESCAPE_NONE);
if (event->esc == ESCAPE_UNSET)
- count = util_replace_chars(buf, "/ ");
+ count = udev_replace_chars(buf, "/ ");
else if (event->esc == ESCAPE_REPLACE)
- count = util_replace_chars(buf, "/");
+ count = udev_replace_chars(buf, "/");
else
count = 0;
if (count > 0)