xref: /aosp_15_r20/external/toybox/toys/other/insmod.c (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
1*cf5a6c84SAndroid Build Coastguard Worker /* insmod.c - Load a module into the Linux kernel.
2*cf5a6c84SAndroid Build Coastguard Worker  *
3*cf5a6c84SAndroid Build Coastguard Worker  * Copyright 2012 Elie De Brauwer <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker 
5*cf5a6c84SAndroid Build Coastguard Worker USE_INSMOD(NEWTOY(insmod, "<1", TOYFLAG_SBIN|TOYFLAG_NEEDROOT))
6*cf5a6c84SAndroid Build Coastguard Worker 
7*cf5a6c84SAndroid Build Coastguard Worker config INSMOD
8*cf5a6c84SAndroid Build Coastguard Worker   bool "insmod"
9*cf5a6c84SAndroid Build Coastguard Worker   default y
10*cf5a6c84SAndroid Build Coastguard Worker   help
11*cf5a6c84SAndroid Build Coastguard Worker     usage: insmod MODULE [OPTION...]
12*cf5a6c84SAndroid Build Coastguard Worker 
13*cf5a6c84SAndroid Build Coastguard Worker     Load the module named MODULE passing options if given.
14*cf5a6c84SAndroid Build Coastguard Worker */
15*cf5a6c84SAndroid Build Coastguard Worker 
16*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
17*cf5a6c84SAndroid Build Coastguard Worker 
insmod_main(void)18*cf5a6c84SAndroid Build Coastguard Worker void insmod_main(void)
19*cf5a6c84SAndroid Build Coastguard Worker {
20*cf5a6c84SAndroid Build Coastguard Worker   int fd = xopenro(*toys.optargs);
21*cf5a6c84SAndroid Build Coastguard Worker   int i, rc;
22*cf5a6c84SAndroid Build Coastguard Worker 
23*cf5a6c84SAndroid Build Coastguard Worker   i = 1;
24*cf5a6c84SAndroid Build Coastguard Worker   while (toys.optargs[i] &&
25*cf5a6c84SAndroid Build Coastguard Worker     strlen(toybuf) + strlen(toys.optargs[i]) + 2 < sizeof(toybuf))
26*cf5a6c84SAndroid Build Coastguard Worker   {
27*cf5a6c84SAndroid Build Coastguard Worker     strcat(toybuf, toys.optargs[i++]);
28*cf5a6c84SAndroid Build Coastguard Worker     strcat(toybuf, " ");
29*cf5a6c84SAndroid Build Coastguard Worker   }
30*cf5a6c84SAndroid Build Coastguard Worker 
31*cf5a6c84SAndroid Build Coastguard Worker   // finit_module doesn't work on stdin, so we fall back to init_module...
32*cf5a6c84SAndroid Build Coastguard Worker   rc = syscall(SYS_finit_module, fd, toybuf, 0);
33*cf5a6c84SAndroid Build Coastguard Worker   if (rc && (fd == 0 || errno == ENOSYS)) {
34*cf5a6c84SAndroid Build Coastguard Worker     off_t len = 0;
35*cf5a6c84SAndroid Build Coastguard Worker     char *path = !strcmp(*toys.optargs, "-") ? "/dev/stdin" : *toys.optargs;
36*cf5a6c84SAndroid Build Coastguard Worker     char *buf = readfileat(AT_FDCWD, path, NULL, &len);
37*cf5a6c84SAndroid Build Coastguard Worker 
38*cf5a6c84SAndroid Build Coastguard Worker     if (!buf) perror_exit("couldn't read %s", path);
39*cf5a6c84SAndroid Build Coastguard Worker     rc = syscall(SYS_init_module, buf, len, toybuf);
40*cf5a6c84SAndroid Build Coastguard Worker     if (CFG_TOYBOX_FREE) free(buf);
41*cf5a6c84SAndroid Build Coastguard Worker   }
42*cf5a6c84SAndroid Build Coastguard Worker 
43*cf5a6c84SAndroid Build Coastguard Worker   if (rc) perror_exit("failed to load %s", toys.optargs[0]);
44*cf5a6c84SAndroid Build Coastguard Worker 
45*cf5a6c84SAndroid Build Coastguard Worker   if (CFG_TOYBOX_FREE) close(fd);
46*cf5a6c84SAndroid Build Coastguard Worker }
47