startup.cc 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "chromeos/startup/startup.h"
  5. #include <stdio.h>
  6. #include <sys/mman.h>
  7. #include <utility>
  8. #include <vector>
  9. #include "base/command_line.h"
  10. #include "base/files/file_util.h"
  11. #include "base/logging.h"
  12. #include "base/strings/string_number_conversions.h"
  13. #include "chromeos/startup/startup_switches.h"
  14. namespace chromeos {
  15. namespace {
  16. absl::optional<std::string> ReadStartupDataFromCmdlineSwitch(
  17. base::StringPiece cmdline_switch) {
  18. auto* command_line = base::CommandLine::ForCurrentProcess();
  19. if (!command_line->HasSwitch(cmdline_switch))
  20. return absl::nullopt;
  21. int raw_fd = 0;
  22. if (!base::StringToInt(command_line->GetSwitchValueASCII(cmdline_switch),
  23. &raw_fd)) {
  24. LOG(ERROR) << "Unrecognizable value for --" << cmdline_switch;
  25. return absl::nullopt;
  26. }
  27. base::ScopedFILE file(fdopen(raw_fd, "r"));
  28. std::string content;
  29. if (!base::ReadStreamToString(file.get(), &content)) {
  30. LOG(ERROR) << "Failed to read startup (--" << cmdline_switch << ") data";
  31. return absl::nullopt;
  32. }
  33. return absl::make_optional(std::move(content));
  34. }
  35. } // namespace
  36. absl::optional<std::string> ReadStartupData() {
  37. return ReadStartupDataFromCmdlineSwitch(switches::kCrosStartupDataFD);
  38. }
  39. absl::optional<std::string> ReadPostLoginData() {
  40. return ReadStartupDataFromCmdlineSwitch(switches::kCrosPostLoginDataFD);
  41. }
  42. base::ScopedFD CreateMemFDFromBrowserInitParams(
  43. const crosapi::mojom::BrowserInitParamsPtr& data) {
  44. std::vector<uint8_t> serialized =
  45. crosapi::mojom::BrowserInitParams::Serialize(&data);
  46. base::ScopedFD fd(memfd_create("startup_data", 0));
  47. if (!fd.is_valid()) {
  48. PLOG(ERROR) << "Failed to create a memory backed file";
  49. return base::ScopedFD();
  50. }
  51. if (!base::WriteFileDescriptor(fd.get(), serialized)) {
  52. LOG(ERROR) << "Failed to dump the serialized BrowserInitParams";
  53. return base::ScopedFD();
  54. }
  55. if (lseek(fd.get(), 0, SEEK_SET) < 0) {
  56. PLOG(ERROR) << "Failed to reset the FD position";
  57. return base::ScopedFD();
  58. }
  59. return fd;
  60. }
  61. } // namespace chromeos