annotate common/path.cpp @ 25:afff3f16d86e

Docs: explain better plugin-reload, #421
author David Demelier <markand@malikania.fr>
date Tue, 16 Feb 2016 13:58:29 +0100
parents 03068f5ed79d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * path.cpp -- special paths inside irccd
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <algorithm>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <cassert>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <sstream>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <stdexcept>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <irccd-config.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #if defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 # include <Windows.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 # include <Shlobj.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 # if defined(IRCCD_SYSTEM_LINUX)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 # include <limits.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 # include <unistd.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 # include <cerrno>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 # include <cstring>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 # include <stdexcept>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 # endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 # if defined(IRCCD_SYSTEM_FREEBSD)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 # include <sys/types.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 # include <sys/sysctl.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 # include <limits.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
42
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 # include <array>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 # include <cerrno>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 # include <cstring>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 # include <stdexcept>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 # endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 # if defined(IRCCD_SYSTEM_MAC)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 # include <cerrno>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 # include <cstring>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 # include <unistd.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 # include <libproc.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 # endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 # include <xdg.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 #include "filesystem.h"
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 #include "path.h"
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 #include "system.h"
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 #include "util.h"
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 namespace irccd {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 namespace path {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 namespace {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 * Base program directory
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 * ------------------------------------------------------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 * This variable stores the program base directory. It is only enabled when irccd is relocatable because we can
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 * retrieve the base directory by removing WITH_BINDIR.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 * If it is empty, the program was not able to detect it (e.g. error, not supported).
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 #if defined(IRCCD_RELOCATABLE)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 std::string base;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 #if defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 std::string executablePath()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 std::string result;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 std::size_t size = PATH_MAX;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
90
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 result.resize(size);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 if (!(size = GetModuleFileNameA(nullptr, &result[0], size)))
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
94 throw std::runtime_error("GetModuleFileName error");
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
95
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 result.resize(size);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 return result;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
100
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 #elif defined(IRCCD_SYSTEM_LINUX)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 std::string executablePath()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 std::string result;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 result.resize(2048);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 auto size = readlink("/proc/self/exe", &result[0], 2048);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 if (size < 0)
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
112 throw std::invalid_argument(std::strerror(errno));
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 result.resize(size);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
115
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 return result;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
118
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 #elif defined(IRCCD_SYSTEM_FREEBSD)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 std::string executablePath()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 std::array<int, 4> mib{ { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 } };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 std::string result;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 std::size_t size = PATH_MAX + 1;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
126
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 result.resize(size);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
128
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 if (sysctl(mib.data(), 4, &result[0], &size, nullptr, 0) < 0)
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
130 throw std::runtime_error(std::strerror(errno));
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 result.resize(size);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 return result;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 #elif defined(IRCCD_SYSTEM_MAC)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 std::string executablePath()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 std::string result;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 std::size_t size = PROC_PIDPATHINFO_MAXSIZE;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 result.resize(size);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
145
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 if ((size = proc_pidpath(getpid(), &result[0], size)) == 0)
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
147 throw std::runtime_error(std::strerror(errno));
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
148
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 result.resize(size);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 return result;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
153
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
155
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 * TODO: add support for more systems here.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 * - NetBSD
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 * - OpenBSD
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 std::string executablePath()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 return "";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
167
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
169
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 #endif // !IRCCD_RELOCATABLE
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
171
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 * System paths
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 * ------------------------------------------------------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 * Compute system paths.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 * Do not call any of these functions if irccd is relocatable and base is unset.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
180
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 std::string systemConfig()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 #if defined(IRCCD_RELOCATABLE)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 assert(!base.empty());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 return base + WITH_CONFDIR;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 return fs::isAbsolute(WITH_CONFDIR) ? WITH_CONFDIR : std::string(PREFIX) + fs::Separator + WITH_CONFDIR;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 std::string systemData()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 #if defined(IRCCD_RELOCATABLE)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 assert(!base.empty());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
196
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 return base + WITH_DATADIR;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 return fs::isAbsolute(WITH_DATADIR) ? WITH_CONFDIR : std::string(PREFIX) + fs::Separator + WITH_DATADIR;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
202
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 std::string systemCache()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 #if defined(IRCCD_RELOCATABLE)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 assert(!base.empty());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
207
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 return base + WITH_CACHEDIR;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 return fs::isAbsolute(WITH_CACHEDIR) ? WITH_CACHEDIR : std::string(PREFIX) + fs::Separator + WITH_CACHEDIR;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 std::string systemPlugins()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 #if defined(IRCCD_RELOCATABLE)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 assert(!base.empty());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 return base + WITH_PLUGINDIR;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 return fs::isAbsolute(WITH_PLUGINDIR) ? WITH_PLUGINDIR : std::string(PREFIX) + fs::Separator + WITH_PLUGINDIR;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
224
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 * User paths
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 * ------------------------------------------------------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 * Compute user paths.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
231
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 * userConfig
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 * ---------------------------------------------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 * Get the path directory to the user configuration. Example:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 * Unix:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
239 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 * XDG_CONFIG_HOME/irccd
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 * HOME/.config/irccd
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 * Windows:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 * CSIDL_LOCAL_APPDATA/irccd/config
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 std::string userConfig()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 std::ostringstream oss;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
250
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 #if defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 char path[MAX_PATH];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
253
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 if (SHGetFolderPathA(nullptr, CSIDL_LOCAL_APPDATA, nullptr, 0, path) != S_OK) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 oss << "";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 } else {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 oss << path;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 oss << "\\irccd\\config\\";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 try {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 Xdg xdg;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
263
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 oss << xdg.configHome();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 oss << "/irccd/";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 } catch (const std::exception &) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 const char *home = getenv("HOME");
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
268
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 if (home != nullptr)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 oss << home;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
271
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 oss << "/.config/irccd/";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
275
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 return oss.str();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
278
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 * userData
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 * --------------------------------------------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 * Get the path to the data application.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 * Unix:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
287 * XDG_DATA_HOME/irccd
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 * HOME/.local/share/irccd
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 * Windows:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 * CSIDL_LOCAL_APPDATA
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 std::string userData()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 std::ostringstream oss;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
297
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 #if defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 char path[MAX_PATH];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
300
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 if (SHGetFolderPathA(nullptr, CSIDL_LOCAL_APPDATA, nullptr, 0, path) != S_OK)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
302 oss << "";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 else {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 oss << path;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 oss << "\\irccd\\share";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 try {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 Xdg xdg;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
310
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 oss << xdg.dataHome();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 oss << "/irccd/";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 } catch (const std::exception &) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 const char *home = getenv("HOME");
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
315
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 if (home != nullptr)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 oss << home;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
318
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 oss << "/.local/share/irccd/";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
322
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 return oss.str();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
325
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 * userCache
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 * --------------------------------------------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
329 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
330 * Directory for cache files.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 * Unix:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 * XDG_CACHE_HOME/irccd
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
335 * HOME/.cache/irccd
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 * Windows:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 * %TEMP% (e.g. C:\Users\<user>\AppData\Local\Temp)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
340 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 std::string userCache()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
342 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
343 std::ostringstream oss;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
344
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
345 #if defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 char path[MAX_PATH + 1];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
347
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 GetTempPathA(sizeof (path), path);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
349
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
350 oss << path << "\\irccd\\";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 try {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 Xdg xdg;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
354
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 oss << xdg.cacheHome();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 oss << "/irccd/";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
357 } catch (const std::exception &) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 const char *home = getenv("HOME");
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
359
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 if (home != nullptr)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 oss << home;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
362
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
363 oss << "/.cache/irccd/";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
366
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
367 return oss.str();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
368 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
369
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
370 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
371 * userPlugins
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
372 * --------------------------------------------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
373 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
374 * Path to the data + plugins.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
375 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
376 std::string userPlugins()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
377 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
378 return userData() + "/plugins/";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
379 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
380
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
381 } // !namespace
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
382
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
383 #if defined(IRCCD_SYSTEM_WINDOWS)
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
384 const char Separator(';');
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
385 #else
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
386 const char Separator(':');
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
387 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
388
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
389 void setApplicationPath(const std::string &argv0)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
390 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
391 #if defined(IRCCD_RELOCATABLE)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
392 try {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
393 base = executablePath();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
394 } catch (const std::exception &) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
395 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
396 * If an exception is thrown, that means the operatin system supports a function to get the executable
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
397 * path but it failed.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
398 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
399 * TODO: show a waning
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
400 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
401 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
402
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
403 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
404 * If we could not get the application path from the native function, check if argv[0] is an absolute path
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
405 * and use that from there.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
406 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
407 * Otherwise, search from the PATH.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
408 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
409 * In the worst case use current working directory.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
410 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
411 if (base.empty()) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
412 if (fs::isAbsolute(argv0)) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
413 base = argv0;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
414 } else {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
415 std::string name = fs::baseName(argv0);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
416
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
417 for (const auto &dir : util::split(sys::env("PATH"), std::string(1, Separator))) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
418 std::string path = dir + fs::Separator + name;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
419
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
420 if (fs::exists(path)) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
421 base = path;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
422 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
423 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
424 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
425
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
426 /* Not found in PATH? add dummy value */
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
427 if (base.empty())
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
428 base = std::string(".") + fs::Separator + WITH_BINDIR + fs::Separator + "dummy";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
429 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
430 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
431
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
432 /* Find bin/<progname> */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
433 auto pos = base.rfind(std::string(WITH_BINDIR) + fs::Separator + fs::baseName(base));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
434
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
435 if (pos != std::string::npos)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
436 base.erase(pos);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
437
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
438 /* Add trailing / or \\ for convenience */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
439 base = clean(base);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
440
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
441 assert(!base.empty());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
442 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
443 (void)argv0;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
444 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
445 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
446
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
447 std::string clean(std::string input)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
448 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
449 if (input.empty())
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
450 return input;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
451
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
452 /* First, remove any duplicates */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
453 input.erase(std::unique(input.begin(), input.end(), [&] (char c1, char c2) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
454 return c1 == c2 && (c1 == '/' || c1 == '\\');
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
455 }), input.end());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
456
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
457 /* Add a trailing / or \\ */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
458 char c = input[input.length() - 1];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
459 if (c != '/' && c != '\\')
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
460 input += fs::Separator;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
461
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
462 /* Now converts all / to \\ for Windows and the opposite for Unix */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
463 #if defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
464 std::replace(input.begin(), input.end(), '/', '\\');
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
465 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
466 std::replace(input.begin(), input.end(), '\\', '/');
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
467 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
468
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
469 return input;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
470 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
471
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
472 std::string get(Path path, Owner owner)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
473 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
474 assert(path >= PathConfig && path <= PathPlugins);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
475 assert(owner >= OwnerSystem && owner <= OwnerUser);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
476
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
477 std::string result;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
478
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
479 switch (owner) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
480 case OwnerSystem:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
481 switch (path) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
482 case PathCache:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
483 result = clean(systemCache());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
484 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
485 case PathConfig:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
486 result = clean(systemConfig());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
487 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
488 case PathData:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
489 result = clean(systemData());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
490 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
491 case PathPlugins:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
492 result = clean(systemPlugins());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
493 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
494 default:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
495 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
496 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
497 case OwnerUser:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
498 switch (path) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
499 case PathCache:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
500 result = clean(userCache());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
501 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
502 case PathConfig:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
503 result = clean(userConfig());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
504 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
505 case PathData:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
506 result = clean(userData());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
507 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
508 case PathPlugins:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
509 result = clean(userPlugins());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
510 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
511 default:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
512 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
513 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
514 default:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
515 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
516 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
517
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
518 return result;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
519 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
520
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
521 std::vector<std::string> list(Path path)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
522 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
523 assert(path >= PathConfig && path <= PathPlugins);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
524
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
525 std::vector<std::string> list;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
526
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
527 switch (path) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
528 case PathCache:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
529 list.push_back(clean(userCache()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
530 list.push_back(clean(systemCache()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
531 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
532 case PathConfig:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
533 list.push_back(clean(userConfig()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
534 list.push_back(clean(systemConfig()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
535 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
536 case PathData:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
537 list.push_back(clean(userData()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
538 list.push_back(clean(systemData()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
539 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
540 case PathPlugins:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
541 list.push_back(clean(fs::cwd()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
542 list.push_back(clean(userPlugins()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
543 list.push_back(clean(systemPlugins()));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
544 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
545 default:
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
546 break;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
547 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
548
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
549 return list;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
550 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
551
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
552 } // !path
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
553
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
554 } // !irccd