X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Fcommon%2Fmodule.c;fp=src%2Fceph%2Fsrc%2Fcommon%2Fmodule.c;h=f19f74324c752db7e6164c875c9c022a39fee2e8;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/common/module.c b/src/ceph/src/common/module.c new file mode 100644 index 0000000..f19f743 --- /dev/null +++ b/src/ceph/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 +#include +#include +#include +#if defined(__FreeBSD__) +#include +#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); +}