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()27 Settings::Settings() : initialized_(false), enable_on_start_(false) {}
28 
~Settings()29 Settings::~Settings() {}
30 
Init()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     } 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