Mail Archives: djgpp-workers/1999/02/25/01:02:58
Here's a new improved version of chroot. It now can emulate the
restrictive Unix behavior of chroot or the non-restrictive behavior
needed for Bash.
Work still needs to be done on the environmental variables.
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdlib.h>
/* Should be in a header. */
#define __CHROOT_UNIX_EMU_FLAG 1
char __djgpp_root [PATH_MAX+1] = { '\0' };
int __djgpp_root_len = 0;
unsigned int __chroot_flags = __CHROOT_UNIX_EMU_FLAG;
int
chroot (const char *path)
{
char buf[PATH_MAX+1];
char *to = __djgpp_root;
char *from = buf;
int unix_emu = __chroot_flags & __CHROOT_UNIX_EMU_FLAG;
/* When not emulating the Unix behavior of chroot,
allow a null root to delete the root path. */
if (path == NULL || *path == '\0')
{
if (unix_emu)
{
errno = EINVAL;
return -1;
}
__djgpp_root[0] = '\0';
__djgpp_root_len = 0;
return 0;
}
_fixpath(path, buf);
if (unix_emu)
{
/* If the path returned from _fixpath isn't relative
to __djgpp_root, then the path is rejected. */
if (__djgpp_root_len != 0 && *buf != '/')
{
errno = EINVAL;
return -1;
}
/* Change the cwd like Unix versions do. */
if (chdir(buf) < 0)
return -1;
}
else
{
/* Verify the path contains directories,
but do not make the path the cwd. */
if (access(buf, D_OK) < 0)
return -1;
}
/* Copy in the new root path. */
if (*buf != '/')
__djgpp_root_len = 0;
else /* Append to the current root path. */
to = __djgpp_root + __djgpp_root_len;
while (*from)
{
*to = *from;
++to;
++from;
++__djgpp_root_len;
}
#if 0
if (unix_emu)
setenv ("ROOT", __djgpp_root, 1);
else
setenv ("SYSROOT", __djgpp_root, 1);
#endif
return 0;
}
---
Mark Elbrecht
snowball3 AT usa DOT net http://members.xoom.com/snowball3/
- Raw text -