|
44 | 44 | #if HAVE_DECL_GETIFADDRS
|
45 | 45 | #include <ifaddrs.h>
|
46 | 46 | #endif
|
| 47 | +#if HAVE_SYSCTL |
| 48 | +#include <sys/sysctl.h> |
| 49 | +#if HAVE_VM_VM_PARAM_H |
| 50 | +#include <vm/vm_param.h> |
| 51 | +#endif |
| 52 | +#if HAVE_SYS_RESOURCES_H |
| 53 | +#include <sys/resources.h> |
| 54 | +#endif |
| 55 | +#if HAVE_SYS_VMMETER_H |
| 56 | +#include <sys/vmmeter.h> |
| 57 | +#endif |
| 58 | +#endif |
47 | 59 |
|
48 | 60 | //! Necessary on some platforms
|
49 | 61 | extern char** environ;
|
@@ -149,6 +161,23 @@ void AddPath(CSHA512& hasher, const char *path)
|
149 | 161 | }
|
150 | 162 | #endif
|
151 | 163 |
|
| 164 | +#if HAVE_SYSCTL |
| 165 | +template<int... S> |
| 166 | +void AddSysctl(CSHA512& hasher) |
| 167 | +{ |
| 168 | + int CTL[sizeof...(S)] = {S...}; |
| 169 | + unsigned char buffer[65536]; |
| 170 | + size_t siz = 65536; |
| 171 | + int ret = sysctl(CTL, sizeof...(S), buffer, &siz, nullptr, 0); |
| 172 | + if (ret == 0 || (ret == -1 && errno == ENOMEM)) { |
| 173 | + hasher << sizeof(CTL); |
| 174 | + hasher.Write((const unsigned char*)CTL, sizeof(CTL)); |
| 175 | + if (siz > sizeof(buffer)) siz = sizeof(buffer); |
| 176 | + hasher << siz; |
| 177 | + hasher.Write(buffer, siz); |
| 178 | + } |
| 179 | +} |
| 180 | +#endif |
152 | 181 |
|
153 | 182 | } // namespace
|
154 | 183 |
|
@@ -217,6 +246,30 @@ void RandAddDynamicEnv(CSHA512& hasher)
|
217 | 246 | AddFile(hasher, "/proc/self/status");
|
218 | 247 | #endif
|
219 | 248 |
|
| 249 | +#if HAVE_SYSCTL |
| 250 | +# ifdef CTL_KERN |
| 251 | +# if defined(KERN_PROC) && defined(KERN_PROC_ALL) |
| 252 | + AddSysctl<CTL_KERN, KERN_PROC, KERN_PROC_ALL>(hasher); |
| 253 | +# endif |
| 254 | +# endif |
| 255 | +# ifdef CTL_HW |
| 256 | +# ifdef HW_DISKSTATS |
| 257 | + AddSysctl<CTL_HW, HW_DISKSTATS>(hasher); |
| 258 | +# endif |
| 259 | +# endif |
| 260 | +# ifdef CTL_VM |
| 261 | +# ifdef VM_LOADAVG |
| 262 | + AddSysctl<CTL_VM, VM_LOADAVG>(hasher); |
| 263 | +# endif |
| 264 | +# ifdef VM_TOTAL |
| 265 | + AddSysctl<CTL_VM, VM_TOTAL>(hasher); |
| 266 | +# endif |
| 267 | +# ifdef VM_METER |
| 268 | + AddSysctl<CTL_VM, VM_METER>(hasher); |
| 269 | +# endif |
| 270 | +# endif |
| 271 | +#endif |
| 272 | + |
220 | 273 | // Stack and heap location
|
221 | 274 | void* addr = malloc(4097);
|
222 | 275 | hasher << &addr << addr;
|
@@ -299,8 +352,81 @@ void RandAddStaticEnv(CSHA512& hasher)
|
299 | 352 | AddFile(hasher, "/etc/resolv.conf");
|
300 | 353 | AddFile(hasher, "/etc/timezone");
|
301 | 354 | AddFile(hasher, "/etc/localtime");
|
| 355 | +#endif |
302 | 356 |
|
303 |
| - /* TODO: sysctl's for OSX to fetch information not available from /proc */ |
| 357 | + // For MacOS/BSDs, gather data through sysctl instead of /proc. Not all of these |
| 358 | + // will exist on every system. |
| 359 | +#if HAVE_SYSCTL |
| 360 | +# ifdef CTL_HW |
| 361 | +# ifdef HW_MACHINE |
| 362 | + AddSysctl<CTL_HW, HW_MACHINE>(hasher); |
| 363 | +# endif |
| 364 | +# ifdef HW_MODEL |
| 365 | + AddSysctl<CTL_HW, HW_MODEL>(hasher); |
| 366 | +# endif |
| 367 | +# ifdef HW_NCPU |
| 368 | + AddSysctl<CTL_HW, HW_NCPU>(hasher); |
| 369 | +# endif |
| 370 | +# ifdef HW_PHYSMEM |
| 371 | + AddSysctl<CTL_HW, HW_PHYSMEM>(hasher); |
| 372 | +# endif |
| 373 | +# ifdef HW_USERMEM |
| 374 | + AddSysctl<CTL_HW, HW_USERMEM>(hasher); |
| 375 | +# endif |
| 376 | +# ifdef HW_MACHINE_ARCH |
| 377 | + AddSysctl<CTL_HW, HW_MACHINE_ARCH>(hasher); |
| 378 | +# endif |
| 379 | +# ifdef HW_REALMEM |
| 380 | + AddSysctl<CTL_HW, HW_REALMEM>(hasher); |
| 381 | +# endif |
| 382 | +# ifdef HW_CPU_FREQ |
| 383 | + AddSysctl<CTL_HW, HW_CPU_FREQ>(hasher); |
| 384 | +# endif |
| 385 | +# ifdef HW_BUS_FREQ |
| 386 | + AddSysctl<CTL_HW, HW_BUS_FREQ>(hasher); |
| 387 | +# endif |
| 388 | +# ifdef HW_CACHELINE |
| 389 | + AddSysctl<CTL_HW, HW_CACHELINE>(hasher); |
| 390 | +# endif |
| 391 | +# endif |
| 392 | +# ifdef CTL_KERN |
| 393 | +# ifdef KERN_BOOTFILE |
| 394 | + AddSysctl<CTL_KERN, KERN_BOOTFILE>(hasher); |
| 395 | +# endif |
| 396 | +# ifdef KERN_BOOTTIME |
| 397 | + AddSysctl<CTL_KERN, KERN_BOOTTIME>(hasher); |
| 398 | +# endif |
| 399 | +# ifdef KERN_CLOCKRATE |
| 400 | + AddSysctl<CTL_KERN, KERN_CLOCKRATE>(hasher); |
| 401 | +# endif |
| 402 | +# ifdef KERN_HOSTID |
| 403 | + AddSysctl<CTL_KERN, KERN_HOSTID>(hasher); |
| 404 | +# endif |
| 405 | +# ifdef KERN_HOSTUUID |
| 406 | + AddSysctl<CTL_KERN, KERN_HOSTUUID>(hasher); |
| 407 | +# endif |
| 408 | +# ifdef KERN_HOSTNAME |
| 409 | + AddSysctl<CTL_KERN, KERN_HOSTNAME>(hasher); |
| 410 | +# endif |
| 411 | +# ifdef KERN_OSRELDATE |
| 412 | + AddSysctl<CTL_KERN, KERN_OSRELDATE>(hasher); |
| 413 | +# endif |
| 414 | +# ifdef KERN_OSRELEASE |
| 415 | + AddSysctl<CTL_KERN, KERN_OSRELEASE>(hasher); |
| 416 | +# endif |
| 417 | +# ifdef KERN_OSREV |
| 418 | + AddSysctl<CTL_KERN, KERN_OSREV>(hasher); |
| 419 | +# endif |
| 420 | +# ifdef KERN_OSTYPE |
| 421 | + AddSysctl<CTL_KERN, KERN_OSTYPE>(hasher); |
| 422 | +# endif |
| 423 | +# ifdef KERN_POSIX1 |
| 424 | + AddSysctl<CTL_KERN, KERN_OSREV>(hasher); |
| 425 | +# endif |
| 426 | +# ifdef KERN_VERSION |
| 427 | + AddSysctl<CTL_KERN, KERN_VERSION>(hasher); |
| 428 | +# endif |
| 429 | +# endif |
304 | 430 | #endif
|
305 | 431 |
|
306 | 432 | // Env variables
|
|
0 commit comments