mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-19 12:59:21 +08:00
582628d551
This reverts commit 532b91d24e9496c7988b2b1dda7fc0e8b161f782. It turned out that this patch has undesired side effects. To wit, if a newer, post-uname_x executable was linked against or loading an older, pre-uname_x DLL, and this DLL called uname. This call would jump into the old uname with the old struct utsname as parameter, but given the newer executable it would get redirected to uname_x. uname_x in turn would overwrite stack memory it should leave well alone, given it expects the newer, larger struct utsname. For the entire discussion see the thread starting at https://cygwin.com/pipermail/cygwin/2021-February/247870.html and continuing in March at https://cygwin.com/pipermail/cygwin/2021-March/247930.html For a description where we're coming from, see https://cygwin.com/pipermail/cygwin/2021-March/247959.html While we *could* make the scenario in question work by patching dlsym, the problem would actually be the same, just for dynamic loading. In the end, we're missing the information, which Cygwin version has been used when building DLLs. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
168 lines
4.6 KiB
C++
168 lines
4.6 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 <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;
|
|
char *snp = strstr (cygwin_version.dll_build_date, "SNP");
|
|
|
|
memset (name, 0, sizeof (*name));
|
|
/* sysname */
|
|
__small_sprintf (name->sysname, "CYGWIN_%s-%u%s",
|
|
wincap.osname (), wincap.build_number (),
|
|
wincap.is_wow64 () ? "-WOW64" : "");
|
|
/* nodename */
|
|
memset (buf, 0, sizeof buf);
|
|
cygwin_gethostname (buf, sizeof buf - 1);
|
|
strncat (name->nodename, buf, sizeof (name->nodename) - 1);
|
|
/* release */
|
|
__small_sprintf (name->release, "%d.%d.%d-%d.",
|
|
cygwin_version.dll_major / 1000,
|
|
cygwin_version.dll_major % 1000,
|
|
cygwin_version.dll_minor,
|
|
cygwin_version.api_minor);
|
|
/* version */
|
|
stpcpy (name->version, cygwin_version.dll_build_date);
|
|
if (snp)
|
|
name->version[snp - cygwin_version.dll_build_date] = '\0';
|
|
strcat (name->version, " UTC");
|
|
/* machine */
|
|
switch (wincap.cpu_arch ())
|
|
{
|
|
case PROCESSOR_ARCHITECTURE_INTEL:
|
|
strcat (name->release, strcpy (name->machine, "i686"));
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_AMD64:
|
|
strcat (name->release, strcpy (name->machine, "x86_64"));
|
|
break;
|
|
default:
|
|
strcpy (name->machine, "unknown");
|
|
break;
|
|
}
|
|
if (snp)
|
|
strcat (name->release, ".snap");
|
|
/* 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
|
|
{
|
|
char *snp = strstr (cygwin_version.dll_build_date, "SNP");
|
|
|
|
memset (name, 0, sizeof (*name));
|
|
__small_sprintf (name->sysname, "CYGWIN_%s", wincap.osname ());
|
|
|
|
/* Add a hint to the sysname, that we're running under WOW64. This might
|
|
give an early clue if somebody encounters problems. */
|
|
if (wincap.is_wow64 ())
|
|
strncat (name->sysname, "-WOW",
|
|
sizeof name->sysname - strlen (name->sysname) - 1);
|
|
|
|
/* Computer name */
|
|
cygwin_gethostname (name->nodename, sizeof (name->nodename) - 1);
|
|
|
|
/* Cygwin dll release */
|
|
__small_sprintf (name->release, "%d.%d.%d%s(%d.%d/%d/%d)",
|
|
cygwin_version.dll_major / 1000,
|
|
cygwin_version.dll_major % 1000,
|
|
cygwin_version.dll_minor,
|
|
snp ? "s" : "",
|
|
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);
|
|
if (snp)
|
|
name->version[snp - cygwin_version.dll_build_date] = '\0';
|
|
|
|
/* CPU type */
|
|
switch (wincap.cpu_arch ())
|
|
{
|
|
case PROCESSOR_ARCHITECTURE_INTEL:
|
|
unsigned int ptype;
|
|
if (wincap.cpu_level () < 3) /* Shouldn't happen. */
|
|
ptype = 3;
|
|
else if (wincap.cpu_level () > 9) /* P4 */
|
|
ptype = 6;
|
|
else
|
|
ptype = wincap.cpu_level ();
|
|
__small_sprintf (name->machine, "i%d86", ptype);
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_IA64:
|
|
strcpy (name->machine, "ia64");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_AMD64:
|
|
strcpy (name->machine, "x86_64");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_IA32_ON_WIN64:
|
|
strcpy (name->machine, "ia32-win64");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_ALPHA:
|
|
strcpy (name->machine, "alpha");
|
|
break;
|
|
case PROCESSOR_ARCHITECTURE_MIPS:
|
|
strcpy (name->machine, "mips");
|
|
break;
|
|
default:
|
|
strcpy (name->machine, "unknown");
|
|
break;
|
|
}
|
|
}
|
|
__except (EFAULT)
|
|
{
|
|
return -1;
|
|
}
|
|
__endtry
|
|
return 0;
|
|
}
|