125 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*  uname - print system name			Author: Earl Chew */
 | |
| 
 | |
| /* Print the following system information as returned by the uname()
 | |
|  * function:
 | |
|  *
 | |
|  *	system name		Minix
 | |
|  *	node name		waddles
 | |
|  *	release name		1.5
 | |
|  *	version			10
 | |
|  *	machine name		i86
 | |
|  *	arch			i86	(Minix specific)
 | |
|  */
 | |
| 
 | |
| #include <sys/types.h>
 | |
| #include <sys/utsname.h>
 | |
| #include <stdarg.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| /* Define the uname components. */
 | |
| #define ALL	 ((unsigned) 0x1F)
 | |
| #define SYSNAME  ((unsigned) 0x01)
 | |
| #define NODENAME ((unsigned) 0x02)
 | |
| #define RELEASE  ((unsigned) 0x04)
 | |
| #define U_MACHINE  ((unsigned) 0x10)
 | |
| #define ARCH     ((unsigned) 0x20)
 | |
| 
 | |
| int main(int argc, char **argv );
 | |
| void print(int fd, ... );
 | |
| void usage(void );
 | |
| 
 | |
| #ifdef __STDC__
 | |
| void print(int fd, ...)
 | |
| #else
 | |
| void print(fd)
 | |
| int fd;
 | |
| #endif
 | |
| {
 | |
| /* Print a sequence of strings onto the named channel. */
 | |
|   va_list argp;
 | |
|   char *p;
 | |
| 
 | |
|   va_start(argp, fd);
 | |
|   while (1) {
 | |
| 	p = va_arg(argp, char *);
 | |
| 	if (p == (char *) NULL) break;
 | |
| 	write(fd, p, strlen(p));
 | |
|   }
 | |
|   va_end(argp);
 | |
| }
 | |
| 
 | |
| char *name;
 | |
| 
 | |
| void usage()
 | |
| {
 | |
|   print(STDERR_FILENO, "Usage: ", name, " -snrvmpa\n", (char *) NULL);
 | |
|   exit(EXIT_FAILURE);
 | |
| }
 | |
| 
 | |
| int main(argc, argv)
 | |
| int argc;
 | |
| char **argv;
 | |
| {
 | |
|   int info;
 | |
|   char *p;
 | |
|   struct utsname un;
 | |
| 
 | |
|   name = strrchr(argv[0], '/');
 | |
|   if (name == NULL) name = argv[0]; else name++;
 | |
| 
 | |
|   for (info = 0; argc > 1; argc--, argv++) {
 | |
|   	if (argv[1][0] == '-') {
 | |
|   		for (p = &argv[1][1]; *p; p++) {
 | |
|   			switch (*p) {
 | |
| 				case 'a': info |= ALL;      break;
 | |
| 				case 'm': info |= U_MACHINE;  break;
 | |
| 				case 'n': info |= NODENAME; break;
 | |
| 				case 'r': info |= RELEASE;  break;
 | |
| 				case 's': info |= SYSNAME;  break;
 | |
| 				case 'v': info |= RELEASE;  break;
 | |
| 				case 'p': info |= ARCH;     break;
 | |
| 				default: usage();
 | |
|   			}
 | |
| 		}
 | |
| 	} else {
 | |
| 		usage();
 | |
| 	}
 | |
|   }
 | |
| 
 | |
|   if (info == 0) info = strcmp(name, "arch") == 0 ? ARCH : SYSNAME;
 | |
| 
 | |
|   if (uname(&un) != 0) {
 | |
| 	print(STDERR_FILENO, "unable to determine uname values\n", (char *) NULL);
 | |
| 	exit(EXIT_FAILURE);
 | |
|   }
 | |
| 
 | |
|   if ((info & SYSNAME) != 0)
 | |
| 	print(STDOUT_FILENO, un.sysname, (char *) NULL);
 | |
|   if ((info & NODENAME) != 0) {
 | |
| 	if ((info & (SYSNAME)) != 0)
 | |
| 		print(STDOUT_FILENO, " ", (char *) NULL);
 | |
| 	print(STDOUT_FILENO, un.nodename, (char *) NULL);
 | |
|   }
 | |
|   if ((info & RELEASE) != 0) {
 | |
| 	if ((info & (SYSNAME|NODENAME)) != 0)
 | |
| 		print(STDOUT_FILENO, " ", (char *) NULL);
 | |
| 	print(STDOUT_FILENO, un.release, (char *) NULL);
 | |
| 	print(STDOUT_FILENO, ".", (char *) NULL);
 | |
| 	print(STDOUT_FILENO, un.version, (char *) NULL);
 | |
|   }
 | |
|   if ((info & U_MACHINE) != 0) {
 | |
| 	if ((info & (SYSNAME|NODENAME|RELEASE)) != 0)
 | |
| 		print(STDOUT_FILENO, " ", (char *) NULL);
 | |
| 	print(STDOUT_FILENO, un.machine, (char *) NULL);
 | |
|   }
 | |
|   if ((info & ARCH) != 0) {
 | |
| 	if ((info & (SYSNAME|NODENAME|RELEASE|U_MACHINE)) != 0)
 | |
| 		print(STDOUT_FILENO, " ", (char *) NULL);
 | |
| 	print(STDOUT_FILENO, un.arch, (char *) NULL);
 | |
|   }
 | |
|   print(STDOUT_FILENO, "\n", (char *) NULL);
 | |
|   return EXIT_SUCCESS;
 | |
| }
 | 
