diff options
author | hobbs <hobbs> | 2002-04-07 05:44:10 (GMT) |
---|---|---|
committer | hobbs <hobbs> | 2002-04-07 05:44:10 (GMT) |
commit | 99e8896f2e7f6cdf266ea20b486a1587ba574dba (patch) | |
tree | 876d80c097a0ff02106d337a2a1f0af140900c25 | |
parent | b1d0f3126ec21021d3ddfe55871c4e366887e0b5 (diff) | |
download | tcl-99e8896f2e7f6cdf266ea20b486a1587ba574dba.zip tcl-99e8896f2e7f6cdf266ea20b486a1587ba574dba.tar.gz tcl-99e8896f2e7f6cdf266ea20b486a1587ba574dba.tar.bz2 |
* unix/tclUnixFCmd.c (Realpath): added a little extra code to
initialize a realpath arg when compiling in PURIFY mode in order
to prevent spurious purify warnings. We should really create our
own realpath implementation, but this will at least quiet purify
for now.
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | unix/tclUnixFCmd.c | 99 |
2 files changed, 67 insertions, 40 deletions
@@ -1,3 +1,11 @@ +2002-04-06 Jeff Hobbs <jeffh@ActiveState.com> + + * unix/tclUnixFCmd.c (Realpath): added a little extra code to + initialize a realpath arg when compiling in PURIFY mode in order + to prevent spurious purify warnings. We should really create our + own realpath implementation, but this will at least quiet purify + for now. + 2002-04-05 Don Porter <dgp@users.sourceforge.net> * generic/tclCmdMZ.c (Tcl_SubstObj): diff --git a/unix/tclUnixFCmd.c b/unix/tclUnixFCmd.c index 8eb0d81..f70d008 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.20 2002/04/04 21:14:53 hobbs Exp $ + * RCS: @(#) $Id: tclUnixFCmd.c,v 1.21 2002/04/07 05:44:11 hobbs Exp $ * * Portions of this code were derived from NetBSD source code which has * the following copyright notice: @@ -149,6 +149,29 @@ static int TraverseUnixTree _ANSI_ARGS_(( TraversalProc *traversalProc, Tcl_DString *sourcePtr, Tcl_DString *destPtr, Tcl_DString *errorPtr)); + +#ifdef PURIFY +/* + * realpath and purify don't mix happily. It has been noted that realpath + * should not be used with purify because of bogus warnings, but just + * memset'ing the resolved path will squelch those. This assumes we are + * passing the standard MAXPATHLEN size resolved arg. + */ +static char * Realpath _ANSI_ARGS_((CONST char *path, + char *resolved)); + +char * +Realpath(path, resolved) + CONST char *path; + char *resolved; +{ + memset(resolved, 0, MAXPATHLEN); + return realpath(path, resolved); +} +#else +#define Realpath realpath +#endif + /* *--------------------------------------------------------------------------- @@ -185,7 +208,6 @@ static int TraverseUnixTree _ANSI_ARGS_(( *--------------------------------------------------------------------------- */ - int TclpObjRenameFile(srcPathPtr, destPathPtr) Tcl_Obj *srcPathPtr; @@ -232,8 +254,8 @@ DoRenameFile(src, dst) DIR *dirPtr; Tcl_DirEntry *dirEntPtr; - if ((realpath((char *) src, srcPath) != NULL) /* INTL: Native. */ - && (realpath((char *) dst, dstPath) != NULL) /* INTL: Native. */ + if ((Realpath((char *) src, srcPath) != NULL) /* INTL: Native. */ + && (Realpath((char *) dst, dstPath) != NULL) /* INTL: Native. */ && (strncmp(srcPath, dstPath, strlen(srcPath)) != 0)) { dirPtr = opendir(dst); /* INTL: Native. */ if (dirPtr != NULL) { @@ -274,7 +296,6 @@ DoRenameFile(src, dst) return TCL_ERROR; } - /* *--------------------------------------------------------------------------- @@ -1643,6 +1664,11 @@ TclpObjNormalizePath(interp, pathPtr, nextCheckpoint) int pathLen; char cur; char *path = Tcl_GetStringFromObj(pathPtr, &pathLen); +#ifndef NO_REALPATH + char normPath[MAXPATHLEN]; + Tcl_DString ds; + CONST char *nativePath; +#endif currentPathEndPosition = path + nextCheckpoint; @@ -1655,7 +1681,7 @@ TclpObjNormalizePath(interp, pathPtr, nextCheckpoint) int accessOk; nativePath = Tcl_UtfToExternalDString(NULL, path, - currentPathEndPosition - path, &ds); + currentPathEndPosition - path, &ds); accessOk = access(nativePath, F_OK); Tcl_DStringFree(&ds); if (accessOk != 0) { @@ -1677,43 +1703,36 @@ TclpObjNormalizePath(interp, pathPtr, nextCheckpoint) * have 'realpath'. */ #ifndef NO_REALPATH - if (1) { - char normPath[MAXPATHLEN]; - Tcl_DString ds; - CONST char *nativePath = Tcl_UtfToExternalDString(NULL, path, - nextCheckpoint, &ds); - - if (realpath((char *) nativePath, normPath) != NULL) { - /* - * Free up the native path and put in its place the - * converted, normalized path. - */ - Tcl_DStringFree(&ds); - Tcl_ExternalToUtfDString(NULL, normPath, - (int) strlen(normPath), &ds); - - if (path[nextCheckpoint] != '\0') { - /* not at end, append remaining path */ - int normLen = Tcl_DStringLength(&ds); - Tcl_DStringAppend(&ds, path + nextCheckpoint, - pathLen - nextCheckpoint); - /* - * We recognise up to and including the directory - * separator. - */ - nextCheckpoint = normLen + 1; - } else { - /* We recognise the whole string */ - nextCheckpoint = Tcl_DStringLength(&ds); - } + nativePath = Tcl_UtfToExternalDString(NULL, path, nextCheckpoint, &ds); + if (Realpath(nativePath, normPath) != NULL) { + /* + * Free up the native path and put in its place the + * converted, normalized path. + */ + Tcl_DStringFree(&ds); + Tcl_ExternalToUtfDString(NULL, normPath, (int) strlen(normPath), &ds); + + if (path[nextCheckpoint] != '\0') { + /* not at end, append remaining path */ + int normLen = Tcl_DStringLength(&ds); + Tcl_DStringAppend(&ds, path + nextCheckpoint, + pathLen - nextCheckpoint); /* - * Overwrite with the normalized path. - */ - Tcl_SetStringObj(pathPtr,Tcl_DStringValue(&ds), - Tcl_DStringLength(&ds)); + * We recognise up to and including the directory + * separator. + */ + nextCheckpoint = normLen + 1; + } else { + /* We recognise the whole string */ + nextCheckpoint = Tcl_DStringLength(&ds); } - Tcl_DStringFree(&ds); + /* + * Overwrite with the normalized path. + */ + Tcl_SetStringObj(pathPtr, Tcl_DStringValue(&ds), + Tcl_DStringLength(&ds)); } + Tcl_DStringFree(&ds); #endif /* !NO_REALPATH */ return nextCheckpoint; |