micro-utils/src/coreutils/uname/uname.c

131 lines
1.9 KiB
C

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/utsname.h>
#include "config.h"
#if defined(OS_NAME)
#elif defined(__ANDROID__)
#define OS_NAME "Android"
#elif defined(__linux__)
#define OS_NAME "Linux"
#elif defined(__OpenBSD__)
#define OS_NAME "OpenBSD"
#elif defined(__FreeBSD_)
#define OS_NAME "FreeBSD"
#elif defined(__NetBSD_)
#define OS_NAME "NetBSD"
#else
#define OS_NAME "unknow"
#endif
enum {
SYSNAME,
NODENAME,
RELEASE,
VERSION,
MACHINE,
OS,
CPU,
ALL,
COUNT
};
char flags[COUNT];
unsigned int counter = 0;
void print(const char *msg) {
if (counter > 0 && !flags[ALL])
putchar(' ');
printf("%s", msg);
counter++;
if (flags[ALL] && counter <= COUNT)
putchar(' ');
}
int main(int argc, char **argv) {
struct utsname uts;
if (uname(&uts)) {
fprintf(stderr, "uname: %s", strerror(errno));
return 1;
}
if (argc == 1) {
printf("%s\n", uts.sysname);
return 0;
}
int opt;
while ((opt = getopt(argc, argv, "asnrvmop")) != -1) {
switch (opt) {
case 'a':
flags[ALL] = 1;
break;
case 's':
flags[SYSNAME] = 1;
break;
case 'n':
flags[NODENAME] = 1;
break;
case 'r':
flags[RELEASE] = 1;
break;
case 'v':
flags[VERSION] = 1;
break;
case 'm':
flags[MACHINE] = 1;
break;
case 'o':
flags[OS] = 1;
break;
case 'p':
flags[CPU] = 1;
break;
default:
printf("uname [asnrvmop]\n\t-a All\n\t-s Sys\n\t-n Nodename\n\t-r Release\n\t-v Version\n\t-m Machine\n\t-o Os name\n");
return 0;
}
}
if (flags[SYSNAME] || flags[ALL])
print(uts.sysname);
if (flags[NODENAME] || flags[ALL])
print(uts.nodename);
if (flags[RELEASE] || flags[ALL])
print(uts.release);
if (flags[VERSION] || flags[ALL])
print(uts.version);
if (flags[MACHINE] || flags[ALL])
print(uts.machine);
if (flags[OS] || flags[ALL])
print(OS_NAME);
if (flags[CPU] || flags[ALL])
print("unknow");
putchar('\n');
}