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() 28 : initialized_(false) { 29 } 30 31 Settings::~Settings() { 32 } 33 34 bool Settings::Init() { 35 CHECK(!initialized_); 36 auto command_line = base::CommandLine::ForCurrentProcess(); 37 const auto& switches = command_line->GetSwitches(); 38 39 for (const auto& iter : switches) { 40 if (iter.first == switches::kCreateIPCSocketPath) { 41 // kCreateIPCSocketPath: An optional argument that initializes an IPC 42 // socket path for IPC. 43 base::FilePath path(iter.second); 44 if (path.empty() || path.EndsWithSeparator()) { 45 LOG(ERROR) << "Invalid IPC create socket path"; 46 return false; 47 } 48 49 create_ipc_socket_path_ = path; 50 } else if (iter.first == switches::kAndroidIPCSocketSuffix) { 51 // kAndroidIPCSocketSuffix: An optional argument used to express 52 // a socket that Android init created for us. We bind to this. 53 const std::string& suffix = iter.second; 54 if (suffix.empty()) { 55 LOG(ERROR) << "Invalid Android socket suffix"; 56 return false; 57 } 58 59 android_ipc_socket_suffix_ = suffix; 60 } 61 // Check for libbase logging switches. These get processed by 62 // logging::InitLogging directly. 63 else if (iter.first != ::switches::kV) { 64 LOG(ERROR) << "Unexpected command-line switches found: " << iter.first; 65 return false; 66 } 67 } 68 69 // Two IPC methods/paths were provided. 70 if (!android_ipc_socket_suffix_.empty() && 71 !create_ipc_socket_path_.empty()) { 72 LOG(ERROR) << "Too many IPC methods provided"; 73 return false; 74 } 75 76 // The daemon has no arguments 77 if (command_line->GetArgs().size()) { 78 LOG(ERROR) << "Unexpected command-line arguments found"; 79 return false; 80 } 81 82 initialized_ = true; 83 return true; 84 } 85 86 } // namespace bluetooth 87