-
Notifications
You must be signed in to change notification settings - Fork 13
/
jd_sysinfo.c
109 lines (89 loc) · 2.17 KB
/
jd_sysinfo.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// SPDX-License-Identifier: MIT
#define _GNU_SOURCE
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <libgen.h>
#include <sys/utsname.h>
#include <sys/klog.h>
#include <sys/sysinfo.h>
#include "jitterdebugger.h"
#define SYSLOG_ACTION_READ_ALL 3
#define SYSLOG_ACTION_SIZE_BUFFER 10
struct system_info *collect_system_info(void)
{
struct system_info *info;
struct utsname buf;
int err;
info = malloc(sizeof(*info));
if (!info)
err_handler(errno, "malloc()");
err = uname(&buf);
if (err)
err_handler(errno, "Could not retrieve name and information about current kernel");
info->sysname = jd_strdup(buf.sysname);
info->nodename = jd_strdup(buf.nodename);
info->release = jd_strdup(buf.release);
info->version = jd_strdup(buf.version);
info->machine = jd_strdup(buf.machine);
info->cpus_online = get_nprocs();
return info;
}
void store_system_info(const char *path, struct system_info *sysinfo)
{
char *buf;
FILE *fd;
unsigned int len;
jd_cp("/proc/cmdline", path);
jd_cp("/proc/config.gz", path);
jd_cp("/proc/cpuinfo", path);
jd_cp("/proc/interrupts", path);
jd_cp("/proc/sched_debug", path);
// cpus_online
fd = jd_fopen(path, "cpus_online", "w");
if (!fd)
return;
fprintf(fd, "%d\n", sysinfo->cpus_online);
fclose(fd);
// uname
fd = jd_fopen(path, "uname", "w");
if (!fd)
return;
fprintf(fd, "%s %s %s %s %s\n",
sysinfo->sysname,
sysinfo->nodename,
sysinfo->release,
sysinfo->version,
sysinfo->machine);
fclose(fd);
// dmesg
len = klogctl(SYSLOG_ACTION_SIZE_BUFFER, NULL, 0);
buf = malloc(len * sizeof(char));
if (!buf)
err_handler(errno, "malloc()");
if (klogctl(SYSLOG_ACTION_READ_ALL, buf, len) < 0)
return;
fd = jd_fopen(path, "dmesg", "w");
if (!fd) {
free(buf);
return;
}
if (fwrite(buf, sizeof(char), len, fd) != len)
warn_handler("writing dmesg failed\n");
fclose(fd);
free(buf);
}
void free_system_info(struct system_info *sysinfo)
{
if (sysinfo->sysname)
free(sysinfo->sysname);
if (sysinfo->nodename)
free(sysinfo->nodename);
if (sysinfo->release)
free(sysinfo->release);
if (sysinfo->version)
free(sysinfo->version);
if (sysinfo->machine)
free(sysinfo->machine);
free(sysinfo);
}