1*c6638d34Stb /* $OpenBSD: uname.c,v 1.17 2015/12/24 15:01:24 tb 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 34b9fc9a72Sderaadt #include <sys/param.h> /* MACHINE_ARCH */ 35*c6638d34Stb #include <sys/utsname.h> 36*c6638d34Stb 37*c6638d34Stb #include <err.h> 38*c6638d34Stb #include <locale.h> 39df930be7Sderaadt #include <stdio.h> 4070ef01f6Sdavid #include <stdlib.h> 41df930be7Sderaadt #include <unistd.h> 42df930be7Sderaadt 4355d52c50Sderaadt static void usage(void); 44df930be7Sderaadt 45df930be7Sderaadt #define PRINT_SYSNAME 0x01 46df930be7Sderaadt #define PRINT_NODENAME 0x02 47df930be7Sderaadt #define PRINT_RELEASE 0x04 48df930be7Sderaadt #define PRINT_VERSION 0x08 49df930be7Sderaadt #define PRINT_MACHINE 0x10 50df930be7Sderaadt #define PRINT_ALL 0x1f 5185f521f9Sajacoutot #define PRINT_MACHINE_ARCH 0x20 52df930be7Sderaadt 53df930be7Sderaadt int 54dad987f9Sderaadt main(int argc, char *argv[]) 55df930be7Sderaadt { 56df930be7Sderaadt struct utsname u; 57df930be7Sderaadt int c; 58df930be7Sderaadt int space = 0; 59df930be7Sderaadt int print_mask = 0; 60df930be7Sderaadt 61df930be7Sderaadt setlocale(LC_ALL, ""); 62df930be7Sderaadt 630bd1216cSderaadt if (pledge("stdio", NULL) == -1) 640bd1216cSderaadt err(1, "pledge"); 65336f11d6Sderaadt 6634c9f3caSderaadt while ((c = getopt(argc, argv, "amnrsvp")) != -1 ) { 67df930be7Sderaadt switch (c) { 68df930be7Sderaadt case 'a': 69df930be7Sderaadt print_mask |= PRINT_ALL; 70df930be7Sderaadt break; 71df930be7Sderaadt case 'm': 72df930be7Sderaadt print_mask |= PRINT_MACHINE; 73df930be7Sderaadt break; 74df930be7Sderaadt case 'n': 75df930be7Sderaadt print_mask |= PRINT_NODENAME; 76df930be7Sderaadt break; 77*c6638d34Stb case 'p': 78*c6638d34Stb print_mask |= PRINT_MACHINE_ARCH; 79*c6638d34Stb break; 80df930be7Sderaadt case 'r': 81df930be7Sderaadt print_mask |= PRINT_RELEASE; 82df930be7Sderaadt break; 83df930be7Sderaadt case 's': 84df930be7Sderaadt print_mask |= PRINT_SYSNAME; 85df930be7Sderaadt break; 86df930be7Sderaadt case 'v': 87df930be7Sderaadt print_mask |= PRINT_VERSION; 88df930be7Sderaadt break; 89df930be7Sderaadt default: 90df930be7Sderaadt usage(); 91df930be7Sderaadt /* NOTREACHED */ 92df930be7Sderaadt } 93df930be7Sderaadt } 94df930be7Sderaadt 95df930be7Sderaadt if (optind != argc) { 96df930be7Sderaadt usage(); 97df930be7Sderaadt /* NOTREACHED */ 98df930be7Sderaadt } 99df930be7Sderaadt 100df930be7Sderaadt if (!print_mask) { 101df930be7Sderaadt print_mask = PRINT_SYSNAME; 102df930be7Sderaadt } 103df930be7Sderaadt 104*c6638d34Stb if (uname(&u)) 105df930be7Sderaadt err(1, NULL); 106df930be7Sderaadt 107df930be7Sderaadt if (print_mask & PRINT_SYSNAME) { 108df930be7Sderaadt space++; 109df930be7Sderaadt fputs(u.sysname, stdout); 110df930be7Sderaadt } 111df930be7Sderaadt if (print_mask & PRINT_NODENAME) { 112*c6638d34Stb if (space++) 113*c6638d34Stb putchar(' '); 114*c6638d34Stb 115df930be7Sderaadt fputs(u.nodename, stdout); 116df930be7Sderaadt } 117df930be7Sderaadt if (print_mask & PRINT_RELEASE) { 118*c6638d34Stb if (space++) 119*c6638d34Stb putchar(' '); 120*c6638d34Stb 121df930be7Sderaadt fputs(u.release, stdout); 122df930be7Sderaadt } 123df930be7Sderaadt if (print_mask & PRINT_VERSION) { 124*c6638d34Stb if (space++) 125*c6638d34Stb putchar(' '); 126*c6638d34Stb 127df930be7Sderaadt fputs(u.version, stdout); 128df930be7Sderaadt } 129df930be7Sderaadt if (print_mask & PRINT_MACHINE) { 130*c6638d34Stb if (space++) 131*c6638d34Stb putchar(' '); 132*c6638d34Stb 133df930be7Sderaadt fputs(u.machine, stdout); 134df930be7Sderaadt } 13585f521f9Sajacoutot if (print_mask & PRINT_MACHINE_ARCH) { 136*c6638d34Stb if (space++) 137*c6638d34Stb putchar(' '); 138*c6638d34Stb 13985f521f9Sajacoutot fputs(MACHINE_ARCH, stdout); 14034c9f3caSderaadt } 141df930be7Sderaadt putchar('\n'); 142df930be7Sderaadt 143*c6638d34Stb return 0; 144df930be7Sderaadt } 145df930be7Sderaadt 146df930be7Sderaadt static void 147dad987f9Sderaadt usage(void) 148df930be7Sderaadt { 14951ebfb2cSderaadt fprintf(stderr, "usage: uname [-amnprsv]\n"); 150df930be7Sderaadt exit(1); 151df930be7Sderaadt } 152