mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-08 22:45:43 +00:00
added core/kmod 4-2.1
This commit is contained in:
parent
bfcc68ac23
commit
512a503664
7 changed files with 456 additions and 0 deletions
|
@ -0,0 +1,34 @@
|
|||
From cdaf4b2f3ef60365c6b8006a63410368a7b38f39 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Reisner <dreisner@archlinux.org>
|
||||
Date: Tue, 31 Jan 2012 00:12:32 -0500
|
||||
Subject: [PATCH 1/4] partially fix parsing of alias with dots
|
||||
|
||||
---
|
||||
libkmod/libkmod-util.c | 4 +---
|
||||
1 files changed, 1 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/libkmod/libkmod-util.c b/libkmod/libkmod-util.c
|
||||
index 7c2611b..6a9f697 100644
|
||||
--- a/libkmod/libkmod-util.c
|
||||
+++ b/libkmod/libkmod-util.c
|
||||
@@ -134,8 +134,7 @@ inline int alias_normalize(const char *alias, char buf[PATH_MAX], size_t *len)
|
||||
case ']':
|
||||
return -EINVAL;
|
||||
case '[':
|
||||
- while (alias[s] != ']' &&
|
||||
- alias[s] != '.' && alias[s] != '\0')
|
||||
+ while (alias[s] != ']' && alias[s] != '\0')
|
||||
s++;
|
||||
|
||||
if (alias[s] != ']')
|
||||
@@ -144,7 +143,6 @@ inline int alias_normalize(const char *alias, char buf[PATH_MAX], size_t *len)
|
||||
s++;
|
||||
break;
|
||||
case '\0':
|
||||
- case '.':
|
||||
goto finish;
|
||||
default:
|
||||
buf[s] = c;
|
||||
--
|
||||
1.7.9
|
||||
|
|
@ -0,0 +1,196 @@
|
|||
From 1d2f64689b2456ade81d6d489c4f5bfb5fdb92fd Mon Sep 17 00:00:00 2001
|
||||
From: Dave Reisner <dreisner@archlinux.org>
|
||||
Date: Tue, 31 Jan 2012 00:13:43 -0500
|
||||
Subject: [PATCH 2/4] libkmod-module: used shared code in module creation
|
||||
|
||||
---
|
||||
libkmod/libkmod-module.c | 135 ++++++++++++++++++++++++++-------------------
|
||||
1 files changed, 78 insertions(+), 57 deletions(-)
|
||||
|
||||
diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c
|
||||
index 47b1709..48e4aa1 100644
|
||||
--- a/libkmod/libkmod-module.c
|
||||
+++ b/libkmod/libkmod-module.c
|
||||
@@ -162,6 +162,76 @@ fail:
|
||||
return err;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Memory layout with alias:
|
||||
+ *
|
||||
+ * struct kmod_module {
|
||||
+ * hashkey -----.
|
||||
+ * alias -----. |
|
||||
+ * name ----. | |
|
||||
+ * } | | |
|
||||
+ * name <----------' | |
|
||||
+ * alias <-----------' |
|
||||
+ * name\alias <--------'
|
||||
+ *
|
||||
+ * Memory layout without alias:
|
||||
+ *
|
||||
+ * struct kmod_module {
|
||||
+ * hashkey ---.
|
||||
+ * alias -----|----> NULL
|
||||
+ * name ----. |
|
||||
+ * } | |
|
||||
+ * name <----------'-'
|
||||
+ *
|
||||
+ * @key is "name\alias" or "name" (in which case alias == NULL)
|
||||
+ */
|
||||
+static int kmod_module_new(struct kmod_ctx *ctx, const char *key,
|
||||
+ const char *name, size_t namelen,
|
||||
+ const char *alias, size_t aliaslen,
|
||||
+ struct kmod_module **mod)
|
||||
+{
|
||||
+ struct kmod_module *m;
|
||||
+ size_t keylen;
|
||||
+
|
||||
+ m = kmod_pool_get_module(ctx, key);
|
||||
+ if (m != NULL) {
|
||||
+ *mod = kmod_module_ref(m);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ if (alias == NULL)
|
||||
+ keylen = namelen;
|
||||
+ else
|
||||
+ keylen = namelen + aliaslen + 1;
|
||||
+
|
||||
+ m = malloc(sizeof(*m) + (alias == NULL ? 1 : 2) * (keylen + 1));
|
||||
+ if (m == NULL) {
|
||||
+ free(m);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+
|
||||
+ memset(m, 0, sizeof(*m));
|
||||
+
|
||||
+ m->ctx = kmod_ref(ctx);
|
||||
+ m->name = (char *)m + sizeof(*m);
|
||||
+ memcpy(m->name, key, keylen + 1);
|
||||
+ if (alias == NULL) {
|
||||
+ m->hashkey = m->name;
|
||||
+ m->alias = NULL;
|
||||
+ } else {
|
||||
+ m->name[namelen] = '\0';
|
||||
+ m->alias = m->name + namelen + 1;
|
||||
+ m->hashkey = m->name + keylen + 1;
|
||||
+ memcpy(m->hashkey, key, keylen + 1);
|
||||
+ }
|
||||
+
|
||||
+ m->refcount = 1;
|
||||
+ kmod_pool_add_module(ctx, m, m->hashkey);
|
||||
+ *mod = m;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* kmod_module_new_from_name:
|
||||
* @ctx: kmod library context
|
||||
@@ -188,54 +258,15 @@ KMOD_EXPORT int kmod_module_new_from_name(struct kmod_ctx *ctx,
|
||||
const char *name,
|
||||
struct kmod_module **mod)
|
||||
{
|
||||
- struct kmod_module *m;
|
||||
size_t namelen;
|
||||
char name_norm[PATH_MAX];
|
||||
- char *namesep;
|
||||
|
||||
if (ctx == NULL || name == NULL || mod == NULL)
|
||||
return -ENOENT;
|
||||
|
||||
- if (alias_normalize(name, name_norm, &namelen) < 0) {
|
||||
- DBG(ctx, "invalid alias: %s\n", name);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
+ modname_normalize(name, name_norm, &namelen);
|
||||
|
||||
- m = kmod_pool_get_module(ctx, name_norm);
|
||||
- if (m != NULL) {
|
||||
- *mod = kmod_module_ref(m);
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- namesep = strchr(name_norm, '/');
|
||||
- m = malloc(sizeof(*m) + (namesep == NULL ? 1 : 2) * namelen + 2);
|
||||
- if (m == NULL) {
|
||||
- free(m);
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
-
|
||||
- memset(m, 0, sizeof(*m));
|
||||
-
|
||||
- m->ctx = kmod_ref(ctx);
|
||||
- m->name = (char *)m + sizeof(*m);
|
||||
- memcpy(m->name, name_norm, namelen + 1);
|
||||
-
|
||||
- if (namesep) {
|
||||
- size_t len = namesep - name_norm;
|
||||
-
|
||||
- m->name[len] = '\0';
|
||||
- m->alias = m->name + len + 1;
|
||||
- m->hashkey = m->name + namelen + 1;
|
||||
- memcpy(m->hashkey, name_norm, namelen + 1);
|
||||
- } else {
|
||||
- m->hashkey = m->name;
|
||||
- }
|
||||
-
|
||||
- m->refcount = 1;
|
||||
- kmod_pool_add_module(ctx, m, m->hashkey);
|
||||
- *mod = m;
|
||||
-
|
||||
- return 0;
|
||||
+ return kmod_module_new(ctx, name_norm, name_norm, namelen, NULL, 0, mod);
|
||||
}
|
||||
|
||||
int kmod_module_new_from_alias(struct kmod_ctx *ctx, const char *alias,
|
||||
@@ -251,9 +282,9 @@ int kmod_module_new_from_alias(struct kmod_ctx *ctx, const char *alias,
|
||||
|
||||
memcpy(key, name, namelen);
|
||||
memcpy(key + namelen + 1, alias, aliaslen + 1);
|
||||
- key[namelen] = '/';
|
||||
+ key[namelen] = '\\';
|
||||
|
||||
- err = kmod_module_new_from_name(ctx, key, mod);
|
||||
+ err = kmod_module_new(ctx, key, name, namelen, alias, aliaslen, mod);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
@@ -323,7 +354,7 @@ KMOD_EXPORT int kmod_module_new_from_path(struct kmod_ctx *ctx,
|
||||
free(abspath);
|
||||
else {
|
||||
ERR(ctx, "kmod_module '%s' already exists with different path: new-path='%s' old-path='%s'\n",
|
||||
- name, abspath, m->path);
|
||||
+ name, abspath, m->path);
|
||||
free(abspath);
|
||||
return -EEXIST;
|
||||
}
|
||||
@@ -332,21 +363,11 @@ KMOD_EXPORT int kmod_module_new_from_path(struct kmod_ctx *ctx,
|
||||
return 0;
|
||||
}
|
||||
|
||||
- m = malloc(sizeof(*m) + namelen + 1);
|
||||
- if (m == NULL)
|
||||
- return -errno;
|
||||
-
|
||||
- memset(m, 0, sizeof(*m));
|
||||
+ err = kmod_module_new(ctx, name, name, namelen, NULL, 0, &m);
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
|
||||
- m->ctx = kmod_ref(ctx);
|
||||
- m->name = (char *)m + sizeof(*m);
|
||||
- memcpy(m->name, name, namelen + 1);
|
||||
m->path = abspath;
|
||||
- m->hashkey = m->name;
|
||||
- m->refcount = 1;
|
||||
-
|
||||
- kmod_pool_add_module(ctx, m, m->hashkey);
|
||||
-
|
||||
*mod = m;
|
||||
|
||||
return 0;
|
||||
--
|
||||
1.7.9
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
From fdf78d80d298353c29e1fe8c00602669dd9662bb Mon Sep 17 00:00:00 2001
|
||||
From: Dave Reisner <dreisner@archlinux.org>
|
||||
Date: Mon, 30 Jan 2012 23:05:26 -0500
|
||||
Subject: [PATCH 3/4] modprobe: handle all error returns from init_module
|
||||
|
||||
---
|
||||
tools/kmod-modprobe.c | 4 +++-
|
||||
1 files changed, 3 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/tools/kmod-modprobe.c b/tools/kmod-modprobe.c
|
||||
index 3e51506..c882856 100644
|
||||
--- a/tools/kmod-modprobe.c
|
||||
+++ b/tools/kmod-modprobe.c
|
||||
@@ -551,6 +551,8 @@ static int insmod_do_insert_module(struct kmod_module *mod, const char *opts)
|
||||
|
||||
err = kmod_module_insert_module(mod, flags, opts);
|
||||
switch (err) {
|
||||
+ case 0:
|
||||
+ break;
|
||||
case -EEXIST:
|
||||
/*
|
||||
* We checked for EEXIST with an earlier call to
|
||||
@@ -564,7 +566,7 @@ static int insmod_do_insert_module(struct kmod_module *mod, const char *opts)
|
||||
ERR("Module %s already in kernel.\n",
|
||||
kmod_module_get_name(mod));
|
||||
break;
|
||||
- case -EPERM:
|
||||
+ default:
|
||||
ERR("could not insert '%s': %s\n", kmod_module_get_name(mod),
|
||||
strerror(-err));
|
||||
break;
|
||||
--
|
||||
1.7.9
|
||||
|
52
core/kmod/0004-modprobe-remove-0-refcnt-deps.patch
Normal file
52
core/kmod/0004-modprobe-remove-0-refcnt-deps.patch
Normal file
|
@ -0,0 +1,52 @@
|
|||
From 4e3dd21aff55b5bbaa08b037fc2a5625bfffc0a5 Mon Sep 17 00:00:00 2001
|
||||
From: Dave Reisner <dreisner@archlinux.org>
|
||||
Date: Mon, 30 Jan 2012 23:39:30 -0500
|
||||
Subject: [PATCH 4/4] modprobe: remove 0 refcnt deps
|
||||
|
||||
---
|
||||
tools/kmod-modprobe.c | 15 +++++++++++++--
|
||||
1 files changed, 13 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/tools/kmod-modprobe.c b/tools/kmod-modprobe.c
|
||||
index c882856..bd991a5 100644
|
||||
--- a/tools/kmod-modprobe.c
|
||||
+++ b/tools/kmod-modprobe.c
|
||||
@@ -381,7 +381,7 @@ static int rmmod_do_deps_list(struct kmod_list *list, bool stop_on_errors)
|
||||
static int rmmod_do_module(struct kmod_module *mod, bool do_dependencies)
|
||||
{
|
||||
const char *modname = kmod_module_get_name(mod);
|
||||
- struct kmod_list *pre = NULL, *post = NULL;
|
||||
+ struct kmod_list *pre = NULL, *post = NULL, *deps, *itr;
|
||||
const char *cmd = NULL;
|
||||
int err;
|
||||
|
||||
@@ -422,7 +422,7 @@ static int rmmod_do_module(struct kmod_module *mod, bool do_dependencies)
|
||||
rmmod_do_deps_list(post, false);
|
||||
|
||||
if (do_dependencies && remove_dependencies) {
|
||||
- struct kmod_list *deps = kmod_module_get_dependencies(mod);
|
||||
+ deps = kmod_module_get_dependencies(mod);
|
||||
|
||||
err = rmmod_do_deps_list(deps, true);
|
||||
if (err < 0)
|
||||
@@ -451,6 +451,17 @@ static int rmmod_do_module(struct kmod_module *mod, bool do_dependencies)
|
||||
|
||||
rmmod_do_deps_list(pre, false);
|
||||
|
||||
+ deps = kmod_module_get_dependencies(mod);
|
||||
+ if (deps != NULL) {
|
||||
+ kmod_list_foreach_reverse(itr, deps) {
|
||||
+ struct kmod_module *dep = kmod_module_get_module(itr);
|
||||
+ if (kmod_module_get_refcnt(dep) == 0)
|
||||
+ rmmod_do_remove_module(dep);
|
||||
+ kmod_module_unref(dep);
|
||||
+ }
|
||||
+ kmod_module_unref_list(deps);
|
||||
+ }
|
||||
+
|
||||
error:
|
||||
kmod_module_unref_list(pre);
|
||||
kmod_module_unref_list(post);
|
||||
--
|
||||
1.7.9
|
||||
|
77
core/kmod/PKGBUILD
Normal file
77
core/kmod/PKGBUILD
Normal file
|
@ -0,0 +1,77 @@
|
|||
# $Id: PKGBUILD 148462 2012-02-01 13:16:32Z dreisner $
|
||||
# Maintainer: Dave Reisner <dreisner@archlinux.org>
|
||||
|
||||
# ALARM: Kevin Mihelich <kevin@archlinuxarm.org>
|
||||
# - fix for v5, credit: ambrop7 (issue #127)
|
||||
|
||||
plugrel=1
|
||||
|
||||
pkgname=kmod
|
||||
pkgver=4
|
||||
pkgrel=2.1
|
||||
pkgdesc="Linux kernel module handling"
|
||||
arch=('i686' 'x86_64')
|
||||
url="http://git.profusion.mobi/cgit.cgi/kmod.git"
|
||||
license=('GPL2')
|
||||
depends=('glibc' 'zlib')
|
||||
makedepends=('docbook2x')
|
||||
options=('!libtool')
|
||||
provides=('module-init-tools=3.16')
|
||||
conflicts=('module-init-tools')
|
||||
replaces=('module-init-tools')
|
||||
source=("http://packages.profusion.mobi/$pkgname/$pkgname-$pkgver.tar.xz"
|
||||
0001-partially-fix-parsing-of-alias-with-dots.patch
|
||||
0002-libkmod-module-used-shared-code-in-module-creation.patch
|
||||
0003-modprobe-handle-all-error-returns-from-init_module.patch
|
||||
0004-modprobe-remove-0-refcnt-deps.patch
|
||||
v5-alignment-fix.patch
|
||||
"depmod-search.conf")
|
||||
md5sums=('e14450a066a48accd0af1995b3c0232d'
|
||||
'5f497ab3466ee1a616b6e6c97b330706'
|
||||
'23a9257a152862753ce4c4ee7287761a'
|
||||
'3a57671b0f37b1203b207f35a4442ae3'
|
||||
'1fe88eee9302104b179124ce6bfc55d2'
|
||||
'99d003b8337d9372b043b0d449a6b59a'
|
||||
'4b8cbcbc54b9029c99fd730e257d4436')
|
||||
|
||||
build() {
|
||||
cd "$pkgname-$pkgver"
|
||||
|
||||
patch -Np1 <"$srcdir/0001-partially-fix-parsing-of-alias-with-dots.patch"
|
||||
patch -Np1 <"$srcdir/0002-libkmod-module-used-shared-code-in-module-creation.patch"
|
||||
patch -Np1 <"$srcdir/0003-modprobe-handle-all-error-returns-from-init_module.patch"
|
||||
patch -Np1 <"$srcdir/0004-modprobe-remove-0-refcnt-deps.patch"
|
||||
[[ $CARCH == "arm" ]] && patch -p1 -i "${srcdir}/v5-alignment-fix.patch"
|
||||
|
||||
./configure \
|
||||
--sysconfdir=/etc \
|
||||
--with-rootprefix= \
|
||||
--with-zlib
|
||||
|
||||
make
|
||||
}
|
||||
|
||||
check() {
|
||||
make -C "$pkgname-$pkgver" check
|
||||
}
|
||||
|
||||
package() {
|
||||
make -C "$pkgname-$pkgver" DESTDIR="$pkgdir" install
|
||||
|
||||
# binary directories
|
||||
install -dm755 "$pkgdir"/{,s}bin
|
||||
|
||||
# configuration directories
|
||||
install -dm755 "$pkgdir"/{etc,lib}/{depmod,modprobe}.d
|
||||
|
||||
# add symlinks to kmod
|
||||
ln -s /usr/bin/kmod "$pkgdir/bin/lsmod"
|
||||
for tool in {ins,rm,dep}mod mod{info,probe}; do
|
||||
ln -s ../usr/bin/kmod "$pkgdir/sbin/$tool"
|
||||
done
|
||||
|
||||
# install depmod.d file for search/ dir
|
||||
install -Dm644 "$srcdir/depmod-search.conf" "$pkgdir/lib/depmod.d/search.conf"
|
||||
}
|
||||
|
||||
# vim: ft=sh syn=sh et
|
5
core/kmod/depmod-search.conf
Normal file
5
core/kmod/depmod-search.conf
Normal file
|
@ -0,0 +1,5 @@
|
|||
#
|
||||
# /etc/depmod.d/depmod.conf
|
||||
#
|
||||
|
||||
search updates extramodules built-in
|
58
core/kmod/v5-alignment-fix.patch
Normal file
58
core/kmod/v5-alignment-fix.patch
Normal file
|
@ -0,0 +1,58 @@
|
|||
diff --git a/libkmod/libkmod-hash.c b/libkmod/libkmod-hash.c
|
||||
index f58e9db..8f647b4 100644
|
||||
--- a/libkmod/libkmod-hash.c
|
||||
+++ b/libkmod/libkmod-hash.c
|
||||
@@ -83,6 +83,10 @@ void hash_free(struct hash *hash)
|
||||
free(hash);
|
||||
}
|
||||
|
||||
+struct unaligned_short {
|
||||
+ unsigned short v;
|
||||
+} __attribute__((packed));
|
||||
+
|
||||
static inline unsigned int hash_superfast(const char *key, unsigned int len)
|
||||
{
|
||||
/* Paul Hsieh (http://www.azillionmonkeys.com/qed/hash.html)
|
||||
@@ -90,14 +94,14 @@ static inline unsigned int hash_superfast(const char *key, unsigned int len)
|
||||
* EFL's eina and possible others.
|
||||
*/
|
||||
unsigned int tmp, hash = len, rem = len & 3;
|
||||
- const unsigned short *itr = (const unsigned short *)key;
|
||||
+ const struct unaligned_short *itr = (const unsigned short *)key;
|
||||
|
||||
len /= 4;
|
||||
|
||||
/* Main loop */
|
||||
for (; len > 0; len--) {
|
||||
- hash += itr[0];
|
||||
- tmp = (itr[1] << 11) ^ hash;
|
||||
+ hash += itr[0].v;
|
||||
+ tmp = (itr[1].v << 11) ^ hash;
|
||||
hash = (hash << 16) ^ tmp;
|
||||
itr += 2;
|
||||
hash += hash >> 11;
|
||||
@@ -106,14 +110,14 @@ static inline unsigned int hash_superfast(const char *key, unsigned int len)
|
||||
/* Handle end cases */
|
||||
switch (rem) {
|
||||
case 3:
|
||||
- hash += *itr;
|
||||
+ hash += itr->v;
|
||||
hash ^= hash << 16;
|
||||
hash ^= key[2] << 18;
|
||||
hash += hash >> 11;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
- hash += *itr;
|
||||
+ hash += itr->v;
|
||||
hash ^= hash << 11;
|
||||
hash += hash >> 17;
|
||||
break;
|
||||
@@ -243,6 +247,7 @@ void *hash_find(const struct hash *hash, const char *key)
|
||||
if (entry == NULL)
|
||||
return NULL;
|
||||
return (void *)entry->value;
|
||||
+
|
||||
}
|
||||
|
||||
int hash_del(struct hash *hash, const char *key)
|
Loading…
Reference in a new issue