Add -K (__FreeBSD_version of kernel) and -U (__FreeBSD_version of userland).

Things like Makefile.inc1 resort to parsing /usr/include/osreldate.h with
awk because this isn't easily available by other means.  The separation
of user and kernel versions is important for jail/chroot environments.
This commit is contained in:
Peter Wemm 2013-10-15 20:57:40 +00:00
parent 77dabf96d9
commit 876a7cf40c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=256557
2 changed files with 64 additions and 5 deletions

View File

@ -36,7 +36,7 @@
.Nd display information about the system
.Sh SYNOPSIS
.Nm
.Op Fl aimnoprsv
.Op Fl aiKmnoprsUv
.Sh DESCRIPTION
The
.Nm
@ -55,6 +55,10 @@ and
were specified.
.It Fl i
Write the kernel ident to standard output.
.It Fl K
Write the
.Fx
version of the kernel.
.It Fl m
Write the type of the current hardware platform to standard output.
.It Fl n
@ -70,6 +74,10 @@ Write the current release level of the operating system
to standard output.
.It Fl s
Write the name of the operating system implementation to standard output.
.It Fl U
Write the
.Fx
version of the user environment.
.It Fl v
Write the version level of this release of the operating system
to standard output.
@ -79,6 +87,14 @@ If the
.Fl a
flag is specified, or multiple flags are specified, all
output is written on a single line, separated by spaces.
.Pp
The
.Fl K
and
.Fl U
flags are intended to be used for fine grain differentiation of incremental
.Fx
development and user visible changes.
.Sh ENVIRONMENT
An environment variable composed of the string
.Ev UNAME_
@ -91,6 +107,8 @@ of the environment variable.
.Sh EXIT STATUS
.Ex -std
.Sh SEE ALSO
.Xr feature_present 3 ,
.Xr getosreldate 3 ,
.Xr sysctl 3 ,
.Xr uname 3 ,
.Xr sysctl 8
@ -104,3 +122,10 @@ specification.
The
.Nm
command appeared in PWB UNIX.
.Pp
The
.Fl K
and
.Fl U
extension flags appeared in
.Fx 11.0 .

View File

@ -54,6 +54,8 @@ static const char sccsid[] = "@(#)uname.c 8.2 (Berkeley) 5/4/95";
#include <stdlib.h>
#include <unistd.h>
#include <osreldate.h>
#define MFLAG 0x01
#define NFLAG 0x02
#define PFLAG 0x04
@ -61,10 +63,12 @@ static const char sccsid[] = "@(#)uname.c 8.2 (Berkeley) 5/4/95";
#define SFLAG 0x10
#define VFLAG 0x20
#define IFLAG 0x40
#define UFLAG 0x80
#define KFLAG 0x100
typedef void (*get_t)(void);
static get_t get_ident, get_platform, get_hostname, get_arch,
get_release, get_sysname, get_version;
get_release, get_sysname, get_kernvers, get_uservers, get_version;
static void native_ident(void);
static void native_platform(void);
@ -73,11 +77,13 @@ static void native_arch(void);
static void native_release(void);
static void native_sysname(void);
static void native_version(void);
static void native_kernvers(void);
static void native_uservers(void);
static void print_uname(u_int);
static void setup_get(void);
static void usage(void);
static char *ident, *platform, *hostname, *arch, *release, *sysname, *version;
static char *ident, *platform, *hostname, *arch, *release, *sysname, *version, *kernvers, *uservers;
static int space;
int
@ -89,7 +95,7 @@ main(int argc, char *argv[])
setup_get();
flags = 0;
while ((ch = getopt(argc, argv, "aimnoprsv")) != -1)
while ((ch = getopt(argc, argv, "aiKmnoprsUv")) != -1)
switch(ch) {
case 'a':
flags |= (MFLAG | NFLAG | RFLAG | SFLAG | VFLAG);
@ -97,6 +103,9 @@ main(int argc, char *argv[])
case 'i':
flags |= IFLAG;
break;
case 'K':
flags |= KFLAG;
break;
case 'm':
flags |= MFLAG;
break;
@ -113,6 +122,9 @@ main(int argc, char *argv[])
case 'o':
flags |= SFLAG;
break;
case 'U':
flags |= UFLAG;
break;
case 'v':
flags |= VFLAG;
break;
@ -153,6 +165,8 @@ setup_get(void)
CHECK_ENV("m", platform);
CHECK_ENV("p", arch);
CHECK_ENV("i", ident);
CHECK_ENV("K", kernvers);
CHECK_ENV("U", uservers);
}
#define PRINT_FLAG(flags,flag,var) \
@ -176,6 +190,8 @@ print_uname(u_int flags)
PRINT_FLAG(flags, MFLAG, platform);
PRINT_FLAG(flags, PFLAG, arch);
PRINT_FLAG(flags, IFLAG, ident);
PRINT_FLAG(flags, KFLAG, kernvers);
PRINT_FLAG(flags, UFLAG, uservers);
printf("\n");
}
@ -243,9 +259,27 @@ NATIVE_SYSCTL2_GET(arch, CTL_HW, HW_MACHINE_ARCH) {
NATIVE_SYSCTLNAME_GET(ident, "kern.ident") {
} NATIVE_SET;
static void
native_uservers(void)
{
static char buf[128];
snprintf(buf, sizeof(buf), "%d", __FreeBSD_version);
uservers = buf;
}
static void
native_kernvers(void)
{
static char buf[128];
snprintf(buf, sizeof(buf), "%d", getosreldate());
kernvers = buf;
}
static void
usage(void)
{
fprintf(stderr, "usage: uname [-aimnoprsv]\n");
fprintf(stderr, "usage: uname [-aiKmnoprsUv]\n");
exit(1);
}