insmod.c revision 4f6e8d7a00cbeda1e70cc15be9c4af1018bdad53
1#include <stdio.h>
2#include <string.h>
3#include <fcntl.h>
4#include <unistd.h>
5#include <malloc.h>
6#include <errno.h>
7#include <sys/types.h>
8#include <sys/stat.h>
9#include <unistd.h>
10
11extern int init_module(void *, unsigned long, const char *);
12
13static void *read_file(const char *filename, ssize_t *_size)
14{
15	int ret, fd;
16	struct stat sb;
17	ssize_t size;
18	void *buffer = NULL;
19
20	/* open the file */
21	fd = open(filename, O_RDONLY);
22	if (fd < 0)
23		return NULL;
24
25	/* find out how big it is */
26	if (fstat(fd, &sb) < 0)
27		goto bail;
28	size = sb.st_size;
29
30	/* allocate memory for it to be read into */
31	buffer = malloc(size);
32	if (!buffer)
33		goto bail;
34
35	/* slurp it into our buffer */
36	ret = read(fd, buffer, size);
37	if (ret != size)
38		goto bail;
39
40	/* let the caller know how big it is */
41	*_size = size;
42
43bail:
44	close(fd);
45	return buffer;
46}
47
48int insmod_main(int argc, char **argv)
49{
50	void *file;
51	ssize_t size;
52	int ret;
53
54	/* make sure we've got an argument */
55	if (argc < 2) {
56		fprintf(stderr, "usage: insmod <module.o>\n");
57		return -1;
58	}
59
60	/* read the file into memory */
61	file = read_file(argv[1], &size);
62	if (!file) {
63		fprintf(stderr, "insmod: can't open '%s'\n", argv[1]);
64		return -1;
65	}
66
67	/* pass it to the kernel */
68	/* XXX options */
69	ret = init_module(file, size, "");
70	if (ret != 0) {
71		fprintf(stderr,
72                "insmod: init_module '%s' failed (%s)\n",
73                argv[1], strerror(errno));
74	}
75
76	/* free the file buffer */
77	free(file);
78
79	return ret;
80}
81
82