Implement function to remove module
diff --git a/libkmod/libkmod-loaded.c b/libkmod/libkmod-loaded.c
index 7d0e963..af55386 100644
--- a/libkmod/libkmod-loaded.c
+++ b/libkmod/libkmod-loaded.c
@@ -226,3 +226,36 @@
return 0;
}
+
+extern long delete_module(const char *name, unsigned int flags);
+
+KMOD_EXPORT int kmod_loaded_remove_module(struct kmod_loaded *mod,
+ struct kmod_list *entry,
+ unsigned int flags)
+{
+ struct kmod_loaded_module *m;
+ int err;
+
+ if (mod == NULL)
+ return -ENOSYS;
+
+ if (entry == NULL)
+ return -ENOENT;
+
+ m = entry->data;
+
+ /* Filter out other flags */
+ flags &= (KMOD_REMOVE_FORCE | KMOD_REMOVE_NOWAIT);
+
+ err = delete_module(m->name, flags);
+ if (err != 0) {
+ err(mod->ctx, "Removing '%s': %s\n", m->name,
+ strerror(-err));
+ return err;
+ }
+
+ loaded_modules_free_module(m);
+ kmod_list_remove(entry);
+
+ return 0;
+}
diff --git a/libkmod/libkmod.h b/libkmod/libkmod.h
index f31820d..3f0b792 100644
--- a/libkmod/libkmod.h
+++ b/libkmod/libkmod.h
@@ -21,6 +21,7 @@
#ifndef _LIBKMOD_H_
#define _LIBKMOD_H_
+#include <fcntl.h>
#include <stdarg.h>
#include <inttypes.h>
@@ -74,4 +75,11 @@
const char **name, long *size, int *use_count,
const char **deps, uintptr_t *addr);
+enum KMOD_REMOVE {
+ KMOD_REMOVE_FORCE = O_TRUNC,
+ KMOD_REMOVE_NOWAIT = O_NONBLOCK,
+};
+
+int kmod_loaded_remove_module(struct kmod_loaded *kmod,
+ struct kmod_list *entry, unsigned int flags);
#endif
diff --git a/libkmod/libkmod.sym b/libkmod/libkmod.sym
index 0482ada..b22312d 100644
--- a/libkmod/libkmod.sym
+++ b/libkmod/libkmod.sym
@@ -15,6 +15,7 @@
kmod_loaded_unref;
kmod_loaded_get_list;
kmod_loaded_get_module_info;
+ kmod_loaded_remove_module;
local:
*;
};