17aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley/* insmod.c - Load a module into the Linux kernel.
2ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer *
3ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer * Copyright 2012 Elie De Brauwer <eliedebrauwer@gmail.com>
4ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer
51dd3704c5ffea926f61a96bb7de7d9dbee52fa44Paul BarkerUSE_INSMOD(NEWTOY(insmod, "<1", TOYFLAG_SBIN|TOYFLAG_NEEDROOT))
6ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer
7ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwerconfig INSMOD
87aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  bool "insmod"
97aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  default y
107aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  help
117aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    usage: insmod MODULE [MODULE_OPTIONS]
12ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer
137aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    Load the module named MODULE passing options if given.
14ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer*/
15ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer
16ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer#include "toys.h"
17ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer
18ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer#include <sys/syscall.h>
19ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer#define init_module(mod, len, opts) syscall(__NR_init_module, mod, len, opts)
20ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer
21ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwervoid insmod_main(void)
22ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer{
237aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  char * buf = NULL;
247aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  int len, res, i;
253d56716d362d6a827c5f81029ac64c71b56a2f5cRob Landley  int fd = xopen(*toys.optargs, O_RDONLY);
267aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley
277aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  len = fdlength(fd);
287aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  buf = xmalloc(len);
297aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  xreadall(fd, buf, len);
307aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley
317aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  i = 1;
327aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  while(toys.optargs[i] &&
333d56716d362d6a827c5f81029ac64c71b56a2f5cRob Landley    strlen(toybuf) + strlen(toys.optargs[i]) + 2 < sizeof(toybuf))
343d56716d362d6a827c5f81029ac64c71b56a2f5cRob Landley  {
357aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    strcat(toybuf, toys.optargs[i++]);
367aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley    strcat(toybuf, " ");
377aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  }
387aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley
397aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  res = init_module(buf, len, toybuf);
403d56716d362d6a827c5f81029ac64c71b56a2f5cRob Landley  if (CFG_TOYBOX_FREE) {
413d56716d362d6a827c5f81029ac64c71b56a2f5cRob Landley    if (buf != toybuf) free(buf);
423d56716d362d6a827c5f81029ac64c71b56a2f5cRob Landley    close(fd);
433d56716d362d6a827c5f81029ac64c71b56a2f5cRob Landley  }
447aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley
457aa651a6a4496d848f86de9b1e6b3a003256a01fRob Landley  if (res) perror_exit("failed to load %s", toys.optargs[0]);
46ed505e8b16eecc984759415efad56dc6e47afb70Elie De Brauwer}
47