1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkGetExecutablePath.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include <linux/limits.h> 11*c8dee2aaSAndroid Build Coastguard Worker #include <sys/types.h> 12*c8dee2aaSAndroid Build Coastguard Worker #include <unistd.h> 13*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker // Note that /proc/self/exe is Linux-specific; this won't work on other UNIX systems. 16*c8dee2aaSAndroid Build Coastguard Worker SkGetExecutablePath()17*c8dee2aaSAndroid Build Coastguard Workerstd::string SkGetExecutablePath() { 18*c8dee2aaSAndroid Build Coastguard Worker std::string result(PATH_MAX, '\0'); 19*c8dee2aaSAndroid Build Coastguard Worker ssize_t len = readlink("/proc/self/exe", result.data(), result.size() - 1); 20*c8dee2aaSAndroid Build Coastguard Worker if (len < 0 || static_cast<size_t>(len) >= PATH_MAX - 1) { 21*c8dee2aaSAndroid Build Coastguard Worker result.clear(); 22*c8dee2aaSAndroid Build Coastguard Worker } else { 23*c8dee2aaSAndroid Build Coastguard Worker result.resize(len); 24*c8dee2aaSAndroid Build Coastguard Worker } 25*c8dee2aaSAndroid Build Coastguard Worker return result; 26*c8dee2aaSAndroid Build Coastguard Worker } 27