123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- // Copyright 2021 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "remoting/host/setup/start_host_as_root.h"
- #include <pwd.h>
- #include <sys/wait.h>
- #include <unistd.h>
- #include "base/check.h"
- #include "base/command_line.h"
- #include "base/process/launch.h"
- namespace remoting {
- int StartHostAsRoot(int argc, char** argv) {
- DCHECK(getuid() == 0);
- base::CommandLine command_line(argc, argv);
- std::string user_name = command_line.GetSwitchValueASCII("user-name");
- if (user_name.empty()) {
- fprintf(stderr,
- "Must specify the --user-name option when running as root.\n");
- return 1;
- }
- int return_value = 1;
- command_line.RemoveSwitch("user-name");
- command_line.AppendSwitch("no-start");
- std::vector<std::string> create_config_command_line{
- "/usr/bin/sudo",
- "-u",
- user_name.c_str(),
- };
- create_config_command_line.insert(create_config_command_line.end(),
- command_line.argv().begin(),
- command_line.argv().end());
- // LaunchProcess redirects stdin to /dev/null, but start_host prompts for a
- // PIN if one isn't specified on the command-line, so dup and remap it.
- base::LaunchOptions options;
- int stdin_dup = dup(STDIN_FILENO);
- options.fds_to_remap.emplace_back(stdin_dup, STDIN_FILENO);
- auto create_config_process =
- base::LaunchProcess(create_config_command_line, options);
- close(stdin_dup);
- if (!create_config_process.WaitForExit(&return_value) || return_value != 0) {
- fprintf(stderr, "Failed to set new config.\n");
- return return_value;
- }
- return_value = 1;
- std::vector<std::string> systemctl_command_line{
- "systemctl", "enable", "--now",
- std::string("chrome-remote-desktop@") + user_name};
- auto systemctl_process =
- base::LaunchProcess(systemctl_command_line, base::LaunchOptions());
- if (!systemctl_process.WaitForExit(&return_value) || return_value != 0) {
- fprintf(stderr, "Failed to enable host service.\n");
- return return_value;
- }
- return 0;
- }
- } // namespace remoting
|