release fixes
. make ramdisk buildable without ../etc having pwd.db . add cat to release bootstrap cmds . support running dynamically linked executables for release bootstrap cmds . import netbsd chroot to help
This commit is contained in:
parent
5086f1b2a1
commit
b332803b6f
10 changed files with 339 additions and 42 deletions
|
@ -6,7 +6,7 @@ SUBDIR= add_route arp ash at awk \
|
||||||
backup badblocks banner basename \
|
backup badblocks banner basename \
|
||||||
btrace cal \
|
btrace cal \
|
||||||
cawf cd cdprobe checkhier cpp \
|
cawf cd cdprobe checkhier cpp \
|
||||||
chmod chown chroot ci cksum cleantmp clear cmp co \
|
chmod chown ci cksum cleantmp clear cmp co \
|
||||||
comm compress cp crc cron crontab cut \
|
comm compress cp crc cron crontab cut \
|
||||||
dd decomp16 DESCRIBE dev2name devsize df dhcpd \
|
dd decomp16 DESCRIBE dev2name devsize df dhcpd \
|
||||||
dhrystone diff dirname diskctl dumpcore \
|
dhrystone diff dirname diskctl dumpcore \
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
PROG= chroot
|
|
||||||
BINDIR= /bin
|
|
||||||
MAN=
|
|
||||||
|
|
||||||
.include <bsd.prog.mk>
|
|
|
@ -1,28 +0,0 @@
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <sys/wait.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int status;
|
|
||||||
|
|
||||||
if(argc != 3) {
|
|
||||||
fprintf(stderr, "usage: %s <root> <command>\n", argv[0]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(chroot(argv[1]) < 0) {
|
|
||||||
perror("chroot");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = system(argv[2]);
|
|
||||||
if(WIFEXITED(status))
|
|
||||||
return WEXITSTATUS(status);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ PROG_COMMANDS=cdprobe dev2name loadramdisk mount fsck.mfs sysenv sh \
|
||||||
PROG_SERVERS=mfs procfs
|
PROG_SERVERS=mfs procfs
|
||||||
PROG_USRSBIN=pwd_mkdb
|
PROG_USRSBIN=pwd_mkdb
|
||||||
PROGRAMS=$(PROG_DRIVERS) $(PROG_COMMANDS) $(PROG_SERVERS) $(PROG_USRSBIN)
|
PROGRAMS=$(PROG_DRIVERS) $(PROG_COMMANDS) $(PROG_SERVERS) $(PROG_USRSBIN)
|
||||||
EXTRA=system.conf master.passwd pwd.db spwd.db rs.single
|
EXTRA=system.conf master.passwd rs.single
|
||||||
|
|
||||||
.if ${MKSMALL} != "yes"
|
.if ${MKSMALL} != "yes"
|
||||||
PROG_DRIVERS+= ahci
|
PROG_DRIVERS+= ahci
|
||||||
|
@ -24,13 +24,13 @@ PROG_DRIVERS+= acpi
|
||||||
|
|
||||||
CPPFLAGS+= -I${MINIXSRCDIR}/servers -I${MINIXSRCDIR}
|
CPPFLAGS+= -I${MINIXSRCDIR}/servers -I${MINIXSRCDIR}
|
||||||
CLEANFILES += $(PROGRAMS) $(SCRIPTS) $(EXTRA) image image.c t proto.gen
|
CLEANFILES += $(PROGRAMS) $(SCRIPTS) $(EXTRA) image image.c t proto.gen
|
||||||
CLEANFILES += $(LIBRARIES)
|
CLEANFILES += $(LIBRARIES) pwd.db spwd.db
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
|
|
||||||
realall: image
|
realall: image
|
||||||
|
|
||||||
image: proto.gen mtab rc $(EXTRA) passwd
|
image: proto.gen mtab rc $(EXTRA) pwd.db spwd.db passwd
|
||||||
mkfs.mfs image proto.gen || { rm -f image; false; }
|
mkfs.mfs image proto.gen || { rm -f image; false; }
|
||||||
if fsck.mfs -s image | grep -q CLEAN; \
|
if fsck.mfs -s image | grep -q CLEAN; \
|
||||||
then : ; \
|
then : ; \
|
||||||
|
@ -81,7 +81,7 @@ $(server): ../../servers/$(server)/$(server)
|
||||||
$(MAKE) -C ../../servers/$(server) $(server)
|
$(MAKE) -C ../../servers/$(server) $(server)
|
||||||
.endfor
|
.endfor
|
||||||
|
|
||||||
passwd: ../../etc/master.passwd ../../usr.sbin/pwd_mkdb/pwd_mkdb
|
pwd.db spwd.db passwd: ../../etc/master.passwd ../../usr.sbin/pwd_mkdb/pwd_mkdb
|
||||||
rm -f ../../etc/master.passwd.orig ../../etc/passwd.orig
|
rm -f ../../etc/master.passwd.orig ../../etc/passwd.orig
|
||||||
rm -f ../../etc/pwd.db.tmp ../../etc/spwd.db.tmp
|
rm -f ../../etc/pwd.db.tmp ../../etc/spwd.db.tmp
|
||||||
../../usr.sbin/pwd_mkdb/pwd_mkdb -V 0 -p -d ../../ ../../etc/master.passwd
|
../../usr.sbin/pwd_mkdb/pwd_mkdb -V 0 -p -d ../../ ../../etc/master.passwd
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
# Timestamp in UTC,minixpath,netbsdpath
|
# Timestamp in UTC,minixpath,netbsdpath
|
||||||
# minixpath: path in Minix source tree (starting from /usr/src/)
|
# minixpath: path in Minix source tree (starting from /usr/src/)
|
||||||
# netbsdpath: path in BSD source tree (starting from src/)
|
# netbsdpath: path in BSD source tree (starting from src/)
|
||||||
|
2012/02/10 16:16:12,usr.sbin/chroot
|
||||||
2011/01/17 18:11:10,usr.bin/ldd
|
2011/01/17 18:11:10,usr.bin/ldd
|
||||||
2011/01/17 18:11:10,external/bsd/file
|
2011/01/17 18:11:10,external/bsd/file
|
||||||
2011/01/17 18:11:10,lib/csu
|
2011/01/17 18:11:10,lib/csu
|
||||||
|
|
|
@ -9,10 +9,15 @@ version="`echo $version_pretty | tr . _`"
|
||||||
PACKAGEDIR=/usr/pkgsrc/packages/$version_pretty/`uname -m`
|
PACKAGEDIR=/usr/pkgsrc/packages/$version_pretty/`uname -m`
|
||||||
|
|
||||||
XBIN=usr/xbin
|
XBIN=usr/xbin
|
||||||
|
XLIB=xlib
|
||||||
SRC=src
|
SRC=src
|
||||||
REPO=git://git.minix3.org/minix
|
REPO=git://git.minix3.org/minix
|
||||||
GITBRANCH=master
|
GITBRANCH=master
|
||||||
|
|
||||||
|
LD_LIB="LD_LIBRARY_PATH=/lib:/usr/lib:/$XLIB"
|
||||||
|
BUILDPATH="PATH=/$XBIN:/usr/pkg/bin"
|
||||||
|
BUILDENV="$BUILDPATH $LD_LIB"
|
||||||
|
|
||||||
# List of packages included on installation media
|
# List of packages included on installation media
|
||||||
PACKAGELIST=packages.install
|
PACKAGELIST=packages.install
|
||||||
secs=`expr 32 '*' 64`
|
secs=`expr 32 '*' 64`
|
||||||
|
@ -183,17 +188,28 @@ mkdir -m 1777 $RELEASEDIR/tmp
|
||||||
mkdir -p $RELEASEDIR/tmp
|
mkdir -p $RELEASEDIR/tmp
|
||||||
mkdir -p $RELEASEDIR/usr/tmp
|
mkdir -p $RELEASEDIR/usr/tmp
|
||||||
mkdir -p $RELEASEDIR/$XBIN
|
mkdir -p $RELEASEDIR/$XBIN
|
||||||
|
mkdir -p $RELEASEDIR/$XLIB
|
||||||
|
mkdir -p $RELEASEDIR/libexec
|
||||||
mkdir -p $RELEASEDIR/usr/bin
|
mkdir -p $RELEASEDIR/usr/bin
|
||||||
mkdir -p $RELEASEDIR/bin
|
mkdir -p $RELEASEDIR/bin
|
||||||
mkdir -p $RELEASEPACKAGE
|
mkdir -p $RELEASEPACKAGE
|
||||||
|
|
||||||
echo " * Transfering bootstrap dirs to $RELEASEDIR"
|
echo " * Transfering bootstrap dirs to $RELEASEDIR"
|
||||||
|
|
||||||
|
# Actual binaries
|
||||||
cp -p /bin/* /usr/bin/* /usr/sbin/* /sbin/* $RELEASEDIR/$XBIN
|
cp -p /bin/* /usr/bin/* /usr/sbin/* /sbin/* $RELEASEDIR/$XBIN
|
||||||
cp -rp /bin/sh /bin/echo /bin/install /bin/rm \
|
cp -rp /bin/cat /bin/sh /bin/echo /bin/install /bin/rm \
|
||||||
/bin/date /bin/ls $RELEASEDIR/bin
|
/bin/date /bin/ls $RELEASEDIR/bin
|
||||||
cp -rp /usr/bin/make /usr/bin/yacc /usr/bin/lex \
|
cp -rp /usr/bin/make /usr/bin/yacc /usr/bin/lex \
|
||||||
/usr/bin/grep /usr/bin/egrep /usr/bin/awk /usr/bin/sed $RELEASEDIR/usr/bin
|
/usr/bin/grep /usr/bin/egrep /usr/bin/awk /usr/bin/sed $RELEASEDIR/usr/bin
|
||||||
|
|
||||||
|
# For dynamically linked binaries: put interpreter there the
|
||||||
|
# system's current crop of shared libraries so they'll run;
|
||||||
|
# once they're rebuilt they can be thrown out in favour of the
|
||||||
|
# new ones like $XBIN
|
||||||
|
cp -p /libexec/ld.elf_so $RELEASEDIR/libexec/
|
||||||
|
cp -p /lib/*.so* /usr/lib/*.so* $RELEASEDIR/$XLIB/
|
||||||
|
|
||||||
CONFIGHEADER=$RELEASEDIR/usr/src/include/minix/sys_config.h
|
CONFIGHEADER=$RELEASEDIR/usr/src/include/minix/sys_config.h
|
||||||
|
|
||||||
copy_local_packages
|
copy_local_packages
|
||||||
|
@ -249,7 +265,7 @@ rm -f $RELEASEDIR/usr/$SRC/tools/revision
|
||||||
cp chrootmake.sh $RELEASEDIR/usr/$SRC/tools/chrootmake.sh
|
cp chrootmake.sh $RELEASEDIR/usr/$SRC/tools/chrootmake.sh
|
||||||
|
|
||||||
echo " * Make hierarchy"
|
echo " * Make hierarchy"
|
||||||
chroot $RELEASEDIR "PATH=/$XBIN:/usr/pkg/bin sh -x /usr/$SRC/tools/chrootmake.sh etcfiles" || exit 1
|
sh -c "$LD_LIB chroot $RELEASEDIR sh -c \"$BUILDENV sh -x /usr/$SRC/tools/chrootmake.sh etcfiles\"" || exit 1
|
||||||
|
|
||||||
for p in $PREINSTALLED_PACKAGES
|
for p in $PREINSTALLED_PACKAGES
|
||||||
do echo " * Pre-installing: $p from $PKG_ADD_URL"
|
do echo " * Pre-installing: $p from $PKG_ADD_URL"
|
||||||
|
@ -263,10 +279,11 @@ fi
|
||||||
echo " * Resetting timestamps"
|
echo " * Resetting timestamps"
|
||||||
find $RELEASEDIR | xargs touch
|
find $RELEASEDIR | xargs touch
|
||||||
echo " * Chroot build"
|
echo " * Chroot build"
|
||||||
chroot $RELEASEDIR "PATH=/$XBIN:/usr/pkg/bin MAKEMAP=$MAKEMAP sh -x /usr/$SRC/tools/chrootmake.sh" || exit 1
|
sh -c "$LD_LIB MAKEMAP=$MAKEMAP chroot $RELEASEDIR sh -c \"$BUILDENV sh -x /usr/$SRC/tools/chrootmake.sh\"" || exit 1
|
||||||
echo " * Chroot build done"
|
echo " * Chroot build done"
|
||||||
echo " * Removing bootstrap files"
|
echo " * Removing bootstrap files"
|
||||||
rm -rf $RELEASEDIR/$XBIN
|
rm -rf $RELEASEDIR/$XBIN
|
||||||
|
rm -rf $RELEASEDIR/$XLIB
|
||||||
# The build process leaves some file in $SRC as bin.
|
# The build process leaves some file in $SRC as bin.
|
||||||
chown -R root $RELEASEDIR/usr/src*
|
chown -R root $RELEASEDIR/usr/src*
|
||||||
cp issue.install $RELEASEDIR/etc/issue
|
cp issue.install $RELEASEDIR/etc/issue
|
||||||
|
|
|
@ -3,6 +3,6 @@
|
||||||
.include <bsd.own.mk>
|
.include <bsd.own.mk>
|
||||||
|
|
||||||
# NetBSD imports
|
# NetBSD imports
|
||||||
SUBDIR= installboot pwd_mkdb user vipw zic
|
SUBDIR= installboot pwd_mkdb user vipw zic chroot
|
||||||
|
|
||||||
.include <bsd.subdir.mk>
|
.include <bsd.subdir.mk>
|
||||||
|
|
7
usr.sbin/chroot/Makefile
Normal file
7
usr.sbin/chroot/Makefile
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# from: @(#)Makefile 8.1 (Berkeley) 6/6/93
|
||||||
|
# $NetBSD: Makefile,v 1.6 2009/04/22 15:23:02 lukem Exp $
|
||||||
|
|
||||||
|
PROG= chroot
|
||||||
|
MAN= chroot.8
|
||||||
|
|
||||||
|
.include <bsd.prog.mk>
|
100
usr.sbin/chroot/chroot.8
Normal file
100
usr.sbin/chroot/chroot.8
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
.\" $NetBSD: chroot.8,v 1.14 2011/08/15 14:43:17 wiz Exp $
|
||||||
|
.\"
|
||||||
|
.\" Copyright (c) 1988, 1991, 1993
|
||||||
|
.\" The Regents of the University of California. 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.
|
||||||
|
.\" 3. Neither the name of the University nor the names of its contributors
|
||||||
|
.\" may be used to endorse or promote products derived from this software
|
||||||
|
.\" without specific prior written permission.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
|
||||||
|
.\"
|
||||||
|
.\" from: @(#)chroot.8 8.1 (Berkeley) 6/9/93
|
||||||
|
.\"
|
||||||
|
.Dd August 13, 2011
|
||||||
|
.Dt CHROOT 8
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm chroot
|
||||||
|
.Nd change root directory
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm
|
||||||
|
.Op Fl G Ar group,group,...
|
||||||
|
.Op Fl g Ar group
|
||||||
|
.Op Fl u Ar user
|
||||||
|
.Ar newroot
|
||||||
|
.Op Ar command
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
command changes its root directory to the supplied directory
|
||||||
|
.Ar newroot
|
||||||
|
and exec's
|
||||||
|
.Ar command ,
|
||||||
|
or, if not supplied, an interactive copy of your shell.
|
||||||
|
.Pp
|
||||||
|
If the
|
||||||
|
.Fl u ,
|
||||||
|
.Fl g ,
|
||||||
|
or
|
||||||
|
.Fl G
|
||||||
|
options are given, the user, group, and group list of the process are
|
||||||
|
set to these values after the chroot has taken place; see
|
||||||
|
.Xr setgid 2 ,
|
||||||
|
.Xr setgroups 2 ,
|
||||||
|
.Xr setuid 2 ,
|
||||||
|
.Xr getgrnam 3 ,
|
||||||
|
and
|
||||||
|
.Xr getpwnam 3 .
|
||||||
|
.Pp
|
||||||
|
Note:
|
||||||
|
.Ar command
|
||||||
|
or the shell are run as your real-user-id.
|
||||||
|
.Sh ENVIRONMENT
|
||||||
|
The following environment variable is referenced by
|
||||||
|
.Nm :
|
||||||
|
.Bl -tag -width SHELL
|
||||||
|
.It Ev SHELL
|
||||||
|
If set,
|
||||||
|
the string specified by
|
||||||
|
.Ev SHELL
|
||||||
|
is interpreted as the name of
|
||||||
|
the shell to exec.
|
||||||
|
If the variable
|
||||||
|
.Ev SHELL
|
||||||
|
is not set,
|
||||||
|
.Pa /bin/sh
|
||||||
|
is used.
|
||||||
|
.El
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr ldd 1 ,
|
||||||
|
.Xr chdir 2 ,
|
||||||
|
.Xr chroot 2 ,
|
||||||
|
.Xr environ 7
|
||||||
|
.Sh HISTORY
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
utility first appeared in
|
||||||
|
.Bx 4.4 .
|
||||||
|
.Sh SECURITY CONSIDERATIONS
|
||||||
|
.Nm
|
||||||
|
should never be installed setuid root, as it would then be possible
|
||||||
|
to exploit the program to gain root privileges.
|
205
usr.sbin/chroot/chroot.c
Normal file
205
usr.sbin/chroot/chroot.c
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
/* $NetBSD: chroot.c,v 1.19 2011/09/20 14:28:52 christos Exp $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1988, 1993
|
||||||
|
* The Regents of the University of California. 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.
|
||||||
|
* 3. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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>
|
||||||
|
#ifndef lint
|
||||||
|
__COPYRIGHT("@(#) Copyright (c) 1988, 1993\
|
||||||
|
The Regents of the University of California. All rights reserved.");
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#ifndef lint
|
||||||
|
#if 0
|
||||||
|
static char sccsid[] = "@(#)chroot.c 8.1 (Berkeley) 6/9/93";
|
||||||
|
#else
|
||||||
|
__RCSID("$NetBSD: chroot.c,v 1.19 2011/09/20 14:28:52 christos Exp $");
|
||||||
|
#endif
|
||||||
|
#endif /* not lint */
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
#include <err.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <grp.h>
|
||||||
|
#include <paths.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
static void usage(void) __dead;
|
||||||
|
|
||||||
|
static int
|
||||||
|
getnum(const char *str, uintmax_t *num)
|
||||||
|
{
|
||||||
|
char *ep;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
*num = strtoumax(str, &ep, 0);
|
||||||
|
if (str[0] == '\0' || *ep != '\0') {
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (errno == ERANGE && *num == UINTMAX_MAX)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gid_t
|
||||||
|
getgroup(const char *group)
|
||||||
|
{
|
||||||
|
uintmax_t num;
|
||||||
|
struct group *gp;
|
||||||
|
|
||||||
|
if ((gp = getgrnam(group)) != NULL)
|
||||||
|
return gp->gr_gid;
|
||||||
|
|
||||||
|
if (getnum(group, &num) == -1)
|
||||||
|
errx(1, "no such group `%s'", group);
|
||||||
|
|
||||||
|
return (gid_t)num;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uid_t
|
||||||
|
getuser(const char *user)
|
||||||
|
{
|
||||||
|
uintmax_t num;
|
||||||
|
struct passwd *pw;
|
||||||
|
|
||||||
|
if ((pw = getpwnam(user)) != NULL)
|
||||||
|
return pw->pw_uid;
|
||||||
|
|
||||||
|
if (getnum(user, &num) == -1)
|
||||||
|
errx(1, "no such user `%s'", user);
|
||||||
|
|
||||||
|
return (uid_t)num;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
char *user; /* user to switch to before running program */
|
||||||
|
char *group; /* group to switch to ... */
|
||||||
|
char *grouplist; /* group list to switch to ... */
|
||||||
|
char *p;
|
||||||
|
const char *shell;
|
||||||
|
gid_t gid, gidlist[NGROUPS_MAX];
|
||||||
|
uid_t uid;
|
||||||
|
int ch, gids;
|
||||||
|
|
||||||
|
user = NULL;
|
||||||
|
group = NULL;
|
||||||
|
grouplist = NULL;
|
||||||
|
gid = 0;
|
||||||
|
uid = 0;
|
||||||
|
gids = 0;
|
||||||
|
while ((ch = getopt(argc, argv, "G:g:u:")) != -1) {
|
||||||
|
switch(ch) {
|
||||||
|
case 'u':
|
||||||
|
user = optarg;
|
||||||
|
if (*user == '\0')
|
||||||
|
usage();
|
||||||
|
break;
|
||||||
|
case 'g':
|
||||||
|
group = optarg;
|
||||||
|
if (*group == '\0')
|
||||||
|
usage();
|
||||||
|
break;
|
||||||
|
case 'G':
|
||||||
|
grouplist = optarg;
|
||||||
|
if (*grouplist == '\0')
|
||||||
|
usage();
|
||||||
|
break;
|
||||||
|
case '?':
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
argc -= optind;
|
||||||
|
argv += optind;
|
||||||
|
|
||||||
|
if (argc < 1)
|
||||||
|
usage();
|
||||||
|
|
||||||
|
if (user != NULL)
|
||||||
|
uid = getuser(user);
|
||||||
|
|
||||||
|
if (group != NULL)
|
||||||
|
gid = getgroup(group);
|
||||||
|
|
||||||
|
if (grouplist != NULL) {
|
||||||
|
while ((p = strsep(&grouplist, ",")) != NULL) {
|
||||||
|
if (*p == '\0')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (gids == NGROUPS_MAX)
|
||||||
|
errx(1,
|
||||||
|
"too many supplementary groups provided");
|
||||||
|
|
||||||
|
gidlist[gids++] = getgroup(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (chdir(argv[0]) == -1 || chroot(".") == -1)
|
||||||
|
err(1, "%s", argv[0]);
|
||||||
|
|
||||||
|
if (gids && setgroups(gids, gidlist) == -1)
|
||||||
|
err(1, "setgroups");
|
||||||
|
if (group && setgid(gid) == -1)
|
||||||
|
err(1, "setgid");
|
||||||
|
if (user && setuid(uid) == -1)
|
||||||
|
err(1, "setuid");
|
||||||
|
|
||||||
|
if (argv[1]) {
|
||||||
|
execvp(argv[1], &argv[1]);
|
||||||
|
err(1, "%s", argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((shell = getenv("SHELL")) == NULL)
|
||||||
|
shell = _PATH_BSHELL;
|
||||||
|
execlp(shell, shell, "-i", NULL);
|
||||||
|
err(1, "%s", shell);
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
(void)fprintf(stderr, "Usage: %s [-G group,group,...] [-g group] "
|
||||||
|
"[-u user] newroot [command]\n", getprogname());
|
||||||
|
exit(1);
|
||||||
|
}
|
Loading…
Reference in a new issue