summaryrefslogtreecommitdiffstats
path: root/src/common/module.c
blob: a2a468ac3e1f757751ffdc28e493eec941a457e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
 * 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/compat.h"
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(__FreeBSD__)
#include <sys/wait.h>
#endif 

#ifndef _WIN32
/*
 * 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];
		char* errp = ceph_strerror_r(errno, error_buf, sizeof(error_buf));
		fprintf(stderr, "couldn't run '%s': %s\n", command,
			errp);
	} 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);
}

#else

// We're stubbing out those functions, for now.
int module_has_param(const char *module, const char *param)
{
	return -1;
}

int module_load(const char *module, const char *options)
{
	return -1;
}

#endif /* _WIN32 */