From: Lucas De Marchi Date: Wed, 23 Nov 2011 18:10:58 +0000 (-0200) Subject: Implement function to remove module X-Git-Tag: v1~200 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6806a0437f49e97969872a353473b23d27a0e380;p=thirdparty%2Fkmod.git Implement function to remove module --- diff --git a/libkmod/libkmod-loaded.c b/libkmod/libkmod-loaded.c index 7d0e963b..af55386f 100644 --- a/libkmod/libkmod-loaded.c +++ b/libkmod/libkmod-loaded.c @@ -226,3 +226,36 @@ KMOD_EXPORT int kmod_loaded_get_module_info(const struct kmod_list *entry, 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 f31820d5..3f0b7920 100644 --- a/libkmod/libkmod.h +++ b/libkmod/libkmod.h @@ -21,6 +21,7 @@ #ifndef _LIBKMOD_H_ #define _LIBKMOD_H_ +#include #include #include @@ -74,4 +75,11 @@ int kmod_loaded_get_module_info(const struct kmod_list *entry, 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 0482adaf..b22312d8 100644 --- a/libkmod/libkmod.sym +++ b/libkmod/libkmod.sym @@ -15,6 +15,7 @@ global: kmod_loaded_unref; kmod_loaded_get_list; kmod_loaded_get_module_info; + kmod_loaded_remove_module; local: *; };