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 }