summaryrefslogtreecommitdiffstats
path: root/src/common/module.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-27 18:24:20 +0000
commit483eb2f56657e8e7f419ab1a4fab8dce9ade8609 (patch)
treee5d88d25d870d5dedacb6bbdbe2a966086a0a5cf /src/common/module.c
parentInitial commit. (diff)
downloadceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.tar.xz
ceph-483eb2f56657e8e7f419ab1a4fab8dce9ade8609.zip
Adding upstream version 14.2.21.upstream/14.2.21upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/common/module.c')
-rw-r--r--src/common/module.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/common/module.c b/src/common/module.c
new file mode 100644
index 00000000..f19f7432
--- /dev/null
+++ b/src/common/module.c
@@ -0,0 +1,83 @@
+/*
+ * 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 "acconfig.h"
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#if defined(__FreeBSD__)
+#include <sys/wait.h>
+#endif
+
+/*
+ * 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];
+#ifdef STRERROR_R_CHAR_P
+ char* dummy = strerror_r(errno, error_buf, sizeof(error_buf));
+ (void)dummy;
+#else
+ strerror_r(errno, error_buf, sizeof(error_buf));
+#endif
+ fprintf(stderr, "couldn't run '%s': %s\n", command,
+ 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);
+}