Use chroot(2) instead of using prefixes for files.

Previously, the code prefixes the chroot path to actual file paths to
simulate the effect.  This, however, will not work for tzset(3) which
expects the current system have a working set of timezone data files,
and that is not always the case.

This changeset simplifies the handling of paths and use an actual
chroot(2) call to implement the effect.

PR:		bin/197313
MFC after:	2 weeks
This commit is contained in:
delphij 2015-10-13 22:55:17 +00:00
parent 804e50d725
commit f704bed628

View File

@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <time.h>
#include <unistd.h>
@ -944,23 +945,18 @@ main(int argc, char **argv)
if (argc - optind > 1)
usage();
if (chrootenv == NULL) {
strcpy(path_zonetab, _PATH_ZONETAB);
strcpy(path_iso3166, _PATH_ISO3166);
strcpy(path_zoneinfo, _PATH_ZONEINFO);
strcpy(path_localtime, _PATH_LOCALTIME);
strcpy(path_db, _PATH_DB);
strcpy(path_wall_cmos_clock, _PATH_WALL_CMOS_CLOCK);
} else {
sprintf(path_zonetab, "%s/%s", chrootenv, _PATH_ZONETAB);
sprintf(path_iso3166, "%s/%s", chrootenv, _PATH_ISO3166);
sprintf(path_zoneinfo, "%s/%s", chrootenv, _PATH_ZONEINFO);
sprintf(path_localtime, "%s/%s", chrootenv, _PATH_LOCALTIME);
sprintf(path_db, "%s/%s", chrootenv, _PATH_DB);
sprintf(path_wall_cmos_clock, "%s/%s", chrootenv,
_PATH_WALL_CMOS_CLOCK);
if (chrootenv != NULL) {
rv = chroot(chrootenv);
if (rv != 0)
err(EX_OSERR, "chroot to %s", chrootenv);
}
strcpy(path_zonetab, _PATH_ZONETAB);
strcpy(path_iso3166, _PATH_ISO3166);
strcpy(path_zoneinfo, _PATH_ZONEINFO);
strcpy(path_localtime, _PATH_LOCALTIME);
strcpy(path_db, _PATH_DB);
strcpy(path_wall_cmos_clock, _PATH_WALL_CMOS_CLOCK);
/* Override the user-supplied umask. */
(void)umask(S_IWGRP | S_IWOTH);