xref: /aosp_15_r20/tools/netsim/src/util/os_utils.cc (revision cf78ab8cffb8fc9207af348f23af247fb04370a6)
1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2022 The Android Open Source Project
2*cf78ab8cSAndroid Build Coastguard Worker //
3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*cf78ab8cSAndroid Build Coastguard Worker //
7*cf78ab8cSAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
8*cf78ab8cSAndroid Build Coastguard Worker //
9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License.
14*cf78ab8cSAndroid Build Coastguard Worker 
15*cf78ab8cSAndroid Build Coastguard Worker #include "util/os_utils.h"
16*cf78ab8cSAndroid Build Coastguard Worker 
17*cf78ab8cSAndroid Build Coastguard Worker #include <fcntl.h>
18*cf78ab8cSAndroid Build Coastguard Worker #include <stdio.h>
19*cf78ab8cSAndroid Build Coastguard Worker #include <unistd.h>
20*cf78ab8cSAndroid Build Coastguard Worker #if defined(_WIN32)
21*cf78ab8cSAndroid Build Coastguard Worker #include <windows.h>
22*cf78ab8cSAndroid Build Coastguard Worker #endif
23*cf78ab8cSAndroid Build Coastguard Worker 
24*cf78ab8cSAndroid Build Coastguard Worker #include <memory>
25*cf78ab8cSAndroid Build Coastguard Worker #include <string>
26*cf78ab8cSAndroid Build Coastguard Worker 
27*cf78ab8cSAndroid Build Coastguard Worker #include "util/filesystem.h"
28*cf78ab8cSAndroid Build Coastguard Worker #include "util/ini_file.h"
29*cf78ab8cSAndroid Build Coastguard Worker #include "util/log.h"
30*cf78ab8cSAndroid Build Coastguard Worker 
31*cf78ab8cSAndroid Build Coastguard Worker namespace netsim {
32*cf78ab8cSAndroid Build Coastguard Worker namespace osutils {
33*cf78ab8cSAndroid Build Coastguard Worker namespace {
34*cf78ab8cSAndroid Build Coastguard Worker 
35*cf78ab8cSAndroid Build Coastguard Worker constexpr uint16_t DEFAULT_INSTANCE = 0;
36*cf78ab8cSAndroid Build Coastguard Worker constexpr uint32_t DEFAULT_HCI_PORT = 6402;
37*cf78ab8cSAndroid Build Coastguard Worker 
38*cf78ab8cSAndroid Build Coastguard Worker struct DiscoveryDir {
39*cf78ab8cSAndroid Build Coastguard Worker   const char *root_env;
40*cf78ab8cSAndroid Build Coastguard Worker   const char *subdir;
41*cf78ab8cSAndroid Build Coastguard Worker };
42*cf78ab8cSAndroid Build Coastguard Worker 
43*cf78ab8cSAndroid Build Coastguard Worker DiscoveryDir discovery{
44*cf78ab8cSAndroid Build Coastguard Worker #if defined(_WIN32)
45*cf78ab8cSAndroid Build Coastguard Worker     "LOCALAPPDATA", "Temp"
46*cf78ab8cSAndroid Build Coastguard Worker #elif defined(__linux__)
47*cf78ab8cSAndroid Build Coastguard Worker     "XDG_RUNTIME_DIR", ""
48*cf78ab8cSAndroid Build Coastguard Worker #elif defined(__APPLE__)
49*cf78ab8cSAndroid Build Coastguard Worker     "HOME", "Library/Caches/TemporaryItems"
50*cf78ab8cSAndroid Build Coastguard Worker #else
51*cf78ab8cSAndroid Build Coastguard Worker #error This platform is not supported.
52*cf78ab8cSAndroid Build Coastguard Worker #endif
53*cf78ab8cSAndroid Build Coastguard Worker };
54*cf78ab8cSAndroid Build Coastguard Worker 
55*cf78ab8cSAndroid Build Coastguard Worker }  // namespace
56*cf78ab8cSAndroid Build Coastguard Worker 
GetDiscoveryDirectory()57*cf78ab8cSAndroid Build Coastguard Worker std::string GetDiscoveryDirectory() {
58*cf78ab8cSAndroid Build Coastguard Worker   // $TMPDIR is the temp directory on buildbots.
59*cf78ab8cSAndroid Build Coastguard Worker   const char *test_env_p = std::getenv("TMPDIR");
60*cf78ab8cSAndroid Build Coastguard Worker   if (test_env_p && *test_env_p) {
61*cf78ab8cSAndroid Build Coastguard Worker     return std::string(test_env_p);
62*cf78ab8cSAndroid Build Coastguard Worker   }
63*cf78ab8cSAndroid Build Coastguard Worker   const char *env_p = std::getenv(discovery.root_env);
64*cf78ab8cSAndroid Build Coastguard Worker   if (!env_p) {
65*cf78ab8cSAndroid Build Coastguard Worker     BtsLogWarn("No discovery env for %s, using tmp/", discovery.root_env);
66*cf78ab8cSAndroid Build Coastguard Worker     env_p = "/tmp";
67*cf78ab8cSAndroid Build Coastguard Worker   }
68*cf78ab8cSAndroid Build Coastguard Worker   return std::string(env_p) + netsim::filesystem::slash + discovery.subdir;
69*cf78ab8cSAndroid Build Coastguard Worker }
70*cf78ab8cSAndroid Build Coastguard Worker 
GetNetsimIniFilepath(uint16_t instance_num)71*cf78ab8cSAndroid Build Coastguard Worker std::string GetNetsimIniFilepath(uint16_t instance_num) {
72*cf78ab8cSAndroid Build Coastguard Worker   auto discovery_dir = GetDiscoveryDirectory();
73*cf78ab8cSAndroid Build Coastguard Worker   // Check if directory has a trailing slash.
74*cf78ab8cSAndroid Build Coastguard Worker   if (discovery_dir.back() != netsim::filesystem::slash.back())
75*cf78ab8cSAndroid Build Coastguard Worker     discovery_dir.append(netsim::filesystem::slash);
76*cf78ab8cSAndroid Build Coastguard Worker   auto filename = (instance_num == 1)
77*cf78ab8cSAndroid Build Coastguard Worker                       ? "netsim.ini"
78*cf78ab8cSAndroid Build Coastguard Worker                       : "netsim_" + std::to_string(instance_num) + ".ini";
79*cf78ab8cSAndroid Build Coastguard Worker   discovery_dir.append(filename);
80*cf78ab8cSAndroid Build Coastguard Worker   return discovery_dir;
81*cf78ab8cSAndroid Build Coastguard Worker }
82*cf78ab8cSAndroid Build Coastguard Worker 
GetServerAddress(uint16_t instance_num)83*cf78ab8cSAndroid Build Coastguard Worker std::optional<std::string> GetServerAddress(uint16_t instance_num) {
84*cf78ab8cSAndroid Build Coastguard Worker   auto filepath = GetNetsimIniFilepath(instance_num);
85*cf78ab8cSAndroid Build Coastguard Worker   if (!netsim::filesystem::exists(filepath)) {
86*cf78ab8cSAndroid Build Coastguard Worker     BtsLogWarn("Unable to find netsim ini file: %s", filepath.c_str());
87*cf78ab8cSAndroid Build Coastguard Worker     return std::nullopt;
88*cf78ab8cSAndroid Build Coastguard Worker   }
89*cf78ab8cSAndroid Build Coastguard Worker   if (!netsim::filesystem::is_regular_file(filepath)) {
90*cf78ab8cSAndroid Build Coastguard Worker     BtsLogError("Not a regular file: %s", filepath.c_str());
91*cf78ab8cSAndroid Build Coastguard Worker     return std::nullopt;
92*cf78ab8cSAndroid Build Coastguard Worker   }
93*cf78ab8cSAndroid Build Coastguard Worker   IniFile iniFile(filepath);
94*cf78ab8cSAndroid Build Coastguard Worker   iniFile.Read();
95*cf78ab8cSAndroid Build Coastguard Worker   return iniFile.Get("grpc.port");
96*cf78ab8cSAndroid Build Coastguard Worker }
97*cf78ab8cSAndroid Build Coastguard Worker 
98*cf78ab8cSAndroid Build Coastguard Worker }  // namespace osutils
99*cf78ab8cSAndroid Build Coastguard Worker }  // namespace netsim
100