Blame src/lib/libcmd/uname.c

Packit Service a8c26c
/***********************************************************************
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*               This software is part of the ast package               *
Packit Service a8c26c
*          Copyright (c) 1992-2012 AT&T Intellectual Property          *
Packit Service a8c26c
*                      and is licensed under the                       *
Packit Service a8c26c
*                 Eclipse Public License, Version 1.0                  *
Packit Service a8c26c
*                    by AT&T Intellectual Property                     *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*                A copy of the License is available at                 *
Packit Service a8c26c
*          http://www.eclipse.org/org/documents/epl-v10.html           *
Packit Service a8c26c
*         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*              Information and Software Systems Research               *
Packit Service a8c26c
*                            AT&T Research                             *
Packit Service a8c26c
*                           Florham Park NJ                            *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
*                 Glenn Fowler <gsf@research.att.com>                  *
Packit Service a8c26c
*                  David Korn <dgk@research.att.com>                   *
Packit Service a8c26c
*                                                                      *
Packit Service a8c26c
***********************************************************************/
Packit Service a8c26c
#pragma prototyped
Packit Service a8c26c
/*
Packit Service a8c26c
 * David Korn
Packit Service a8c26c
 * Glenn Fowler
Packit Service a8c26c
 * AT&T Research
Packit Service a8c26c
 *
Packit Service a8c26c
 * uname
Packit Service a8c26c
 */
