blob: 8f439131e244ac3527b91effc271f7686326806d [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <getopt.h>
#include <limits.h>
#include <stdbool.h>
#include <stdio.h>
#include <unistd.h>
#include <zircon/syscalls.h>
enum {
DUMP_KERNEL_NAME = 1U << 1,
DUMP_NODENAME = 1U << 2,
DUMP_KERNEL_RELEASE = 1U << 3,
DUMP_KERNEL_VERSION = 1U << 4,
DUMP_MACHINE = 1U << 5,
DUMP_OPERATING_SYSTEM = 1U << 6
};
static void usage(const char *exe_name) {
fprintf(stderr, "Usage: %s <options>...\n", exe_name);
fprintf(stderr, "Print system information\n");
fprintf(stderr, "\n");
fprintf(stderr, "Options:\n");
fprintf(stderr, " -a (--all) Equivalent to -mnrsv\n");
fprintf(stderr, " -s (--kernel-name) Print the kernel name\n");
fprintf(stderr, " -n (--nodename) Print the network hostname\n");
fprintf(stderr, " -r (--kernel-release) Print the kernel release\n");
fprintf(stderr, " -v (--kernel-version) Print the kernel version\n");
fprintf(stderr, " -m (--machine) Print the machine type\n");
fprintf(stderr, " -o (--operating-system) Print the operating system\n");
fprintf(stderr, " --help Print this message and exit\n");
}
/* Prints a single value out to stdout, without a trailing newline. */
static void print_string(const char *text) {
static bool first_text = true;
if (!first_text) {
putchar(' ');
} else {
first_text = false;
}
fputs(text, stdout);
}
int main(int argc, char *const argv[]) {
int selected_options = (argc == 1) ? DUMP_KERNEL_NAME : 0;
static struct option long_options[] = {
{"all", no_argument, 0, 'a'},
{"kernel-name", no_argument, 0, 's'},
{"nodename", no_argument, 0, 'n'},
{"kernel-release", no_argument, 0, 'r'},
{"kernel-version", no_argument, 0, 'v'},
{"machine", no_argument, 0, 'm'},
{"operating-system", no_argument, 0, 'o'},
{"help", no_argument, 0, 'h'},
};
bool opts_done = false;
while (!opts_done) {
switch (getopt_long(argc, argv, "asnrvmpioh", long_options, NULL)) {
case 'a':
/* -a is equivalent to -mnrsv */
selected_options |= DUMP_MACHINE | DUMP_NODENAME | DUMP_KERNEL_RELEASE |
DUMP_KERNEL_NAME | DUMP_KERNEL_VERSION;
break;
case 's':
selected_options |= DUMP_KERNEL_NAME;
break;
case 'n':
selected_options |= DUMP_NODENAME;
break;
case 'r':
selected_options |= DUMP_KERNEL_RELEASE;
break;
case 'v':
selected_options |= DUMP_KERNEL_VERSION;
break;
case 'm':
selected_options |= DUMP_MACHINE;
break;
case 'o':
selected_options |= DUMP_OPERATING_SYSTEM;
break;
case -1:
opts_done = true;
break;
case '?':
fprintf(stderr,
"Unrecognized option '%c'. Use --help for list of options\n",
optopt);
return 1;
case 'h':
usage(argv[0]);
return 0;
}
}
if (selected_options == 0) {
return 0;
}
/* Kernel name */
if (selected_options & DUMP_KERNEL_NAME) {
print_string("Zircon");
}
/* Network name */
if (selected_options & DUMP_NODENAME) {
char hostname[HOST_NAME_MAX + 1];
if (gethostname(hostname, sizeof(hostname)) == 0) {
hostname[sizeof(hostname) - 1] = '\0';
print_string(hostname);
} else {
print_string("unknown");
}
}
/* Kernel release */
if (selected_options & DUMP_KERNEL_RELEASE) {
print_string("prerelease");
}
/* Kernel version */
if (selected_options & DUMP_KERNEL_VERSION) {
print_string(zx_system_get_version_string().c_str);
}
/* Machine type */
if (selected_options & DUMP_MACHINE) {
#if defined(__x86_64__)
print_string("x86_64");
#elif defined(__aarch64__)
print_string("aarch64");
#else
print_string("unknown");
#endif
}
/* Operating system */
if (selected_options & DUMP_OPERATING_SYSTEM) {
print_string("Fuchsia");
}
putchar('\n');
return 0;
}