diff options
| author | Charles Cabergs <me@cacharle.xyz> | 2021-07-07 10:10:48 +0200 |
|---|---|---|
| committer | Charles Cabergs <me@cacharle.xyz> | 2021-07-07 10:10:48 +0200 |
| commit | ea770b8419686f9c8f71c20d275a832efc1b3f48 (patch) | |
| tree | 5dc92c968ffb4df3c97769f57dbb3fb7cc761454 | |
| parent | 851597449547251b36e35ee32813e6b1f51415ed (diff) | |
| download | coreutils-ea770b8419686f9c8f71c20d275a832efc1b3f48.tar.gz coreutils-ea770b8419686f9c8f71c20d275a832efc1b3f48.tar.bz2 coreutils-ea770b8419686f9c8f71c20d275a832efc1b3f48.zip | |
Added uname
| -rw-r--r-- | src/uname.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/uname.c b/src/uname.c new file mode 100644 index 0000000..0fbef58 --- /dev/null +++ b/src/uname.c @@ -0,0 +1,67 @@ +#define _POSIX_C_SOURCE 2 +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include <sys/utsname.h> + +enum name +{ + NAME_SYSNAME = 1 << 0, + NAME_NODENAME = 1 << 1, + NAME_RELEASE = 1 << 2, + NAME_VERSION = 1 << 3, + NAME_MACHINE = 1 << 4, + NAME_ALL = NAME_SYSNAME | NAME_NODENAME | NAME_RELEASE | NAME_VERSION | NAME_MACHINE, +}; + +static void print_name(char *name) +{ + static bool previous = false; + if (previous) + fputc(' ' ,stdout); + else + previous = true; + fputs(name, stdout); +} + +int main(int argc, char *argv[]) +{ + enum name names = 0; + int option; + while ((option = getopt(argc, argv, "amnrsv")) != -1) + { + switch (option) + { + case 'a': names |= NAME_ALL; break; + case 'm': names |= NAME_MACHINE; break; + case 'n': names |= NAME_NODENAME; break; + case 'r': names |= NAME_RELEASE; break; + case 's': names |= NAME_SYSNAME; break; + case 'v': names |= NAME_VERSION; break; + } + } + if (optind != argc) + { + fprintf(stderr, "%s: extra operand '%s'\n", argv[0], argv[optind]); + exit(1); + } + if (names == 0) + names = NAME_SYSNAME; + + struct utsname names_buf; + uname(&names_buf); + + if (names & NAME_SYSNAME) + print_name(names_buf.sysname); + if (names & NAME_NODENAME) + print_name(names_buf.nodename); + if (names & NAME_RELEASE) + print_name(names_buf.release); + if (names & NAME_VERSION) + print_name(names_buf.version); + if (names & NAME_MACHINE) + print_name(names_buf.machine); + fputc('\n', stdout); + return 0; +} |
