userspace: Implement uname utility

This commit is contained in:
Bananymous 2025-11-04 18:45:20 +02:00
parent 00e5749e20
commit fc730679ed
3 changed files with 99 additions and 0 deletions

View File

@ -46,6 +46,7 @@ set(USERSPACE_PROGRAMS
Terminal Terminal
touch touch
u8sum u8sum
uname
whoami whoami
WindowServer WindowServer
yes yes

View File

@ -0,0 +1,8 @@
set(SOURCES
main.cpp
)
add_executable(uname ${SOURCES})
banan_link_library(uname libc)
install(TARGETS uname OPTIONAL)

View File

@ -0,0 +1,90 @@
#include <getopt.h>
#include <stdio.h>
#include <sys/utsname.h>
int main(int argc, char** argv)
{
bool machine = false;
bool nodename = false;
bool release = false;
bool systemname = false;
bool version = false;
for (;;)
{
static option long_options[] {
{ "all", no_argument, nullptr, 'a' },
{ "machine", no_argument, nullptr, 'm' },
{ "kernel-release", no_argument, nullptr, 'r' },
{ "nodename", no_argument, nullptr, 'n' },
{ "kernel-name", no_argument, nullptr, 's' },
{ "kernel-version", no_argument, nullptr, 'v' },
{ "help", no_argument, nullptr, 0 },
};
int ch = getopt_long(argc, argv, "amnrsv", long_options, nullptr);
if (ch == -1)
break;
switch (ch)
{
case 0:
printf("usage: %s [OPTION]...\n", argv[0]);
printf(" -a, --all print all information\n");
printf(" -m, --machine print machine name\n");
printf(" -r, --release print release\n");
printf(" -n, --nodename print node name\n");
printf(" -s, --system print system name\n");
printf(" -v, --version print version\n");
return 0;
case 'a':
machine = true;
nodename = true;
release = true;
systemname = true;
version = true;
break;
case 'm':
machine = true;
break;
case 'n':
nodename = true;
break;
case 'r':
release = true;
break;
case 's':
systemname = true;
break;
case 'v':
version = true;
break;
case '?':
fprintf(stderr, "invalid option %c\n", optopt);
fprintf(stderr, "see '%s --help' for usage\n", argv[0]);
return 1;
}
}
if (!machine && !nodename && !release && !systemname && !version)
systemname = true;
utsname utsname;
if (uname(&utsname) == -1)
{
perror("uname: ");
return 1;
}
if (systemname)
printf("%s ", utsname.sysname);
if (nodename)
printf("%s ", utsname.nodename);
if (release)
printf("%s ", utsname.release);
if (version)
printf("%s ", utsname.version);
if (machine)
printf("%s ", utsname.machine);
printf("\n");
}