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). --- You may well want me to remove some cases from the switch ;)
winsup/cygwin/uname.cc | 44 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/winsup/cygwin/uname.cc b/winsup/cygwin/uname.cc index dd4160189c..40030fba16 100644 --- a/winsup/cygwin/uname.cc +++ b/winsup/cygwin/uname.cc @@ -24,6 +24,49 @@ extern "C" int getdomainname (char *__name, size_t __len); #define ATTRIBUTE_NONSTRING #endif +static int +append_host_suffix (char * buf) +{ + USHORT host = wincap.host_machine (); + USHORT cygwin = wincap.current_module_machine (); + int n = 0; + if (host != cygwin) + { + switch (host) + { + case IMAGE_FILE_MACHINE_AMD64: + /* special case for backwards compatibility */ + if (cygwin == IMAGE_FILE_MACHINE_I386) + { + strcpy (buf, "-WOW64"); + n = 6; + } + else + { + strcpy (buf, "-x64"); + n = 4; + } + break; + case IMAGE_FILE_MACHINE_I386: + strcpy (buf, "-x86"); + n = 4; + break; + case IMAGE_FILE_MACHINE_ARMNT: + strcpy (buf, "-ARM"); + n = 4; + break; + case IMAGE_FILE_MACHINE_ARM64: + strcpy (buf, "-ARM64"); + n = 6; + break; + default: + n = __small_sprintf (buf, "-%04y", host); + break; + } + } + return n; +} + /* uname: POSIX 4.4.1.1 */ /* New entrypoint for applications since API 335 */ @@ -38,6 +81,7 @@ uname_x (struct utsname *name) /* sysname */ __small_sprintf (name->sysname, "CYGWIN_%s-%u", wincap.osname (), wincap.build_number ()); + append_host_suffix (name->sysname + n); /* nodename */ memset (buf, 0, sizeof buf); cygwin_gethostname (buf, sizeof buf - 1); -- 2.47.0.windows.2