Packit Service a8c26c
Packit Service a8c26c
static const char usage[] =
Packit Service a8c26c
"[-?\n@(#)$Id: uname (AT&T Research) 2007-04-19 $\n]"
Packit Service a8c26c
USAGE_LICENSE
Packit Service a8c26c
"[+NAME?uname - identify the current system ]"
Packit Service a8c26c
"[+DESCRIPTION?By default \buname\b writes the operating system name to"
Packit Service a8c26c
"	standard output. When options are specified, one or more"
Packit Service a8c26c
"	system characteristics are written to standard output, space"
Packit Service a8c26c
"	separated, on a single line. When more than one option is specified"
Packit Service a8c26c
"	the output is in the order specfied by the \b-A\b option below."
Packit Service a8c26c
"	Unsupported option values are listed as \a[option]]\a. If any unknown"
Packit Service a8c26c
"	options are specified then the local \b/usr/bin/uname\b is called.]"
Packit Service a8c26c
"[+?If any \aname\a operands are specified then the \bsysinfo\b(2) values"
Packit Service a8c26c
"	for each \aname\a are listed, separated by space, on one line."
Packit Service a8c26c
"	\bgetconf\b(1), a pre-existing \astandard\a interface, provides"
Packit Service a8c26c
"	access to the same information; vendors should spend more time"
Packit Service a8c26c
"	using standards than inventing them.]"
Packit Service a8c26c
"[+?Selected information is printed in the same order as the options below.]"
Packit Service a8c26c
"[a:all?Equivalent to \b-snrvmpio\b.]"
Packit Service a8c26c
"[s:system|sysname|kernel-name?The detailed kernel name. This is the default.]"
Packit Service a8c26c
"[n:nodename?The hostname or nodename.]"
Packit Service a8c26c
"[r:release|kernel-release?The kernel release level.]"
Packit Service a8c26c
"[v:version|kernel-version?The kernel version level.]"
Packit Service a8c26c
"[m:machine?The name of the hardware type the system is running on.]"
Packit Service a8c26c
"[p:processor?The name of the processor instruction set architecture.]"
Packit Service a8c26c
"[i:implementation|platform|hardware-platform?The hardware implementation;"
Packit Service a8c26c
"	this is \b--host-id\b on some systems.]"
Packit Service a8c26c
"[o:operating-system?The generic operating system name.]"
Packit Service a8c26c
"[h:host-id|id?The host id in hex.]"
Packit Service a8c26c
"[d:domain?The domain name returned by \agetdomainname\a(2).]"
Packit Service a8c26c
"[R:extended-release?The extended release name.]"
Packit Service a8c26c
"[A:everything?Equivalent to \b-snrvmpiohdR\b.]"
Packit Service a8c26c
"[f:list?List all \bsysinfo\b(2) names and values, one per line.]"
Packit Service a8c26c
"[S:sethost?Set the hostname or nodename to \aname\a. No output is"
Packit Service a8c26c
"	written to standard output.]:[name]"
Packit Service a8c26c
"\n"
Packit Service a8c26c
"\n[ name ... ]\n"
Packit Service a8c26c
"\n"
Packit Service a8c26c
"[+SEE ALSO?\bhostname\b(1), \bgetconf\b(1), \buname\b(2),"
Packit Service a8c26c
"	\bsysconf\b(2), \bsysinfo\b(2)]"
Packit Service a8c26c
;
Packit Service a8c26c
Packit Service a8c26c
#if defined(__STDPP__directive) && defined(__STDPP__hide)
Packit Service a8c26c
__STDPP__directive pragma pp:hide getdomainname gethostid gethostname sethostname
Packit Service a8c26c
#else
Packit Service a8c26c
#define getdomainname	______getdomainname
Packit Service a8c26c
#define gethostid	______gethostid
Packit Service a8c26c
#define gethostname	______gethostname
Packit Service a8c26c
#define sethostname	______sethostname
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
#include <cmd.h>
Packit Service a8c26c
#include <ctype.h>
Packit Service a8c26c
#include <proc.h>
Packit Service a8c26c
Packit Service a8c26c
#include "FEATURE/utsname"
Packit Service a8c26c
Packit Service a8c26c
#define MAXHOSTNAME	64
Packit Service a8c26c
Packit Service a8c26c
#if _lib_uname && _sys_utsname
Packit Service a8c26c
Packit Service a8c26c
#include <sys/utsname.h>
Packit Service a8c26c
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
#if defined(__STDPP__directive) && defined(__STDPP__hide)
Packit Service a8c26c
__STDPP__directive pragma pp:nohide getdomainname gethostid gethostname sethostname
Packit Service a8c26c
#else
Packit Service a8c26c
#undef	getdomainname
Packit Service a8c26c
#undef	gethostid
Packit Service a8c26c
#undef	gethostname
Packit Service a8c26c
#undef	sethostname
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
#if _lib_getdomainname
Packit Service a8c26c
extern int	getdomainname(char*, size_t);
Packit Service a8c26c
#endif
Packit Service a8c26c
#if _lib_gethostid
Packit Service a8c26c
extern long	gethostid(void);
Packit Service a8c26c
#endif
Packit Service a8c26c
#if _lib_gethostname
Packit Service a8c26c
extern int	gethostname(char*, size_t);
Packit Service a8c26c
#endif
Packit Service a8c26c
#if _lib_sethostname
Packit Service a8c26c
extern int	sethostname(const char*, size_t);
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
#ifndef HOSTTYPE
Packit Service a8c26c
#define HOSTTYPE	"unknown"
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
static const char	hosttype[] = HOSTTYPE;
Packit Service a8c26c
Packit Service a8c26c
#if !_lib_uname || !_sys_utsname
Packit Service a8c26c
Packit Service a8c26c
#if defined(__STDPP__)
Packit Service a8c26c
#define SYSNAME		#(getprd machine)
Packit Service a8c26c
#define RELEASE		#(getprd release)
Packit Service a8c26c
#define VERSION		#(getprd version)
Packit Service a8c26c
#define MACHINE		#(getprd architecture)
Packit Service a8c26c
#else
Packit Service a8c26c
#define SYSNAME		""
Packit Service a8c26c
#define RELEASE		""
Packit Service a8c26c
#define VERSION		""
Packit Service a8c26c
#define MACHINE		""
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
struct utsname
Packit Service a8c26c
{
Packit Service a8c26c
	char*	sysname;
Packit Service a8c26c
	char	nodename[MAXHOSTNAME];
Packit Service a8c26c
	char*	release;
Packit Service a8c26c
	char*	version;
Packit Service a8c26c
	char*	machine;
Packit Service a8c26c
};
Packit Service a8c26c
Packit Service a8c26c
int
Packit Service a8c26c
uname(register struct utsname* ut)
Packit Service a8c26c
{
Packit Service a8c26c
#ifdef HOSTTYPE
Packit Service a8c26c
	char*		sys = 0;
Packit Service a8c26c
	char*		arch = 0;
Packit Service a8c26c
Packit Service a8c26c
	if (*hosttype)
Packit Service a8c26c
	{
Packit Service a8c26c
		static char	buf[sizeof(hosttype)];
Packit Service a8c26c
Packit Service a8c26c
		strcpy(buf, hosttype);
Packit Service a8c26c
		sys = buf;
Packit Service a8c26c
		if (arch = strchr(sys, '.'))
Packit Service a8c26c
		{
Packit Service a8c26c
			*arch++ = 0;
Packit Service a8c26c
			if (!*arch)
Packit Service a8c26c
				arch = 0;
Packit Service a8c26c
		}
Packit Service a8c26c
		if (!*sys)
Packit Service a8c26c
			sys = 0;
Packit Service a8c26c
	}
Packit Service a8c26c
#endif
Packit Service a8c26c
#ifdef _lib_gethostname
Packit Service a8c26c
	if (gethostname(ut->nodename, sizeof(ut->nodename) - 1))
Packit Service a8c26c
		return -1;
Packit Service a8c26c
#else
Packit Service a8c26c
	strncpy(ut->nodename, "local", sizeof(ut->nodename) - 1);
Packit Service a8c26c
#endif
Packit Service a8c26c
#ifdef HOSTTYPE
Packit Service a8c26c
	if (!(ut->sysname = sys))
Packit Service a8c26c
#endif
Packit Service a8c26c
	if (!*(ut->sysname = SYSNAME))
Packit Service a8c26c
		ut->sysname = ut->nodename;
Packit Service a8c26c
#ifdef HOSTTYPE
Packit Service a8c26c
	if (!(ut->machine = arch))
Packit Service a8c26c
#endif
Packit Service a8c26c
	ut->machine = MACHINE;
Packit Service a8c26c
	ut->release = RELEASE;
Packit Service a8c26c
	ut->version = VERSION;
Packit Service a8c26c
	return 0;
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
#define OPT_system		(1<<0)
Packit Service a8c26c
#define OPT_nodename		(1<<1)
Packit Service a8c26c
#define OPT_release		(1<<2)
Packit Service a8c26c
#define OPT_version		(1<<3)
Packit Service a8c26c
#define OPT_machine		(1<<4)
Packit Service a8c26c
#define OPT_processor		(1<<5)
Packit Service a8c26c
Packit Service a8c26c
#define OPT_STANDARD		6
Packit Service a8c26c
Packit Service a8c26c
#define OPT_implementation	(1<<6)
Packit Service a8c26c
#define OPT_operating_system	(1<<7)
Packit Service a8c26c
Packit Service a8c26c
#define OPT_ALL			8
Packit Service a8c26c
Packit Service a8c26c
#define OPT_hostid		(1<<8)
Packit Service a8c26c
#define OPT_vendor		(1<<9)
Packit Service a8c26c
#define OPT_domain		(1<<10)
Packit Service a8c26c
#define OPT_machine_type	(1<<11)
Packit Service a8c26c
#define OPT_base		(1<<12)
Packit Service a8c26c
#define OPT_extended_release	(1<<13)
Packit Service a8c26c
#define OPT_extra		(1<<14)
Packit Service a8c26c
Packit Service a8c26c
#define OPT_TOTAL		15
Packit Service a8c26c
Packit Service a8c26c
#define OPT_all			(1L<<29)
Packit Service a8c26c
#define OPT_total		(1L<<30)
Packit Service a8c26c
#define OPT_standard		((1<
Packit Service a8c26c
Packit Service a8c26c
#ifndef MACHINE
Packit Service a8c26c
#if defined(__STDPP__)
Packit Service a8c26c
#define MACHINE			#(getprd architecture)
Packit Service a8c26c
#else
Packit Service a8c26c
#define MACHINE			""
Packit Service a8c26c
#endif
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
#ifndef HOSTTYPE
Packit Service a8c26c
#define HOSTTYPE		"unknown"
Packit Service a8c26c
#endif
Packit Service a8c26c
Packit Service a8c26c
#define extra(m)        do \
Packit Service a8c26c
			{ \
Packit Service a8c26c
				if ((char*)&ut.m[sizeof(ut.m)] > last) \
Packit Service a8c26c
					last = (char*)&ut.m[sizeof(ut.m)]; \
Packit Service a8c26c
			} while(0)
Packit Service a8c26c
Packit Service a8c26c
#define output(f,v,u)	do \
Packit Service a8c26c
			{ \
Packit Service a8c26c
				if ((flags&(f))&&(*(v)||(flags&(OPT_all|OPT_total))==OPT_all&&((f)&OPT_standard)||!(flags&(OPT_all|OPT_total)))) \
Packit Service a8c26c
				{ \
Packit Service a8c26c
					if (sep) \
Packit Service a8c26c
						sfputc(sfstdout, ' '); \
Packit Service a8c26c
					else \
Packit Service a8c26c
						sep = 1; \
Packit Service a8c26c
					if (*(v)) \
Packit Service a8c26c
						sfputr(sfstdout, v, -1); \
Packit Service a8c26c
					else \
Packit Service a8c26c
						sfprintf(sfstdout, "[%s]", u); \
Packit Service a8c26c
				} \
Packit Service a8c26c
			} while (0)
Packit Service a8c26c
Packit Service a8c26c
int
Packit Service a8c26c
b_uname(int argc, char** argv, Shbltin_t* context)
Packit Service a8c26c
{
Packit Service a8c26c
	register long	flags = 0;
Packit Service a8c26c
	register int	sep = 0;
Packit Service a8c26c
	register int	n;
Packit Service a8c26c
	register char*	s;
Packit Service a8c26c
	char*		t;
Packit Service a8c26c
	char*		e;
Packit Service a8c26c
	char*		sethost = 0;
Packit Service a8c26c
	int		list = 0;
Packit Service a8c26c
	struct utsname	ut;
Packit Service a8c26c
	char		buf[257];
Packit Service a8c26c
Packit Service a8c26c
	cmdinit(argc, argv, context, ERROR_CATALOG, 0);
Packit Service a8c26c
	for (;;)
Packit Service a8c26c
	{
Packit Service a8c26c
		switch (optget(argv, usage))
Packit Service a8c26c
		{
Packit Service a8c26c
		case 'a':
Packit Service a8c26c
			flags |= OPT_all|((1L<
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'b':
Packit Service a8c26c
			flags |= OPT_base;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'c':
Packit Service a8c26c
			flags |= OPT_vendor;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'd':
Packit Service a8c26c
			flags |= OPT_domain;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'f':
Packit Service a8c26c
			list = 1;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'h':
Packit Service a8c26c
			flags |= OPT_hostid;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'i':
Packit Service a8c26c
			flags |= OPT_implementation;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'm':
Packit Service a8c26c
			flags |= OPT_machine;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'n':
Packit Service a8c26c
			flags |= OPT_nodename;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'o':
Packit Service a8c26c
			flags |= OPT_operating_system;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'p':
Packit Service a8c26c
			flags |= OPT_processor;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'r':
Packit Service a8c26c
			flags |= OPT_release;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 's':
Packit Service a8c26c
			flags |= OPT_system;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 't':
Packit Service a8c26c
			flags |= OPT_machine_type;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'v':
Packit Service a8c26c
			flags |= OPT_version;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'x':
Packit Service a8c26c
			flags |= OPT_extra;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'A':
Packit Service a8c26c
			flags |= OPT_total|((1L<
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'R':
Packit Service a8c26c
			flags |= OPT_extended_release;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case 'S':
Packit Service a8c26c
			sethost = opt_info.arg;
Packit Service a8c26c
			continue;
Packit Service a8c26c
		case ':':
Packit Service a8c26c
			s = "/usr/bin/uname";
Packit Service a8c26c
			if (!streq(argv[0], s) && (!eaccess(s, X_OK) || !eaccess(s+=4, X_OK)))
Packit Service a8c26c
			{
Packit Service a8c26c
				argv[0] = s;
Packit Service a8c26c
				return sh_run(context, argc, argv);
Packit Service a8c26c
			}
Packit Service a8c26c
			error(2, "%s", opt_info.arg);
Packit Service a8c26c
			break;
Packit Service a8c26c
		case '?':
Packit Service a8c26c
			error(ERROR_usage(2), "%s", opt_info.arg);
Packit Service a8c26c
			break;
Packit Service a8c26c
		}
Packit Service a8c26c
		break;
Packit Service a8c26c
	}
Packit Service a8c26c
	argv += opt_info.index;
Packit Service a8c26c
	if (error_info.errors || *argv && (flags || sethost) || sethost && flags)
Packit Service a8c26c
		error(ERROR_usage(2), "%s", optusage(NiL));
Packit Service a8c26c
	if (sethost)
Packit Service a8c26c
	{
Packit Service a8c26c
#if _lib_sethostname
Packit Service a8c26c
		if (sethostname(sethost, strlen(sethost) + 1))
Packit Service a8c26c
#else
Packit Service a8c26c
#ifdef	ENOSYS
Packit Service a8c26c
		errno = ENOSYS;
Packit Service a8c26c
#else
Packit Service a8c26c
		errno = EPERM;
Packit Service a8c26c
#endif
Packit Service a8c26c
#endif
Packit Service a8c26c
		error(ERROR_system(1), "%s: cannot set host name", sethost);
Packit Service a8c26c
	}
Packit Service a8c26c
	else if (list)
Packit Service a8c26c
		astconflist(sfstdout, NiL, ASTCONF_base|ASTCONF_defined|ASTCONF_lower|ASTCONF_quote|ASTCONF_matchcall, "CS|SI");
Packit Service a8c26c
	else if (*argv)
Packit Service a8c26c
	{
Packit Service a8c26c
		e = &buf[sizeof(buf)-1];
Packit Service a8c26c
		while (s = *argv++)
Packit Service a8c26c
		{
Packit Service a8c26c
			t = buf;
Packit Service a8c26c
			*t++ = 'C';
Packit Service a8c26c
			*t++ = 'S';
Packit Service a8c26c
			*t++ = '_';
Packit Service a8c26c
			while (t < e && (n = *s++))
Packit Service a8c26c
				*t++ = islower(n) ? toupper(n) : n;
Packit Service a8c26c
			*t = 0;
Packit Service a8c26c
			sfprintf(sfstdout, "%s%c", *(t = astconf(buf, NiL, NiL)) ? t : *(t = astconf(buf+3, NiL, NiL)) ? t :  "unknown", *argv ? ' ' : '\n');
Packit Service a8c26c
		}
Packit Service a8c26c
	}
Packit Service a8c26c
	else
Packit Service a8c26c
	{
Packit Service a8c26c
		s = buf;
Packit Service a8c26c
		if (!flags)
Packit Service a8c26c
			flags = OPT_system;
Packit Service a8c26c
		memzero(&ut, sizeof(ut));
Packit Service a8c26c
		if (uname(&ut) < 0)
Packit Service a8c26c
			error(ERROR_usage(2), "information unavailable");
Packit Service a8c26c
		output(OPT_system, ut.sysname, "sysname");
Packit Service a8c26c
		if (flags & OPT_nodename)
Packit Service a8c26c
		{
Packit Service a8c26c
#if !_mem_nodeext_utsname && _lib_gethostname
Packit Service a8c26c
			if (sizeof(ut.nodename) > 9 || gethostname(s, sizeof(buf)))
Packit Service a8c26c
#endif
Packit Service a8c26c
			s = ut.nodename;
Packit Service a8c26c
			output(OPT_nodename, s, "nodename");
Packit Service a8c26c
		}
Packit Service a8c26c
		output(OPT_release, ut.release, "release");
Packit Service a8c26c
		output(OPT_version, ut.version, "version");
Packit Service a8c26c
		output(OPT_machine, ut.machine, "machine");
Packit Service a8c26c
		if (flags & OPT_processor)
Packit Service a8c26c
		{
Packit Service a8c26c
			if (!*(s = astconf("ARCHITECTURE", NiL, NiL)))
Packit Service a8c26c
				s = ut.machine;
Packit Service a8c26c
			output(OPT_processor, s, "processor");
Packit Service a8c26c
		}
Packit Service a8c26c
		if (flags & OPT_implementation)
Packit Service a8c26c
		{
Packit Service a8c26c
			if (!*(s = astconf("PLATFORM", NiL, NiL)) && !*(s = astconf("HW_NAME", NiL, NiL)))
Packit Service a8c26c
			{
Packit Service a8c26c
				if (t = strchr(hosttype, '.'))
Packit Service a8c26c
					t++;
Packit Service a8c26c
				else
Packit Service a8c26c
					t = (char*)hosttype;
Packit Service a8c26c
				strncpy(s = buf, t, sizeof(buf) - 1);
Packit Service a8c26c
			}
Packit Service a8c26c
			output(OPT_implementation, s, "implementation");
Packit Service a8c26c
		}
Packit Service a8c26c
		if (flags & OPT_operating_system)
Packit Service a8c26c
		{
Packit Service a8c26c
			s = astconf("OPERATING_SYSTEM", NiL, NiL);
Packit Service a8c26c
			if (!*s)
Packit Service a8c26c
#ifdef _UNAME_os_DEFAULT
Packit Service a8c26c
				s = _UNAME_os_DEFAULT;
Packit Service a8c26c
#else
Packit Service a8c26c
				s = ut.sysname;
Packit Service a8c26c
#endif
Packit Service a8c26c
			output(OPT_operating_system, s, "operating-system");
Packit Service a8c26c
		}
Packit Service a8c26c
		if (flags & OPT_extended_release)
Packit Service a8c26c
		{
Packit Service a8c26c
			s = astconf("RELEASE", NiL, NiL);
Packit Service a8c26c
			output(OPT_extended_release, s, "extended-release");
Packit Service a8c26c
		}
Packit Service a8c26c
#if _mem_idnumber_utsname
Packit Service a8c26c
		output(OPT_hostid, ut.idnumber, "hostid");
Packit Service a8c26c
#else
Packit Service a8c26c
		if (flags & OPT_hostid)
Packit Service a8c26c
		{
Packit Service a8c26c
			if (!*(s = astconf("HW_SERIAL", NiL, NiL)))
Packit Service a8c26c
#if _lib_gethostid
Packit Service a8c26c
				sfsprintf(s = buf, sizeof(buf), "%08x", gethostid());
Packit Service a8c26c
#else
Packit Service a8c26c
				/*NOP*/;
Packit Service a8c26c
#endif
Packit Service a8c26c
			output(OPT_hostid, s, "hostid");
Packit Service a8c26c
		}
Packit Service a8c26c
#endif
Packit Service a8c26c
		if (flags & OPT_vendor)
Packit Service a8c26c
		{
Packit Service a8c26c
			s = astconf("HW_PROVIDER", NiL, NiL);
Packit Service a8c26c
			output(OPT_vendor, s, "vendor");
Packit Service a8c26c
		}
Packit Service a8c26c
		if (flags & OPT_domain)
Packit Service a8c26c
		{
Packit Service a8c26c
			if (!*(s = astconf("SRPC_DOMAIN", NiL, NiL)))
Packit Service a8c26c
#if _lib_getdomainname
Packit Service a8c26c
				getdomainname(s, sizeof(buf));
Packit Service a8c26c
#else
Packit Service a8c26c
				/*NOP*/;
Packit Service a8c26c
#endif
Packit Service a8c26c
			output(OPT_domain, s, "domain");
Packit Service a8c26c
		}
Packit Service a8c26c
#if _mem_m_type_utsname
Packit Service a8c26c
		s = ut.m_type;
Packit Service a8c26c
#else
Packit Service a8c26c
		s = astconf("MACHINE", NiL, NiL);
Packit Service a8c26c
#endif
Packit Service a8c26c
		output(OPT_machine_type, s, "m_type");
Packit Service a8c26c
#if _mem_base_rel_utsname
Packit Service a8c26c
		s = ut.base_rel;
Packit Service a8c26c
#else
Packit Service a8c26c
		s = astconf("BASE", NiL, NiL);
Packit Service a8c26c
#endif
Packit Service a8c26c
		output(OPT_base, s, "base_rel");
Packit Service a8c26c
		if (flags & OPT_extra)
Packit Service a8c26c
		{
Packit Service a8c26c
			char*	last = (char*)&ut;
Packit Service a8c26c
Packit Service a8c26c
			extra(sysname);
Packit Service a8c26c
			extra(nodename);
Packit Service a8c26c
			extra(release);
Packit Service a8c26c
			extra(version);
Packit Service a8c26c
			extra(machine);
Packit Service a8c26c
#if _mem_idnumber_utsname
Packit Service a8c26c
			extra(idnumber);
Packit Service a8c26c
#endif
Packit Service a8c26c
#if _mem_m_type_utsname
Packit Service a8c26c
			extra(m_type);
Packit Service a8c26c
#endif
Packit Service a8c26c
#if _mem_base_rel_utsname
Packit Service a8c26c
			extra(base_rel);
Packit Service a8c26c
#endif
Packit Service a8c26c
			if (last < ((char*)(&ut + 1)))
Packit Service a8c26c
			{
Packit Service a8c26c
				s = t = last;
Packit Service a8c26c
				while (s < (char*)(&ut + 1))
Packit Service a8c26c
				{
Packit Service a8c26c
					if (!(n = *s++))
Packit Service a8c26c
					{
Packit Service a8c26c
						if ((s - t) > 1)
Packit Service a8c26c
						{
Packit Service a8c26c
							if (sep)
Packit Service a8c26c
								sfputc(sfstdout, ' ');
Packit Service a8c26c
							else
Packit Service a8c26c
								sep = 1;
Packit Service a8c26c
							sfputr(sfstdout, t, -1);
Packit Service a8c26c
						}
Packit Service a8c26c
						t = s;
Packit Service a8c26c
					}
Packit Service a8c26c
					else if (!isprint(n))
Packit Service a8c26c
						break;
Packit Service a8c26c
				}
Packit Service a8c26c
			}
Packit Service a8c26c
		}
Packit Service a8c26c
		if (sep)
Packit Service a8c26c
			sfputc(sfstdout, '\n');
Packit Service a8c26c
	}
Packit Service a8c26c
	return error_info.errors;
Packit Service a8c26c
}