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 }