Something went wrong. Try again.
What happens if I push all of nixpkgs
Something went wrong. Try again.
4.3 kB · 157 lines
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158diff --git a/Makefile.am b/Makefile.amindex d4eeb7e..5c9f603 100644--- a/Makefile.am+++ b/Makefile.am@@ -19,6 +19,7 @@ AM_CPPFLAGS = \ -include $(top_builddir)/config.h \ -I$(top_srcdir) \ -DSYSCONFDIR=\""$(sysconfdir)"\" \+ -DMODULESDIRS=\""$(shell echo $(modulesdirs) | $(SED) 's|:|\\",\\"|g')"\" \ ${zlib_CFLAGS} AM_CFLAGS = $(OUR_CFLAGS)diff --git a/configure.ac b/configure.acindex 23510c8..66490cf 100644--- a/configure.ac+++ b/configure.ac@@ -202,6 +202,12 @@ GTK_DOC_CHECK([1.14],[--flavour no-tmpl-flat]) ], [ AM_CONDITIONAL([ENABLE_GTK_DOC], false)]) +AC_ARG_WITH([modulesdirs],+ AS_HELP_STRING([--with-modulesdirs=DIRS], [Kernel modules directories, separated by :]),+ [],+ [with_modulesdirs=/lib/modules])+AC_SUBST([modulesdirs], [$with_modulesdirs])+ ##################################################################### # Default CFLAGS and LDFLAGSdiff --git a/libkmod/libkmod.c b/libkmod/libkmod.cindex 69fe431..d37da32 100644--- a/libkmod/libkmod.c+++ b/libkmod/libkmod.c@@ -206,12 +206,15 @@ static int log_priority(const char *priority) return 0; } -static const char *dirname_default_prefix = "/lib/modules";+static const char *dirname_default_prefixes[] = {+ MODULESDIRS,+ NULL+}; static char *get_kernel_release(const char *dirname) { struct utsname u;- char *p;+ char *p, *dirname_prefix; if (dirname != NULL) return path_make_absolute_cwd(dirname);@@ -219,8 +222,42 @@ static char *get_kernel_release(const char *dirname) if (uname(&u) < 0) return NULL; - if (asprintf(&p, "%s/%s", dirname_default_prefix, u.release) < 0)- return NULL;+ if ((dirname_prefix = getenv("MODULE_DIR")) != NULL) {+ if(asprintf(&p, "%s/%s", dirname_prefix, u.release) < 0)+ return NULL;+ } else {+ size_t i;+ char buf[PATH_MAX];++ for (i = 0; dirname_default_prefixes[i] != NULL; i++) {+ int plen;+ struct stat dirstat;++ plen = snprintf(buf, sizeof(buf), "%s/%s", dirname_default_prefixes[i], u.release);+ if (plen < 0)+ return NULL;+ else if (plen >= PATH_MAX)+ continue;++ if (dirname_default_prefixes[i + 1] != NULL) {+ if (stat(buf, &dirstat) < 0) {+ if (errno == ENOENT)+ continue;+ else+ return NULL;+ }++ if (!S_ISDIR(dirstat.st_mode))+ continue;+ }++ p = malloc(plen + 1);+ if (p == NULL)+ return NULL;+ memcpy(p, buf, plen + 1);+ break;+ }+ } return p; }diff --git a/tools/static-nodes.c b/tools/static-nodes.cindex 8d2356d..2ed306d 100644--- a/tools/static-nodes.c+++ b/tools/static-nodes.c@@ -29,10 +29,11 @@ #include <unistd.h> #include <sys/stat.h> #include <sys/types.h>-#include <sys/utsname.h> #include <shared/util.h> +#include <libkmod/libkmod.h>+ #include "kmod.h" struct static_nodes_format {@@ -154,8 +155,8 @@ static void help(void) static int do_static_nodes(int argc, char *argv[]) {- struct utsname kernel; char modules[PATH_MAX], buf[4096];+ struct kmod_ctx *ctx; const char *output = "/dev/stdout"; FILE *in = NULL, *out = NULL; const struct static_nodes_format *format = &static_nodes_format_human;@@ -206,22 +207,25 @@ static int do_static_nodes(int argc, char *argv[]) } } - if (uname(&kernel) < 0) {- fputs("Error: uname failed!\n", stderr);+ ctx = kmod_new(NULL, NULL);+ if (ctx == NULL) {+ fprintf(stderr, "Error: failed to create kmod context\n"); ret = EXIT_FAILURE; goto finish; }-- snprintf(modules, sizeof(modules), "/lib/modules/%s/modules.devname", kernel.release);+ if (snprintf(modules, sizeof(modules), "%s/modules.devname", kmod_get_dirname(ctx)) < 0) {+ fprintf(stderr, "Error: path to modules.devname is too long\n");+ ret = EXIT_FAILURE;+ goto finish;+ }+ kmod_unref(ctx); in = fopen(modules, "re"); if (in == NULL) { if (errno == ENOENT) {- fprintf(stderr, "Warning: /lib/modules/%s/modules.devname not found - ignoring\n",- kernel.release);+ fprintf(stderr, "Warning: %s not found - ignoring\n", modules); ret = EXIT_SUCCESS; } else {- fprintf(stderr, "Error: could not open /lib/modules/%s/modules.devname - %m\n",- kernel.release);+ fprintf(stderr, "Error: could not open %s - %m\n", modules); ret = EXIT_FAILURE; } goto finish;