annotate common/system.cpp @ 27:12dfbec74a9c

Docs: use Irccd.SystemError in functions throwing that error, #420
author David Demelier <markand@malikania.fr>
date Sat, 20 Feb 2016 10:35:43 +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 * system.cpp -- platform dependent functions for system inspection
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 <cstdlib>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <ctime>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdexcept>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <irccd-config.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #if defined(HAVE_SETPROGNAME)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 # include <cstdlib>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #if defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 # include <sys/types.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 # include <sys/timeb.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 # include <Windows.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 # include <Shlobj.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #else // All non Windows
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #if defined(IRCCD_SYSTEM_MAC)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 # include <sys/sysctl.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 #if defined(IRCCD_SYSTEM_LINUX)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 # include <sys/sysinfo.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 #endif
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 <sys/utsname.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 # include <sys/time.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 # include <sys/types.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 # include <unistd.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 # include <cerrno>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 # include <cstring>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 # include <stdexcept>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 # include <ctime>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
53
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 /* For sys::setGid */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 #if defined(HAVE_SETGID)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 # include <sys/types.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 # include <unistd.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 # include <grp.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 /* For sys::setUid */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 #if defined(HAVE_SETGID)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 # include <sys/types.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 # include <unistd.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 # include <pwd.h>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 #include "filesystem.h"
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 #include "logger.h"
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 #include "system.h"
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 #include "util.h"
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 namespace irccd {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 namespace sys {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
78
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 namespace {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 * setHelper
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 * ------------------------------------------------------------------
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 * This is an helper for setting the uid or gid. It accepts both numeric and string uid and gid.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 * If a name is specified as uid/group, the lookup function will be called and must be getpwname or
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 * getgrname. Then, to get the id from the returned structure (struct passwd, struct group), the getter
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 * function will return either pw_uid or gr_gid.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 * Finally, when the id is resolved, the setter function (setuid, setgid) will be called.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 *
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 * @param typeName the type of id (uid or gid)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 * @param value the value (numeric or name)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 * @param lookup the lookup function to resolve the name (getpwnam or getgrnam)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 * @param setter the function to apply the id (setuid or setgid)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 * @param getter the function to get the id from the informal structure
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 template <typename IntType, typename LookupFunc, typename SetterFunc, typename FieldGetter>
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 void setHelper(const std::string &typeName, const std::string &value, LookupFunc lookup, SetterFunc setter, FieldGetter getter)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 IntType id;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
103
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 if (util::isNumber(value)) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 id = std::stoi(value);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 } else {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 auto info = lookup(value.c_str());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 if (info == nullptr) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 log::warning() << "irccd: invalid " << typeName << ": " << std::strerror(errno) << std::endl;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 return;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 } else {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 id = getter(info);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
114
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 log::debug() << "irccd: " << typeName << " " << value << " resolved to: " << id << std::endl;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 }
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 if (setter(id) < 0)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
120 log::warning() << "irccd: could not set " << typeName << ": " << std::strerror(errno) << std::endl;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 log::info() << "irccd: setting " << typeName << " to " << value << std::endl;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 /*
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 * XXX: the setprogname() function keeps a pointer without copying it so when main's argv is modified, we're not using
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 * the same name so create our own copy.
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 std::string programNameCopy;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 } // !namespace
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
133
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 void setProgramName(std::string name) noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 programNameCopy = std::move(name);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
137
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 #if defined(HAVE_SETPROGNAME)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 setprogname(programNameCopy.c_str());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
142
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 const std::string &programName() noexcept
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 return programNameCopy;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
147
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 std::string name()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 #if defined(IRCCD_SYSTEM_LINUX)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 return "Linux";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 #elif defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 return "Windows";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 #elif defined(IRCCD_SYSTEM_FREEBSD)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 return "FreeBSD";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 #elif defined(IRCCD_SYSTEM_OPENBSD)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 return "OpenBSD";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 #elif defined(IRCCD_SYSTEM_NETBSD)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 return "NetBSD";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 #elif defined(IRCCD_SYSTEM_MAC)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 return "Mac";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 return "Unknown";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 std::string version()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 #if defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 auto version = GetVersion();
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 auto major = (DWORD)(LOBYTE(LOWORD(version)));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 auto minor = (DWORD)(HIBYTE(LOWORD(version)));
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
173
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 return std::to_string(major) + "." + std::to_string(minor);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 struct utsname uts;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
177
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 if (uname(&uts) < 0)
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
179 throw std::runtime_error(std::strerror(errno));
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
180
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 return std::string(uts.release);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
184
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 uint64_t uptime()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 #if defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 return ::GetTickCount64() / 1000;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 #elif defined(IRCCD_SYSTEM_LINUX)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 struct sysinfo info;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 if (sysinfo(&info) < 0)
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
193 throw std::runtime_error(std::strerror(errno));
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
194
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 return info.uptime;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 #elif defined(IRCCD_SYSTEM_MAC)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 struct timeval boottime;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
198 size_t length = sizeof (boottime);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 int mib[2] = { CTL_KERN, KERN_BOOTTIME };
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 if (sysctl(mib, 2, &boottime, &length, nullptr, 0) < 0)
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
202 throw std::runtime_error(std::strerror(errno));
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
203
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 time_t bsec = boottime.tv_sec, csec = time(nullptr);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 return difftime(csec, bsec);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 /* BSD */
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 struct timespec ts;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 if (clock_gettime(CLOCK_UPTIME, &ts) < 0)
23
03068f5ed79d Misc: various style issues, #419
David Demelier <markand@malikania.fr>
parents: 0
diff changeset
212 throw std::runtime_error(std::strerror(errno));
0
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 return ts.tv_sec;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 uint64_t ticks()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 #if defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 _timeb tp;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
222
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 _ftime(&tp);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
224
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
225 return tp.time * 1000LL + tp.millitm;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 struct timeval tp;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
228
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 gettimeofday(&tp, NULL);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
230
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 return tp.tv_sec * 1000LL + tp.tv_usec / 1000;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
234
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 std::string home()
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 #if defined(IRCCD_SYSTEM_WINDOWS)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 char path[MAX_PATH];
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
239
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 if (SHGetFolderPathA(nullptr, CSIDL_LOCAL_APPDATA, nullptr, 0, path) != S_OK)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 return "";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
242
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 return std::string(path);
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 #else
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 return env("HOME");
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 }
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::string env(const std::string &var)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 auto value = std::getenv(var.c_str());
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
252
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 if (value == nullptr)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 return "";
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
255
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 return value;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
258
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 #if defined(HAVE_SETUID)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
260
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 void setUid(const std::string &value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 setHelper<uid_t>("uid", value, &getpwnam, &setuid, [] (const struct passwd *pw) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 return pw->pw_uid;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 });
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 }
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
267
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
269
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 #if defined(HAVE_SETGID)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
271
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 void setGid(const std::string &value)
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 setHelper<gid_t>("gid", value, &getgrnam, &setgid, [] (const struct group *gr) {
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 return gr->gr_gid;
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 });
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 #endif
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
280
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 } // !sys
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
282
1158cffe5a5e Initial import
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 } // !irccd