annotate extern/vera/src/executable_path.cpp @ 655:cda30ca5bb76

Irccd: style (controller) #782
author David Demelier <markand@malikania.fr>
date Tue, 27 Mar 2018 20:30:59 +0200
parents a7c0eb100760
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
548
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 //
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 // Copyright (C) 2014 Ben Key
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 // Distributed under the Boost Software License, Version 1.0.
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 // (See accompanying file LICENSE_1_0.txt or copy at
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 // http://www.boost.org/LICENSE_1_0.txt)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 //
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
7
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 #include <stdio.h>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 #include <stdlib.h>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 #include <boost/filesystem/operations.hpp>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 #include <boost/filesystem/path.hpp>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
12
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 #include "executable_path.h"
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
14
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 #if defined(_WIN32)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
16
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 # include <Windows.h>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 std::string executable_path(const char *argv0)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 char buf[1024] = {0};
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 DWORD ret = GetModuleFileNameA(NULL, buf, sizeof(buf));
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 if (ret == 0 || ret == sizeof(buf))
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 return executable_path_fallback(argv0);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 return buf;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #elif defined(__APPLE__)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 # include <mach-o/dyld.h>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 std::string executable_path(const char *argv0)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 char buf[1024] = {0};
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 uint32_t size = sizeof(buf);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 int ret = _NSGetExecutablePath(buf, &size);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 if (0 != ret)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 return executable_path_fallback(argv0);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 boost::filesystem::path full_path(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 boost::filesystem::system_complete(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 boost::filesystem::path(buf).normalize()));
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 return full_path.string();
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 #elif defined(sun) || defined(__sun)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
50
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 # include <stdlib.h>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 std::string executable_path(const char *argv0)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 return getexecname();
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
57
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 #elif defined(__FreeBSD__)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 # include <sys/sysctl.h>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 std::string executable_path(const char *argv0)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 int mib[4] = {0};
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 mib[0] = CTL_KERN;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 mib[1] = KERN_PROC;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 mib[2] = KERN_PROC_PATHNAME;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 mib[3] = -1;
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 char buf[1024] = {0};
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 size_t size = sizeof(buf);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 sysctl(mib, 4, buf, &size, NULL, 0);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 if (size == 0 || size == sizeof(buf))
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 return executable_path_fallback(argv0);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 std::string path(buf, size);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 boost::filesystem::path full_path(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 boost::filesystem::system_complete(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 boost::filesystem::path(path).normalize()));
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 return full_path.string();
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 #elif defined(__linux__)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
84
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 # include <unistd.h>
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
86
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 std::string executable_path(const char *argv0)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 char buf[1024] = {0};
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 ssize_t size = readlink("/proc/self/exe", buf, sizeof(buf));
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 if (size == 0 || size == sizeof(buf))
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 return executable_path_fallback(argv0);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 std::string path(buf, size);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 boost::filesystem::path full_path(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 boost::filesystem::system_complete(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 boost::filesystem::path(path).normalize()));
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 return full_path.string();
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
101
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 #else
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
103
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 std::string executable_path(const char *argv0)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 return executable_path_fallback(argv0);
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 #endif
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
110
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 std::string executable_path_fallback(const char *argv0)
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 if (0 == argv0 || 0 == argv0[0])
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 {
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 return "";
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 }
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 boost::filesystem::path full_path(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 boost::filesystem::system_complete(
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 boost::filesystem::path(argv0)));
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 return full_path.string();
a7c0eb100760 CMake: import vera++ 1.3.0, closes #729
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 }