aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2021-07-07 10:10:48 +0200
committerCharles Cabergs <me@cacharle.xyz>2021-07-07 10:10:48 +0200
commitea770b8419686f9c8f71c20d275a832efc1b3f48 (patch)
tree5dc92c968ffb4df3c97769f57dbb3fb7cc761454 /src
parent851597449547251b36e35ee32813e6b1f51415ed (diff)
downloadcoreutils-ea770b8419686f9c8f71c20d275a832efc1b3f48.tar.gz
coreutils-ea770b8419686f9c8f71c20d275a832efc1b3f48.tar.bz2
coreutils-ea770b8419686f9c8f71c20d275a832efc1b3f48.zip
Added uname
Diffstat (limited to 'src')
-rw-r--r--src/uname.c67
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;
+}