1 // 2 // Copyright 2015 Google, Inc. 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at: 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "service/settings.h" 18 19 #include <base/base_switches.h> 20 #include <base/command_line.h> 21 #include <base/logging.h> 22 23 #include "service/switches.h" 24 25 namespace bluetooth { 26 Settings()27Settings::Settings() : initialized_(false), enable_on_start_(false) {} 28 ~Settings()29Settings::~Settings() {} 30 Init()31bool Settings::Init() { 32 CHECK(!initialized_); 33 auto command_line = base::CommandLine::ForCurrentProcess(); 34 const auto& switches = command_line->GetSwitches(); 35 36 for (const auto& iter : switches) { 37 if (iter.first == switches::kCreateIPCSocketPath) { 38 // kCreateIPCSocketPath: An optional argument that initializes an IPC 39 // socket path for IPC. 40 base::FilePath path(iter.second); 41 if (path.empty() || path.EndsWithSeparator()) { 42 LOG(ERROR) << "Invalid IPC create socket path"; 43 return false; 44 } 45 46 create_ipc_socket_path_ = path; 47 } else if (iter.first == switches::kAndroidIPCSocketSuffix) { 48 // kAndroidIPCSocketSuffix: An optional argument used to express 49 // a socket that Android init created for us. We bind to this. 50 const std::string& suffix = iter.second; 51 if (suffix.empty()) { 52 LOG(ERROR) << "Invalid Android socket suffix"; 53 return false; 54 } 55 56 android_ipc_socket_suffix_ = suffix; 57 } else if (iter.first == switches::kEnableOnStart) { 58 if (iter.second == "true") { 59 enable_on_start_ = true; 60 } else if (iter.second == "false") { 61 enable_on_start_ = false; 62 } else { 63 LOG(ERROR) << "Invalid value for " << switches::kEnableOnStart << ": " 64 << iter.second << ". Expect 'true' or 'false'"; 65 return false; 66 } 67 } 68 // Check for libbase logging switches. These get processed by 69 // logging::InitLogging directly. 70 else if (iter.first != ::switches::kV) { 71 LOG(ERROR) << "Unexpected command-line switches found: " << iter.first; 72 return false; 73 } 74 } 75 76 // Two IPC methods/paths were provided. 77 if (!android_ipc_socket_suffix_.empty() && !create_ipc_socket_path_.empty()) { 78 LOG(ERROR) << "Too many IPC methods provided"; 79 return false; 80 } 81 82 // The daemon has no arguments 83 if (command_line->GetArgs().size()) { 84 LOG(ERROR) << "Unexpected command-line arguments found"; 85 return false; 86 } 87 88 initialized_ = true; 89 return true; 90 } 91 92 } // namespace bluetooth 93