Message-Id: <199902250602.GAA34258@out1.ibm.net> From: "Mark E." To: djgpp-workers AT delorie DOT com Date: Thu, 25 Feb 1999 01:03:05 -0500 MIME-Version: 1.0 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7BIT Subject: updated chroot X-mailer: Pegasus Mail for Win32 (v3.01d) Reply-To: djgpp-workers AT delorie DOT com 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 #include #include #include #include #include /* 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/