1 #include "linux_rawio.h"
9 friidump_linux_rawio_state friidump_linux_rawio_state_from_status_file(
10 const char *status_path,
11 unsigned long long *effective_mask) {
14 unsigned long long value;
20 if (!status_path || !status_path[0])
21 return FRIIDUMP_LINUX_RAWIO_UNKNOWN;
23 status = fopen(status_path, "rb");
25 return FRIIDUMP_LINUX_RAWIO_UNKNOWN;
27 while (fgets(line, sizeof(line), status)) {
28 if (strncmp(line, "CapEff:", 7) != 0)
32 value = strtoull(line + 7, &end, 16);
35 if (errno != 0 || end == line + 7)
36 return FRIIDUMP_LINUX_RAWIO_UNKNOWN;
39 *effective_mask = value;
41 return (value & (1ULL << FRIIDUMP_LINUX_CAP_SYS_RAWIO))
42 ? FRIIDUMP_LINUX_RAWIO_PRESENT
43 : FRIIDUMP_LINUX_RAWIO_MISSING;
47 return FRIIDUMP_LINUX_RAWIO_UNKNOWN;
50 friidump_linux_rawio_state friidump_linux_rawio_effective(
51 unsigned long long *effective_mask) {
52 return friidump_linux_rawio_state_from_status_file(
53 "/proc/self/status", effective_mask);
56 int friidump_linux_executable_path(char *buffer, size_t buffer_size) {
59 if (!buffer || buffer_size < 2)
63 length = readlink("/proc/self/exe", buffer, buffer_size - 1);
64 if (length <= 0 || (size_t) length >= buffer_size)
67 buffer[length] = '\0';