summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac7
-rw-r--r--src/libudev/strv.c37
-rw-r--r--src/libudev/strv.h3
-rw-r--r--src/libudev/util.c35
-rw-r--r--src/libudev/util.h4
-rw-r--r--src/udev/udevd.c4
6 files changed, 86 insertions, 4 deletions
diff --git a/configure.ac b/configure.ac
index 52e241fa70..1fe801411c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
AC_PREREQ([2.68])
AC_INIT([eudev],[1.2],[https://github.com/gentoo/eudev/issues])
-AC_SUBST(UDEV_VERSION, 205)
+AC_SUBST(UDEV_VERSION, 206)
AC_CONFIG_SRCDIR([src/udev/udevd.c])
AC_USE_SYSTEM_EXTENSIONS
@@ -267,10 +267,10 @@ if test "x${enable_modules}" = xyes; then
AS_IF([test "x${enable_libkmod}" = xyes],
[AC_CHECK_LIB([kmod], [main],
- [PKG_CHECK_MODULES(KMOD, [libkmod >= 5])
+ [PKG_CHECK_MODULES(KMOD, [libkmod >= 14])
AC_SUBST([LIBKMOD], ["-lkmod"])
AC_DEFINE([HAVE_LIBKMOD], [1],
- [Define if you have libkmod])
+ [AC_MSG_ERROR([*** kmod version >= 14 not found])])
],
[AC_MSG_FAILURE(
[--enable-libkmod was given, but test for kmod failed])],
@@ -281,7 +281,6 @@ fi
AM_CONDITIONAL([HAVE_MODULES], [test "x${enable_modules}" = xyes])
AM_CONDITIONAL([HAVE_LIBKMOD], [test "x${enable_libkmod}" = xyes])
-
# ------------------------------------------------------------------------------
AC_ARG_WITH([modprobe],
diff --git a/src/libudev/strv.c b/src/libudev/strv.c
index 041e20d700..3619701e9d 100644
--- a/src/libudev/strv.c
+++ b/src/libudev/strv.c
@@ -142,6 +142,43 @@ char **strv_new(const char *x, ...) {
return r;
}
+int strv_push(char ***l, char *value) {
+ char **c;
+ unsigned n;
+
+ if (!value)
+ return 0;
+
+ n = strv_length(*l);
+ c = realloc(*l, sizeof(char*) * (n + 2));
+ if (!c)
+ return -ENOMEM;
+
+ c[n] = value;
+ c[n+1] = NULL;
+
+ *l = c;
+ return 0;
+}
+
+int strv_extend(char ***l, const char *value) {
+ char *v;
+ int r;
+
+ if (!value)
+ return 0;
+
+ v = strdup(value);
+ if (!v)
+ return -ENOMEM;
+
+ r = strv_push(l, v);
+ if (r < 0)
+ free(v);
+
+ return r;
+}
+
char **strv_uniq(char **l) {
char **i;
diff --git a/src/libudev/strv.h b/src/libudev/strv.h
index d9e0e1c20b..9fba94e566 100644
--- a/src/libudev/strv.h
+++ b/src/libudev/strv.h
@@ -36,6 +36,9 @@ static inline void strv_freep(char ***l) {
char **strv_copy(char * const *l);
unsigned strv_length(char * const *l) _pure_;
+int strv_extend(char ***l, const char *value);
+int strv_push(char ***l, char *value);
+
char **strv_remove(char **l, const char *s);
char **strv_uniq(char **l);
diff --git a/src/libudev/util.c b/src/libudev/util.c
index f625cfe99b..61d000c350 100644
--- a/src/libudev/util.c
+++ b/src/libudev/util.c
@@ -664,6 +664,41 @@ int null_or_empty_path(const char *fn) {
return null_or_empty(&st);
}
+char hexchar(int x) {
+ static const char table[16] = "0123456789abcdef";
+
+ return table[x & 15];
+}
+
+char *xescape(const char *s, const char *bad) {
+ char *r, *t;
+ const char *f;
+
+ /* Escapes all chars in bad, in addition to \ and all special
+ * chars, in \xFF style escaping. May be reversed with
+ * cunescape. */
+
+ r = new(char, strlen(s) * 4 + 1);
+ if (!r)
+ return NULL;
+
+ for (f = s, t = r; *f; f++) {
+
+ if ((*f < ' ') || (*f >= 127) ||
+ (*f == '\\') || strchr(bad, *f)) {
+ *(t++) = '\\';
+ *(t++) = 'x';
+ *(t++) = hexchar(*f >> 4);
+ *(t++) = hexchar(*f);
+ } else
+ *(t++) = *f;
+ }
+
+ *t = 0;
+
+ return r;
+}
+
bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) {
assert(de);
diff --git a/src/libudev/util.h b/src/libudev/util.h
index 60b300da3c..7b6571ab10 100644
--- a/src/libudev/util.h
+++ b/src/libudev/util.h
@@ -131,6 +131,10 @@ char *strnappend(const char *s, const char *suffix, size_t length);
char *truncate_nl(char *s);
+char hexchar(int x) _const_;
+
+char *xescape(const char *s, const char *bad);
+
bool dirent_is_file_with_suffix(const struct dirent *de, const char *suffix) _pure_;
bool ignore_file(const char *filename) _pure_;
diff --git a/src/udev/udevd.c b/src/udev/udevd.c
index a41c196991..26f3d846e1 100644
--- a/src/udev/udevd.c
+++ b/src/udev/udevd.c
@@ -811,6 +811,7 @@ static void handle_signal(struct udev *udev, int signo)
}
}
+#ifndef HAVE_LIBKMOD
static void static_dev_create_from_modules(struct udev *udev)
{
struct utsname kernel;
@@ -881,6 +882,7 @@ static void static_dev_create_from_modules(struct udev *udev)
fclose(f);
}
+#endif
/*
* read the kernel commandline, in case we need to get into debug mode
@@ -1033,7 +1035,9 @@ int main(int argc, char *argv[])
mkdir("/run/udev", 0755);
dev_setup(NULL);
+#ifndef HAVE_LIBKMOD
static_dev_create_from_modules(udev);
+#endif
/* before opening new files, make sure std{in,out,err} fds are in a sane state */
if (daemonize) {