userspace: Implement uname utility
This commit is contained in:
parent
00e5749e20
commit
fc730679ed
|
|
@ -46,6 +46,7 @@ set(USERSPACE_PROGRAMS
|
||||||
Terminal
|
Terminal
|
||||||
touch
|
touch
|
||||||
u8sum
|
u8sum
|
||||||
|
uname
|
||||||
whoami
|
whoami
|
||||||
WindowServer
|
WindowServer
|
||||||
yes
|
yes
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
set(SOURCES
|
||||||
|
main.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(uname ${SOURCES})
|
||||||
|
banan_link_library(uname libc)
|
||||||
|
|
||||||
|
install(TARGETS uname OPTIONAL)
|
||||||
|
|
@ -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");
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue