diff options
Diffstat (limited to 'unix/tclUnixFCmd.c')
-rw-r--r-- | unix/tclUnixFCmd.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/unix/tclUnixFCmd.c b/unix/tclUnixFCmd.c index 264a7a6..98d5224 100644 --- a/unix/tclUnixFCmd.c +++ b/unix/tclUnixFCmd.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixFCmd.c,v 1.11 2001/08/30 08:53:15 vincentdarley Exp $ + * RCS: @(#) $Id: tclUnixFCmd.c,v 1.12 2001/09/04 18:06:34 vincentdarley Exp $ * * Portions of this code were derived from NetBSD source code which has * the following copyright notice: @@ -685,19 +685,37 @@ DoRemoveDirectory(pathPtr, recursive, errorPtr) * causing error. */ { CONST char *path; - + mode_t oldPerm = 0; + int result; + path = Tcl_DStringValue(pathPtr); + + if (recursive != 0) { + /* We should try to change permissions so this can be deleted */ + struct stat statBuf; + int newPerm; + + if (stat(path, &statBuf) == 0) { + oldPerm = (mode_t) (statBuf.st_mode & 0x00007FFF); + } + + newPerm = oldPerm | (64+128+256); + chmod(path, (mode_t) newPerm); + } + if (rmdir(path) == 0) { /* INTL: Native. */ return TCL_OK; } if (errno == ENOTEMPTY) { errno = EEXIST; } + + result = TCL_OK; if ((errno != EEXIST) || (recursive == 0)) { if (errorPtr != NULL) { Tcl_ExternalToUtfDString(NULL, path, -1, errorPtr); } - return TCL_ERROR; + result = TCL_ERROR; } /* @@ -705,7 +723,15 @@ DoRemoveDirectory(pathPtr, recursive, errorPtr) * specified, so we recursively remove all the files in the directory. */ - return TraverseUnixTree(TraversalDelete, pathPtr, NULL, errorPtr); + if (result == TCL_OK) { + result = TraverseUnixTree(TraversalDelete, pathPtr, NULL, errorPtr); + } + + if ((result != TCL_OK) && (recursive != 0)) { + /* Try to restore permissions */ + chmod(path, oldPerm); + } + return result; } /* |