4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-02-02 12:30:24 +08:00
Corinna Vinschen ea0a84424c Cygwin: uname: generate default release string from git as well
When building a release with cygport, we get uname version info
from cygport, which in turn gets version info from `git describe'.

During development, the release info for local builds was not
that helpful yet.  Fix that, by creating version info from
`git describe' if CYGPORT_RELEASE_INFO isn't given.  Make sure to
always force rebuild of the version info to pick up source file
changes as well as git actions.

Rearrange code slightly to generate machine info first, release info
after that.  Use snprintf to generate release string safely.

Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
2022-12-11 11:25:04 +01:00

133 lines
3.4 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;
memset (name, 0, sizeof (*name));
/* sysname */
__small_sprintf (name->sysname, "CYGWIN_%s-%u",
wincap.osname (), wincap.build_number ());
/* 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;
snprintf (name->release, _UTSNAME_LENGTH, "%s.%s",
uname_dev_version, 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;
}