diff --git a/init/builtins.cpp b/init/builtins.cpp index 89f6c68c8..98595da0e 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -44,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -66,13 +68,13 @@ static const int kTerminateServiceDelayMicroSeconds = 50000; -static int insmod(const char *filename, const char *options) { +static int insmod(const char *filename, const char *options, int flags) { int fd = open(filename, O_RDONLY | O_NOFOLLOW | O_CLOEXEC); if (fd == -1) { ERROR("insmod: open(\"%s\") failed: %s", filename, strerror(errno)); return -1; } - int rc = syscall(__NR_finit_module, fd, options, 0); + int rc = syscall(__NR_finit_module, fd, options, flags); if (rc == -1) { ERROR("finit_module for \"%s\" failed: %s", filename, strerror(errno)); } @@ -269,17 +271,17 @@ static int do_ifup(const std::vector& args) { } static int do_insmod(const std::vector& args) { - std::string options; + int flags = 0; + auto it = args.begin() + 1; - if (args.size() > 2) { - options += args[2]; - for (std::size_t i = 3; i < args.size(); ++i) { - options += ' '; - options += args[i]; - } + if (!(*it).compare("-f")) { + flags = MODULE_INIT_IGNORE_VERMAGIC | MODULE_INIT_IGNORE_MODVERSIONS; + it++; } - return insmod(args[1].c_str(), options.c_str()); + std::string filename = *it++; + std::string options = android::base::Join(std::vector(it, args.end()), ' '); + return insmod(filename.c_str(), options.c_str(), flags); } static int do_mkdir(const std::vector& args) { diff --git a/init/readme.txt b/init/readme.txt index 8130806c2..e75b4b282 100644 --- a/init/readme.txt +++ b/init/readme.txt @@ -281,8 +281,11 @@ hostname ifup Bring the network interface online. -insmod - Install the module at +insmod [-f] [] + Install the module at with the specified options. + -f + Force installation of the module even if the version of the running kernel + and the version of the kernel for which the module was compiled do not match. load_all_props Loads properties from /system, /vendor, et cetera.