1*70ef01f6Sdavid /* $OpenBSD: uname.c,v 1.8 2003/07/10 00:06:51 david Exp $ */ 21258a77dSderaadt 3df930be7Sderaadt /* 4df930be7Sderaadt * Copyright (c) 1994 Winning Strategies, Inc. 5df930be7Sderaadt * All rights reserved. 6df930be7Sderaadt * 7df930be7Sderaadt * Redistribution and use in source and binary forms, with or without 8df930be7Sderaadt * modification, are permitted provided that the following conditions 9df930be7Sderaadt * are met: 10df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright 11df930be7Sderaadt * notice, this list of conditions and the following disclaimer. 12df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright 13df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the 14df930be7Sderaadt * documentation and/or other materials provided with the distribution. 15df930be7Sderaadt * 3. All advertising materials mentioning features or use of this software 16df930be7Sderaadt * must display the following acknowledgement: 17df930be7Sderaadt * This product includes software developed by Winning Strategies, Inc. 18df930be7Sderaadt * 4. The name of Winning Strategies, Inc. may not be used to endorse or 19df930be7Sderaadt * promote products derived from this software without specific prior 20df930be7Sderaadt * written permission. 21df930be7Sderaadt * 22df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23df930be7Sderaadt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24df930be7Sderaadt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25df930be7Sderaadt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26df930be7Sderaadt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27df930be7Sderaadt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28df930be7Sderaadt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29df930be7Sderaadt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30df930be7Sderaadt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31df930be7Sderaadt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32df930be7Sderaadt */ 33df930be7Sderaadt 34df930be7Sderaadt #ifndef lint 35*70ef01f6Sdavid static char rcsid[] = "$OpenBSD: uname.c,v 1.8 2003/07/10 00:06:51 david Exp $"; 36df930be7Sderaadt #endif /* not lint */ 37df930be7Sderaadt 3834c9f3caSderaadt #include <sys/param.h> 39df930be7Sderaadt #include <stdio.h> 40*70ef01f6Sdavid #include <stdlib.h> 41df930be7Sderaadt #include <locale.h> 42df930be7Sderaadt #include <unistd.h> 43df930be7Sderaadt #include <sys/utsname.h> 4434c9f3caSderaadt #include <sys/sysctl.h> 45df930be7Sderaadt #include <err.h> 46df930be7Sderaadt 4755d52c50Sderaadt static void usage(void); 48df930be7Sderaadt 49df930be7Sderaadt #define PRINT_SYSNAME 0x01 50df930be7Sderaadt #define PRINT_NODENAME 0x02 51df930be7Sderaadt #define PRINT_RELEASE 0x04 52df930be7Sderaadt #define PRINT_VERSION 0x08 53df930be7Sderaadt #define PRINT_MACHINE 0x10 54df930be7Sderaadt #define PRINT_ALL 0x1f 5534c9f3caSderaadt #define PRINT_PROCESSOR 0x20 56df930be7Sderaadt 57df930be7Sderaadt int 58dad987f9Sderaadt main(int argc, char *argv[]) 59df930be7Sderaadt { 60df930be7Sderaadt struct utsname u; 61df930be7Sderaadt int c; 62df930be7Sderaadt int space = 0; 63df930be7Sderaadt int print_mask = 0; 64df930be7Sderaadt 65df930be7Sderaadt setlocale(LC_ALL, ""); 66df930be7Sderaadt 6734c9f3caSderaadt while ((c = getopt(argc,argv,"amnrsvp")) != -1 ) { 68df930be7Sderaadt switch ( c ) { 69df930be7Sderaadt case 'a': 70df930be7Sderaadt print_mask |= PRINT_ALL; 71df930be7Sderaadt break; 72df930be7Sderaadt case 'm': 73df930be7Sderaadt print_mask |= PRINT_MACHINE; 74df930be7Sderaadt break; 75df930be7Sderaadt case 'n': 76df930be7Sderaadt print_mask |= PRINT_NODENAME; 77df930be7Sderaadt break; 78df930be7Sderaadt case 'r': 79df930be7Sderaadt print_mask |= PRINT_RELEASE; 80df930be7Sderaadt break; 81df930be7Sderaadt case 's': 82df930be7Sderaadt print_mask |= PRINT_SYSNAME; 83df930be7Sderaadt break; 84df930be7Sderaadt case 'v': 85df930be7Sderaadt print_mask |= PRINT_VERSION; 86df930be7Sderaadt break; 8734c9f3caSderaadt case 'p': 8834c9f3caSderaadt print_mask |= PRINT_PROCESSOR; 8934c9f3caSderaadt break; 90df930be7Sderaadt default: 91df930be7Sderaadt usage(); 92df930be7Sderaadt /* NOTREACHED */ 93df930be7Sderaadt } 94df930be7Sderaadt } 95df930be7Sderaadt 96df930be7Sderaadt if (optind != argc) { 97df930be7Sderaadt usage(); 98df930be7Sderaadt /* NOTREACHED */ 99df930be7Sderaadt } 100df930be7Sderaadt 101df930be7Sderaadt if (!print_mask) { 102df930be7Sderaadt print_mask = PRINT_SYSNAME; 103df930be7Sderaadt } 104df930be7Sderaadt 105df930be7Sderaadt if (uname(&u)) { 106df930be7Sderaadt err(1, NULL); 107df930be7Sderaadt /* NOTREACHED */ 108df930be7Sderaadt } 109df930be7Sderaadt 110df930be7Sderaadt if (print_mask & PRINT_SYSNAME) { 111df930be7Sderaadt space++; 112df930be7Sderaadt fputs(u.sysname, stdout); 113df930be7Sderaadt } 114df930be7Sderaadt if (print_mask & PRINT_NODENAME) { 115df930be7Sderaadt if (space++) putchar(' '); 116df930be7Sderaadt fputs(u.nodename, stdout); 117df930be7Sderaadt } 118df930be7Sderaadt if (print_mask & PRINT_RELEASE) { 119df930be7Sderaadt if (space++) putchar(' '); 120df930be7Sderaadt fputs(u.release, stdout); 121df930be7Sderaadt } 122df930be7Sderaadt if (print_mask & PRINT_VERSION) { 123df930be7Sderaadt if (space++) putchar(' '); 124df930be7Sderaadt fputs(u.version, stdout); 125df930be7Sderaadt } 126df930be7Sderaadt if (print_mask & PRINT_MACHINE) { 127df930be7Sderaadt if (space++) putchar(' '); 128df930be7Sderaadt fputs(u.machine, stdout); 129df930be7Sderaadt } 13034c9f3caSderaadt if (print_mask & PRINT_PROCESSOR) { 13134c9f3caSderaadt char buf[1024]; 13234c9f3caSderaadt size_t len; 13334c9f3caSderaadt int mib[2]; 13434c9f3caSderaadt 13534c9f3caSderaadt if (space++) putchar(' '); 13634c9f3caSderaadt mib[0] = CTL_HW; 13734c9f3caSderaadt mib[1] = HW_MODEL; 13834c9f3caSderaadt len = sizeof(buf); 13934c9f3caSderaadt if (sysctl(mib, 2, &buf, &len, NULL, 0) == -1) 14034c9f3caSderaadt err(1, "sysctl"); 141c3e1e82eSderaadt printf("%.*s", (int)len, buf); 14234c9f3caSderaadt } 143df930be7Sderaadt putchar('\n'); 144df930be7Sderaadt 145df930be7Sderaadt exit(0); 146df930be7Sderaadt /* NOTREACHED */ 147df930be7Sderaadt } 148df930be7Sderaadt 149df930be7Sderaadt static void 150dad987f9Sderaadt usage(void) 151df930be7Sderaadt { 15251ebfb2cSderaadt fprintf(stderr, "usage: uname [-amnprsv]\n"); 153df930be7Sderaadt exit(1); 154df930be7Sderaadt } 155