From a119ec7c824da4a618cb3f4c6e3557c38381b674 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 9 Aug 2017 19:01:18 +0200 Subject: [PATCH] util-lib: add a new skip_dev_prefix() helper This new helper removes a leading /dev if there is one. We have code doing this all over the place, let's unify this, and correct it while we are at it, by using path_startswith() rather than startswith() to drop the prefix. --- src/basic/path-util.h | 10 ++++++++++ src/basic/terminal-util.c | 15 ++++----------- src/core/execute.c | 3 +-- src/test/test-path-util.c | 16 ++++++++++++++++ 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/basic/path-util.h b/src/basic/path-util.h index 26f165f..ea00955 100644 --- a/src/basic/path-util.h +++ b/src/basic/path-util.h @@ -143,3 +143,13 @@ bool is_deviceallow_pattern(const char *path); int systemd_installation_has_version(const char *root, unsigned minimal_version); bool dot_or_dot_dot(const char *path); + +static inline const char *skip_dev_prefix(const char *p) { + const char *e; + + /* Drop any /dev prefix if there is any */ + + e = path_startswith(p, "/dev/"); + + return e ?: p; +} diff --git a/src/basic/terminal-util.c b/src/basic/terminal-util.c index 8a0419d..c570c2e 100644 --- a/src/basic/terminal-util.c +++ b/src/basic/terminal-util.c @@ -649,10 +649,7 @@ bool tty_is_vc(const char *tty) { bool tty_is_console(const char *tty) { assert(tty); - if (startswith(tty, "/dev/")) - tty += 5; - - return streq(tty, "console"); + return streq(skip_dev_prefix(tty), "console"); } int vtnr_from_tty(const char *tty) { @@ -660,8 +657,7 @@ int vtnr_from_tty(const char *tty) { assert(tty); - if (startswith(tty, "/dev/")) - tty += 5; + tty = skip_dev_prefix(tty); if (!startswith(tty, "tty") ) return -EINVAL; @@ -775,8 +771,7 @@ bool tty_is_vc_resolve(const char *tty) { assert(tty); - if (startswith(tty, "/dev/")) - tty += 5; + tty = skip_dev_prefix(tty); if (streq(tty, "console")) { tty = resolve_dev_console(&active); @@ -918,11 +913,9 @@ int getttyname_malloc(int fd, char **ret) { r = ttyname_r(fd, path, sizeof(path)); if (r == 0) { - const char *p; char *c; - p = startswith(path, "/dev/"); - c = strdup(p ?: path); + c = strdup(skip_dev_prefix(path)); if (!c) return -ENOMEM; diff --git a/src/core/execute.c b/src/core/execute.c index 55f9aab..21488a0 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -3400,8 +3400,7 @@ static bool tty_may_match_dev_console(const char *tty) { if (!tty) return true; - if (startswith(tty, "/dev/")) - tty += 5; + tty = skip_dev_prefix(tty); /* trivial identity? */ if (streq(tty, "console")) diff --git a/src/test/test-path-util.c b/src/test/test-path-util.c index e564424..e708d6e 100644 --- a/src/test/test-path-util.c +++ b/src/test/test-path-util.c @@ -588,6 +588,21 @@ static void test_systemd_installation_has_version(const char *path) { } } +static void test_skip_dev_prefix(void) { + + assert_se(streq(skip_dev_prefix("/"), "/")); + assert_se(streq(skip_dev_prefix("/dev"), "")); + assert_se(streq(skip_dev_prefix("/dev/"), "")); + assert_se(streq(skip_dev_prefix("/dev/foo"), "foo")); + assert_se(streq(skip_dev_prefix("/dev/foo/bar"), "foo/bar")); + assert_se(streq(skip_dev_prefix("//dev"), "")); + assert_se(streq(skip_dev_prefix("//dev//"), "")); + assert_se(streq(skip_dev_prefix("/dev///foo"), "foo")); + assert_se(streq(skip_dev_prefix("///dev///foo///bar"), "foo///bar")); + assert_se(streq(skip_dev_prefix("//foo"), "//foo")); + assert_se(streq(skip_dev_prefix("foo"), "foo")); +} + int main(int argc, char **argv) { log_set_max_level(LOG_DEBUG); log_parse_environment(); @@ -607,6 +622,7 @@ int main(int argc, char **argv) { test_file_in_same_dir(); test_filename_is_valid(); test_hidden_or_backup_file(); + test_skip_dev_prefix(); test_systemd_installation_has_version(argv[1]); /* NULL is OK */ -- 2.7.4