1 // 2 // Copyright (C) 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 27 Settings::Settings() : initialized_(false) {} 28 29 Settings::~Settings() {} 30 31 bool 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 } 58 // Check for libbase logging switches. These get processed by 59 // logging::InitLogging directly. 60 else if (iter.first != ::switches::kV) { 61 LOG(ERROR) << "Unexpected command-line switches found: " << iter.first; 62 return false; 63 } 64 } 65 66 // Two IPC methods/paths were provided. 67 if (!android_ipc_socket_suffix_.empty() && !create_ipc_socket_path_.empty()) { 68 LOG(ERROR) << "Too many IPC methods provided"; 69 return false; 70 } 71 72 // The daemon has no arguments 73 if (command_line->GetArgs().size()) { 74 LOG(ERROR) << "Unexpected command-line arguments found"; 75 return false; 76 } 77 78 initialized_ = true; 79 return true; 80 } 81 82 } // namespace bluetooth 83