1
/* insmod.c: insert a module into the kernel.
2
Copyright (C) 2001 Rusty Russell.
3
Copyright (C) 2002 Rusty Russell, IBM Corporation.
5
This program is free software; you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation; either version 2 of the License, or
8
(at your option) any later version.
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
15
You should have received a copy of the GNU General Public License
16
along with this program; if not, write to the Free Software
17
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25
#include <sys/types.h>
31
#define streq(a,b) (strcmp((a),(b)) == 0)
33
/* This really needs to be in a header file... */
34
extern long init_module(void *, unsigned long, const char *);
36
static void print_usage(const char *progname)
38
fprintf(stderr, "Usage: %s filename [args]\n", progname);
42
/* We use error numbers in a loose translation... */
43
static const char *moderror(int err)
47
return "Invalid module format";
49
return "Unknown symbol in module";
51
return "Module has wrong symbol version";
53
return "Invalid parameters";
59
static void *grab_file(const char *filename, unsigned long *size)
61
unsigned int max = 16384;
63
void *buffer = malloc(max);
65
if (streq(filename, "-"))
66
fd = dup(STDIN_FILENO);
68
fd = open(filename, O_RDONLY, 0);
74
while ((ret = read(fd, buffer + *size, max - *size)) > 0) {
77
buffer = realloc(buffer, max *= 2);
87
int main(int argc, char *argv[])
93
char *filename, *options = strdup("");
94
char *progname = argv[0];
96
if (argv[1] && (streq(argv[1], "--version") || streq(argv[1], "-V"))) {
101
/* Ignore old options, for backwards compat. */
102
while (argv[1] && (streq(argv[1], "-p")
103
|| streq(argv[1], "-s")
104
|| streq(argv[1], "-f"))) {
111
print_usage(progname);
113
/* Rest is options */
114
for (i = 2; i < argc; i++) {
115
options = realloc(options,
116
strlen(options) + 2 + strlen(argv[i]) + 2);
117
/* Spaces handled by "" pairs, but no way of escaping
119
if (strchr(argv[i], ' '))
120
strcat(options, "\"");
121
strcat(options, argv[i]);
122
if (strchr(argv[i], ' '))
123
strcat(options, "\"");
124
strcat(options, " ");
127
file = grab_file(filename, &len);
129
fprintf(stderr, "insmod: can't read '%s': %s\n",
130
filename, strerror(errno));
134
ret = init_module(file, len, options);
136
fprintf(stderr, "insmod: error inserting '%s': %li %s\n",
137
filename, ret, moderror(errno));