[Midnightbsd-cvs] src [11408] trunk/usr.sbin/binmiscctl: add binmiscctl
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Fri Jul 6 21:11:10 EDT 2018
Revision: 11408
http://svnweb.midnightbsd.org/src/?rev=11408
Author: laffer1
Date: 2018-07-06 21:11:10 -0400 (Fri, 06 Jul 2018)
Log Message:
-----------
add binmiscctl
Added Paths:
-----------
trunk/usr.sbin/binmiscctl/
trunk/usr.sbin/binmiscctl/Makefile
trunk/usr.sbin/binmiscctl/binmiscctl.8
trunk/usr.sbin/binmiscctl/binmiscctl.c
Added: trunk/usr.sbin/binmiscctl/Makefile
===================================================================
--- trunk/usr.sbin/binmiscctl/Makefile (rev 0)
+++ trunk/usr.sbin/binmiscctl/Makefile 2018-07-07 01:11:10 UTC (rev 11408)
@@ -0,0 +1,11 @@
+# $MidnightBSD$
+#
+# $FreeBSD: stable/10/usr.sbin/binmiscctl/Makefile 264269 2014-04-08 20:10:22Z sbruno $
+#
+
+.include <bsd.own.mk>
+
+PROG= binmiscctl
+MAN= binmiscctl.8
+
+.include <bsd.prog.mk>
Property changes on: trunk/usr.sbin/binmiscctl/Makefile
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.sbin/binmiscctl/binmiscctl.8
===================================================================
--- trunk/usr.sbin/binmiscctl/binmiscctl.8 (rev 0)
+++ trunk/usr.sbin/binmiscctl/binmiscctl.8 2018-07-07 01:11:10 UTC (rev 11408)
@@ -0,0 +1,299 @@
+.\" $MidnightBSD$
+.\"-
+.\" Copyright (c) 2013 Stacey D. Son
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD: stable/10/usr.sbin/binmiscctl/binmiscctl.8 277155 2015-01-13 22:51:44Z wblock $
+.\"
+.\" Support for miscellaneous binary image activators
+.\"
+.Dd December 30, 2014
+.Dt BINMISCCTL 8
+.Os
+.Sh NAME
+.Nm binmiscctl
+.Nd manage binary image activators
+.Sh SYNOPSIS
+.Nm
+.Cm add
+.Ar name
+.Cm --interpreter
+.Ar path
+.Cm --magic
+.Ar magic
+.Cm --size
+.Ar size
+.Op Cm --mask Ar mask
+.Op Cm --offset Ar offset
+.Op Cm --set-enabled
+.Nm
+.Cm remove
+.Ar name
+.Nm
+.Cm disable
+.Ar name
+.Nm
+.Cm enable
+.Ar name
+.Nm
+.Cm lookup
+.Ar name
+.Nm
+.Cm list
+.Sh DESCRIPTION
+The
+.Nm
+utility
+is the management utility for configuring miscellaneous binaries image
+activators in the kernel.
+It allows adding, deleting, disabling,
+enabling, and looking up interpreters.
+Also, all the interpreters can
+be listed.
+.Pp
+The first argument on the command line indicates the operation to be
+performed.
+Operation must be one of the following:
+.Bl -tag -width indent
+.It Xo
+.Cm add
+.Ar name
+.Cm --interpreter
+.Ar path
+.Cm --magic
+.Ar magic
+.Cm --size
+.Ar size
+.Op Cm --mask Ar mask
+.Op Cm --offset Ar offset
+.Op Cm --set-enabled
+.Xc
+Add a new activator entry in the kernel.
+You must specify a
+unique
+.Ar name,
+interpreter path and its arguments
+.Ar path,
+header
+.Ar magic
+bytes that uniquely identify a suitable binary for the activator,
+and the
+.Ar size
+of the
+.Ar magic
+in bytes.
+.Pp
+Optionally you may specify a
+.Ar mask
+to do a bitwise AND with the header bytes.
+This effectively allows you to ignore fields in the binary header that
+do not uniquely indentify the binary file's type.
+.Pp
+An
+.Ar offset
+may be specified for the magic bytes using the
+.Cm --offset
+option.
+By default the
+.Ar offset
+is zero.
+.Pp
+To enable the activator entry the
+.Cm --set-enabled
+option is used.
+The activator default state is disabled.
+.Pp
+The interpreter
+.Ar path
+may also contain arguments for the interpreter including
+.Ar #a
+which gets replaced by the old
+.Dv argv0
+value in the interpreter string.
+.It Cm remove Ar name
+Remove the activator entry identified with
+.Ar name .
+.It Cm disable Ar name
+Disable the activator entry identified with
+.Ar name .
+.It Cm enable Ar name
+Enable the activator entry identified with
+.Ar name .
+.It Cm lookup Ar name
+Look up and print out the activator entry identified with
+.Ar name .
+.It Cm list
+Take a snapshot and print all the activator entries currently configured.
+.El
+.Sh EXAMPLES
+Add an image activator to run the LLVM interpreter (lli) on bitcode
+compiled files:
+.Bd -ragged -offset indent
+# binmiscctl add llvmbc --interpreter ''/usr/bin/lli --fake-argv0=#a''
+--magic ''BC\\xc0\\xde'' --size 4 --set-enabled
+.Ed
+.Pp
+.Ar #a
+is replaced with the old
+.Dv argv0
+value so that 'lli' can fake its
+.Dv argv0 .
+Set its state to enabled.
+.Pp
+Set the state of the
+.Ar llvmbc
+image activator to disabled:
+.Dl # binmiscctl disable llvmbc
+.Pp
+Set the state of the
+.Ar llvmbc
+image activator to enabled:
+.Dl # binmiscctl enable llvmbc
+.Pp
+Delete the
+.Ar llvmbc
+image activator:
+.Dl # binmiscctl remove llvmbc
+.Pp
+Look up and list the record for the
+.Ar llvmbc
+image activator:
+.Dl # binmiscctl lookup llvmbc
+.Pp
+Add QEMU bsd-user program as an image activator for ARM little-endian binaries:
+.Bd -literal -offset indent
+# binmiscctl add armelf \e
+ --interpreter "/usr/local/bin/qemu-arm-static" \e
+ --magic "\ex7f\ex45\ex4c\ex46\ex01\ex01\ex01\ex00\ex00\ex00\e
+ \ex00\ex00\ex00\ex00\ex00\ex00\ex02\ex00\ex28\ex00" \e
+ --mask "\exff\exff\exff\exff\exff\exff\exff\ex00\exff\exff\e
+ \exff\exff\exff\exff\exff\exff\exfe\exff\exff\exff" \e
+ --size 20 --set-enabled
+.Ed
+.Pp
+Add QEMU bsd-user program as an image activator for ARM big-endian binaries:
+.Bd -literal -offset indent
+# binmiscctl add armebelf \e
+ --interpreter "/usr/local/bin/qemu-arm-static" \e
+ --magic "\ex7f\ex45\ex4c\ex46\ex01\ex02\ex01\ex00\ex00\ex00\e
+ \ex00\ex00\ex00\ex00\ex00\ex00\ex00\ex02\ex00\ex28" \e
+ --mask "\exff\exff\exff\exff\exff\exff\exff\ex00\exff\exff\e
+ \exff\exff\exff\exff\exff\exff\exff\exfe\exff\exff" \e
+ --size 20 --set-enabled
+.Ed
+.Pp
+Add QEMU bsd-user program as an image activator for MIPS32 binaries:
+.Bd -literal -offset indent
+# binmiscctl add mips32 \e
+ --interpreter "/usr/local/bin/qemu-mips-static" \e
+ --magic "\ex7f\ex45\ex4c\ex46\ex01\ex02\ex01\ex00\ex00\ex00\e
+ \ex00\ex00\ex00\ex00\ex00\ex00\ex00\ex02\ex00\ex08" \e
+ --mask "\exff\exff\exff\exff\exff\exff\exff\ex00\exff\exff\e
+ \exff\exff\exff\exff\exff\exff\exff\exfe\exff\exff" \e
+ --size 20 --set-enabled
+.Ed
+.Pp
+Add QEMU bsd-user program as an image activator for MIPS64 binaries:
+.Bd -literal -offset indent
+# binmiscctl add mips64 \e
+ --interpreter "/usr/local/bin/qemu-mips64-static" \e
+ --magic "\ex7f\ex45\ex4c\ex46\ex02\ex02\ex01\ex00\ex00\ex00\e
+ \ex00\ex00\ex00\ex00\ex00\ex00\ex00\ex02\ex00\ex08" \e
+ --mask "\exff\exff\exff\exff\exff\exff\exff\ex00\exff\exff\e
+ \exff\exff\exff\exff\exff\exff\exff\exfe\exff\exff" \e
+ --size 20 --set-enabled
+.Ed
+.Pp
+Add QEMU bsd-user program as an image activator for PowerPC binaries:
+.Bd -literal -offset indent
+# binmiscctl add powerpc \e
+ --interpreter "/usr/local/bin/qemu-ppc-static" \e
+ --magic "\ex7f\ex45\ex4c\ex46\ex01\ex02\ex01\ex00\ex00\ex00\e
+ \ex00\ex00\ex00\ex00\ex00\ex00\ex00\ex02\ex00\ex14" \e
+ --mask "\exff\exff\exff\exff\exff\exff\exff\ex00\exff\exff\e
+ \exff\exff\exff\exff\exff\exff\exff\exfe\exff\exff" \e
+ --size 20 --set-enabled
+.Ed
+.Pp
+Add QEMU bsd-user program as an image activator for PowerPC64 binaries:
+.Bd -literal -offset indent
+# binmiscctl add powerpc64 \e
+ --interpreter "/usr/local/bin/qemu-ppc64-static" \e
+ --magic "\ex7f\ex45\ex4c\ex46\ex01\ex02\ex01\ex00\ex00\ex00\e
+ \ex00\ex00\ex00\ex00\ex00\ex00\ex00\ex02\ex00\ex15" \e
+ --mask "\exff\exff\exff\exff\exff\exff\exff\ex00\exff\exff\e
+ \exff\exff\exff\exff\exff\exff\exff\exfe\exff\exff" \e
+ --size 20 --set-enabled
+.Ed
+.Pp
+Add QEMU bsd-user program as an image activator for SPARC64 binaries:
+.Bd -literal -offset indent
+# binmiscctl add sparc64 \e
+ --interpreter "/usr/local/bin/qemu-sparc64-static" \e
+ --magic "\ex7f\ex45\ex4c\ex46\ex02\ex02\ex01\ex00\ex00\ex00\e
+ \ex00\ex00\ex00\ex00\ex00\ex00\ex00\ex02\ex00\ex2b" \e
+ --mask "\exff\exff\exff\exff\exff\exff\exff\ex00\exff\exff\e
+ \exff\exff\exff\exff\exff\exff\exff\exfe\exff\exff" \e
+ --size 20 --set-enabled
+.Ed
+.Pp
+.Ss "Create and use an ARMv6 chroot on an AMD64 host"
+Use an existing source tree to build a chroot host with architecture
+overrides:
+.Bd -literal
+D=/path/to/chroot
+cd /usr/src
+mkdir -p $D
+make world TARGET=arm TARGET_ARCH=armv6 DESTDIR=$D
+make distribution TARGET=arm TARGET_ARCH=armv6 DESTDIR=$D
+.Ed
+.Pp
+With
+.Pa emulators/qemu-user-static
+from the
+.Fx
+Ports Collection, the emulator must be copied into the jail path
+specified in the binmiscctl command.
+Using the example above:
+.Bd -literal
+mkdir $D/usr/local/bin
+cp /usr/local/bin/qemu-arm-static $D/usr/local/bin
+.Ed
+.Pp
+Now the user can chroot into the environment normally, as root:
+.Bd -literal
+chroot $D
+.Ed
+.Sh SEE ALSO
+.Xr lli 1 ,
+.Xr execve 2 ,
+.Xr jail 8
+.Sh HISTORY
+The
+.Cm binmiscctl
+command was added in
+.Fx 10.1 .
+It was developed to support the imgact_binmisc kernel module.
+.Sh AUTHORS
+Stacey D Son
Property changes on: trunk/usr.sbin/binmiscctl/binmiscctl.8
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.sbin/binmiscctl/binmiscctl.c
===================================================================
--- trunk/usr.sbin/binmiscctl/binmiscctl.c (rev 0)
+++ trunk/usr.sbin/binmiscctl/binmiscctl.c 2018-07-07 01:11:10 UTC (rev 11408)
@@ -0,0 +1,511 @@
+/* $MidnightBSD$ */
+/*-
+ * Copyright (c) 2013 Stacey D. Son
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD: stable/10/usr.sbin/binmiscctl/binmiscctl.c 287463 2015-09-04 15:45:42Z sbruno $");
+
+#include <ctype.h>
+#include <errno.h>
+#include <getopt.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <sys/types.h>
+#include <sys/imgact_binmisc.h>
+#include <sys/linker.h>
+#include <sys/sysctl.h>
+
+enum cmd {
+ CMD_ADD = 0,
+ CMD_REMOVE,
+ CMD_DISABLE,
+ CMD_ENABLE,
+ CMD_LOOKUP,
+ CMD_LIST,
+};
+
+extern char *__progname;
+
+typedef int (*cmd_func_t)(int argc, char *argv[], ximgact_binmisc_entry_t *xbe);
+
+int add_cmd(int argc, char *argv[], ximgact_binmisc_entry_t *xbe);
+int name_cmd(int argc, char *argv[], ximgact_binmisc_entry_t *xbe);
+int noname_cmd(int argc, char *argv[], ximgact_binmisc_entry_t *xbe);
+
+static const struct {
+ const int token;
+ const char *name;
+ cmd_func_t func;
+ const char *desc;
+ const char *args;
+} cmds[] = {
+ {
+ CMD_ADD,
+ "add",
+ add_cmd,
+ "Add a new binary image activator (requires 'root' privilege)",
+ "<name> --interpreter <path_and_arguments> \\\n"
+ "\t\t--magic <magic_bytes> [--mask <mask_bytes>] \\\n"
+ "\t\t--size <magic_size> [--offset <magic_offset>] \\\n"
+ "\t\t[--set-enabled]"
+ },
+ {
+ CMD_REMOVE,
+ "remove",
+ name_cmd,
+ "Remove a binary image activator (requires 'root' privilege)",
+ "<name>"
+ },
+ {
+ CMD_DISABLE,
+ "disable",
+ name_cmd,
+ "Disable a binary image activator (requires 'root' privilege)",
+ "<name>"
+ },
+ {
+ CMD_ENABLE,
+ "enable",
+ name_cmd,
+ "Enable a binary image activator (requires 'root' privilege)",
+ "<name>"
+ },
+ {
+ CMD_LOOKUP,
+ "lookup",
+ name_cmd,
+ "Lookup a binary image activator",
+ "<name>"
+ },
+ {
+ CMD_LIST,
+ "list",
+ noname_cmd,
+ "List all the binary image activators",
+ ""
+ },
+};
+
+static const struct option
+add_opts[] = {
+ { "set-enabled", no_argument, NULL, 'e' },
+ { "interpreter", required_argument, NULL, 'i' },
+ { "mask", required_argument, NULL, 'M' },
+ { "magic", required_argument, NULL, 'm' },
+ { "offset", required_argument, NULL, 'o' },
+ { "size", required_argument, NULL, 's' },
+ { NULL, 0, NULL, 0 }
+};
+
+static char const *cmd_sysctl_name[] = {
+ IBE_SYSCTL_NAME_ADD,
+ IBE_SYSCTL_NAME_REMOVE,
+ IBE_SYSCTL_NAME_DISABLE,
+ IBE_SYSCTL_NAME_ENABLE,
+ IBE_SYSCTL_NAME_LOOKUP,
+ IBE_SYSCTL_NAME_LIST
+};
+
+static void
+usage(const char *format, ...)
+{
+ va_list args;
+ size_t i;
+ int error = 0;
+
+ va_start(args, format);
+ if (format) {
+ vfprintf(stderr, format, args);
+ error = -1;
+ }
+ va_end(args);
+ fprintf(stderr, "\n");
+ fprintf(stderr, "usage: %s command [args...]\n\n", __progname);
+
+ for(i = 0; i < ( sizeof (cmds) / sizeof (cmds[0])); i++) {
+ fprintf(stderr, "%s:\n", cmds[i].desc);
+ fprintf(stderr, "\t%s %s %s\n\n", __progname, cmds[i].name,
+ cmds[i].args);
+ }
+
+ exit (error);
+}
+
+static void
+fatal(const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ if (format)
+ vfprintf(stderr, format, args);
+ fprintf(stderr, "\n");
+
+ exit(-1);
+}
+
+static void
+getoptstr(char *str, size_t size, const char *argname)
+{
+ if (strlen(optarg) > size)
+ usage("'%s' too large", argname);
+ strlcpy(str, optarg, size);
+}
+
+static void
+printxbe(ximgact_binmisc_entry_t *xbe)
+{
+ uint32_t i, flags = xbe->xbe_flags;
+
+ if (xbe->xbe_version != IBE_VERSION) {
+ fprintf(stderr, "Error: XBE version mismatch\n");
+ return;
+ }
+
+ printf("name: %s\n", xbe->xbe_name);
+ printf("interpreter: %s\n", xbe->xbe_interpreter);
+ printf("flags: %s%s\n", (flags & IBF_ENABLED) ? "ENABLED " : "",
+ (flags & IBF_USE_MASK) ? "USE_MASK " : "");
+ printf("magic size: %u\n", xbe->xbe_msize);
+ printf("magic offset: %u\n", xbe->xbe_moffset);
+
+ printf("magic: ");
+ for(i = 0; i < xbe->xbe_msize; i++) {
+ if (i && !(i % 12))
+ printf("\n ");
+ else
+ if (i && !(i % 4))
+ printf(" ");
+ printf("0x%02x ", xbe->xbe_magic[i]);
+ }
+ printf("\n");
+
+ if (flags & IBF_USE_MASK) {
+ printf("mask: ");
+ for(i = 0; i < xbe->xbe_msize; i++) {
+ if (i && !(i % 12))
+ printf("\n ");
+ else
+ if (i && !(i % 4))
+ printf(" ");
+ printf("0x%02x ", xbe->xbe_mask[i]);
+ }
+ printf("\n");
+ }
+
+ printf("\n");
+}
+
+static int
+demux_cmd(__unused int argc, char *const argv[])
+{
+ size_t i;
+
+ optind = 1;
+ optreset = 1;
+
+ for(i = 0; i < ( sizeof (cmds) / sizeof (cmds[0])); i++) {
+ if (!strcasecmp(cmds[i].name, argv[0])) {
+ return (i);
+ }
+ }
+
+ /* Unknown command */
+ return (-1);
+}
+
+static int
+strlit2bin_cpy(uint8_t *d, char *s, size_t size)
+{
+ int c;
+ size_t cnt = 0;
+
+ while((c = *s++) != '\0') {
+ if (c == '\\') {
+ /* Do '\' escapes. */
+ switch (*s) {
+ case '\\':
+ *d++ = '\\';
+ break;
+
+ case 'x':
+ s++;
+ c = toupper(*s++);
+ *d = (c - (isdigit(c) ? '0' : ('A' - 10))) << 4;
+ c = toupper(*s++);
+ *d++ |= c - (isdigit(c) ? '0' : ('A' - 10));
+ break;
+
+ default:
+ return (-1);
+ }
+ } else
+ *d++ = c;
+
+ if (++cnt > size)
+ return (-1);
+ }
+
+ return (cnt);
+}
+
+int
+add_cmd(__unused int argc, char *argv[], ximgact_binmisc_entry_t *xbe)
+{
+ int ch;
+ char *magic = NULL, *mask = NULL;
+ int sz;
+
+ if (strlen(argv[0]) > IBE_NAME_MAX)
+ usage("'%s' string length longer than IBE_NAME_MAX (%d)",
+ IBE_NAME_MAX);
+ strlcpy(&xbe->xbe_name[0], argv[0], IBE_NAME_MAX);
+
+ while ((ch = getopt_long(argc, argv, "ei:m:M:o:s:", add_opts, NULL))
+ != -1) {
+
+ switch(ch) {
+ case 'i':
+ getoptstr(xbe->xbe_interpreter, IBE_INTERP_LEN_MAX,
+ "interpreter");
+ break;
+
+ case 'm':
+ magic = strdup(optarg);
+ break;
+
+ case 'M':
+ mask = strdup(optarg);
+ xbe->xbe_flags |= IBF_USE_MASK;
+ break;
+
+ case 'e':
+ xbe->xbe_flags |= IBF_ENABLED;
+ break;
+
+ case 'o':
+ xbe->xbe_moffset = atol(optarg);
+ break;
+
+ case 's':
+ xbe->xbe_msize = atol(optarg);
+ if (xbe->xbe_msize == 0 ||
+ xbe->xbe_msize > IBE_MAGIC_MAX)
+ usage("Error: Not valid '--size' value. "
+ "(Must be > 0 and < %u.)\n",
+ xbe->xbe_msize);
+ break;
+
+ default:
+ usage("Unknown argument: '%c'", ch);
+ }
+ }
+
+ if (xbe->xbe_msize == 0) {
+ if (NULL != magic)
+ free(magic);
+ if (NULL != mask)
+ free(mask);
+ usage("Error: Missing '--size' argument");
+ }
+
+ if (NULL != magic) {
+ if (xbe->xbe_msize == 0) {
+ if (magic)
+ free(magic);
+ if (mask)
+ free(mask);
+ usage("Error: Missing magic size argument");
+ }
+ sz = strlit2bin_cpy(xbe->xbe_magic, magic, IBE_MAGIC_MAX);
+ free(magic);
+ if (sz == -1 || (uint32_t)sz != xbe->xbe_msize) {
+ if (mask)
+ free(mask);
+ usage("Error: invalid magic argument");
+ }
+ if (mask) {
+ sz = strlit2bin_cpy(xbe->xbe_mask, mask, IBE_MAGIC_MAX);
+ free(mask);
+ if (sz == -1 || (uint32_t)sz != xbe->xbe_msize)
+ usage("Error: invalid mask argument");
+ }
+ } else {
+ if (mask)
+ free(mask);
+ usage("Error: Missing magic argument");
+ }
+
+ if (!strnlen(xbe->xbe_interpreter, IBE_INTERP_LEN_MAX)) {
+ usage("Error: Missing 'interpreter' argument");
+ }
+
+ return (0);
+}
+
+int
+name_cmd(int argc, char *argv[], ximgact_binmisc_entry_t *xbe)
+{
+ if (argc == 0)
+ usage("Required argument missing\n");
+ if (strlen(argv[0]) > IBE_NAME_MAX)
+ usage("'%s' string length longer than IBE_NAME_MAX (%d)",
+ IBE_NAME_MAX);
+ strlcpy(&xbe->xbe_name[0], argv[0], IBE_NAME_MAX);
+
+ return (0);
+}
+
+int
+noname_cmd(__unused int argc, __unused char *argv[],
+ __unused ximgact_binmisc_entry_t *xbe)
+{
+
+ return (0);
+}
+
+int
+main(int argc, char **argv)
+{
+ int error = 0, cmd = -1;
+ ximgact_binmisc_entry_t xbe_in, *xbe_inp = NULL;
+ ximgact_binmisc_entry_t xbe_out, *xbe_outp = NULL;
+ size_t xbe_in_sz = 0;
+ size_t xbe_out_sz = 0, *xbe_out_szp = NULL;
+ uint32_t i;
+
+ if (kldfind(KMOD_NAME) == -1) {
+ if (kldload(KMOD_NAME) == -1)
+ fatal("Can't load %s kernel module: %s",
+ KMOD_NAME, strerror(errno));
+ }
+
+ bzero(&xbe_in, sizeof(xbe_in));
+ bzero(&xbe_out, sizeof(xbe_out));
+ xbe_in.xbe_version = IBE_VERSION;
+
+ if (argc < 2)
+ usage("Error: requires at least one argument");
+
+ argc--, argv++;
+ cmd = demux_cmd(argc, argv);
+ if (cmd == -1)
+ usage("Error: Unknown command \"%s\"", argv[0]);
+ argc--, argv++;
+
+ error = (*cmds[cmd].func)(argc, argv, &xbe_in);
+ if (error)
+ usage("Can't parse command-line for '%s' command",
+ cmds[cmd].name);
+
+ if (cmd != CMD_LIST) {
+ xbe_inp = &xbe_in;
+ xbe_in_sz = sizeof(xbe_in);
+ } else
+ xbe_out_szp = &xbe_out_sz;
+ if (cmd == CMD_LOOKUP) {
+ xbe_out_sz = sizeof(xbe_out);
+ xbe_outp = &xbe_out;
+ xbe_out_szp = &xbe_out_sz;
+ }
+
+ error = sysctlbyname(cmd_sysctl_name[cmd], xbe_outp, xbe_out_szp,
+ xbe_inp, xbe_in_sz);
+
+ if (error)
+ switch(errno) {
+ case EINVAL:
+ usage("Invalid interpreter name or --interpreter, "
+ "--magic, --mask, or --size argument value");
+ break;
+
+ case EEXIST:
+ usage("'%s' is not unique in activator list",
+ xbe_in.xbe_name);
+ break;
+
+ case ENOENT:
+ usage("'%s' is not found in activator list",
+ xbe_in.xbe_name);
+ break;
+
+ case ENOSPC:
+ fatal("Fatal: no more room in the activator list "
+ "(limited to %d enties)", IBE_MAX_ENTRIES);
+ break;
+
+ case EPERM:
+ usage("Insufficient privileges for '%s' command",
+ cmds[cmd].name);
+ break;
+
+ default:
+ fatal("Fatal: sysctlbyname() returned: %s",
+ strerror(errno));
+ break;
+ }
+
+
+ if (cmd == CMD_LOOKUP)
+ printxbe(xbe_outp);
+
+ if (cmd == CMD_LIST && xbe_out_sz > 0) {
+ xbe_outp = malloc(xbe_out_sz);
+ if (!xbe_outp)
+ fatal("Fatal: out of memory");
+ while(1) {
+ size_t osize = xbe_out_sz;
+ error = sysctlbyname(cmd_sysctl_name[cmd], xbe_outp,
+ &xbe_out_sz, NULL, 0);
+
+ if (error == -1 && errno == ENOMEM &&
+ xbe_out_sz == osize) {
+ /*
+ * Buffer too small. Increase it by one
+ * entry.
+ */
+ xbe_out_sz += sizeof(xbe_out);
+ xbe_outp = realloc(xbe_outp, xbe_out_sz);
+ if (!xbe_outp)
+ fatal("Fatal: out of memory");
+ } else
+ break;
+ }
+ if (error) {
+ free(xbe_outp);
+ fatal("Fatal: %s", strerror(errno));
+ }
+ for(i = 0; i < (xbe_out_sz / sizeof(xbe_out)); i++)
+ printxbe(&xbe_outp[i]);
+ }
+
+ return (error);
+}
Property changes on: trunk/usr.sbin/binmiscctl/binmiscctl.c
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
More information about the Midnightbsd-cvs
mailing list