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