Pārlūkot izejas kodu

Add system information for linux

This adds support for printing system information on linux.
fryshorts 11 gadi atpakaļ
vecāks
revīzija
14e1549f7a
1 mainītis faili ar 114 papildinājumiem un 8 dzēšanām
  1. 114 8
      libobs/obs-nix.c

+ 114 - 8
libobs/obs-nix.c

@@ -19,6 +19,8 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <sys/sysinfo.h>
+#include <sys/utsname.h>
 #include "util/dstr.h"
 #include "obs.h"
 
@@ -121,14 +123,118 @@ char *obs_find_plugin_file(const char *file)
 	return NULL;
 }
 
+static void log_processor_info(void)
+{
+	FILE *fp;
+	int physical_id = -1;
+	int last_physical_id = -1;
+	char *line = NULL;
+	size_t linecap = 0;
+	struct dstr processor;
+
+	blog(LOG_INFO, "Processor: %lu logical cores",
+	     sysconf(_SC_NPROCESSORS_ONLN));
+
+	fp = fopen("/proc/cpuinfo", "r");
+	if (!fp)
+		return;
+
+	dstr_init(&processor);
+
+	while (getline(&line, &linecap, fp) != -1) {
+		if (!strncmp(line, "model name", 10)) {
+			char *start = strchr(line, ':');
+			if (!start || *(++start) == '\0')
+				continue;
+			dstr_copy(&processor, start);
+			dstr_resize(&processor, processor.len - 1);
+			dstr_depad(&processor);
+		}
+
+		if (!strncmp(line, "physical id", 11)) {
+			char *start = strchr(line, ':');
+			if (!start || *(++start) == '\0')
+				continue;
+			physical_id = atoi(start);
+		}
+
+		if (*line == '\n' && physical_id != last_physical_id) {
+			last_physical_id = physical_id;
+			blog(LOG_INFO, "Processor: %s", processor.array);
+		}
+	}
+
+	fclose(fp);
+	dstr_free(&processor);
+	free(line);
+}
+
+static void log_memory_info(void)
+{
+	struct sysinfo info;
+	if (sysinfo(&info) < 0)
+		return;
+
+	blog(LOG_INFO, "Physical Memory: %luMB Total",
+		info.totalram / 1024 / 1024);
+}
+
+static void log_kernel_version(void)
+{
+	struct utsname info;
+	if (uname(&info) < 0)
+		return;
+
+	blog(LOG_INFO, "Kernel Version: %s %s", info.sysname, info.release);
+}
+
+static void log_distribution_info(void)
+{
+	FILE *fp;
+	char *line = NULL;
+	size_t linecap = 0;
+	struct dstr distro;
+	struct dstr version;
+
+	fp = fopen("/etc/os-release", "r");
+	if (!fp) {
+		blog(LOG_INFO, "Distribution: Missing /etc/os-release !");
+		return;
+	}
+
+	dstr_init_copy(&distro, "Unknown");
+	dstr_init_copy(&version, "Unknown");
+
+	while (getline(&line, &linecap, fp) != -1) {
+		if (!strncmp(line, "NAME", 4)) {
+			char *start = strchr(line, '=');
+			if (!start || *(++start) == '\0')
+				continue;
+			dstr_copy(&distro, start);
+			dstr_resize(&distro, distro.len - 1);
+		}
+
+		if (!strncmp(line, "VERSION_ID", 10)) {
+			char *start = strchr(line, '=');
+			if (!start || *(++start) == '\0')
+				continue;
+			dstr_copy(&version, start);
+			dstr_resize(&version, version.len - 1);
+		}
+	}
+
+	blog(LOG_INFO, "Distribution: %s %s", distro.array, version.array);
+
+	fclose(fp);
+	dstr_free(&version);
+	dstr_free(&distro);
+	free(line);
+}
+
 void log_system_info(void)
 {
-	/* TODO */
-#if 0
-	log_processor_name();
-	log_processor_speed();
-	log_processor_cores();
-	log_available_memory();
-	log_distribution();
-#endif
+	log_processor_info();
+	log_memory_info();
+	log_kernel_version();
+	log_distribution_info();
 }