]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
common: add module_{load,has_parameter}()
authorIlya Dryomov <ilya.dryomov@inktank.com>
Thu, 17 Apr 2014 15:03:24 +0000 (19:03 +0400)
committerIlya Dryomov <ilya.dryomov@inktank.com>
Tue, 22 Apr 2014 16:43:14 +0000 (20:43 +0400)
Add two kernel module helpers: module_{module,has_parameter}().  They
are going to live in common/module.[ch].

Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
src/common/Makefile.am
src/common/module.c [new file with mode: 0644]
src/common/module.h [new file with mode: 0644]

index ddeafb2057cc1a8dcb2f2433f076ad7671575a01..3a63dc604fd523e351cba1c9c1fde7019670ffff 100644 (file)
@@ -69,7 +69,8 @@ libcommon_la_SOURCES = \
        common/addr_parsing.c \
        common/hobject.cc \
        common/bloom_filter.cc \
-       common/linux_version.c
+       common/linux_version.c \
+       common/module.c
 
 # these should go out of libcommon
 libcommon_la_SOURCES += \
@@ -197,7 +198,8 @@ noinst_HEADERS += \
        common/sync_filesystem.h \
        common/cmdparse.h \
        common/hobject.h \
-       common/linux_version.h
+       common/linux_version.h \
+       common/module.h
 
 noinst_LTLIBRARIES += libcommon.la
 
diff --git a/src/common/module.c b/src/common/module.c
new file mode 100644 (file)
index 0000000..cdae181
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2014 Inktank Storage, Inc.
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation.  See file COPYING.
+ *
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+/*
+ * TODO: Switch to libkmod when we abandon older platforms.  The APIs
+ * we want are:
+ *
+ * - kmod_module_new_from_name() for obtaining handles;
+ * - kmod_module_probe_insert_module() for module_load();
+ * - kmod_module_get_info(), kmod_module_info_get_{key,value}() for
+ *   module_has_param().
+ */
+
+/*
+ * Return command's exit status or -1 on error.
+ */
+static int run_command(const char *command)
+{
+       int status;
+
+       status = system(command);
+       if (status >= 0 && WIFEXITED(status))
+               return WEXITSTATUS(status);
+
+       if (status < 0) {
+               char error_buf[80];
+               fprintf(stderr, "couldn't run '%s': %s\n", command,
+                       strerror_r(errno, error_buf, sizeof(error_buf)));
+       } else if (WIFSIGNALED(status)) {
+               fprintf(stderr, "'%s' killed by signal %d\n", command,
+                       WTERMSIG(status));
+       } else {
+               fprintf(stderr, "weird status from '%s': %d\n", command,
+                       status);
+       }
+
+       return -1;
+}
+
+int module_has_param(const char *module, const char *param)
+{
+       char command[128];
+
+       snprintf(command, sizeof(command),
+                "/sbin/modinfo -F parm %s | /bin/grep -q ^%s:",
+                module, param);
+
+       return run_command(command) == 0;
+}
+
+int module_load(const char *module, const char *options)
+{
+       char command[128];
+
+       snprintf(command, sizeof(command), "/sbin/modprobe %s %s",
+                module, (options ? options : ""));
+
+       return run_command(command);
+}
diff --git a/src/common/module.h b/src/common/module.h
new file mode 100644 (file)
index 0000000..d5fa6a1
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2014 Inktank Storage, Inc.
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation.  See file COPYING.
+ *
+ */
+
+#ifndef CEPH_MODULE_H
+#define CEPH_MODULE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int module_has_param(const char *module, const char *param);
+int module_load(const char *module, const char *options);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CEPH_MODULE_H */