1da2e3ebdSchin /***********************************************************************
2da2e3ebdSchin * *
3da2e3ebdSchin * This software is part of the ast package *
4*3e14f97fSRoger A. Faulkner * Copyright (c) 1992-2010 AT&T Intellectual Property *
5da2e3ebdSchin * and is licensed under the *
6da2e3ebdSchin * Common Public License, Version 1.0 *
77c2fbfb3SApril Chin * by AT&T Intellectual Property *
8da2e3ebdSchin * *
9da2e3ebdSchin * A copy of the License is available at *
10da2e3ebdSchin * http://www.opensource.org/licenses/cpl1.0.txt *
11da2e3ebdSchin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
12da2e3ebdSchin * *
13da2e3ebdSchin * Information and Software Systems Research *
14da2e3ebdSchin * AT&T Research *
15da2e3ebdSchin * Florham Park NJ *
16da2e3ebdSchin * *
17da2e3ebdSchin * Glenn Fowler <gsf@research.att.com> *
18da2e3ebdSchin * David Korn <dgk@research.att.com> *
19da2e3ebdSchin * *
20da2e3ebdSchin ***********************************************************************/
21da2e3ebdSchin #pragma prototyped
22da2e3ebdSchin /*
23da2e3ebdSchin * David Korn
24da2e3ebdSchin * Glenn Fowler
25da2e3ebdSchin * AT&T Research
26da2e3ebdSchin *
27da2e3ebdSchin * uname
28da2e3ebdSchin */
29da2e3ebdSchin
30da2e3ebdSchin static const char usage[] =
317c2fbfb3SApril Chin "[-?\n@(#)$Id: uname (AT&T Research) 2007-04-19 $\n]"
32da2e3ebdSchin USAGE_LICENSE
33da2e3ebdSchin "[+NAME?uname - identify the current system ]"
34da2e3ebdSchin "[+DESCRIPTION?By default \buname\b writes the operating system name to"
35da2e3ebdSchin " standard output. When options are specified, one or more"
36da2e3ebdSchin " system characteristics are written to standard output, space"
37*3e14f97fSRoger A. Faulkner " separated, on a single line. When more than one option is specified"
38da2e3ebdSchin " the output is in the order specfied by the \b-A\b option below."
39da2e3ebdSchin " Unsupported option values are listed as \a[option]]\a. If any unknown"
40da2e3ebdSchin " options are specified then the local \b/usr/bin/uname\b is called.]"
41da2e3ebdSchin "[+?If any \aname\a operands are specified then the \bsysinfo\b(2) values"
42da2e3ebdSchin " for each \aname\a are listed, separated by space, on one line."
43da2e3ebdSchin " \bgetconf\b(1), a pre-existing \astandard\a interface, provides"
44da2e3ebdSchin " access to the same information; vendors should spend more time"
45da2e3ebdSchin " using standards than inventing them.]"
46da2e3ebdSchin "[+?Selected information is printed in the same order as the options below.]"
47da2e3ebdSchin "[a:all?Equivalent to \b-snrvmpio\b.]"
48da2e3ebdSchin "[s:system|sysname|kernel-name?The detailed kernel name. This is the default.]"
49da2e3ebdSchin "[n:nodename?The hostname or nodename.]"
50da2e3ebdSchin "[r:release|kernel-release?The kernel release level.]"
51da2e3ebdSchin "[v:version|kernel-version?The kernel version level.]"
52da2e3ebdSchin "[m:machine?The name of the hardware type the system is running on.]"
53da2e3ebdSchin "[p:processor?The name of the processor instruction set architecture.]"
54da2e3ebdSchin "[i:implementation|platform|hardware-platform?The hardware implementation;"
55da2e3ebdSchin " this is \b--host-id\b on some systems.]"
56da2e3ebdSchin "[o:operating-system?The generic operating system name.]"
57da2e3ebdSchin "[h:host-id|id?The host id in hex.]"
58da2e3ebdSchin "[d:domain?The domain name returned by \agetdomainname\a(2).]"
59da2e3ebdSchin "[R:extended-release?The extended release name.]"
60da2e3ebdSchin "[A:everything?Equivalent to \b-snrvmpiohdR\b.]"
61da2e3ebdSchin "[f:list?List all \bsysinfo\b(2) names and values, one per line.]"
62da2e3ebdSchin "[S:sethost?Set the hostname or nodename to \aname\a. No output is"
63da2e3ebdSchin " written to standard output.]:[name]"
647c2fbfb3SApril Chin "\n"
657c2fbfb3SApril Chin "\n[ name ... ]\n"
667c2fbfb3SApril Chin "\n"
67da2e3ebdSchin "[+SEE ALSO?\bhostname\b(1), \bgetconf\b(1), \buname\b(2),"
68da2e3ebdSchin " \bsysconf\b(2), \bsysinfo\b(2)]"
69da2e3ebdSchin ;
70da2e3ebdSchin
71da2e3ebdSchin #if defined(__STDPP__directive) && defined(__STDPP__hide)
72da2e3ebdSchin __STDPP__directive pragma pp:hide getdomainname gethostid gethostname sethostname
73da2e3ebdSchin #else
74da2e3ebdSchin #define getdomainname ______getdomainname
75da2e3ebdSchin #define gethostid ______gethostid
76da2e3ebdSchin #define gethostname ______gethostname
77da2e3ebdSchin #define sethostname ______sethostname
78da2e3ebdSchin #endif
79da2e3ebdSchin
80da2e3ebdSchin #include <cmd.h>
81da2e3ebdSchin #include <ctype.h>
82da2e3ebdSchin #include <proc.h>
83da2e3ebdSchin
84da2e3ebdSchin #include "FEATURE/utsname"
85da2e3ebdSchin
86da2e3ebdSchin #define MAXHOSTNAME 64
87da2e3ebdSchin
88da2e3ebdSchin #if _lib_uname && _sys_utsname
89da2e3ebdSchin
90da2e3ebdSchin #include <sys/utsname.h>
91da2e3ebdSchin
92da2e3ebdSchin #endif
93da2e3ebdSchin
94da2e3ebdSchin #if defined(__STDPP__directive) && defined(__STDPP__hide)
95da2e3ebdSchin __STDPP__directive pragma pp:nohide getdomainname gethostid gethostname sethostname
96da2e3ebdSchin #else
97da2e3ebdSchin #undef getdomainname
98da2e3ebdSchin #undef gethostid
99da2e3ebdSchin #undef gethostname
100da2e3ebdSchin #undef sethostname
101da2e3ebdSchin #endif
102da2e3ebdSchin
103da2e3ebdSchin #if _lib_getdomainname
104da2e3ebdSchin extern int getdomainname(char*, size_t);
105da2e3ebdSchin #endif
106da2e3ebdSchin #if _lib_gethostid
10734f9b3eeSRoland Mainz extern long gethostid(void);
108da2e3ebdSchin #endif
109da2e3ebdSchin #if _lib_gethostname
110da2e3ebdSchin extern int gethostname(char*, size_t);
111da2e3ebdSchin #endif
112da2e3ebdSchin #if _lib_sethostname
113da2e3ebdSchin extern int sethostname(const char*, size_t);
114da2e3ebdSchin #endif
115da2e3ebdSchin
116da2e3ebdSchin #ifndef HOSTTYPE
117da2e3ebdSchin #define HOSTTYPE "unknown"
118da2e3ebdSchin #endif
119da2e3ebdSchin
120da2e3ebdSchin static const char hosttype[] = HOSTTYPE;
121da2e3ebdSchin
122da2e3ebdSchin #if !_lib_uname || !_sys_utsname
123da2e3ebdSchin
124da2e3ebdSchin #if defined(__STDPP__)
125da2e3ebdSchin #define SYSNAME #(getprd machine)
126da2e3ebdSchin #define RELEASE #(getprd release)
127da2e3ebdSchin #define VERSION #(getprd version)
128da2e3ebdSchin #define MACHINE #(getprd architecture)
129da2e3ebdSchin #else
130da2e3ebdSchin #define SYSNAME ""
131da2e3ebdSchin #define RELEASE ""
132da2e3ebdSchin #define VERSION ""
133da2e3ebdSchin #define MACHINE ""
134da2e3ebdSchin #endif
135da2e3ebdSchin
136da2e3ebdSchin struct utsname
137da2e3ebdSchin {
138da2e3ebdSchin char* sysname;
139da2e3ebdSchin char nodename[MAXHOSTNAME];
140da2e3ebdSchin char* release;
141da2e3ebdSchin char* version;
142da2e3ebdSchin char* machine;
143da2e3ebdSchin };
144da2e3ebdSchin
145da2e3ebdSchin int
uname(register struct utsname * ut)146da2e3ebdSchin uname(register struct utsname* ut)
147da2e3ebdSchin {
148da2e3ebdSchin #ifdef HOSTTYPE
149da2e3ebdSchin char* sys = 0;
150da2e3ebdSchin char* arch = 0;
151da2e3ebdSchin
152da2e3ebdSchin if (*hosttype)
153da2e3ebdSchin {
154da2e3ebdSchin static char buf[sizeof(hosttype)];
155da2e3ebdSchin
156da2e3ebdSchin strcpy(buf, hosttype);
157da2e3ebdSchin sys = buf;
158da2e3ebdSchin if (arch = strchr(sys, '.'))
159da2e3ebdSchin {
160da2e3ebdSchin *arch++ = 0;
161da2e3ebdSchin if (!*arch)
162da2e3ebdSchin arch = 0;
163da2e3ebdSchin }
164da2e3ebdSchin if (!*sys)
165da2e3ebdSchin sys = 0;
166da2e3ebdSchin }
167da2e3ebdSchin #endif
168da2e3ebdSchin #ifdef _lib_gethostname
169da2e3ebdSchin if (gethostname(ut->nodename, sizeof(ut->nodename) - 1))
170da2e3ebdSchin return -1;
171da2e3ebdSchin #else
172da2e3ebdSchin strncpy(ut->nodename, "local", sizeof(ut->nodename) - 1);
173da2e3ebdSchin #endif
174da2e3ebdSchin #ifdef HOSTTYPE
175da2e3ebdSchin if (!(ut->sysname = sys))
176da2e3ebdSchin #endif
177da2e3ebdSchin if (!*(ut->sysname = SYSNAME))
178da2e3ebdSchin ut->sysname = ut->nodename;
179da2e3ebdSchin #ifdef HOSTTYPE
180da2e3ebdSchin if (!(ut->machine = arch))
181da2e3ebdSchin #endif
182da2e3ebdSchin ut->machine = MACHINE;
183da2e3ebdSchin ut->release = RELEASE;
184da2e3ebdSchin ut->version = VERSION;
185da2e3ebdSchin return 0;
186da2e3ebdSchin }
187da2e3ebdSchin
188da2e3ebdSchin #endif
189da2e3ebdSchin
190da2e3ebdSchin #define OPT_system (1<<0)
191da2e3ebdSchin #define OPT_nodename (1<<1)
192da2e3ebdSchin #define OPT_release (1<<2)
193da2e3ebdSchin #define OPT_version (1<<3)
194da2e3ebdSchin #define OPT_machine (1<<4)
195da2e3ebdSchin #define OPT_processor (1<<5)
196da2e3ebdSchin
197da2e3ebdSchin #define OPT_STANDARD 6
198da2e3ebdSchin
199da2e3ebdSchin #define OPT_implementation (1<<6)
200da2e3ebdSchin #define OPT_operating_system (1<<7)
201da2e3ebdSchin
202da2e3ebdSchin #define OPT_ALL 8
203da2e3ebdSchin
204da2e3ebdSchin #define OPT_hostid (1<<8)
205da2e3ebdSchin #define OPT_vendor (1<<9)
206da2e3ebdSchin #define OPT_domain (1<<10)
207da2e3ebdSchin #define OPT_machine_type (1<<11)
208da2e3ebdSchin #define OPT_base (1<<12)
209da2e3ebdSchin #define OPT_extended_release (1<<13)
210da2e3ebdSchin #define OPT_extra (1<<14)
211da2e3ebdSchin
212da2e3ebdSchin #define OPT_TOTAL 15
213da2e3ebdSchin
214da2e3ebdSchin #define OPT_all (1L<<29)
215da2e3ebdSchin #define OPT_total (1L<<30)
216da2e3ebdSchin #define OPT_standard ((1<<OPT_STANDARD)-1)
217da2e3ebdSchin
218da2e3ebdSchin #ifndef MACHINE
219da2e3ebdSchin #if defined(__STDPP__)
220da2e3ebdSchin #define MACHINE #(getprd architecture)
221da2e3ebdSchin #else
222da2e3ebdSchin #define MACHINE ""
223da2e3ebdSchin #endif
224da2e3ebdSchin #endif
225da2e3ebdSchin
226da2e3ebdSchin #ifndef HOSTTYPE
227da2e3ebdSchin #define HOSTTYPE "unknown"
228da2e3ebdSchin #endif
229da2e3ebdSchin
230da2e3ebdSchin #define extra(m) do \
231da2e3ebdSchin { \
232da2e3ebdSchin if ((char*)&ut.m[sizeof(ut.m)] > last) \
233da2e3ebdSchin last = (char*)&ut.m[sizeof(ut.m)]; \
234da2e3ebdSchin } while(0)
235da2e3ebdSchin
236da2e3ebdSchin #define output(f,v,u) do \
237da2e3ebdSchin { \
238da2e3ebdSchin if ((flags&(f))&&(*(v)||(flags&(OPT_all|OPT_total))==OPT_all&&((f)&OPT_standard)||!(flags&(OPT_all|OPT_total)))) \
239da2e3ebdSchin { \
240da2e3ebdSchin if (sep) \
241da2e3ebdSchin sfputc(sfstdout, ' '); \
242da2e3ebdSchin else \
243da2e3ebdSchin sep = 1; \
244da2e3ebdSchin if (*(v)) \
245da2e3ebdSchin sfputr(sfstdout, v, -1); \
246da2e3ebdSchin else \
247da2e3ebdSchin sfprintf(sfstdout, "[%s]", u); \
248da2e3ebdSchin } \
249da2e3ebdSchin } while (0)
250da2e3ebdSchin
251da2e3ebdSchin int
b_uname(int argc,char ** argv,void * context)252da2e3ebdSchin b_uname(int argc, char** argv, void* context)
253da2e3ebdSchin {
254da2e3ebdSchin register long flags = 0;
255da2e3ebdSchin register int sep = 0;
256da2e3ebdSchin register int n;
257da2e3ebdSchin register char* s;
258da2e3ebdSchin char* t;
259da2e3ebdSchin char* e;
260da2e3ebdSchin char* sethost = 0;
261da2e3ebdSchin int list = 0;
262da2e3ebdSchin struct utsname ut;
263da2e3ebdSchin char buf[257];
264da2e3ebdSchin
265da2e3ebdSchin cmdinit(argc, argv, context, ERROR_CATALOG, 0);
266da2e3ebdSchin for (;;)
267da2e3ebdSchin {
268da2e3ebdSchin switch (optget(argv, usage))
269da2e3ebdSchin {
270da2e3ebdSchin case 'a':
271da2e3ebdSchin flags |= OPT_all|((1L<<OPT_ALL)-1);
272da2e3ebdSchin continue;
273da2e3ebdSchin case 'b':
274da2e3ebdSchin flags |= OPT_base;
275da2e3ebdSchin continue;
276da2e3ebdSchin case 'c':
277da2e3ebdSchin flags |= OPT_vendor;
278da2e3ebdSchin continue;
279da2e3ebdSchin case 'd':
280da2e3ebdSchin flags |= OPT_domain;
281da2e3ebdSchin continue;
282da2e3ebdSchin case 'f':
283da2e3ebdSchin list = 1;
284da2e3ebdSchin continue;
285da2e3ebdSchin case 'h':
286da2e3ebdSchin flags |= OPT_hostid;
287da2e3ebdSchin continue;
288da2e3ebdSchin case 'i':
289da2e3ebdSchin flags |= OPT_implementation;
290da2e3ebdSchin continue;
291da2e3ebdSchin case 'm':
292da2e3ebdSchin flags |= OPT_machine;
293da2e3ebdSchin continue;
294da2e3ebdSchin case 'n':
295da2e3ebdSchin flags |= OPT_nodename;
296da2e3ebdSchin continue;
297da2e3ebdSchin case 'o':
298da2e3ebdSchin flags |= OPT_operating_system;
299da2e3ebdSchin continue;
300da2e3ebdSchin case 'p':
301da2e3ebdSchin flags |= OPT_processor;
302da2e3ebdSchin continue;
303da2e3ebdSchin case 'r':
304da2e3ebdSchin flags |= OPT_release;
305da2e3ebdSchin continue;
306da2e3ebdSchin case 's':
307da2e3ebdSchin flags |= OPT_system;
308da2e3ebdSchin continue;
309da2e3ebdSchin case 't':
310da2e3ebdSchin flags |= OPT_machine_type;
311da2e3ebdSchin continue;
312da2e3ebdSchin case 'v':
313da2e3ebdSchin flags |= OPT_version;
314da2e3ebdSchin continue;
315da2e3ebdSchin case 'x':
316da2e3ebdSchin flags |= OPT_extra;
317da2e3ebdSchin continue;
318da2e3ebdSchin case 'A':
319da2e3ebdSchin flags |= OPT_total|((1L<<OPT_TOTAL)-1);
320da2e3ebdSchin continue;
321da2e3ebdSchin case 'R':
322da2e3ebdSchin flags |= OPT_extended_release;
323da2e3ebdSchin continue;
324da2e3ebdSchin case 'S':
325da2e3ebdSchin sethost = opt_info.arg;
326da2e3ebdSchin continue;
327da2e3ebdSchin case ':':
328da2e3ebdSchin s = "/usr/bin/uname";
329da2e3ebdSchin if (!streq(argv[0], s) && (!eaccess(s, X_OK) || !eaccess(s+=4, X_OK)))
330da2e3ebdSchin {
331da2e3ebdSchin argv[0] = s;
3327c2fbfb3SApril Chin return sh_run(context, argc, argv);
333da2e3ebdSchin }
334da2e3ebdSchin error(2, "%s", opt_info.arg);
335da2e3ebdSchin break;
336da2e3ebdSchin case '?':
337da2e3ebdSchin error(ERROR_usage(2), "%s", opt_info.arg);
338da2e3ebdSchin break;
339da2e3ebdSchin }
340da2e3ebdSchin break;
341da2e3ebdSchin }
342da2e3ebdSchin argv += opt_info.index;
343da2e3ebdSchin if (error_info.errors || *argv && (flags || sethost) || sethost && flags)
344da2e3ebdSchin error(ERROR_usage(2), "%s", optusage(NiL));
345da2e3ebdSchin if (sethost)
346da2e3ebdSchin {
347da2e3ebdSchin #if _lib_sethostname
348da2e3ebdSchin if (sethostname(sethost, strlen(sethost) + 1))
349da2e3ebdSchin #else
350da2e3ebdSchin #ifdef ENOSYS
351da2e3ebdSchin errno = ENOSYS;
352da2e3ebdSchin #else
353da2e3ebdSchin errno = EPERM;
354da2e3ebdSchin #endif
355da2e3ebdSchin #endif
356da2e3ebdSchin error(ERROR_system(1), "%s: cannot set host name", sethost);
357da2e3ebdSchin }
358da2e3ebdSchin else if (list)
359da2e3ebdSchin astconflist(sfstdout, NiL, ASTCONF_base|ASTCONF_defined|ASTCONF_lower|ASTCONF_quote|ASTCONF_matchcall, "CS|SI");
360da2e3ebdSchin else if (*argv)
361da2e3ebdSchin {
362da2e3ebdSchin e = &buf[sizeof(buf)-1];
363da2e3ebdSchin while (s = *argv++)
364da2e3ebdSchin {
365da2e3ebdSchin t = buf;
366da2e3ebdSchin *t++ = 'C';
367da2e3ebdSchin *t++ = 'S';
368da2e3ebdSchin *t++ = '_';
369da2e3ebdSchin while (t < e && (n = *s++))
370da2e3ebdSchin *t++ = islower(n) ? toupper(n) : n;
371da2e3ebdSchin *t = 0;
3727c2fbfb3SApril Chin sfprintf(sfstdout, "%s%c", *(t = astconf(buf, NiL, NiL)) ? t : *(t = astconf(buf+3, NiL, NiL)) ? t : "unknown", *argv ? ' ' : '\n');
373da2e3ebdSchin }
374da2e3ebdSchin }
375da2e3ebdSchin else
376da2e3ebdSchin {
377da2e3ebdSchin s = buf;
378da2e3ebdSchin if (!flags)
379da2e3ebdSchin flags = OPT_system;
380da2e3ebdSchin memzero(&ut, sizeof(ut));
381da2e3ebdSchin if (uname(&ut) < 0)
382da2e3ebdSchin error(ERROR_usage(2), "information unavailable");
383da2e3ebdSchin output(OPT_system, ut.sysname, "sysname");
384da2e3ebdSchin if (flags & OPT_nodename)
385da2e3ebdSchin {
386da2e3ebdSchin #if !_mem_nodeext_utsname && _lib_gethostname
387da2e3ebdSchin if (sizeof(ut.nodename) > 9 || gethostname(s, sizeof(buf)))
388da2e3ebdSchin #endif
389da2e3ebdSchin s = ut.nodename;
390da2e3ebdSchin output(OPT_nodename, s, "nodename");
391da2e3ebdSchin }
392da2e3ebdSchin output(OPT_release, ut.release, "release");
393da2e3ebdSchin output(OPT_version, ut.version, "version");
394da2e3ebdSchin output(OPT_machine, ut.machine, "machine");
395da2e3ebdSchin if (flags & OPT_processor)
396da2e3ebdSchin {
397da2e3ebdSchin if (!*(s = astconf("ARCHITECTURE", NiL, NiL)))
398da2e3ebdSchin s = ut.machine;
399da2e3ebdSchin output(OPT_processor, s, "processor");
400da2e3ebdSchin }
401da2e3ebdSchin if (flags & OPT_implementation)
402da2e3ebdSchin {
403da2e3ebdSchin if (!*(s = astconf("PLATFORM", NiL, NiL)) && !*(s = astconf("HW_NAME", NiL, NiL)))
404da2e3ebdSchin {
405da2e3ebdSchin if (t = strchr(hosttype, '.'))
406da2e3ebdSchin t++;
407da2e3ebdSchin else
408da2e3ebdSchin t = (char*)hosttype;
409da2e3ebdSchin strncpy(s = buf, t, sizeof(buf) - 1);
410da2e3ebdSchin }
411da2e3ebdSchin output(OPT_implementation, s, "implementation");
412da2e3ebdSchin }
413da2e3ebdSchin if (flags & OPT_operating_system)
414da2e3ebdSchin {
415da2e3ebdSchin s = astconf("OPERATING_SYSTEM", NiL, NiL);
416da2e3ebdSchin if (!*s)
417da2e3ebdSchin #ifdef _UNAME_os_DEFAULT
418da2e3ebdSchin s = _UNAME_os_DEFAULT;
419da2e3ebdSchin #else
420da2e3ebdSchin s = ut.sysname;
421da2e3ebdSchin #endif
422da2e3ebdSchin output(OPT_operating_system, s, "operating-system");
423da2e3ebdSchin }
424da2e3ebdSchin if (flags & OPT_extended_release)
425da2e3ebdSchin {
426da2e3ebdSchin s = astconf("RELEASE", NiL, NiL);
427da2e3ebdSchin output(OPT_extended_release, s, "extended-release");
428da2e3ebdSchin }
429da2e3ebdSchin #if _mem_idnumber_utsname
430da2e3ebdSchin output(OPT_hostid, ut.idnumber, "hostid");
431da2e3ebdSchin #else
432da2e3ebdSchin if (flags & OPT_hostid)
433da2e3ebdSchin {
434da2e3ebdSchin if (!*(s = astconf("HW_SERIAL", NiL, NiL)))
435da2e3ebdSchin #if _lib_gethostid
436da2e3ebdSchin sfsprintf(s = buf, sizeof(buf), "%08x", gethostid());
437da2e3ebdSchin #else
438da2e3ebdSchin /*NOP*/;
439da2e3ebdSchin #endif
440da2e3ebdSchin output(OPT_hostid, s, "hostid");
441da2e3ebdSchin }
442da2e3ebdSchin #endif
443da2e3ebdSchin if (flags & OPT_vendor)
444da2e3ebdSchin {
445da2e3ebdSchin s = astconf("HW_PROVIDER", NiL, NiL);
446da2e3ebdSchin output(OPT_vendor, s, "vendor");
447da2e3ebdSchin }
448da2e3ebdSchin if (flags & OPT_domain)
449da2e3ebdSchin {
450da2e3ebdSchin if (!*(s = astconf("SRPC_DOMAIN", NiL, NiL)))
451da2e3ebdSchin #if _lib_getdomainname
452da2e3ebdSchin getdomainname(s, sizeof(buf));
453da2e3ebdSchin #else
454da2e3ebdSchin /*NOP*/;
455da2e3ebdSchin #endif
456da2e3ebdSchin output(OPT_domain, s, "domain");
457da2e3ebdSchin }
458da2e3ebdSchin #if _mem_m_type_utsname
459da2e3ebdSchin s = ut.m_type;
460da2e3ebdSchin #else
461da2e3ebdSchin s = astconf("MACHINE", NiL, NiL);
462da2e3ebdSchin #endif
463da2e3ebdSchin output(OPT_machine_type, s, "m_type");
464da2e3ebdSchin #if _mem_base_rel_utsname
465da2e3ebdSchin s = ut.base_rel;
466da2e3ebdSchin #else
467da2e3ebdSchin s = astconf("BASE", NiL, NiL);
468da2e3ebdSchin #endif
469da2e3ebdSchin output(OPT_base, s, "base_rel");
470da2e3ebdSchin if (flags & OPT_extra)
471da2e3ebdSchin {
472da2e3ebdSchin char* last = (char*)&ut;
473da2e3ebdSchin
474da2e3ebdSchin extra(sysname);
475da2e3ebdSchin extra(nodename);
476da2e3ebdSchin extra(release);
477da2e3ebdSchin extra(version);
478da2e3ebdSchin extra(machine);
479da2e3ebdSchin #if _mem_idnumber_utsname
480da2e3ebdSchin extra(idnumber);
481da2e3ebdSchin #endif
482da2e3ebdSchin #if _mem_m_type_utsname
483da2e3ebdSchin extra(m_type);
484da2e3ebdSchin #endif
485da2e3ebdSchin #if _mem_base_rel_utsname
486da2e3ebdSchin extra(base_rel);
487da2e3ebdSchin #endif
488da2e3ebdSchin if (last < ((char*)(&ut + 1)))
489da2e3ebdSchin {
490da2e3ebdSchin s = t = last;
491da2e3ebdSchin while (s < (char*)(&ut + 1))
492da2e3ebdSchin {
493da2e3ebdSchin if (!(n = *s++))
494da2e3ebdSchin {
495da2e3ebdSchin if ((s - t) > 1)
496da2e3ebdSchin {
497da2e3ebdSchin if (sep)
498da2e3ebdSchin sfputc(sfstdout, ' ');
499da2e3ebdSchin else
500da2e3ebdSchin sep = 1;
501da2e3ebdSchin sfputr(sfstdout, t, -1);
502da2e3ebdSchin }
503da2e3ebdSchin t = s;
504da2e3ebdSchin }
505da2e3ebdSchin else if (!isprint(n))
506da2e3ebdSchin break;
507da2e3ebdSchin }
508da2e3ebdSchin }
509da2e3ebdSchin }
510da2e3ebdSchin if (sep)
511da2e3ebdSchin sfputc(sfstdout, '\n');
512da2e3ebdSchin }
513da2e3ebdSchin return error_info.errors;
514da2e3ebdSchin }
515