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