=== pkgtools/libkver/PLIST
==================================================================
--- pkgtools/libkver/PLIST (revision 1571)
+++ pkgtools/libkver/PLIST (revision 1574)
@@ -3,6 +3,9 @@
lib/libkver.so
lib/libkver.so.1
lib/libkver.so.1.0
+sbin/kver
+man/cat8/kver.0
+man/man8/kver.8
man/cat3/kver.0
man/man3/kver.3
${PLIST.sysctl}sbin/sysctl
=== pkgtools/libkver/Makefile
==================================================================
--- pkgtools/libkver/Makefile (revision 1571)
+++ pkgtools/libkver/Makefile (revision 1574)
@@ -18,7 +18,7 @@
NO_PKGTOOLS_REQD_CHECK= yes
USE_BSD_MAKEFILE= yes
-VERSION= 0.6
+VERSION= 0.7
ONLY_FOR_PLATFORM= NetBSD-*-*
@@ -34,6 +34,13 @@
FILES_SUBST+= HAS_SYSCTL=false
.endif
+SUBST_CLASSES+= paths
+SUBST_FILES.paths= kver/kver.sh kver/kver.8 lib/kver.3
+SUBST_SED.paths+= -e 's,@PREFIX@,${PREFIX},g'
+SUBST_SED.paths+= -e 's,@SH@,${SH},g'
+SUBST_STAGE.paths= post-patch
+
+INSTALLATION_DIRS+= sbin man/man8 man/cat8
INSTALLATION_DIRS+= lib man/man3 man/cat3
.if empty(LDD_SYSCTL:M*libc*)
INSTALLATION_DIRS+= sbin
=== pkgtools/libkver/files/lib/kver.3
==================================================================
--- pkgtools/libkver/files/lib/kver.3 (revision 1571)
+++ pkgtools/libkver/files/lib/kver.3 (revision 1574)
@@ -1,13 +1,13 @@
.\" $NetBSD: kver.3,v 1.2 2004/04/24 10:53:03 grant Exp $
.\"
-.Dd December 13, 2003
+.Dd Ocrober 30, 2012
.Os
.Dt KVER 3
.Sh NAME
.Nm kver
.Nd override system version library
.Sh SYNOPSIS
-LD_PRELOAD=.../libkver.so uname -a
+LD_PRELOAD=@PREFIX@/lib/libkver.so uname -a
.Sh DESCRIPTION
The
.Nm
@@ -16,24 +16,114 @@
.Xr uname 3 that
shadow the real implementation and could be configured to override the
information identifying the current system.
-The library is usually loaded by the run-time link-editor via the
-LD_PRELOAD hook.
-.Pp
This is useful for, among other things, building packages in a
sandbox/chrooted environment for a different
.Nx
release then the system hosting the sandbox.
.Pp
-The library must be configured for reporting a specific
-.Nx
-release or else it emits a warning message on the standard error output.
-The value of the environment variable
-.Ev LIBKVER_OSRELEASE
-or the ``name'' of the file referenced by the symbolic link named
-.Pa /libkver_osrelease
-are checked in that order for the
-.Nx
-release number the library should reports information for.
+The library is usually loaded by the run-time link-editor via the
+LD_PRELOAD hook.
+The
+.Xr kver 8
+utility provides a simple wrapper for convenience.
+.Pp
+For each variable that may be overridden,
+.Nm
+first attempts to obtain an override value from an environment variable;
+if the environment variable is not set then it uses
+.Xr readlink 3
+to get the target of a symbolic link, and treats that as the override value;
+if that also fails, then the variable is not overridden.
+If none of the variables are overridden, or if an error occurs, then
+the
+.Nm
+library emits a warning message on the standard error output,
+and allows the program to run without any overrides.
+.Pp
+The following table lists all the variables that may be overridden,
+giving the environment variable name, the symbolic link name,
+and a description of the way the value is used.
+.Pp
+.Bl -column "LIBKVER_MACHINE_ARCH" "/libkver_machine_arch"
+.It Sy Environment Ta Sy Symlink Ta Sy Description
+.
+.It Ev LIBKVER_OSTYPE Ta Pa /libkver_ostype Ta
+The operating system type, e.g.
+.Qq Nx .
+Overrides the
+.Xr sysctl 7
+variable
+.Va kern.ostype .
+Overrides the result from
+.Xr uname 1
+with the
+.Fl s
+flag.
+Overrides the
+.Va sysname
+element of the
+.Vt "struct utsname"
+result from
+.Xr uname 3 .
+.
+.It Ev LIBKVER_OSRELEASE Ta Pa /libkver_osrelease Ta
+The operating system release, e.g.
+.Qq "6.0_STABLE" .
+Overrides the
+.Xr sysctl 7
+variable
+.Va kern.osrelease .
+Overrides the result from
+.Xr uname 1
+with the
+.Fl r
+flag.
+Overrides the
+.Va release
+element of the
+.Vt "struct utsname"
+result from
+.Xr uname 3 .
+.Pp
+This value is also converted to an integer, which is used to
+override the value of the
+.Xr sysctl 7
+variable
+.Va kern.osrevision .
+.
+.It Ev LIBKVER_MACHINE Ta Pa /libkver_machine Ta
+The operating hardware platform, e.g.
+.Dq "amd64" .
+Overrides the
+.Xr sysctl 7
+variable
+.Va hw.machine .
+Overrides the result from
+.Xr uname 1
+with the
+.Fl m
+flag.
+Overrides the
+.Va machine
+element of the
+.Vt "struct utsname"
+result from
+.Xr uname 3 .
+.
+.It Ev LIBKVER_MACHINE_ARCH Ta Pa /libkver_machine_arch Ta
+The machine processor architecture, e.g.
+.Dq "x86_64" .
+Overrides the
+.Xr sysctl 7
+variable
+.Va hw.machine_arch .
+Overrides the result from
+.Xr uname 1
+with the
+.Fl p
+flag.
+.El
+.Pp
.Sh EXAMPLES
.Dl env LD_PRELOAD=/lib/libkver.so LIBKVER_OSRELEASE=1.5 uname -r
.Pp
@@ -41,7 +131,26 @@
.Dl env LD_PRELOAD=/lib/libkver.so uname -r
.Sh SEE ALSO
.Xr ld.so 1 ,
+.Xr uname 1 ,
.Xr sysctl 3 ,
+.Xr uname 3 ,
+.Xr kver 8
+.Sh DIAGNOSTICS
+.Bl -diag
+.It "libkver: uname"
.Xr uname 3
+failed.
+.It "libkver: not configured"
+None of the configurable variables has been overridden.
+.It "libkver: sysctl hw.machine_arch"
+.Xr sysctl 3
+failed to retrieve the value of the
+.Va hw.machine_arch
+variable.
+.It "libkver: cannot convert osrelease to osrevision: %s"
+The osrelease string could not be converted to an integer for use by the
+.Va kern.osrevision
+.Xr sysctl 7
+variable.
.Sh AUTHORS
.An Stoned Elipot Aq
[email protected]
=== pkgtools/libkver/files/lib/kver.c
==================================================================
--- pkgtools/libkver/files/lib/kver.c (revision 1571)
+++ pkgtools/libkver/files/lib/kver.c (revision 1574)
@@ -19,11 +19,30 @@
#undef sysctl
#undef uname
-#define KVER_VERSION_FMT "NetBSD %s (LIBKVER) #0: Tue Jan 19 00:00:00 UTC 2038 root@localhost:/sys/arch/%s/compile/LIBKVER"
+#define KVER_VERSION_FMT "%s %s (LIBKVER) #0: Tue Jan 19 00:00:00 UTC 2038 root@localhost:/sys/arch/%s/compile/LIBKVER"
+
#define KVER_NOT_INITIALIZED_OSRELEASE -2
#define KVER_INVALID_OSRELEASE -1
+/*
+ * How to override the operating system name; e.g. "NetBSD".
+ * Used by sysctl kern.ostype, uname -s, struct utsname.sysname
+ */
+#ifndef PATH_LIBKVER_OSTYPE
+#define PATH_LIBKVER_OSTYPE "/libkver_ostype"
+#endif
+#ifndef VAR_LIBKVER_OSTYPE
+#define VAR_LIBKVER_OSTYPE "LIBKVER_OSTYPE"
+#endif
+
+/*
+ * How to override the operating system release level; e.g. "6.0_STABLE".
+ * Used by sysctl kern.osrelease, uname -r, struct utsname.release
+ *
+ * This is also coverted to an integer, e.g. 601000000,
+ * for use by sysctl.kern.osrevision.
+ */
#ifndef PATH_LIBKVER_OSRELEASE
#define PATH_LIBKVER_OSRELEASE "/libkver_osrelease"
#endif
@@ -31,12 +50,37 @@
#define VAR_LIBKVER_OSRELEASE "LIBKVER_OSRELEASE"
#endif
+/*
+ * How to override the machine hardware platform, e.g. "i386".
+ * Used by sysctl hw.machine, uname -m, struct utsname.machine.
+ */
+#ifndef PATH_LIBKVER_MACHINE
+#define PATH_LIBKVER_MACHINE "/libkver_machine"
+#endif
+#ifndef VAR_LIBKVER_MACHINE
+#define VAR_LIBKVER_MACHINE "LIBKVER_MACHINE"
+#endif
+
+/*
+ * How to override the machine processor architecture, e.g. "i386".
+ * Used by sysctl hw.machine_arch, uname -p.
+ */
+#ifndef PATH_LIBKVER_MACHINE_ARCH
+#define PATH_LIBKVER_MACHINE_ARCH "/libkver_machine_arch"
+#endif
+#ifndef VAR_LIBKVER_MACHINE_ARCH
+#define VAR_LIBKVER_MACHINE_ARCH "LIBKVER_MACHINE_ARCH"
+#endif
+
static struct kver {
+ char ostype[_SYS_NMLN];
char osrelease[_SYS_NMLN];
int osrevision;
char version[_SYS_NMLN];
+ char machine[_SYS_NMLN];
+ char machine_arch[_SYS_NMLN];
} kver = {
- "", KVER_NOT_INITIALIZED_OSRELEASE, ""
+ .osrevision = KVER_NOT_INITIALIZED_OSRELEASE
};
static struct utsname real_utsname;
@@ -48,7 +92,7 @@
#define SYSCTL_STRING(oldp, oldlenp, str) \
if (oldlenp) { \
- len = strlen(str) + 1; \
+ size_t len = strlen(str) + 1; \
if (!oldp) \
*oldlenp = len; \
else { \
@@ -129,40 +173,109 @@
return KVER_INVALID_OSRELEASE;
}
+/*
+ * Initialise one element of struct kver.
+ *
+ * The result is based on getenv(envvarname), or readlink(linkname),
+ * or defaultval. If the provided defaultval is NULL, then the empty
+ * string is used.
+ *
+ * Returns 1 if a non-default value was used, 0 if a default was used.
+ */
+static int
+kver_init_var(char *dst, size_t dstlen, const char *envvar,
+ const char *linkname, const char *defaultval)
+{
+ ssize_t len;
+ char *v;
+
+ v = getenv(envvar);
+ if (v) {
+ (void) strlcpy(dst, v, dstlen);
+ return 1;
+ }
+ len = readlink(linkname, dst, dstlen);
+ if (len > 0) {
+ dst[len] = '\0';
+ return 1;
+ }
+ if (defaultval) {
+ (void) strlcpy(dst, defaultval, dstlen);
+ return 0;
+ }
+ dst[0] = '\0';
+ return 0;
+}
+
static void
kver_initialize(void)
{
char *v;
int i;
+ int nok = 0;
+ char buf[PATH_MAX + 1];
kver.osrevision = KVER_INVALID_OSRELEASE; /* init done */
- v = getenv(VAR_LIBKVER_OSRELEASE);
- if (v == NULL) {
- char b[MAXPATHLEN + 1];
- i = readlink(PATH_LIBKVER_OSRELEASE, b, sizeof b - 1);
- if (i <= 0) {
- v = NULL;
- } else {
- b[i] = '\0';
- v = b;
- }
+
+ if (_uname(&real_utsname) != 0) {
+ warn("libkver: uname");
+ return;
}
- if (v == NULL) {
+
+ /*
+ * For each variable that can be overridden: try the
+ * environment variable, then try the symlink, or fall back
+ * to the unmodified (existing) value.
+ */
+ nok += kver_init_var(kver.ostype, sizeof(kver.ostype),
+ VAR_LIBKVER_OSTYPE, PATH_LIBKVER_OSTYPE,
+ real_utsname.sysname);
+ nok += kver_init_var(kver.osrelease, sizeof(kver.osrelease),
+ VAR_LIBKVER_OSRELEASE, PATH_LIBKVER_OSRELEASE,
+ real_utsname.release);
+ nok += kver_init_var(kver.machine, sizeof(kver.machine),
+ VAR_LIBKVER_MACHINE, PATH_LIBKVER_MACHINE,
+ real_utsname.machine);
+ nok += kver_init_var(kver.machine_arch, sizeof(kver.machine_arch),
+ VAR_LIBKVER_MACHINE_ARCH, PATH_LIBKVER_MACHINE_ARCH,
+ "");
+
+ /*
+ * warning if the default was used for all variables. no warning
+ * if at least one non-default value was used.
+ */
+ if (nok == 0) {
warnx("libkver: not configured");
return;
}
- if (_uname(&real_utsname) != 0) {
- warn("libkver: uname");
- return;
+
+ /* machine_arch is not in struct utsname, so get default from sysctl */
+ if (kver.machine_arch[0] == '\0') {
+ int mib[] = { CTL_HW, HW_MACHINE_ARCH, 0 };
+ int len = sizeof(kver.machine_arch);
+ int err;
+
+ err = _sysctl(mib, 2, kver.machine_arch, &len, NULL, 0);
+ if (err < 0) {
+ warn("libkver: sysctl hw.machine_arch");
+ return;
+ }
}
- kver.osrevision = str2osrevision(v);
+
+ /* combine several strings to create kver.version */
+ (void) snprintf(kver.version, sizeof(kver.version), KVER_VERSION_FMT,
+ kver.ostype, kver.osrelease, kver.machine);
+
+ /*
+ * Convert string osrelease to integer osrevision.
+ * This must be the last thing we do, so that any failure
+ * resuls in kver.osrelease being set to KVER_INVALID_OSRELEASE.
+ */
+ kver.osrevision = str2osrevision(kver.osrelease);
if (kver.osrevision == KVER_INVALID_OSRELEASE) {
- warnx("libkver: invalid version: %s", v);
- return;
+ warnx("libkver: cannot convert osrelease to osrevision: %s",
+ kver.osrelease);
}
- (void) strncpy(kver.osrelease, v, _SYS_NMLN);
- kver.osrelease[_SYS_NMLN - 1] = '\0';
- (void) snprintf(kver.version, _SYS_NMLN, KVER_VERSION_FMT,
- kver.osrelease, real_utsname.machine);
+
return;
}
@@ -170,6 +283,8 @@
sysctl(SYSCTL_CONST int *name, u_int namelen, void *oldp, size_t * oldlenp,
const void *newp, size_t newlen)
{
+ int r = 0;
+
_DIAGASSERT(name != NULL);
if (newp != (void *) NULL)
@@ -181,10 +296,12 @@
if (KVER_BADLY_INITIALIZED || namelen != 2)
goto real;
- if (name[0] == CTL_KERN) {
- size_t len;
- int r = 0;
+ switch (name[0]) {
+ case CTL_KERN: {
switch (name[1]) {
+ case KERN_OSTYPE:
+ SYSCTL_STRING(oldp, oldlenp, kver.ostype);
+ return (r);
case KERN_OSRELEASE:
SYSCTL_STRING(oldp, oldlenp, kver.osrelease);
return (r);
@@ -205,6 +322,17 @@
return (r);
}
}
+ case CTL_HW: {
+ switch (name[1]) {
+ case HW_MACHINE:
+ SYSCTL_STRING(oldp, oldlenp, kver.machine);
+ return (r);
+ case HW_MACHINE_ARCH:
+ SYSCTL_STRING(oldp, oldlenp, kver.machine_arch);
+ return (r);
+ }
+ }
+ }
real: return (_sysctl(name, namelen, oldp, oldlenp, newp, newlen));
}
@@ -217,10 +345,10 @@
if (KVER_BADLY_INITIALIZED)
return _uname(n);
- (void) strncpy(n->sysname, real_utsname.sysname, _SYS_NMLN);
+ (void) strncpy(n->sysname, kver.ostype, _SYS_NMLN);
(void) strncpy(n->nodename, real_utsname.nodename, _SYS_NMLN);
(void) strncpy(n->release, kver.osrelease, _SYS_NMLN);
(void) strncpy(n->version, kver.version, _SYS_NMLN);
- (void) strncpy(n->machine, real_utsname.machine, _SYS_NMLN);
+ (void) strncpy(n->machine, kver.machine, _SYS_NMLN);
return 0;
}
=== pkgtools/libkver/files/kver (new directory)
==================================================================
=== pkgtools/libkver/files/kver/Makefile
==================================================================
--- pkgtools/libkver/files/kver/Makefile (revision 1571)
+++ pkgtools/libkver/files/kver/Makefile (revision 1574)
@@ -0,0 +1,4 @@
+MAN= kver.8
+SCRIPTS= kver.sh
+
+.include <bsd.prog.mk>
Property changes on: pkgtools/libkver/files/kver/Makefile
___________________________________________________________________
Name: svn:eol-style
+native
=== pkgtools/libkver/files/kver/kver.8
==================================================================
--- pkgtools/libkver/files/kver/kver.8 (revision 1571)
+++ pkgtools/libkver/files/kver/kver.8 (revision 1574)
@@ -0,0 +1,85 @@
+.\" $NetBSD$
+.\"
+.Dd October 30, 2012
+.Os
+.Dt KVER 8
+.Sh NAME
+.Nm kver
+.Nd run a command with overriden system version
+.Sh SYNOPSIS
+.Nm
+.Op Fl s Ar ostype
+.Op Fl r Ar osrelease
+.Op Fl m Ar machine
+.Op Fl p Ar machine_arch
+.Ar command
+.Op Ar argument ...
+.Sh DESCRIPTION
+The
+.Nm
+utility
+provides a simple wrapper around the
+.Xr kver 3
+library.
+It converts its options to environment variables understood by
+.Xr kver 3 ,
+sets the
+.Ev LD_PRELOAD
+environment variable to ensure that the
+.Xr kver 3
+library
+.Pq Pa @PREFIX@/lib/libkver.so
+is loaded,
+and executes the specified
+.Ar command
+with the specified
+.Ar argument Ns s .
+.Pp
+The following options are accepted:
+.Bl -tag -offset indent
+.It Fl s Ar ostype
+The operating system type, e.g.
+.Qq Nx .
+Sets the
+.Ev LIBKVER_OSTYPE
+environment variable.
+.It Fl r Ar osrelease
+The operating system release, e.g.
+.Qq "6.0_STABLE" .
+Sets the
+.Ev LIBKVER_OSRELEASE
+environment variable.
+.It Fl m Ar machine
+The operating hardware platform, e.g.
+.Dq "amd64" .
+Sets the
+.Ev LIBKVER_MACHINE
+environment variable.
+.It Fl m Ar machine_arch
+The machine processor architecture, e.g.
+.Dq "x86_64" .
+Sets the
+.Ev LIBKVER_MACHINE_ARCH
+environment variable.
+.El
+.Sh EXAMPLES
+.Bl -tag
+.It Li "kver -r 1.5 uname -r"
+Run the
+.Ql "uname -r"
+command with
+.Va osrelease
+set to
+.Ql 1.5 .
+.It Li "kver -m i386 chroot ."
+Run the
+.Ql "chroot ."
+command with
+.Va machine
+set to
+.Ql i386 .
+.El
+.Sh SEE ALSO
+.Xr kver 3
+.Sh AUTHORS
+.An Alan Barrett Aq
[email protected]
=== pkgtools/libkver/files/kver/kver.sh
==================================================================
--- pkgtools/libkver/files/kver/kver.sh (revision 1571)
+++ pkgtools/libkver/files/kver/kver.sh (revision 1574)
@@ -0,0 +1,30 @@
+#!@SH@
+
+LIBKVER='@PREFIX@/lib/libkver.so'
+EX_USAGE=64
+
+usage()
+{
+ cat <<ENDUSAGE;
+usage: $0 [-s ostype] [-r osrelease] [-m machine] [-p arch] command [args]
+ENDUSAGE
+}
+
+while getopts "s:r:m:p:" opt
+do
+ case "$opt" in
+ s) export LIBKVER_OSTYPE="$OPTARG" ;;
+ r) export LIBKVER_OSRELEASE="$OPTARG" ;;
+ m) export LIBKVER_MACHINE="$OPTARG" ;;
+ p) export LIBKVER_MACHINE_ARCH="$OPTARG" ;;
+ *) usage ; exit $EX_USAGE ;;
+ esac
+done
+shift $(($OPTIND - 1))
+if [ $# -eq 0 ]; then
+ usage
+ exit $EX_USAGE
+fi
+
+export LD_PRELOAD="${LIBKVER}${LD_PRELOAD:+:}${LD_PRELOAD}"
+exec "$@"
=== pkgtools/libkver/files/Makefile
==================================================================
--- pkgtools/libkver/files/Makefile (revision 1571)
+++ pkgtools/libkver/files/Makefile (revision 1574)
@@ -1,6 +1,6 @@
# $NetBSD: Makefile,v 1.3 2003/12/13 17:45:59 seb Exp $
-SUBDIR= lib
+SUBDIR= kver lib
.ifndef(LDD_SYSCTL)
LDD_SYSCTL!= ldd /sbin/sysctl 2>&1