mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-22 00:38:06 +08:00
If the Cygwin dll's architecture is different from the host system's architecture, append an additional tag that indicates the host system architecture (the Cygwin dll's architecture is already indicated in machine). Signed-off-by: Jeremy Drake <cygwin@jdrake.com>
155 lines
4.0 KiB
C++
155 lines
4.0 KiB
C++
/* uname.cc
|
|
Written by Steve Chamberlain of Cygnus Support, sac@cygnus.com
|
|
Rewritten by Geoffrey Noer of Cygnus Solutions, noer@cygnus.com
|
|
|
|
This file is part of Cygwin.
|
|
|
|
This software is a copyrighted work licensed under the terms of the
|
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
details. */
|
|
|
|
#include "winsup.h"
|
|
#include <stdio.h>
|
|
#include <sys/utsname.h>
|
|
#include <netdb.h>
|
|
#include "cygwin_version.h"
|
|
#include "cygtls.h"
|
|
|
|
extern "C" int cygwin_gethostname (char *__name, size_t __len);
|
|
extern "C" int getdomainname (char *__name, size_t __len);
|
|
|
|
#if __GNUC__ >= 8
|
|
#define ATTRIBUTE_NONSTRING __attribute__ ((nonstring))
|
|
#else
|
|
#define ATTRIBUTE_NONSTRING
|
|
#endif
|
|
|
|
/* uname: POSIX 4.4.1.1 */
|
|
|
|
/* New entrypoint for applications since API 335 */
|
|
extern "C" int
|
|
uname_x (struct utsname *name)
|
|
{
|
|
__try
|
|
{
|
|
char buf[NI_MAXHOST + 1] ATTRIBUTE_NONSTRING;
|
|
int n;
|
|
|
|
memset (name, 0, sizeof (*name));
|
|
/* sysname */
|
|
n = __small_sprintf (name->sysname, "CYGWIN_%s-%u",
|
|
wincap.osname (), wincap.build_number ());
|
|
if (wincap.host_machine () != wincap.cygwin_machine ())
|
|
{
|
|
switch (wincap.host_machine ())
|
|
{
|
|
case IMAGE_FILE_MACHINE_ARM64:
|
|
n = stpcpy (name->sysname + n, "-ARM64") - name->sysname;
|
|
break;
|
|
default:
|
|
n += __small_sprintf (name->sysname + n, "-%04y",
|
|
(int) wincap.host_machine ());
|
|
break;
|
|
}
|
|
}
|
|
/* nodename */
|
|
memset (buf, 0, sizeof buf);
|
|
cygwin_gethostname (buf, sizeof buf - 1);
|
|
strncat (name->nodename, buf, sizeof (name->nodename) - 1);
|
|
/* machine */
|
|
switch (wincap.cpu_arch ())
|
|
{
|
|
case PROCESSOR_ARCHITECTURE_AMD64:
|
|
strcpy (name->machine, "x86_64");
|
|
break;
|
|
default:
|
|
strcpy (name->machine, "unknown");
|
|
break;
|
|
}
|
|
/* release */
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic ignored "-Wformat-truncation="
|
|
#ifdef CYGPORT_RELEASE_INFO
|
|
snprintf (name->release, _UTSNAME_LENGTH, "%s.%s",
|
|
__XSTRING (CYGPORT_RELEASE_INFO), name->machine);
|
|
#else
|
|
extern const char *uname_dev_version;
|
|
if (uname_dev_version && uname_dev_version[0])
|
|
snprintf (name->release, _UTSNAME_LENGTH, "%s.%s",
|
|
uname_dev_version, name->machine);
|
|
else
|
|
__small_sprintf (name->release, "%d.%d.%d-api-%d.%s",
|
|
cygwin_version.dll_major / 1000,
|
|
cygwin_version.dll_major % 1000,
|
|
cygwin_version.dll_minor,
|
|
cygwin_version.api_minor,
|
|
name->machine);
|
|
#endif
|
|
#pragma GCC diagnostic pop
|
|
/* version */
|
|
stpcpy (name->version, cygwin_version.dll_build_date);
|
|
strcat (name->version, " UTC");
|
|
/* domainame */
|
|
memset (buf, 0, sizeof buf);
|
|
getdomainname (buf, sizeof buf - 1);
|
|
strncat (name->domainname, buf, sizeof (name->domainname) - 1);
|
|
}
|
|
__except (EFAULT) { return -1; }
|
|
__endtry
|
|
return 0;
|
|
}
|
|
|
|
/* Old entrypoint for applications up to API 334 */
|
|
struct old_utsname
|
|
{
|
|
char sysname[20];
|
|
char nodename[20];
|
|
char release[20];
|
|
char version[20];
|
|
char machine[20];
|
|
};
|
|
|
|
extern "C" int
|
|
uname (struct utsname *in_name)
|
|
{
|
|
struct old_utsname *name = (struct old_utsname *) in_name;
|
|
__try
|
|
{
|
|
memset (name, 0, sizeof (*name));
|
|
__small_sprintf (name->sysname, "CYGWIN_%s", wincap.osname ());
|
|
|
|
/* Computer name */
|
|
cygwin_gethostname (name->nodename, sizeof (name->nodename) - 1);
|
|
|
|
/* Cygwin dll release */
|
|
__small_sprintf (name->release, "%d.%d.%d(%d.%d/%d/%d)",
|
|
cygwin_version.dll_major / 1000,
|
|
cygwin_version.dll_major % 1000,
|
|
cygwin_version.dll_minor,
|
|
cygwin_version.api_major,
|
|
cygwin_version.api_minor,
|
|
cygwin_version.shared_data,
|
|
cygwin_version.mount_registry);
|
|
|
|
/* Cygwin "version" aka build date */
|
|
strcpy (name->version, cygwin_version.dll_build_date);
|
|
|
|
/* CPU type */
|
|
switch (wincap.cpu_arch ())
|
|
{
|
|
case PROCESSOR_ARCHITECTURE_AMD64:
|
|
strcpy (name->machine, "x86_64");
|
|
break;
|
|
default:
|
|
strcpy (name->machine, "unknown");
|
|
break;
|
|
}
|
|
}
|
|
__except (EFAULT)
|
|
{
|
|
return -1;
|
|
}
|
|
__endtry
|
|
return 0;
|
|
}
|