/*********************************************************************** * * * This software is part of the ast package * * Copyright (c) 1985-2007 AT&T Intellectual Property * * and is licensed under the * * Common Public License, Version 1.0 * * by AT&T Intellectual Property * * * * A copy of the License is available at * * http://www.opensource.org/licenses/cpl1.0.txt * * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * * * * Information and Software Systems Research * * AT&T Research * * Florham Park NJ * * * * Glenn Fowler * * David Korn * * Phong Vo * * * ***********************************************************************/ #pragma prototyped /* * AT&T Bell Laboratories * force current command to run under dir preroot */ #include #include #if FS_PREROOT #include void setpreroot(register char** argv, const char* dir) { register char* s; register char** ap; int argc; char* cmd; char** av; char buf[PATH_MAX]; if ((argv || (argv = opt_info.argv)) && (dir || (dir = getenv(PR_BASE)) && *dir) && !ispreroot(dir) && (*(cmd = *argv++) == '/' || (cmd = pathpath(buf, cmd, NiL, PATH_ABSOLUTE|PATH_REGULAR|PATH_EXECUTE)))) { argc = 3; for (ap = argv; *ap++; argc++); if (av = newof(0, char*, argc, 0)) { ap = av; *ap++ = PR_COMMAND; *ap++ = dir; *ap++ = cmd; while (*ap++ = *argv++); if (!(s = getenv(PR_SILENT)) || !*s) { sfprintf(sfstderr, "+"); ap = av; while (s = *ap++) sfprintf(sfstderr, " %s", s); sfprintf(sfstderr, "\n"); sfsync(sfstderr); } execv(*av, av); free(av); } } } #else NoN(setpreroot) #endif