summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
author諏訪子 <suwako@076.moe>2024-06-18 01:43:55 +0900
committer諏訪子 <suwako@076.moe>2024-06-18 01:43:55 +0900
commita2bd4b2b5cee06e89084910171341e729fc215e2 (patch)
tree1e2a773c3748038176f44c0d16e58b3411b7125d /src
parent88cdbee9d9cfd258e1ef4117af556fc09b126427 (diff)
FreeBSD: ホスト名とモデル名の修正
Diffstat (limited to 'src')
-rw-r--r--src/host.c63
-rw-r--r--src/user.c63
2 files changed, 79 insertions, 47 deletions
diff --git a/src/host.c b/src/host.c
index 5369de2..010af9e 100644
--- a/src/host.c
+++ b/src/host.c
@@ -1,23 +1,24 @@
#include "host.h"
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#if defined(__linux__)
#include <unistd.h>
int skip = 0;
-#elif defined(__APPLE__)
-#include <stdlib.h>
#endif
-void run_host_command(const char *command) {
+const char *run_host_command(const char *command) {
char buf[64];
+ char *out = NULL;
+ size_t outsize = 0;
FILE *p = popen(command, "r");
if (!p) {
fprintf(stderr, "ホストコマンドを実効に失敗: %s", command);
- return;
+ return NULL;
}
while (fgets(buf, sizeof(buf), p) != NULL) {
@@ -40,28 +41,52 @@ void run_host_command(const char *command) {
skip = 1;
break;
}
-
- if (!skip) printf("%s", buf);
-#else
- printf("%s", buf);
#endif
+
+ size_t len = strlen(buf);
+ char *nout = realloc(out, outsize + len + 1);
+ if (nout == NULL) {
+ perror("メモリの役割に失敗");
+ free(out);
+ pclose(p);
+ return NULL;
+ }
+
+ out = nout;
+
+ memcpy(out + outsize, buf, len);
+ outsize += len;
+ out[outsize] = '\0';
}
pclose(p);
+
+ return out;
}
void display_host_model() {
-#if defined(__OpenBSD__) || defined(__FreeBSD__) || \
- defined(__DragonFly__)
- run_host_command("sysctl -n hw.vendor && echo \" \" && "
+#if defined(__OpenBSD__)
+ printf("%s", run_host_command("sysctl -n hw.vendor && echo \" \" && "
"sysctl -n hw.version && echo \" \" &&"
- "sysctl -n hw.product");
+ "sysctl -n hw.product"));
+#elif defined(__FreeBSD__)
+ const char *family = run_host_command("kenv | grep smbios.system.family | "
+ "sed 's/\"//g' | sed 's/smbios.system.family=//'");
+ if (strncmp(family, " ", strlen(family)) == 0) {
+ family = run_host_command("kenv | grep smbios.system.version | "
+ "sed 's/\"//g' | sed 's/smbios.system.version=//'");
+ }
+ const char *product = run_host_command("kenv | grep smbios.system.product | "
+ "sed 's/\"//g' | sed 's/smbios.system.product=//'");
+ const char *maker = run_host_command("kenv | grep smbios.system.maker | "
+ "sed 's/\"//g' | sed 's/smbios.system.maker=//'");
+ printf("%s %s %s", maker, family, product);
#elif defined(__NetBSD__)
- run_host_command("sysctl -n machdep.dmi.system-vendor && "
+ printf("%s", run_host_command("sysctl -n machdep.dmi.system-vendor && "
"echo \" \" && sysctl -n machdep.dmi.system-version && "
- "echo \" \" && sysctl -n machdep.dmi.system-product");
+ "echo \" \" && sysctl -n machdep.dmi.system-product"));
#elif defined(__sun)
- run_host_command("prtconf -b | awk -F':' '/banner-name/ {printf $2}'");
+ printf("%s", run_host_command("prtconf -b | awk -F':' '/banner-name/ {printf $2}'"));
#elif defined(__linux__)
const char *cmd1 = NULL;
const char *cmd2 = NULL;
@@ -83,15 +108,15 @@ void display_host_model() {
if (!cmd1) {
printf("Unknown");
} else {
- run_host_command(cmd1);
+ printf("%s", run_host_command(cmd1));
}
if (cmd2) {
- printf(" ");
- run_host_command(cmd2);
+ const char *model = run_host_command(cmd2);
+ if (!skip) printf(" %s", model);
}
#elif defined(__APPLE__)
- run_host_command("sysctl -n hw.model");
+ printf("%s", run_host_command("sysctl -n hw.model"));
FILE *p = popen("kextstat | grep -F -e \"FakeSMC\" -e \"VirtualSMC\"", "r");
if (!p) {
diff --git a/src/user.c b/src/user.c
index 9c01c82..a3805d5 100644
--- a/src/user.c
+++ b/src/user.c
@@ -3,55 +3,62 @@
#include <stdio.h>
#include <string.h>
-void display_user_name() {
- char buf[128];
- FILE *p = popen("whoami", "r");
+void run_user_command(const char *command) {
+ char buf[64];
+#if defined(__NetBSD__) || defined(__FreeBSD__)
+ FILE *p = popen(command, "r");
if (!p) {
- fprintf(stderr, "「whoami」コマンドを実効に失敗");
+ snprintf(buf, sizeof(buf), "「%s」コマンドを見つけられません。", command);
+ perror(buf);
return;
}
while (fgets(buf, sizeof(buf), p) != NULL) {
- buf[strcspn(buf, "\n")] = '\0';
printf("%s", buf);
}
pclose(p);
-}
-
-void display_user_host() {
- char buf[64];
-#ifdef __NetBSD__
- FILE *p = popen("hostname", "r");
- if (!p) {
- perror("hostnameコマンドを見つけられません。");
+ //
+#else
+ FILE *f = fopen(command, "r");
+ if (!f) {
+ snprintf(buf, sizeof(buf), "「%s」ファイルを見つけられません。", command);
+ perror(buf);
return;
}
- while (fgets(buf, sizeof(buf), p) != NULL) {
- buf[strcspn(buf, "\n")] = '\0';
+ while (fgets(buf, sizeof(buf), f) != NULL) {
printf("%s", buf);
}
- pclose(p);
-#else
- const char *filename;
-#ifdef __OpenBSD__
- filename = "/etc/myname";
-#else
- filename = "/etc/hostname";
+ fclose(f);
#endif
- FILE *f = fopen(filename, "r");
- if (!f) {
- snprintf(buf, sizeof(buf), "「%s」ファイルを見つけられません。", filename);
- perror(buf);
+}
+
+void display_user_name() {
+ char buf[128];
+ FILE *p = popen("whoami", "r");
+ if (!p) {
+ fprintf(stderr, "「whoami」コマンドを実効に失敗");
return;
}
- while (fgets(buf, sizeof(buf), f) != NULL) {
+ while (fgets(buf, sizeof(buf), p) != NULL) {
+ buf[strcspn(buf, "\n")] = '\0';
printf("%s", buf);
}
- fclose(f);
+ pclose(p);
+}
+
+void display_user_host() {
+#if defined(__OpenBSD__)
+ run_user_command("/etc/myname");
+#elif defined(__NetBSD__)
+ run_user_command("hostname");
+#elif defined(__FreeBSD__)
+ run_user_command("sysctl -n kern.hostname");
+#else
+ run_user_command("/etc/hostname");
#endif
}