aboutsummaryrefslogtreecommitdiff
path: root/pkgs/os-specific/linux/kmod
diff options
context:
space:
mode:
authorNikolay Amiantov <ab@fmap.me>2016-08-14 12:53:52 +0300
committerNikolay Amiantov <ab@fmap.me>2016-08-19 17:56:39 +0300
commit30c9aa269892c55193dc560175c8c2f3e8fcaf70 (patch)
tree3faf1d724c29dbb9d0dc7e730708ba63fea43566 /pkgs/os-specific/linux/kmod
parent1047ed49d929ae5a4b7cc42220fba65b44a7c0d1 (diff)
kmod: add patch to allow searching for modules in several directories
Diffstat (limited to 'pkgs/os-specific/linux/kmod')
-rw-r--r--pkgs/os-specific/linux/kmod/default.nix27
-rw-r--r--pkgs/os-specific/linux/kmod/module-dir.patch151
2 files changed, 141 insertions, 37 deletions
diff --git a/pkgs/os-specific/linux/kmod/default.nix b/pkgs/os-specific/linux/kmod/default.nix
index bcbdf1a5a19..7910c610948 100644
--- a/pkgs/os-specific/linux/kmod/default.nix
+++ b/pkgs/os-specific/linux/kmod/default.nix
@@ -1,30 +1,37 @@
-{ stdenv, fetchurl, xz, zlib, pkgconfig, libxslt }:
+{ stdenv, lib, fetchurl, autoreconfHook, xz, zlib, pkgconfig, libxslt }:
let
- systems = [ "/run/current-system/kernel-modules" "/run/booted-system/kernel-modules" "" ];
- modulesDirs = lib.concatMapStringsSep ":" (x: "${x}/lib/modules") systems;
+ systems = [ "current-system" "booted-system" ];
+ modulesDirs = lib.concatMapStringsSep ":" (x: "/run/${x}/kernel-modules/lib/modules") systems;
in stdenv.mkDerivation rec {
name = "kmod-${version}";
- version = "23";
+ version = "22";
src = fetchurl {
url = "mirror://kernel/linux/utils/kernel/kmod/${name}.tar.xz";
sha256 = "0mc12sx06p8il1ym3hdmgxxb37apn9yv7xij26gddjdfkx8xa0yk";
};
- buildInputs = [ pkgconfig libxslt xz /* zlib */ ];
+ nativeBuildInputs = [ autoreconfHook pkgconfig libxslt ];
+ buildInputs = [ xz /* zlib */ ];
- configureFlags = [ "--sysconfdir=/etc" "--with-xz" /* "--with-zlib" */ ];
+ configureFlags = [
+ "--sysconfdir=/etc"
+ "--with-xz"
+ "--with-modulesdirs=${modulesDirs}"
+ # "--with-zlib"
+ ];
patches = [ ./module-dir.patch ];
postInstall = ''
- ln -s kmod $out/bin/lsmod
- mkdir -p $out/sbin
- for prog in rmmod insmod modinfo modprobe depmod; do
- ln -sv $out/bin/kmod $out/sbin/$prog
+ for prog in rmmod insmod lsmod modinfo modprobe depmod; do
+ ln -sv $out/bin/kmod $out/bin/$prog
done
+
+ # Backwards compatibility
+ ln -s bin $out/sbin
'';
meta = {
diff --git a/pkgs/os-specific/linux/kmod/module-dir.patch b/pkgs/os-specific/linux/kmod/module-dir.patch
index 0c4ab4bd4c4..f7432e3756e 100644
--- a/pkgs/os-specific/linux/kmod/module-dir.patch
+++ b/pkgs/os-specific/linux/kmod/module-dir.patch
@@ -1,7 +1,46 @@
-diff -ru -x '*~' kmod-17-orig/libkmod/libkmod.c kmod-17/libkmod/libkmod.c
---- kmod-17-orig/libkmod/libkmod.c 2014-04-01 12:40:37.161940089 +0200
-+++ kmod-17/libkmod/libkmod.c 2014-04-17 13:47:15.871441987 +0200
-@@ -201,7 +201,7 @@
+diff --git a/Makefile.am b/Makefile.am
+index 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.ac
+index 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 LDFLAGS
+diff --git a/libkmod/libkmod.c b/libkmod/libkmod.c
+index 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;
@@ -10,51 +49,109 @@ diff -ru -x '*~' kmod-17-orig/libkmod/libkmod.c kmod-17/libkmod/libkmod.c
if (dirname != NULL)
return path_make_absolute_cwd(dirname);
-@@ -209,7 +209,10 @@
+@@ -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)
-+ if ((dirname_prefix = getenv("MODULE_DIR")) == NULL)
-+ dirname_prefix = dirname_default_prefix;
+- 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];
+
-+ if (asprintf(&p, "%s/%s", dirname_prefix, u.release) < 0)
- return NULL;
++ 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 -ru -x '*~' kmod-17-orig/tools/static-nodes.c kmod-17/tools/static-nodes.c
---- kmod-17-orig/tools/static-nodes.c 2013-12-17 22:05:42.159047316 +0100
-+++ kmod-17/tools/static-nodes.c 2014-04-17 13:51:17.945974320 +0200
-@@ -159,6 +159,7 @@
+ }
+diff --git a/tools/static-nodes.c b/tools/static-nodes.c
+index 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;
- int r, ret = EXIT_SUCCESS;
-+ char *dirname_prefix;
+@@ -206,22 +207,25 @@ static int do_static_nodes(int argc, char *argv[])
+ }
+ }
- for (;;) {
- int c, idx = 0, valid;
-@@ -211,16 +212,19 @@
+- 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 ((dirname_prefix = getenv("MODULE_DIR")) == NULL)
-+ dirname_prefix = "/lib/modules";
-+
-+ snprintf(modules, sizeof(modules), "%s/%s/modules.devname", dirname_prefix, 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/%s/modules.devname not found - ignoring\n",
-+ dirname_prefix, 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/%s/modules.devname - %m\n",
-+ dirname_prefix, kernel.release);
++ fprintf(stderr, "Error: could not open %s - %m\n", modules);
ret = EXIT_FAILURE;
}
goto finish;