xref: /aosp_15_r20/external/perfetto/src/tracing/ipc/default_socket.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/default_socket.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/build_config.h"
20*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/logging.h"
21*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/string_utils.h"
22*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/utils.h"
23*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/ipc/basic_types.h"
24*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/basic_types.h"
25*6dbdd20aSAndroid Build Coastguard Worker 
26*6dbdd20aSAndroid Build Coastguard Worker #include <stdlib.h>
27*6dbdd20aSAndroid Build Coastguard Worker 
28*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) ||   \
29*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
30*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
31*6dbdd20aSAndroid Build Coastguard Worker #include <unistd.h>
32*6dbdd20aSAndroid Build Coastguard Worker #endif
33*6dbdd20aSAndroid Build Coastguard Worker 
34*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
35*6dbdd20aSAndroid Build Coastguard Worker namespace {
36*6dbdd20aSAndroid Build Coastguard Worker 
37*6dbdd20aSAndroid Build Coastguard Worker const char* kRunPerfettoBaseDir = "/run/perfetto/";
38*6dbdd20aSAndroid Build Coastguard Worker 
39*6dbdd20aSAndroid Build Coastguard Worker // On Linux and CrOS, check /run/perfetto/ before using /tmp/ as the socket
40*6dbdd20aSAndroid Build Coastguard Worker // base directory.
UseRunPerfettoBaseDir()41*6dbdd20aSAndroid Build Coastguard Worker bool UseRunPerfettoBaseDir() {
42*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX)
43*6dbdd20aSAndroid Build Coastguard Worker   // Note that the trailing / in |kRunPerfettoBaseDir| ensures we are checking
44*6dbdd20aSAndroid Build Coastguard Worker   // against a directory, not a file.
45*6dbdd20aSAndroid Build Coastguard Worker   int res = PERFETTO_EINTR(access(kRunPerfettoBaseDir, X_OK));
46*6dbdd20aSAndroid Build Coastguard Worker   if (!res)
47*6dbdd20aSAndroid Build Coastguard Worker     return true;
48*6dbdd20aSAndroid Build Coastguard Worker 
49*6dbdd20aSAndroid Build Coastguard Worker   // If the path doesn't exist (ENOENT), fail silently to the caller. Otherwise,
50*6dbdd20aSAndroid Build Coastguard Worker   // fail with an explicit error message.
51*6dbdd20aSAndroid Build Coastguard Worker   if (errno != ENOENT
52*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_CHROMIUM_BUILD)
53*6dbdd20aSAndroid Build Coastguard Worker       // access(2) won't return EPERM, but Chromium sandbox returns EPERM if the
54*6dbdd20aSAndroid Build Coastguard Worker       // sandbox doesn't allow the call (e.g. in the child processes).
55*6dbdd20aSAndroid Build Coastguard Worker       && errno != EPERM
56*6dbdd20aSAndroid Build Coastguard Worker #endif
57*6dbdd20aSAndroid Build Coastguard Worker   ) {
58*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_PLOG("%s exists but cannot be accessed. Falling back on /tmp/ ",
59*6dbdd20aSAndroid Build Coastguard Worker                   kRunPerfettoBaseDir);
60*6dbdd20aSAndroid Build Coastguard Worker   }
61*6dbdd20aSAndroid Build Coastguard Worker   return false;
62*6dbdd20aSAndroid Build Coastguard Worker #else
63*6dbdd20aSAndroid Build Coastguard Worker   base::ignore_result(kRunPerfettoBaseDir);
64*6dbdd20aSAndroid Build Coastguard Worker   return false;
65*6dbdd20aSAndroid Build Coastguard Worker #endif
66*6dbdd20aSAndroid Build Coastguard Worker }
67*6dbdd20aSAndroid Build Coastguard Worker 
68*6dbdd20aSAndroid Build Coastguard Worker }  // anonymous namespace
69*6dbdd20aSAndroid Build Coastguard Worker 
GetProducerSocket()70*6dbdd20aSAndroid Build Coastguard Worker const char* GetProducerSocket() {
71*6dbdd20aSAndroid Build Coastguard Worker   const char* name = getenv("PERFETTO_PRODUCER_SOCK_NAME");
72*6dbdd20aSAndroid Build Coastguard Worker   if (name == nullptr) {
73*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
74*6dbdd20aSAndroid Build Coastguard Worker     name = "127.0.0.1:32278";
75*6dbdd20aSAndroid Build Coastguard Worker #elif PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
76*6dbdd20aSAndroid Build Coastguard Worker     name = "/dev/socket/traced_producer";
77*6dbdd20aSAndroid Build Coastguard Worker #else
78*6dbdd20aSAndroid Build Coastguard Worker     // Use /run/perfetto if it exists. Then fallback to /tmp.
79*6dbdd20aSAndroid Build Coastguard Worker     static const char* producer_socket =
80*6dbdd20aSAndroid Build Coastguard Worker         UseRunPerfettoBaseDir() ? "/run/perfetto/traced-producer.sock"
81*6dbdd20aSAndroid Build Coastguard Worker                                 : "/tmp/perfetto-producer";
82*6dbdd20aSAndroid Build Coastguard Worker     name = producer_socket;
83*6dbdd20aSAndroid Build Coastguard Worker #endif
84*6dbdd20aSAndroid Build Coastguard Worker   }
85*6dbdd20aSAndroid Build Coastguard Worker   base::ignore_result(UseRunPerfettoBaseDir);  // Silence unused func warnings.
86*6dbdd20aSAndroid Build Coastguard Worker   return name;
87*6dbdd20aSAndroid Build Coastguard Worker }
88*6dbdd20aSAndroid Build Coastguard Worker 
GetRelaySocket()89*6dbdd20aSAndroid Build Coastguard Worker const char* GetRelaySocket() {
90*6dbdd20aSAndroid Build Coastguard Worker   // The relay socket is optional and is connected only when the env var is set.
91*6dbdd20aSAndroid Build Coastguard Worker   return getenv("PERFETTO_RELAY_SOCK_NAME");
92*6dbdd20aSAndroid Build Coastguard Worker }
93*6dbdd20aSAndroid Build Coastguard Worker 
TokenizeProducerSockets(const char * producer_socket_names)94*6dbdd20aSAndroid Build Coastguard Worker std::vector<std::string> TokenizeProducerSockets(
95*6dbdd20aSAndroid Build Coastguard Worker     const char* producer_socket_names) {
96*6dbdd20aSAndroid Build Coastguard Worker   return base::SplitString(producer_socket_names, ",");
97*6dbdd20aSAndroid Build Coastguard Worker }
98*6dbdd20aSAndroid Build Coastguard Worker 
GetConsumerSocket()99*6dbdd20aSAndroid Build Coastguard Worker const char* GetConsumerSocket() {
100*6dbdd20aSAndroid Build Coastguard Worker   const char* name = getenv("PERFETTO_CONSUMER_SOCK_NAME");
101*6dbdd20aSAndroid Build Coastguard Worker   if (name == nullptr) {
102*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
103*6dbdd20aSAndroid Build Coastguard Worker     name = "127.0.0.1:32279";
104*6dbdd20aSAndroid Build Coastguard Worker #elif PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
105*6dbdd20aSAndroid Build Coastguard Worker     name = "/dev/socket/traced_consumer";
106*6dbdd20aSAndroid Build Coastguard Worker #else
107*6dbdd20aSAndroid Build Coastguard Worker     // Use /run/perfetto if it exists. Then fallback to /tmp.
108*6dbdd20aSAndroid Build Coastguard Worker     static const char* consumer_socket =
109*6dbdd20aSAndroid Build Coastguard Worker         UseRunPerfettoBaseDir() ? "/run/perfetto/traced-consumer.sock"
110*6dbdd20aSAndroid Build Coastguard Worker                                 : "/tmp/perfetto-consumer";
111*6dbdd20aSAndroid Build Coastguard Worker     name = consumer_socket;
112*6dbdd20aSAndroid Build Coastguard Worker #endif
113*6dbdd20aSAndroid Build Coastguard Worker   }
114*6dbdd20aSAndroid Build Coastguard Worker   return name;
115*6dbdd20aSAndroid Build Coastguard Worker }
116*6dbdd20aSAndroid Build Coastguard Worker 
117*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
118