insmod.c - ubase - suckless linux base utils
(HTM) git clone git://git.suckless.org/ubase
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
insmod.c (1141B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <sys/stat.h>
3 #include <sys/syscall.h>
4
5 #include <fcntl.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <unistd.h>
10
11 #include "util.h"
12
13 static void
14 usage(void)
15 {
16 eprintf("usage: %s filename [args...]\n", argv0);
17 }
18
19 int
20 main(int argc, char *argv[])
21 {
22 char *buf = NULL, *opts = NULL;
23 size_t blen, plen = 0;
24 int i, fd;
25 ssize_t n;
26 struct stat sb;
27
28 ARGBEGIN {
29 default:
30 usage();
31 } ARGEND;
32
33 if (argc < 1)
34 usage();
35
36 fd = open(argv[0], O_RDONLY);
37 if (fd < 0)
38 eprintf("open %s:", argv[0]);
39 if (fstat(fd, &sb) < 0)
40 eprintf("stat %s:", argv[0]);
41 blen = sb.st_size;
42 buf = emalloc(blen);
43
44 n = read(fd, buf, blen);
45 if (n < 0 || (size_t)n != blen)
46 eprintf("read:");
47
48 argc--;
49 argv++;
50
51 for (i = 0; i < argc; i++)
52 plen += strlen(argv[i]);
53 if (plen > 0) {
54 plen += argc;
55 opts = ecalloc(1, plen);
56 for (i = 0; i < argc; i++) {
57 strcat(opts, argv[i]);
58 if (i + 1 < argc)
59 strcat(opts, " ");
60 }
61 }
62
63 if (syscall(__NR_init_module, buf, blen, !opts ? "" : opts) < 0)
64 eprintf("init_module:");
65
66 free(opts);
67 free(buf);
68 return 0;
69 }