GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/uname/uname.c Lines: 40 58 69.0 %
Date: 2017-11-07 Branches: 27 52 51.9 %

Line Branch Exec Source
1
/*	$OpenBSD: uname.c,v 1.19 2016/10/28 07:22:59 schwarze Exp $	*/
2
3
/*
4
 * Copyright (c) 1994 Winning Strategies, Inc.
5
 * All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 * 3. All advertising materials mentioning features or use of this software
16
 *    must display the following acknowledgement:
17
 *      This product includes software developed by Winning Strategies, Inc.
18
 * 4. The name of Winning Strategies, Inc. may not be used to endorse or
19
 *    promote products derived from this software without specific prior
20
 *    written permission.
21
 *
22
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
 */
33
34
#include <sys/param.h>	/* MACHINE_ARCH */
35
#include <sys/utsname.h>
36
37
#include <err.h>
38
#include <stdio.h>
39
#include <stdlib.h>
40
#include <unistd.h>
41
42
static void __dead usage(void);
43
44
#define	PRINT_SYSNAME		0x01
45
#define	PRINT_NODENAME		0x02
46
#define	PRINT_RELEASE		0x04
47
#define	PRINT_VERSION		0x08
48
#define	PRINT_MACHINE		0x10
49
#define	PRINT_ALL		0x1f
50
#define PRINT_MACHINE_ARCH	0x20
51
52
int
53
main(int argc, char *argv[])
54
{
55
212
	struct utsname u;
56
	int c;
57
	int space = 0;
58
	int print_mask = 0;
59
60
106
	if (pledge("stdio flock rpath cpath wpath", NULL) == -1)
61
		err(1, "pledge");
62
63
212
	while ((c = getopt(argc, argv, "amnrsvp")) != -1 ) {
64


106
		switch (c) {
65
		case 'a':
66
			print_mask |= PRINT_ALL;
67
			break;
68
		case 'm':
69
24
			print_mask |= PRINT_MACHINE;
70
24
			break;
71
		case 'n':
72
			print_mask |= PRINT_NODENAME;
73
			break;
74
		case 'p':
75
10
			print_mask |= PRINT_MACHINE_ARCH;
76
10
			break;
77
		case 'r':
78
24
			print_mask |= PRINT_RELEASE;
79
24
			break;
80
		case 's':
81
32
			print_mask |= PRINT_SYSNAME;
82
32
			break;
83
		case 'v':
84
16
			print_mask |= PRINT_VERSION;
85
16
			break;
86
		default:
87
			usage();
88
		}
89
	}
90
91
106
	if (optind != argc)
92
		usage();
93
94
106
	if (!print_mask)
95
		print_mask = PRINT_SYSNAME;
96
97
106
	if (uname(&u) == -1)
98
		err(1, NULL);
99
100
106
	if (print_mask & PRINT_SYSNAME) {
101
		space++;
102
32
		fputs(u.sysname, stdout);
103
32
	}
104
106
	if (print_mask & PRINT_NODENAME) {
105
		if (space++)
106
			putchar(' ');
107
108
		fputs(u.nodename, stdout);
109
	}
110
106
	if (print_mask & PRINT_RELEASE) {
111
24
		if (space++)
112
			putchar(' ');
113
114
24
		fputs(u.release, stdout);
115
24
	}
116
106
	if (print_mask & PRINT_VERSION) {
117
16
		if (space++)
118
			putchar(' ');
119
120
16
		fputs(u.version, stdout);
121
16
	}
122
106
	if (print_mask & PRINT_MACHINE) {
123
24
		if (space++)
124
			putchar(' ');
125
126
24
		fputs(u.machine, stdout);
127
24
	}
128
106
	if (print_mask & PRINT_MACHINE_ARCH) {
129
10
		if (space++)
130
			putchar(' ');
131
132
10
		fputs(MACHINE_ARCH, stdout);
133
10
	}
134
212
	putchar('\n');
135
136
106
	return 0;
137
106
}
138
139
static void __dead
140
usage(void)
141
{
142
	fprintf(stderr, "usage: uname [-amnprsv]\n");
143
	exit(1);
144
}