for an error.
derived from GNU C's cccp.c. */
-int safe_read(int desc, char *ptr, int len)
+static int safe_read(int desc, char *ptr, int len)
{
int n_chars;
}
-/****************************************************************************
-check if a process exists.
-****************************************************************************/
-int process_exists(int pid)
-{
- return(kill(pid,0) == 0 || errno != ESRCH);
-}
-
/* lock a byte range in a open file */
int lock_range(int fd, int offset, int len)
{
static void glob_expand_one(char *s, char **argv, int *argc, int maxargs)
{
-#ifndef HAVE_GLOB
+#if !(defined(HAVE_GLOB) && defined(HAVE_GLOB_H))
if (!*s) s = ".";
argv[*argc] = strdup(s);
(*argc)++;
free(dest);
return (depth < 0);
}
+
+/*
+ * Make path appear as if a chroot had occurred:
+ * 1. remove leading "/" (or replace with "." if at end)
+ * 2. remove leading ".." components
+ * 3. delete any other "<dir>/.." (recursively)
+ * Return a malloc'ed copy.
+ * Contributed by Dave Dykstra <dwd@bell-labs.com>
+ */
+
+char *sanitize_path(char *p)
+{
+ char *copy, *copyp;
+
+ copy = (char *) malloc(strlen(p)+1);
+ copyp = copy;
+ while (*p != '\0') {
+ if ((*p == '/') && (copyp == copy)) {
+ /* remove leading slash */
+ p++;
+ }
+ else if ((*p == '.') && (*(p+1) == '.') &&
+ ((*(p+2) == '/') || (*(p+2) == '\0'))) {
+ /* remove .. followed by slash or end */
+ p += 2;
+ if (copyp != copy) {
+ /* backup the copy one level */
+ while ((--copyp != copy) && (*copyp == '/'))
+ /* skip trailing slashes */
+ ;
+ while ((copyp != copy) && (*copyp != '/'))
+ /* skip back through slash */
+ copyp--;
+ }
+ } else {
+ /* copy one component */
+ while (1) {
+ *copyp++ = *p++;
+ if ((*p == '\0') || (*(p-1) == '/'))
+ break;
+ }
+ }
+ }
+ *copyp = '\0';
+ return(copy);
+}
+