[Glibc-bsd-commits] r5970 - in branches/jessie/freebsd-utils/debian: . patches

stevenc-guest at alioth.debian.org stevenc-guest at alioth.debian.org
Wed Mar 23 01:58:01 UTC 2016


Author: stevenc-guest
Date: 2016-03-23 01:58:00 +0000 (Wed, 23 Mar 2016)
New Revision: 5970

Added:
   branches/jessie/freebsd-utils/debian/patches/jexec_jls.diff
Modified:
   branches/jessie/freebsd-utils/debian/changelog
   branches/jessie/freebsd-utils/debian/freebsd-utils.install
   branches/jessie/freebsd-utils/debian/freebsd-utils.manpages
   branches/jessie/freebsd-utils/debian/patches/series
   branches/jessie/freebsd-utils/debian/rules
Log:
Add jls(8) and jexec(8) tools for jails administration 
(Closes: #806562)


Modified: branches/jessie/freebsd-utils/debian/changelog
===================================================================
--- branches/jessie/freebsd-utils/debian/changelog	2016-03-22 20:54:43 UTC (rev 5969)
+++ branches/jessie/freebsd-utils/debian/changelog	2016-03-23 01:58:00 UTC (rev 5970)
@@ -1,3 +1,11 @@
+freebsd-utils (10.1~svn273304-1+kbsd8u2) UNRELEASED; urgency=medium
+
+  [ Hideki Yamane ] 
+  * Add jls(8) and jexec(8) tools for jails administration 
+    (Closes: #806562) 
+
+ -- Steven Chamberlain <steven at pyro.eu.org>  Tue, 22 Mar 2016 23:10:43 +0000
+
 freebsd-utils (10.1~svn273304-1+kbsd8u1) jessie-kfreebsd; urgency=medium
 
   * Don't set up /etc/mtab here;  the root is still read-only

Modified: branches/jessie/freebsd-utils/debian/freebsd-utils.install
===================================================================
--- branches/jessie/freebsd-utils/debian/freebsd-utils.install	2016-03-22 20:54:43 UTC (rev 5969)
+++ branches/jessie/freebsd-utils/debian/freebsd-utils.install	2016-03-23 01:58:00 UTC (rev 5970)
@@ -27,3 +27,5 @@
 
 usr/sbin/acpiconf			/usr/sbin
 usr/sbin/jail				/usr/sbin
+usr/sbin/jls				/usr/sbin
+usr/sbin/jexec				/usr/sbin

Modified: branches/jessie/freebsd-utils/debian/freebsd-utils.manpages
===================================================================
--- branches/jessie/freebsd-utils/debian/freebsd-utils.manpages	2016-03-22 20:54:43 UTC (rev 5969)
+++ branches/jessie/freebsd-utils/debian/freebsd-utils.manpages	2016-03-23 01:58:00 UTC (rev 5970)
@@ -18,3 +18,5 @@
 src/sbin/umount/umount.8
 src/usr.sbin/acpi/acpiconf/acpiconf.8
 src/usr.sbin/jail/jail.8
+src/usr.sbin/jexec/jexec.8
+src/usr.sbin/jls/jls.8

Added: branches/jessie/freebsd-utils/debian/patches/jexec_jls.diff
===================================================================
--- branches/jessie/freebsd-utils/debian/patches/jexec_jls.diff	                        (rev 0)
+++ branches/jessie/freebsd-utils/debian/patches/jexec_jls.diff	2016-03-23 01:58:00 UTC (rev 5970)
@@ -0,0 +1,905 @@
+--- /dev/null
++++ b/src/usr.sbin/jexec/jexec.8
+@@ -0,0 +1,76 @@
++.\"
++.\" Copyright (c) 2003 Mike Barcroft <mike at FreeBSD.org>
++.\" 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$
++.\"
++.Dd May 27, 2009
++.Dt JEXEC 8
++.Os
++.Sh NAME
++.Nm jexec
++.Nd "execute a command inside an existing jail"
++.Sh SYNOPSIS
++.Nm
++.Op Fl u Ar username | Fl U Ar username
++.Ar jail command ...
++.Sh DESCRIPTION
++The
++.Nm
++utility executes
++.Ar command
++inside the
++.Ar jail
++identified by its jid or name.
++.Pp
++The following options are available:
++.Bl -tag -width indent
++.It Fl u Ar username
++The user name from host environment as whom the
++.Ar command
++should run.
++.It Fl U Ar username
++The user name from jailed environment as whom the
++.Ar command
++should run.
++.El
++.Sh SEE ALSO
++.Xr jail_attach 2 ,
++.Xr jail 8 ,
++.Xr jls 8
++.Sh HISTORY
++The
++.Nm
++utility was added in
++.Fx 5.1 .
++.Sh BUGS
++If the jail is not identified by
++.Ar jid
++there is a possible race in between the lookup of the jail
++and executing the command inside the jail.
++Giving a
++.Ar jid
++has a similar race as another process can stop the jail and
++start another one after the user looked up the
++.Ar jid .
+--- /dev/null
++++ b/src/usr.sbin/jexec/jexec.c
+@@ -0,0 +1,140 @@
++/*-
++ * Copyright (c) 2003 Mike Barcroft <mike at FreeBSD.org>
++ * Copyright (c) 2008 Bjoern A. Zeeb <bz at FreeBSD.org>
++ * 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$
++ */
++
++#include <sys/param.h>
++#include <sys/jail.h>
++#include <sys/socket.h>
++#include <sys/sysctl.h>
++
++#include <arpa/inet.h>
++#include <netinet/in.h>
++
++#include <err.h>
++#include <errno.h>
++#include <jail.h>
++#include <limits.h>
++#include <login_cap.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <pwd.h>
++#include <unistd.h>
++
++static void	usage(void);
++
++#define GET_USER_INFO do {						\
++	pwd = getpwnam(username);					\
++	if (pwd == NULL) {						\
++		if (errno)						\
++			err(1, "getpwnam: %s", username);		\
++		else							\
++			errx(1, "%s: no such user", username);		\
++	}								\
++	lcap = login_getpwclass(pwd);					\
++	if (lcap == NULL)						\
++		err(1, "getpwclass: %s", username);			\
++	ngroups = ngroups_max;						\
++	if (getgrouplist(username, pwd->pw_gid, groups, &ngroups) != 0)	\
++		err(1, "getgrouplist: %s", username);			\
++} while (0)
++
++int
++main(int argc, char *argv[])
++{
++	int jid;
++	login_cap_t *lcap = NULL;
++	struct passwd *pwd = NULL;
++	gid_t *groups = NULL;
++	int ch, ngroups, uflag, Uflag;
++	long ngroups_max;
++	char *username;
++
++	ch = uflag = Uflag = 0;
++	username = NULL;
++	ngroups_max = sysconf(_SC_NGROUPS_MAX) + 1;
++	if ((groups = malloc(sizeof(gid_t) * ngroups_max)) == NULL)
++		err(1, "malloc");
++
++	while ((ch = getopt(argc, argv, "nu:U:")) != -1) {
++		switch (ch) {
++		case 'n':
++			/* Specified name, now unused */
++			break;
++		case 'u':
++			username = optarg;
++			uflag = 1;
++			break;
++		case 'U':
++			username = optarg;
++			Uflag = 1;
++			break;
++		default:
++			usage();
++		}
++	}
++	argc -= optind;
++	argv += optind;
++	if (argc < 2)
++		usage();
++	if (uflag && Uflag)
++		usage();
++	if (uflag)
++		GET_USER_INFO;
++	jid = jail_getid(argv[0]);
++	if (jid < 0)
++		errx(1, "%s", jail_errmsg);
++	if (jail_attach(jid) == -1)
++		err(1, "jail_attach(%d)", jid);
++	if (chdir("/") == -1)
++		err(1, "chdir(): /");
++	if (username != NULL) {
++		if (Uflag)
++			GET_USER_INFO;
++		if (setgroups(ngroups, groups) != 0)
++			err(1, "setgroups");
++		if (setgid(pwd->pw_gid) != 0)
++			err(1, "setgid");
++		if (setusercontext(lcap, pwd, pwd->pw_uid,
++		    LOGIN_SETALL & ~LOGIN_SETGROUP & ~LOGIN_SETLOGIN) != 0)
++			err(1, "setusercontext");
++		login_close(lcap);
++	}
++	if (execvp(argv[1], argv + 1) == -1)
++		err(1, "execvp(): %s", argv[1]);
++	exit(0);
++}
++
++static void
++usage(void)
++{
++
++	fprintf(stderr, "%s\n",
++		"usage: jexec [-u username | -U username] jail command ...");
++	exit(1); 
++}
+--- /dev/null
++++ b/src/usr.sbin/jexec/Makefile
+@@ -0,0 +1,10 @@
++# $FreeBSD$
++
++PROG=	jexec
++MAN=	jexec.8
++DPADD=	${LIBJAIL} ${LIBUTIL}
++LDADD=	-ljail -lutil-freebsd
++
++LDADD+=	-lfreebsd-glue
++
++.include <bsd.prog.mk>
+--- /dev/null
++++ b/src/usr.sbin/jls/jls.8
+@@ -0,0 +1,115 @@
++.\"
++.\" Copyright (c) 2003 Mike Barcroft <mike at FreeBSD.org>
++.\" 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$
++.\"
++.Dd July 20, 2012
++.Dt JLS 8
++.Os
++.Sh NAME
++.Nm jls
++.Nd "list jails"
++.Sh SYNOPSIS
++.Nm
++.Op Fl dhNnqsv
++.Op Fl j Ar jail
++.Op Ar parameter ...
++.Sh DESCRIPTION
++The
++.Nm
++utility lists all active jails, or the specified jail.
++Each jail is represented by one row which contains space-separated values of
++the listed
++.Ar parameters ,
++including the pseudo-parameter
++.Va all
++which will show all available jail parameters.
++A list of available parameters can be retrieved via
++.Dq Nm sysctl Fl d Va security.jail.param .
++See
++.Xr jail 8
++for a description of some core parameters.
++.Pp
++If no
++.Ar parameters
++or any of the options
++.Fl hns
++are given, the following four columns will be printed:
++jail identifier (jid), IP address (ip4.addr), hostname (host.hostname),
++and path (path).
++.Pp
++The following options are available:
++.Bl -tag -width indent
++.It Fl d
++List
++.Va dying
++as well as active jails.
++.It Fl h
++Print a header line containing the parameters listed.
++If no parameters are given on the command line,
++.Va all
++is assumed.
++.It Fl N
++In the standard display mode, print each jail's name instead of its
++numeric ID.
++If the jail does not have a name, the numeric ID is printed instead.
++.It Fl n
++Print parameters in
++.Dq name=value
++format, where each parameter is preceded by its name.
++If no parameters are given on the command line,
++.Va all
++is assumed.
++.It Fl q
++Put quotes around parameters if they contain spaces or quotes, or are
++the empty string.
++.It Fl s
++Print parameters suitable for passing to
++.Xr jail 8 ,
++skipping read-only and unused parameters.
++Implies
++.Fl nq .
++.It Fl v
++Print a multiple-line summary per jail, with the following parameters:
++jail identifier (jid), hostname (host.hostname), path (path),
++jail name (name), jail state (dying), cpuset ID (cpuset),
++IP address(es) (ip4.addr and ip6.addr).
++.It Fl j Ar jail
++The jid or name of the
++.Ar jail
++to list.
++Without this option, all active jails will be listed.
++.El
++.Sh SEE ALSO
++.Xr jail_get 2 ,
++.Xr jail 8 ,
++.Xr jexec 8
++.Sh HISTORY
++The
++.Nm
++utility was added in
++.Fx 5.1 .
++Extensible jail parameters were introduced in
++.Fx 8.0 .
+--- /dev/null
++++ b/src/usr.sbin/jls/jls.c
+@@ -0,0 +1,516 @@
++/*-
++ * Copyright (c) 2003 Mike Barcroft <mike at FreeBSD.org>
++ * Copyright (c) 2008 Bjoern A. Zeeb <bz at FreeBSD.org>
++ * Copyright (c) 2009 James Gritton <jamie at FreeBSD.org>
++ * 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$");
++
++#include <sys/param.h>
++#include <sys/jail.h>
++#include <sys/socket.h>
++#include <sys/sysctl.h>
++
++#include <arpa/inet.h>
++#include <netinet/in.h>
++
++#include <err.h>
++#include <errno.h>
++#include <jail.h>
++#include <limits.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <unistd.h>
++
++#define	JP_USER		0x01000000
++#define	JP_OPT		0x02000000
++
++#define	PRINT_DEFAULT	0x01
++#define	PRINT_HEADER	0x02
++#define	PRINT_NAMEVAL	0x04
++#define	PRINT_QUOTED	0x08
++#define	PRINT_SKIP	0x10
++#define	PRINT_VERBOSE	0x20
++#define	PRINT_JAIL_NAME	0x40
++
++static struct jailparam *params;
++static int *param_parent;
++static int nparams;
++#ifdef INET6
++static int ip6_ok;
++#endif
++#ifdef INET
++static int ip4_ok;
++#endif
++
++static int add_param(const char *name, void *value, size_t valuelen,
++		struct jailparam *source, unsigned flags);
++static int sort_param(const void *a, const void *b);
++static char *noname(const char *name);
++static char *nononame(const char *name);
++static int print_jail(int pflags, int jflags);
++static void quoted_print(char *str);
++
++int
++main(int argc, char **argv)
++{
++	char *dot, *ep, *jname;
++	int c, i, jflags, jid, lastjid, pflags, spc;
++
++	jname = NULL;
++	pflags = jflags = jid = 0;
++	while ((c = getopt(argc, argv, "adj:hNnqsv")) >= 0)
++		switch (c) {
++		case 'a':
++		case 'd':
++			jflags |= JAIL_DYING;
++			break;
++		case 'j':
++			jid = strtoul(optarg, &ep, 10);
++			if (!jid || *ep) {
++				jid = 0;
++				jname = optarg;
++			}
++			break;
++		case 'h':
++			pflags = (pflags & ~(PRINT_SKIP | PRINT_VERBOSE)) |
++			    PRINT_HEADER;
++			break;
++		case 'N':
++			pflags |= PRINT_JAIL_NAME;
++			break;
++		case 'n':
++			pflags = (pflags & ~PRINT_VERBOSE) | PRINT_NAMEVAL;
++			break;
++		case 'q':
++			pflags |= PRINT_QUOTED;
++			break;
++		case 's':
++			pflags = (pflags & ~(PRINT_HEADER | PRINT_VERBOSE)) |
++			    PRINT_NAMEVAL | PRINT_QUOTED | PRINT_SKIP;
++			break;
++		case 'v':
++			pflags = (pflags &
++			    ~(PRINT_HEADER | PRINT_NAMEVAL | PRINT_SKIP)) |
++			    PRINT_VERBOSE;
++			break;
++		default:
++			errx(1, "usage: jls [-dhNnqv] [-j jail] [param ...]");
++		}
++
++#ifdef INET6
++	ip6_ok = feature_present("inet6");
++#endif
++#ifdef INET
++	ip4_ok = feature_present("inet");
++#endif
++
++	/* Add the parameters to print. */
++	if (optind == argc) {
++		if (pflags & (PRINT_HEADER | PRINT_NAMEVAL))
++			add_param("all", NULL, (size_t)0, NULL, JP_USER);
++		else if (pflags & PRINT_VERBOSE) {
++			add_param("jid", NULL, (size_t)0, NULL, JP_USER);
++			add_param("host.hostname", NULL, (size_t)0, NULL,
++			    JP_USER);
++			add_param("path", NULL, (size_t)0, NULL, JP_USER);
++			add_param("name", NULL, (size_t)0, NULL, JP_USER);
++			add_param("dying", NULL, (size_t)0, NULL, JP_USER);
++			add_param("cpuset.id", NULL, (size_t)0, NULL, JP_USER);
++#ifdef INET
++			if (ip4_ok)
++				add_param("ip4.addr", NULL, (size_t)0, NULL,
++				    JP_USER);
++#endif
++#ifdef INET6
++			if (ip6_ok)
++				add_param("ip6.addr", NULL, (size_t)0, NULL,
++				    JP_USER | JP_OPT);
++#endif
++		} else {
++			pflags |= PRINT_DEFAULT;
++			if (pflags & PRINT_JAIL_NAME)
++				add_param("name", NULL, (size_t)0, NULL, JP_USER);
++			else
++				add_param("jid", NULL, (size_t)0, NULL, JP_USER);
++#ifdef INET
++			if (ip4_ok)
++				add_param("ip4.addr", NULL, (size_t)0, NULL,
++				    JP_USER);
++#endif
++			add_param("host.hostname", NULL, (size_t)0, NULL,
++			    JP_USER);
++			add_param("path", NULL, (size_t)0, NULL, JP_USER);
++		}
++	} else
++		while (optind < argc)
++			add_param(argv[optind++], NULL, (size_t)0, NULL,
++			    JP_USER);
++
++	if (pflags & PRINT_SKIP) {
++		/* Check for parameters with jailsys parents. */
++		for (i = 0; i < nparams; i++) {
++			if ((params[i].jp_flags & JP_USER) &&
++			    (dot = strchr(params[i].jp_name, '.'))) {
++				*dot = 0;
++				param_parent[i] = add_param(params[i].jp_name,
++				    NULL, (size_t)0, NULL, JP_OPT);
++				*dot = '.';
++			}
++		}
++	}
++
++	/* Add the index key parameters. */
++	if (jid != 0)
++		add_param("jid", &jid, sizeof(jid), NULL, 0);
++	else if (jname != NULL)
++		add_param("name", jname, strlen(jname), NULL, 0);
++	else
++		add_param("lastjid", &lastjid, sizeof(lastjid), NULL, 0);
++
++	/* Print a header line if requested. */
++	if (pflags & PRINT_VERBOSE)
++		printf("   JID  Hostname                      Path\n"
++		       "        Name                          State\n"
++		       "        CPUSetID\n"
++		       "        IP Address(es)\n");
++	else if (pflags & PRINT_DEFAULT)
++		if (pflags & PRINT_JAIL_NAME)
++			printf(" JID             IP Address      "
++			    "Hostname                      Path\n");
++		else
++			printf("   JID  IP Address      "
++			    "Hostname                      Path\n");
++	else if (pflags & PRINT_HEADER) {
++		for (i = spc = 0; i < nparams; i++)
++			if (params[i].jp_flags & JP_USER) {
++				if (spc)
++					putchar(' ');
++				else
++					spc = 1;
++				fputs(params[i].jp_name, stdout);
++			}
++		putchar('\n');
++	}
++
++	/* Fetch the jail(s) and print the paramters. */
++	if (jid != 0 || jname != NULL) {
++		if (print_jail(pflags, jflags) < 0)
++			errx(1, "%s", jail_errmsg);
++	} else {
++		for (lastjid = 0;
++		     (lastjid = print_jail(pflags, jflags)) >= 0; )
++			;
++		if (errno != 0 && errno != ENOENT)
++			errx(1, "%s", jail_errmsg);
++	}
++
++	return (0);
++}
++
++static int
++add_param(const char *name, void *value, size_t valuelen,
++    struct jailparam *source, unsigned flags)
++{
++	struct jailparam *param, *tparams;
++	int i, tnparams;
++
++	static int paramlistsize;
++
++	/* The pseudo-parameter "all" scans the list of available parameters. */
++	if (!strcmp(name, "all")) {
++		tnparams = jailparam_all(&tparams);
++		if (tnparams < 0)
++			errx(1, "%s", jail_errmsg);
++		qsort(tparams, (size_t)tnparams, sizeof(struct jailparam),
++		    sort_param);
++		for (i = 0; i < tnparams; i++)
++			add_param(tparams[i].jp_name, NULL, (size_t)0,
++			    tparams + i, flags);
++		free(tparams);
++		return -1;
++	}
++
++	/* Check for repeat parameters. */
++	for (i = 0; i < nparams; i++)
++		if (!strcmp(name, params[i].jp_name)) {
++			if (value != NULL && jailparam_import_raw(params + i,
++			    value, valuelen) < 0)
++				errx(1, "%s", jail_errmsg);
++			params[i].jp_flags |= flags;
++			if (source != NULL)
++				jailparam_free(source, 1);
++			return i;
++		}
++
++	/* Make sure there is room for the new param record. */
++	if (!nparams) {
++		paramlistsize = 32;
++		params = malloc(paramlistsize * sizeof(*params));
++		param_parent = malloc(paramlistsize * sizeof(*param_parent));
++		if (params == NULL || param_parent == NULL)
++			err(1, "malloc");
++	} else if (nparams >= paramlistsize) {
++		paramlistsize *= 2;
++		params = realloc(params, paramlistsize * sizeof(*params));
++		param_parent = realloc(param_parent,
++		    paramlistsize * sizeof(*param_parent));
++		if (params == NULL || param_parent == NULL)
++			err(1, "realloc");
++	}
++
++	/* Look up the parameter. */
++	param_parent[nparams] = -1;
++	param = params + nparams++;
++	if (source != NULL) {
++		*param = *source;
++		param->jp_flags |= flags;
++		return param - params;
++	}
++	if (jailparam_init(param, name) < 0)
++		errx(1, "%s", jail_errmsg);
++	param->jp_flags = flags;
++	if ((value != NULL ? jailparam_import_raw(param, value, valuelen)
++	     : jailparam_import(param, value)) < 0) {
++		if (flags & JP_OPT) {
++			nparams--;
++			return (-1);
++		}
++		errx(1, "%s", jail_errmsg);
++	}
++	return param - params;
++}
++
++static int
++sort_param(const void *a, const void *b)
++{
++	const struct jailparam *parama, *paramb;
++	char *ap, *bp;
++
++	/* Put top-level parameters first. */
++	parama = a;
++	paramb = b;
++	ap = strchr(parama->jp_name, '.');
++	bp = strchr(paramb->jp_name, '.');
++	if (ap && !bp)
++		return (1);
++	if (bp && !ap)
++		return (-1);
++	return (strcmp(parama->jp_name, paramb->jp_name));
++}
++
++static char *
++noname(const char *name)
++{
++	char *nname, *p;
++
++	nname = malloc(strlen(name) + 3);
++	if (nname == NULL)
++		err(1, "malloc");
++	p = strrchr(name, '.');
++	if (p != NULL)
++		sprintf(nname, "%.*s.no%s", (int)(p - name), name, p + 1);
++	else
++		sprintf(nname, "no%s", name);
++	return nname;
++}
++
++static char *
++nononame(const char *name)
++{
++	char *nname, *p;
++
++	p = strrchr(name, '.');
++	if (strncmp(p ? p + 1 : name, "no", 2))
++		return NULL;
++	nname = malloc(strlen(name) - 1);
++	if (nname == NULL)
++		err(1, "malloc");
++	if (p != NULL)
++		sprintf(nname, "%.*s.%s", (int)(p - name), name, p + 3);
++	else
++		strcpy(nname, name + 2);
++	return nname;
++}
++
++static int
++print_jail(int pflags, int jflags)
++{
++	char *nname;
++	char **param_values;
++	int i, ai, jid, count, n, spc;
++	char ipbuf[INET6_ADDRSTRLEN];
++
++	jid = jailparam_get(params, nparams, jflags);
++	if (jid < 0)
++		return jid;
++	if (pflags & PRINT_VERBOSE) {
++		printf("%6d  %-29.29s %.74s\n"
++		       "%6s  %-29.29s %.74s\n"
++		       "%6s  %-6d\n",
++		    *(int *)params[0].jp_value,
++		    (char *)params[1].jp_value,
++		    (char *)params[2].jp_value,
++		    "",
++		    (char *)params[3].jp_value,
++		    *(int *)params[4].jp_value ? "DYING" : "ACTIVE",
++		    "",
++		    *(int *)params[5].jp_value);
++		n = 6;
++#ifdef INET
++		if (ip4_ok && !strcmp(params[n].jp_name, "ip4.addr")) {
++			count = params[n].jp_valuelen / sizeof(struct in_addr);
++			for (ai = 0; ai < count; ai++)
++				if (inet_ntop(AF_INET,
++				    &((struct in_addr *)params[n].jp_value)[ai],
++				    ipbuf, sizeof(ipbuf)) == NULL)
++					err(1, "inet_ntop");
++				else
++					printf("%6s  %-15.15s\n", "", ipbuf);
++			n++;
++		}
++#endif
++#ifdef INET6
++		if (ip6_ok && !strcmp(params[n].jp_name, "ip6.addr")) {
++			count = params[n].jp_valuelen / sizeof(struct in6_addr);
++			for (ai = 0; ai < count; ai++)
++				if (inet_ntop(AF_INET6,
++				    &((struct in6_addr *)
++					params[n].jp_value)[ai],
++				    ipbuf, sizeof(ipbuf)) == NULL)
++					err(1, "inet_ntop");
++				else
++					printf("%6s  %s\n", "", ipbuf);
++			n++;
++		}
++#endif
++	} else if (pflags & PRINT_DEFAULT) {
++		if (pflags & PRINT_JAIL_NAME)
++			printf(" %-15s ", (char *)params[0].jp_value);
++		else
++			printf("%6d  ", *(int *)params[0].jp_value);
++		printf("%-15.15s %-29.29s %.74s\n",
++#ifdef INET
++		    (!ip4_ok || params[1].jp_valuelen == 0) ? "-"
++		    : inet_ntoa(*(struct in_addr *)params[1].jp_value),
++		    (char *)params[2-!ip4_ok].jp_value,
++		    (char *)params[3-!ip4_ok].jp_value);
++#else
++		    "-",
++		    (char *)params[1].jp_value,
++		    (char *)params[2].jp_value);
++#endif
++	} else {
++		param_values = alloca(nparams * sizeof(*param_values));
++		for (i = 0; i < nparams; i++) {
++			if (!(params[i].jp_flags & JP_USER))
++				continue;
++			param_values[i] = jailparam_export(params + i);
++			if (param_values[i] == NULL)
++				errx(1, "%s", jail_errmsg);
++		}
++		for (i = spc = 0; i < nparams; i++) {
++			if (!(params[i].jp_flags & JP_USER))
++				continue;
++			if ((pflags & PRINT_SKIP) &&
++			    ((!(params[i].jp_ctltype &
++				(CTLFLAG_WR | CTLFLAG_TUN))) ||
++			     (param_parent[i] >= 0 &&
++			      *(int *)params[param_parent[i]].jp_value !=
++			      JAIL_SYS_NEW)))
++				continue;
++			if (spc)
++				putchar(' ');
++			else
++				spc = 1;
++			if (pflags & PRINT_NAMEVAL) {
++				/*
++				 * Generally "name=value", but for booleans
++				 * either "name" or "noname".
++				 */
++				if (params[i].jp_flags &
++				    (JP_BOOL | JP_NOBOOL)) {
++					if (*(int *)params[i].jp_value)
++						printf("%s", params[i].jp_name);
++					else {
++						nname = (params[i].jp_flags &
++						    JP_NOBOOL) ?
++						    nononame(params[i].jp_name)
++						    : noname(params[i].jp_name);
++						printf("%s", nname);
++						free(nname);
++					}
++					continue;
++				}
++				printf("%s=", params[i].jp_name);
++			}
++			if (params[i].jp_valuelen == 0) {
++				if (pflags & PRINT_QUOTED)
++					printf("\"\"");
++				else if (!(pflags & PRINT_NAMEVAL))
++					putchar('-');
++			} else
++				quoted_print(param_values[i]);
++		}
++		putchar('\n');
++		for (i = 0; i < nparams; i++)
++			if (params[i].jp_flags & JP_USER)
++				free(param_values[i]);
++	}
++	return (jid);
++}
++
++static void
++quoted_print(char *str)
++{
++	int c, qc;
++	char *p = str;
++
++	/* An empty string needs quoting. */
++	if (!*p) {
++		fputs("\"\"", stdout);
++		return;
++	}
++
++	/*
++	 * The value will be surrounded by quotes if it contains spaces
++	 * or quotes.
++	 */
++	qc = strchr(p, '\'') ? '"'
++	    : strchr(p, '"') ? '\''
++	    : strchr(p, ' ') || strchr(p, '\t') ? '"'
++	    : 0;
++	if (qc)
++		putchar(qc);
++	while ((c = *p++)) {
++		if (c == '\\' || c == qc)
++			putchar('\\');
++		putchar(c);
++	}
++	if (qc)
++		putchar(qc);
++}
+--- /dev/null
++++ b/src/usr.sbin/jls/Makefile
+@@ -0,0 +1,19 @@
++# $FreeBSD$
++
++.include <bsd.own.mk>
++
++PROG=	jls
++MAN=	jls.8
++DPADD=	${LIBJAIL}
++LDADD=	-ljail
++
++LDADD+=	-lfreebsd-glue
++
++.if ${MK_INET6_SUPPORT} != "no"
++CFLAGS+= -DINET6
++.endif
++.if ${MK_INET_SUPPORT} != "no"
++CFLAGS+= -DINET
++.endif
++
++.include <bsd.prog.mk>
+--- a/src/usr.sbin/Makefile
++++ b/src/usr.sbin/Makefile
+@@ -7,6 +7,8 @@
+ 	arp \
+ 	authpf \
+ 	jail \
++	jexec \
++	jls \
+ 	mountd \
+ 	nfsd \
+ 	powerd \

Modified: branches/jessie/freebsd-utils/debian/patches/series
===================================================================
--- branches/jessie/freebsd-utils/debian/patches/series	2016-03-22 20:54:43 UTC (rev 5969)
+++ branches/jessie/freebsd-utils/debian/patches/series	2016-03-23 01:58:00 UTC (rev 5970)
@@ -41,3 +41,4 @@
 sysctl.diff
 abi_breaks.diff
 fstype_alias.diff
+jexec_jls.diff

Modified: branches/jessie/freebsd-utils/debian/rules
===================================================================
--- branches/jessie/freebsd-utils/debian/rules	2016-03-22 20:54:43 UTC (rev 5969)
+++ branches/jessie/freebsd-utils/debian/rules	2016-03-23 01:58:00 UTC (rev 5970)
@@ -113,6 +113,7 @@
 		sys/i386/linux/syscalls.master \
 		\
 		 usr.sbin/jail bin/chflags \
+		 usr.sbin/jexec usr.sbin/jls \
 		 sbin/devd etc/devd.conf etc/devd sys/dev/usb/usbdevs \
 		 usr.sbin/acpi/acpiconf \
 		usr.sbin/acpi/Makefile \




More information about the Glibc-bsd-commits mailing list