common: add module_{load,has_parameter}()

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>
This commit is contained in:
Ilya Dryomov 2014-04-17 19:03:24 +04:00
parent 944dd1c62e
commit ac9b461f67
3 changed files with 106 additions and 2 deletions

View 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

75
src/common/module.c Normal file
View File

@ -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);
}

27
src/common/module.h Normal file
View File

@ -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 */