01b5f020c37c0d17b8d19f6dc766d9fd7fd43dce
[platform/upstream/coreutils.git] / src / uname.c
1 /* uname -- print system information
2    Copyright (C) 1989, 1991 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2, or (at your option)
7    any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software
16    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
17
18 /* Option               Example
19
20    -s, --sysname        SunOS
21    -n, --nodename       rocky8
22    -r, --release        4.0
23    -v, --version        
24    -m, --machine        sun
25    -a, --all            SunOS rocky8 4.0  sun
26
27    The default behavior is equivalent to `-s'.
28
29    David MacKenzie <djm@gnu.ai.mit.edu> */
30
31 #ifdef HAVE_CONFIG_H
32 #if defined (CONFIG_BROKETS)
33 /* We use <config.h> instead of "config.h" so that a compilation
34    using -I. -I$srcdir will use ./config.h rather than $srcdir/config.h
35    (which it would do because it found this file in $srcdir).  */
36 #include <config.h>
37 #else
38 #include "config.h"
39 #endif
40 #endif
41
42 #include <stdio.h>
43 #include <sys/types.h>
44 #include <sys/utsname.h>
45 #include <getopt.h>
46
47 #include "system.h"
48 #include "version.h"
49
50 void error ();
51
52 static void print_element ();
53 static void usage ();
54
55 /* Values that are bitwise or'd into `toprint'. */
56 /* Operating system name. */
57 #define PRINT_SYSNAME 1
58
59 /* Node name on a communications network. */
60 #define PRINT_NODENAME 2
61
62 /* Operating system release. */
63 #define PRINT_RELEASE 4
64
65 /* Operating system version. */
66 #define PRINT_VERSION 8
67
68 /* Machine hardware name. */
69 #define PRINT_MACHINE 16
70
71 /* Mask indicating which elements of the name to print. */
72 static unsigned char toprint;
73
74 /* The name this program was run with, for error messages. */
75 char *program_name;
76
77 /* If non-zero, display usage information and exit.  */
78 static int show_help;
79
80 /* If non-zero, print the version on standard output and exit.  */
81 static int show_version;
82
83 static struct option const long_options[] =
84 {
85   {"help", no_argument, &show_help, 1},
86   {"machine", no_argument, NULL, 'm'},
87   {"nodename", no_argument, NULL, 'n'},
88   {"release", no_argument, NULL, 'r'},
89   {"sysname", no_argument, NULL, 's'},
90   {"version", no_argument, &show_version, 1},
91   {"all", no_argument, NULL, 'a'},
92   {NULL, 0, NULL, 0}
93 };
94
95 void
96 main (argc, argv)
97      int argc;
98      char **argv;
99 {
100   struct utsname name;
101   int c;
102
103   program_name = argv[0];
104   toprint = 0;
105
106   while ((c = getopt_long (argc, argv, "snrvma", long_options, (int *) 0))
107          != EOF)
108     {
109       switch (c)
110         {
111         case 0:
112           break;
113
114         case 's':
115           toprint |= PRINT_SYSNAME;
116           break;
117
118         case 'n':
119           toprint |= PRINT_NODENAME;
120           break;
121
122         case 'r':
123           toprint |= PRINT_RELEASE;
124           break;
125
126         case 'v':
127           toprint |= PRINT_VERSION;
128           break;
129
130         case 'm':
131           toprint |= PRINT_MACHINE;
132           break;
133
134         case 'a':
135           toprint = PRINT_SYSNAME | PRINT_NODENAME | PRINT_RELEASE |
136             PRINT_VERSION | PRINT_MACHINE;
137           break;
138
139         default:
140           usage (1);
141         }
142     }
143
144   if (show_version)
145     {
146       printf ("%s\n", version_string);
147       exit (0);
148     }
149
150   if (show_help)
151     usage (0);
152
153   if (optind != argc)
154     usage (1);
155
156   if (toprint == 0)
157     toprint = PRINT_SYSNAME;
158
159   if (uname (&name) == -1)
160     error (1, errno, "cannot get system name");
161
162   print_element (PRINT_SYSNAME, name.sysname);
163   print_element (PRINT_NODENAME, name.nodename);
164   print_element (PRINT_RELEASE, name.release);
165   print_element (PRINT_VERSION, name.version);
166   print_element (PRINT_MACHINE, name.machine);
167
168   exit (0);
169 }
170
171 /* If the name element set in MASK is selected for printing in `toprint',
172    print ELEMENT; then print a space unless it is the last element to
173    be printed, in which case print a newline. */
174
175 static void
176 print_element (mask, element)
177      unsigned char mask;
178      char *element;
179 {
180   if (toprint & mask)
181     {
182       toprint &= ~mask;
183       printf ("%s%c", element, toprint ? ' ' : '\n');
184     }
185 }
186
187 static void
188 usage (status)
189      int status;
190 {
191   fprintf (status == 0 ? stdout : stderr, "\
192 Usage: %s [OPTION]...\n\
193 ",
194            program_name);
195
196   if (status != 0)
197     fprintf (stderr, "Try `%s --help' for more information.\n",
198              program_name);
199   else
200
201     printf ("\
202 \n\
203   -a, --all        print all information\n\
204   -m, --machine    print the machine (hardware) type\n\
205   -n, --nodename   print the machine's network node hostname\n\
206   -r, --release    print the operating system release\n\
207   -s, --sysname    print the operating system name\n\
208   -v               print the operating system version\n\
209       --help       display this help and exit\n\
210       --version    output version information and exit\n\
211 \n\
212 Without any OPTION, assume -s.\n\
213 ");
214
215   exit (status);
216 }