FEAT: uname

This commit is contained in:
boreddevnl 2026-04-15 23:36:42 +02:00
parent 6e90c3e197
commit 5141eaea60
2 changed files with 237 additions and 0 deletions

View file

@ -56,6 +56,7 @@ void create_man_entries(void) {
write_man_file("cc", "CC - C Compiler\n\nUsage: cc <file.c>\n\nThe BoredOS C Compiler. Compiles C source files into executables. (execute these with ./>file<)"); write_man_file("cc", "CC - C Compiler\n\nUsage: cc <file.c>\n\nThe BoredOS C Compiler. Compiles C source files into executables. (execute these with ./>file<)");
write_man_file("crash", "CRASH - Trigger kernel exception\n\nUsage: crash\n\nIntentionally triggers a null pointer dereference to test handlers."); write_man_file("crash", "CRASH - Trigger kernel exception\n\nUsage: crash\n\nIntentionally triggers a null pointer dereference to test handlers.");
write_man_file("sysfetch", "SYSFETCH - Show OS information\n\nUsage: sysfetch\n\nDisplays system information in a neofetch-like layout. Configurable via /Library/conf/sysfetch.cfg."); write_man_file("sysfetch", "SYSFETCH - Show OS information\n\nUsage: sysfetch\n\nDisplays system information in a neofetch-like layout. Configurable via /Library/conf/sysfetch.cfg.");
write_man_file("uname", "UNAME - Print system information\n\nUsage: uname [-amnoprsv]\n\nOptions:\n -a Print all information\n -s Kernel name\n -n Node name\n -r Kernel release\n -v Kernel build date and time\n -m Machine hardware name\n -p Processor type\n -o Operating system name");
write_man_file("meminfo", "MEMINFO - Memory usage stats\n\nUsage: meminfo\n\nDisplays current physical and virtual memory allocation statistics."); write_man_file("meminfo", "MEMINFO - Memory usage stats\n\nUsage: meminfo\n\nDisplays current physical and virtual memory allocation statistics.");
write_man_file("pci_list", "PCI_LIST - Scan PCI bus\n\nUsage: pci_list\n\nScans the PCI bus and lists all detected hardware devices."); write_man_file("pci_list", "PCI_LIST - Scan PCI bus\n\nUsage: pci_list\n\nScans the PCI bus and lists all detected hardware devices.");
write_man_file("reboot", "REBOOT - Restart system\n\nUsage: reboot\n\nRestarts the computer immediately."); write_man_file("reboot", "REBOOT - Restart system\n\nUsage: reboot\n\nRestarts the computer immediately.");

236
src/userland/cli/uname.c Normal file
View file

@ -0,0 +1,236 @@
// Copyright (c) 2023-2026 Chris (boreddevnl)
// This software is released under the GNU General Public License v3.0. See LICENSE file for details.
// This header needs to maintain in any file it is present in, as per the GPL license terms.
#include <stdlib.h>
#include <syscall.h>
#include <stdbool.h>
static void str_copy(char *dst, const char *src, int max_len) {
int i = 0;
if (!dst || max_len <= 0) return;
if (!src) { dst[0] = 0; return; }
while (i < max_len - 1 && src[i]) {
dst[i] = src[i];
i++;
}
dst[i] = 0;
}
static bool starts_with(const char *s, const char *prefix) {
if (!s || !prefix) return false;
while (*prefix) {
if (*s != *prefix) return false;
s++; prefix++;
}
return true;
}
static void trim_end(char *s) {
int len;
if (!s) return;
len = (int)strlen(s);
while (len > 0) {
char c = s[len - 1];
if (c == '\n' || c == '\r' || c == ' ' || c == '\t') {
s[len - 1] = 0;
len--;
} else {
break;
}
}
}
static const char *trim_start(const char *s) {
if (!s) return "";
while (*s == ' ' || *s == '\t') s++;
return s;
}
static void copy_range(char *dst, const char *start, int len, int max_len) {
int i;
if (!dst || max_len <= 0) return;
if (!start || len <= 0) { dst[0] = 0; return; }
if (len > max_len - 1) len = max_len - 1;
for (i = 0; i < len; i++) dst[i] = start[i];
dst[len] = 0;
trim_end(dst);
}
static void copy_line(const char *start, char *out, int out_len) {
int i = 0;
if (!start || !out || out_len <= 0) return;
while (start[i] && start[i] != '\n' && start[i] != '\r' && i < out_len - 1) {
out[i] = start[i];
i++;
}
out[i] = 0;
trim_end(out);
}
static int read_file_to_buf(const char *path, char *buf, int max_len) {
int fd;
int bytes;
if (!buf || max_len <= 0) return -1;
fd = sys_open(path, "r");
if (fd < 0) return -1;
bytes = sys_read(fd, buf, max_len - 1);
sys_close(fd);
if (bytes < 0) return -1;
buf[bytes] = 0;
return bytes;
}
static void parse_version_info(const char *vbuf,
char *os_name, int os_name_len,
char *kernel_name, int kernel_name_len,
char *kernel_ver, int kernel_ver_len,
char *build_str, int build_str_len) {
char line1[256] = {0};
char line2[256] = {0};
char line3[256] = {0};
const char *l2;
const char *l3;
const char *end;
if (!vbuf || !vbuf[0]) return;
copy_line(vbuf, line1, sizeof(line1));
l2 = strchr(vbuf, '\n');
if (l2) {
l2++;
copy_line(l2, line2, sizeof(line2));
l3 = strchr(l2, '\n');
if (l3) {
l3++;
copy_line(l3, line3, sizeof(line3));
}
}
if (line1[0]) {
end = strstr(line1, " [");
if (!end) end = strstr(line1, " Version");
if (!end) end = line1 + (int)strlen(line1);
copy_range(os_name, line1, (int)(end - line1), os_name_len);
}
if (line2[0]) {
const char *p = line2;
if (starts_with(p, "Kernel:")) {
p += 7;
if (*p == ' ') p++;
}
p = trim_start(p);
if (*p) {
const char *t = p;
while (*t && *t != ' ') t++;
copy_range(kernel_name, p, (int)(t - p), kernel_name_len);
while (*t == ' ') t++;
if (*t) copy_range(kernel_ver, t, (int)strlen(t), kernel_ver_len);
}
}
if (line3[0]) {
const char *p = line3;
if (starts_with(p, "Build:")) {
p += 6;
if (*p == ' ') p++;
}
p = trim_start(p);
if (*p) copy_range(build_str, p, (int)strlen(p), build_str_len);
}
}
static void parse_cpu_model(const char *buf, char *out, int out_len) {
const char *p;
const char *colon;
const char *end;
if (!buf || !out || out_len <= 0) return;
p = strstr(buf, "model name");
if (!p) return;
colon = strchr(p, ':');
if (!colon) return;
colon++;
colon = trim_start(colon);
end = colon;
while (*end && *end != '\n' && *end != '\r') end++;
copy_range(out, colon, (int)(end - colon), out_len);
}
static void print_usage(void) {
printf("Usage: uname [-amnoprsv]\n");
}
static void print_field(const char *value, bool *first) {
if (!value || !value[0]) value = "Unknown";
if (!*first) printf(" ");
printf("%s", value);
*first = false;
}
int main(int argc, char **argv) {
bool want_s = false;
bool want_n = false;
bool want_r = false;
bool want_v = false;
bool want_m = false;
bool want_p = false;
bool want_o = false;
bool any_flags = false;
for (int i = 1; i < argc; i++) {
const char *arg = argv[i];
if (!arg || arg[0] != '-' || arg[1] == 0) {
print_usage();
return 1;
}
for (int j = 1; arg[j]; j++) {
char c = arg[j];
if (c == 'a') {
want_s = want_n = want_r = want_v = want_m = want_p = want_o = true;
any_flags = true;
} else if (c == 's') { want_s = true; any_flags = true; }
else if (c == 'n') { want_n = true; any_flags = true; }
else if (c == 'r') { want_r = true; any_flags = true; }
else if (c == 'v') { want_v = true; any_flags = true; }
else if (c == 'm') { want_m = true; any_flags = true; }
else if (c == 'p') { want_p = true; any_flags = true; }
else if (c == 'o') { want_o = true; any_flags = true; }
else { print_usage(); return 1; }
}
}
if (!any_flags) want_s = true;
char vbuf[1024] = {0};
char cpubuf[2048] = {0};
char os_name[64] = "Unknown";
char kernel_name[64] = "Unknown";
char kernel_ver[64] = "Unknown";
char build_str[64] = "Unknown";
char processor[128] = {0};
if (read_file_to_buf("/proc/version", vbuf, sizeof(vbuf)) > 0) {
parse_version_info(vbuf, os_name, sizeof(os_name), kernel_name, sizeof(kernel_name),
kernel_ver, sizeof(kernel_ver), build_str, sizeof(build_str));
}
if (read_file_to_buf("/proc/cpuinfo", cpubuf, sizeof(cpubuf)) > 0) {
parse_cpu_model(cpubuf, processor, sizeof(processor));
}
const char *nodename = "boredos";
const char *machine = "x86_64";
if (!processor[0]) str_copy(processor, machine, sizeof(processor));
bool first = true;
if (want_s) print_field(kernel_name, &first);
if (want_n) print_field(nodename, &first);
if (want_r) print_field(kernel_ver, &first);
if (want_v) print_field(build_str, &first);
if (want_m) print_field(machine, &first);
if (want_p) print_field(processor, &first);
if (want_o) print_field(os_name, &first);
printf("\n");
return 0;
}