diff --git a/userspace/programs/CMakeLists.txt b/userspace/programs/CMakeLists.txt index b5e472bd..1a76d688 100644 --- a/userspace/programs/CMakeLists.txt +++ b/userspace/programs/CMakeLists.txt @@ -46,6 +46,7 @@ set(USERSPACE_PROGRAMS Terminal touch u8sum + uname whoami WindowServer yes diff --git a/userspace/programs/uname/CMakeLists.txt b/userspace/programs/uname/CMakeLists.txt new file mode 100644 index 00000000..48ae44a4 --- /dev/null +++ b/userspace/programs/uname/CMakeLists.txt @@ -0,0 +1,8 @@ +set(SOURCES + main.cpp +) + +add_executable(uname ${SOURCES}) +banan_link_library(uname libc) + +install(TARGETS uname OPTIONAL) diff --git a/userspace/programs/uname/main.cpp b/userspace/programs/uname/main.cpp new file mode 100644 index 00000000..2e436a7e --- /dev/null +++ b/userspace/programs/uname/main.cpp @@ -0,0 +1,90 @@ +#include +#include +#include + +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"); +}