123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- /* vim: tabstop=4 shiftwidth=4 noexpandtab
- * This file is part of ToaruOS and is released under the terms
- * of the NCSA / University of Illinois License - see LICENSE.md
- * Copyright (C) 2018 K. Lange
- *
- * uname - Print kernel version information
- *
- * Supports all the usual options (a,s,n,r,v,m,o)
- *
- * Note that o is hardcoded, which is also the situation in
- * the coreutils implementation, so I don't see that being
- * a problem. If you want to build this uname for Linux or
- * something... you'll have to change that.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/utsname.h>
- #define FLAG_SYSNAME 0x01
- #define FLAG_NODENAME 0x02
- #define FLAG_RELEASE 0x04
- #define FLAG_VERSION 0x08
- #define FLAG_MACHINE 0x10
- #define FLAG_OSNAME 0x20
- #define FLAG_ALL (FLAG_SYSNAME|FLAG_NODENAME|FLAG_RELEASE|FLAG_VERSION|FLAG_MACHINE|FLAG_OSNAME)
- #define _ITALIC "\033[3m"
- #define _END "\033[0m\n"
- void show_usage(int argc, char * argv[]) {
- fprintf(stderr,
- "uname - Print system version information.\n"
- "\n"
- "usage: %s [-asnrvm]\n"
- "\n"
- " -a " _ITALIC "Print the standard uname string we all love" _END
- " -s " _ITALIC "Print kernel name" _END
- " -n " _ITALIC "Print system name" _END
- " -r " _ITALIC "Print kernel version number" _END
- " -v " _ITALIC "Print the extra kernel version information" _END
- " -m " _ITALIC "Print the architecture name" _END
- " -o " _ITALIC "Print operating system name" _END
- "\n", argv[0]);
- exit(1);
- }
- int main(int argc, char * argv[]) {
- struct utsname u;
- int flags = 0;
- int space = 0;
- for (int i = 1; i < argc; ++i) {
- if (argv[i][0] == '-') {
- char *c = &argv[i][1];
- while (*c) {
- switch (*c) {
- case 'a':
- flags |= FLAG_ALL;
- break;
- case 's':
- flags |= FLAG_SYSNAME;
- break;
- case 'n':
- flags |= FLAG_NODENAME;
- break;
- case 'r':
- flags |= FLAG_RELEASE;
- break;
- case 'v':
- flags |= FLAG_VERSION;
- break;
- case 'm':
- flags |= FLAG_MACHINE;
- break;
- case 'o':
- flags |= FLAG_OSNAME;
- break;
- case 'h':
- default:
- show_usage(argc, argv);
- break;
- }
- c++;
- }
- }
- }
- uname(&u);
- if (!flags) {
- /* By default, we just print the kernel name */
- flags = FLAG_SYSNAME;
- }
- if (flags & FLAG_SYSNAME) {
- if (space++) printf(" ");
- printf("%s", u.sysname);
- }
- if (flags & FLAG_NODENAME) {
- if (space++) printf(" ");
- printf("%s", u.nodename);
- }
- if (flags & FLAG_RELEASE) {
- if (space++) printf(" ");
- printf("%s", u.release);
- }
- if (flags & FLAG_VERSION) {
- if (space++) printf(" ");
- printf("%s", u.version);
- }
- if (flags & FLAG_MACHINE) {
- if (space++) printf(" ");
- printf("%s", u.machine);
- }
- if (flags & FLAG_OSNAME) {
- if (space++) printf(" ");
- printf("%s", "ToaruOS");
- }
- printf("\n");
- return 0;
- }
|