summaryrefslogtreecommitdiffstats
path: root/modalias.c
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@mandriva.com>2009-04-03 17:46:26 +0000
committerChristophe Fergeau <cfergeau@mandriva.com>2009-04-03 17:46:26 +0000
commit43c2513120e27392640e50ecca1519980fcda1b0 (patch)
tree74de92762b6d6125c7ef1f493415b8fe63f1c662 /modalias.c
parentbddd15f634b326032c7f591f332e6f7a913b7195 (diff)
downloadldetect-43c2513120e27392640e50ecca1519980fcda1b0.tar
ldetect-43c2513120e27392640e50ecca1519980fcda1b0.tar.gz
ldetect-43c2513120e27392640e50ecca1519980fcda1b0.tar.bz2
ldetect-43c2513120e27392640e50ecca1519980fcda1b0.tar.xz
ldetect-43c2513120e27392640e50ecca1519980fcda1b0.zip
Move modalias parsing code to generic code
Diffstat (limited to 'modalias.c')
-rw-r--r--modalias.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/modalias.c b/modalias.c
new file mode 100644
index 0000000..6df02f0
--- /dev/null
+++ b/modalias.c
@@ -0,0 +1,87 @@
+#define _GNU_SOURCE
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/utsname.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <modprobe.h>
+#include <dirent.h>
+#include "common.h"
+
+static char *aliasdefault = NULL;
+
+static void set_default_alias_file(void) {
+ struct utsname rel_buf;
+ if (!aliasdefault) {
+ char *dirname;
+ char *fallback_aliases = table_name_to_file("fallback-modules.alias");
+ char *aliasfilename;
+ struct stat st_alias, st_fallback;
+
+ uname(&rel_buf);
+ asprintf(&dirname, "%s/%s", MODULE_DIR, rel_buf.release);
+ asprintf(&aliasfilename, "%s/modules.alias", dirname);
+ free(dirname);
+
+ /* fallback on ldetect-lst's modules.alias and prefer it if more recent */
+ if (stat(aliasfilename, &st_alias) ||
+ (!stat(fallback_aliases, &st_fallback) && st_fallback.st_mtime > st_alias.st_mtime)) {
+ free(aliasfilename);
+ aliasdefault = fallback_aliases;
+ } else {
+ aliasdefault = aliasfilename;
+ }
+ }
+}
+
+char *modalias_resolve_module(const char *modalias) {
+ struct module_command *commands = NULL;
+ struct module_options *modoptions = NULL;
+ struct module_alias *aliases = NULL;
+ struct module_blacklist *blacklist = NULL;
+ const char *config = NULL;
+
+ if (!aliasdefault)
+ set_default_alias_file();
+
+ /* Returns the resolved alias, options */
+ read_toplevel_config(config, modalias, 0,
+ 0, &modoptions, &commands, &aliases, &blacklist);
+
+ if (!aliases) {
+ /* We only use canned aliases as last resort. */
+ char *dkms_file = table_name_to_file("dkms-modules.alias");
+ char *alias_filelist[] = {
+ "/lib/module-init-tools/ldetect-lst-modules.alias",
+ aliasdefault,
+ dkms_file,
+ NULL,
+ };
+ char **alias_file = alias_filelist;
+ while (!aliases && *alias_file) {
+ read_config(*alias_file, modalias, 0,
+ 0, &modoptions, &commands,
+ &aliases, &blacklist);
+ aliases = apply_blacklist(aliases, blacklist);
+ alias_file++;
+ }
+ free(dkms_file);
+ }
+ if (aliases) {
+ // take the last one because we find eg: generic/ata_generic/sata_sil
+ while (aliases->next)
+ aliases = aliases->next;
+
+ return strdup(aliases->module);
+ }
+
+ return NULL;
+}
+
+void modalias_cleanup(void) {
+ ifree(aliasdefault);
+}