From: Jeremy Drake <cyg...@jdrake.com> 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 <cyg...@jdrake.com> --- v2: get rid of hardcoded string lengths, use wincap accessors directly instead of caching their returns, actually add "n" variable as intended winsup/cygwin/uname.cc | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/winsup/cygwin/uname.cc b/winsup/cygwin/uname.cc index dd4160189c..2410dc502e 100644 --- a/winsup/cygwin/uname.cc +++ b/winsup/cygwin/uname.cc @@ -24,6 +24,38 @@ extern "C" int getdomainname (char *__name, size_t __len); #define ATTRIBUTE_NONSTRING #endif +static int +append_host_suffix (char * buf) +{ + int n = 0; + if (wincap.host_machine () != wincap.cygwin_machine ()) + { + switch (wincap.host_machine ()) + { + case IMAGE_FILE_MACHINE_AMD64: + /* special case for backwards compatibility */ + if (wincap.cygwin_machine () == IMAGE_FILE_MACHINE_I386) + n = stpcpy (buf, "-WOW64") - buf; + else + n = stpcpy (buf, "-x64") - buf; + break; + case IMAGE_FILE_MACHINE_I386: + n = stpcpy (buf, "-x86") - buf; + break; + case IMAGE_FILE_MACHINE_ARMNT: + n = stpcpy (buf, "-ARM") - buf; + break; + case IMAGE_FILE_MACHINE_ARM64: + n = strcpy (buf, "-ARM64") - buf; + break; + default: + n = __small_sprintf (buf, "-%04y", (int) wincap.host_machine ()); + break; + } + } + return n; +} + /* uname: POSIX 4.4.1.1 */ /* New entrypoint for applications since API 335 */ @@ -33,11 +65,13 @@ uname_x (struct utsname *name) __try { char buf[NI_MAXHOST + 1] ATTRIBUTE_NONSTRING; + int n; memset (name, 0, sizeof (*name)); /* sysname */ - __small_sprintf (name->sysname, "CYGWIN_%s-%u", - wincap.osname (), wincap.build_number ()); + n = __small_sprintf (name->sysname, "CYGWIN_%s-%u", + wincap.osname (), wincap.build_number ()); + n += append_host_suffix (name->sysname + n); /* nodename */ memset (buf, 0, sizeof buf); cygwin_gethostname (buf, sizeof buf - 1); -- 2.47.0.windows.2