diff --git a/init/README.md b/init/README.md index 4be521902..6f2c01f05 100644 --- a/init/README.md +++ b/init/README.md @@ -623,8 +623,11 @@ provides the `aidl_lazy_test_1` interface. `stop ` > Stop a service from running if it is currently running. -`swapon_all ` +`swapon_all [ ]` > Calls fs\_mgr\_swapon\_all on the given fstab file. + If the fstab parameter is not specified, fstab.${ro.boot.fstab_suffix}, + fstab.${ro.hardware} or fstab.${ro.hardware.platform} will be scanned for + under /odm/etc, /vendor/etc, or / at runtime, in that order. `symlink ` > Create a symbolic link at _path_ with the value _target_ diff --git a/init/builtins.cpp b/init/builtins.cpp index e918e12ae..0ac66f272 100644 --- a/init/builtins.cpp +++ b/init/builtins.cpp @@ -708,10 +708,20 @@ static Result do_umount_all(const BuiltinArguments& args) { return {}; } +/* swapon_all [ ] */ static Result do_swapon_all(const BuiltinArguments& args) { + auto swapon_all = ParseSwaponAll(args.args); + if (!swapon_all.ok()) return swapon_all.error(); + Fstab fstab; - if (!ReadFstabFromFile(args[1], &fstab)) { - return Error() << "Could not read fstab '" << args[1] << "'"; + if (swapon_all->empty()) { + if (!ReadDefaultFstab(&fstab)) { + return Error() << "Could not read default fstab"; + } + } else { + if (!ReadFstabFromFile(*swapon_all, &fstab)) { + return Error() << "Could not read fstab '" << *swapon_all << "'"; + } } if (!fs_mgr_swapon_all(fstab)) { @@ -1371,7 +1381,7 @@ const BuiltinFunctionMap& GetBuiltinFunctionMap() { {"setrlimit", {3, 3, {false, do_setrlimit}}}, {"start", {1, 1, {false, do_start}}}, {"stop", {1, 1, {false, do_stop}}}, - {"swapon_all", {1, 1, {false, do_swapon_all}}}, + {"swapon_all", {0, 1, {false, do_swapon_all}}}, {"enter_default_mount_ns", {0, 0, {false, do_enter_default_mount_ns}}}, {"symlink", {2, 2, {true, do_symlink}}}, {"sysclktz", {1, 1, {false, do_sysclktz}}}, diff --git a/init/check_builtins.cpp b/init/check_builtins.cpp index 450c079a8..481fa31e5 100644 --- a/init/check_builtins.cpp +++ b/init/check_builtins.cpp @@ -202,6 +202,14 @@ Result check_setrlimit(const BuiltinArguments& args) { return {}; } +Result check_swapon_all(const BuiltinArguments& args) { + auto options = ParseSwaponAll(args.args); + if (!options.ok()) { + return options.error(); + } + return {}; +} + Result check_sysclktz(const BuiltinArguments& args) { ReturnIfAnyArgsEmpty(); diff --git a/init/check_builtins.h b/init/check_builtins.h index 725a6fd65..dc1b752e7 100644 --- a/init/check_builtins.h +++ b/init/check_builtins.h @@ -37,6 +37,7 @@ Result check_restorecon(const BuiltinArguments& args); Result check_restorecon_recursive(const BuiltinArguments& args); Result check_setprop(const BuiltinArguments& args); Result check_setrlimit(const BuiltinArguments& args); +Result check_swapon_all(const BuiltinArguments& args); Result check_sysclktz(const BuiltinArguments& args); Result check_umount_all(const BuiltinArguments& args); Result check_wait(const BuiltinArguments& args); diff --git a/init/util.cpp b/init/util.cpp index 90ac50cd1..255434a1b 100644 --- a/init/util.cpp +++ b/init/util.cpp @@ -652,11 +652,22 @@ Result>> ParseRestorecon( return std::pair(flag, paths); } +Result ParseSwaponAll(const std::vector& args) { + if (args.size() <= 1) { + if (SelinuxGetVendorAndroidVersion() <= __ANDROID_API_Q__) { + return Error() << "swapon_all requires at least 1 argument"; + } + return {}; + } + return args[1]; +} + Result ParseUmountAll(const std::vector& args) { - if (SelinuxGetVendorAndroidVersion() <= __ANDROID_API_Q__) { - if (args.size() <= 1) { + if (args.size() <= 1) { + if (SelinuxGetVendorAndroidVersion() <= __ANDROID_API_Q__) { return Error() << "umount_all requires at least 1 argument"; } + return {}; } return args[1]; } diff --git a/init/util.h b/init/util.h index a7f813b53..3cdc9f408 100644 --- a/init/util.h +++ b/init/util.h @@ -92,6 +92,8 @@ Result ParseMountAll(const std::vector& args); Result>> ParseRestorecon( const std::vector& args); +Result ParseSwaponAll(const std::vector& args); + Result ParseUmountAll(const std::vector& args); void SetStdioToDevNull(char** argv);