summaryrefslogtreecommitdiffstats
path: root/unix/tclUnixFCmd.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2023-07-14 11:13:30 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2023-07-14 11:13:30 (GMT)
commite3a6968b93006d08f0e1dd834826e5f4b37fbd1a (patch)
tree25b8638690fc9ea5964d7fbb58ea3c0632a63fe5 /unix/tclUnixFCmd.c
parent2d5f7e8dd76dd8207be4946a14992e3b96c8e2a2 (diff)
downloadtcl-e3a6968b93006d08f0e1dd834826e5f4b37fbd1a.zip
tcl-e3a6968b93006d08f0e1dd834826e5f4b37fbd1a.tar.gz
tcl-e3a6968b93006d08f0e1dd834826e5f4b37fbd1a.tar.bz2
Use "strict" in almost all commands. Only "glob" and environment variables are left out. (Experimental)core-tip-657-candidate
Diffstat (limited to 'unix/tclUnixFCmd.c')
-rw-r--r--unix/tclUnixFCmd.c138
1 files changed, 95 insertions, 43 deletions
diff --git a/unix/tclUnixFCmd.c b/unix/tclUnixFCmd.c
index b260cf4..8321db9 100644
--- a/unix/tclUnixFCmd.c
+++ b/unix/tclUnixFCmd.c
@@ -762,28 +762,35 @@ TclpObjCopyDirectory(
Tcl_Obj *transPtr;
transPtr = Tcl_FSGetTranslatedPath(NULL,srcPathPtr);
- Tcl_UtfToExternalDStringEx(NULL, NULL,
+ ret = Tcl_UtfToExternalDStringEx(NULL, NULL,
(transPtr != NULL ? TclGetString(transPtr) : NULL),
- -1, TCL_ENCODING_PROFILE_TCL8, &srcString, NULL);
+ -1, 0, &srcString, NULL);
if (transPtr != NULL) {
Tcl_DecrRefCount(transPtr);
}
- transPtr = Tcl_FSGetTranslatedPath(NULL,destPathPtr);
- Tcl_UtfToExternalDStringEx(NULL, NULL,
+ if (ret != TCL_OK) {
+ *errorPtr = srcPathPtr;
+ } else {
+ transPtr = Tcl_FSGetTranslatedPath(NULL,destPathPtr);
+ ret = Tcl_UtfToExternalDStringEx(NULL, NULL,
(transPtr != NULL ? TclGetString(transPtr) : NULL),
-1, TCL_ENCODING_PROFILE_TCL8, &dstString, NULL);
- if (transPtr != NULL) {
- Tcl_DecrRefCount(transPtr);
+ if (transPtr != NULL) {
+ Tcl_DecrRefCount(transPtr);
+ }
+ if (ret != TCL_OK) {
+ *errorPtr = destPathPtr;
+ } else {
+ ret = TraverseUnixTree(TraversalCopy, &srcString, &dstString, &ds, 0);
+ /* Note above call only sets ds on error */
+ if (ret != TCL_OK) {
+ *errorPtr = Tcl_DStringToObj(&ds);
+ }
+ Tcl_DStringFree(&dstString);
+ }
+ Tcl_DStringFree(&srcString);
}
-
- ret = TraverseUnixTree(TraversalCopy, &srcString, &dstString, &ds, 0);
-
- Tcl_DStringFree(&srcString);
- Tcl_DStringFree(&dstString);
-
if (ret != TCL_OK) {
- *errorPtr = Tcl_NewStringObj(Tcl_DStringValue(&ds), TCL_INDEX_NONE);
- Tcl_DStringFree(&ds);
Tcl_IncrRefCount(*errorPtr);
}
return ret;
@@ -826,18 +833,24 @@ TclpObjRemoveDirectory(
int ret;
Tcl_Obj *transPtr = Tcl_FSGetTranslatedPath(NULL, pathPtr);
- Tcl_UtfToExternalDStringEx(NULL, NULL,
+ ret = Tcl_UtfToExternalDStringEx(NULL, NULL,
(transPtr != NULL ? TclGetString(transPtr) : NULL),
-1, TCL_ENCODING_PROFILE_TCL8, &pathString, NULL);
if (transPtr != NULL) {
Tcl_DecrRefCount(transPtr);
}
- ret = DoRemoveDirectory(&pathString, recursive, &ds);
- Tcl_DStringFree(&pathString);
+ if (ret != TCL_OK) {
+ *errorPtr = pathPtr;
+ } else {
+ ret = DoRemoveDirectory(&pathString, recursive, &ds);
+ Tcl_DStringFree(&pathString);
+ /* Note above call only sets ds on error */
+ if (ret != TCL_OK) {
+ *errorPtr = Tcl_DStringToObj(&ds);
+ }
+ }
if (ret != TCL_OK) {
- *errorPtr = Tcl_NewStringObj(Tcl_DStringValue(&ds), TCL_INDEX_NONE);
- Tcl_DStringFree(&ds);
Tcl_IncrRefCount(*errorPtr);
}
return ret;
@@ -886,7 +899,7 @@ DoRemoveDirectory(
result = TCL_OK;
if ((errno != EEXIST) || (recursive == 0)) {
if (errorPtr != NULL) {
- Tcl_ExternalToUtfDStringEx(NULL, NULL, path, TCL_INDEX_NONE, TCL_ENCODING_PROFILE_TCL8, errorPtr, NULL);
+ Tcl_ExternalToUtfDStringEx(NULL, NULL, path, TCL_INDEX_NONE, 0, errorPtr, NULL);
}
result = TCL_ERROR;
}
@@ -1135,7 +1148,7 @@ TraverseUnixTree(
end:
if (errfile != NULL) {
if (errorPtr != NULL) {
- Tcl_ExternalToUtfDStringEx(NULL, NULL, errfile, TCL_INDEX_NONE, TCL_ENCODING_PROFILE_TCL8, errorPtr, NULL);
+ Tcl_ExternalToUtfDStringEx(NULL, NULL, errfile, TCL_INDEX_NONE, 0, errorPtr, NULL);
}
result = TCL_ERROR;
}
@@ -1206,7 +1219,7 @@ TraversalCopy(
if (errorPtr != NULL) {
Tcl_ExternalToUtfDStringEx(NULL, NULL, Tcl_DStringValue(dstPtr),
- Tcl_DStringLength(dstPtr), TCL_ENCODING_PROFILE_TCL8, errorPtr, NULL);
+ Tcl_DStringLength(dstPtr), 0, errorPtr, NULL);
}
return TCL_ERROR;
}
@@ -1257,7 +1270,7 @@ TraversalDelete(
}
if (errorPtr != NULL) {
Tcl_ExternalToUtfDStringEx(NULL, NULL, Tcl_DStringValue(srcPtr),
- Tcl_DStringLength(srcPtr), TCL_ENCODING_PROFILE_TCL8, errorPtr, NULL);
+ Tcl_DStringLength(srcPtr), 0, errorPtr, NULL);
}
return TCL_ERROR;
}
@@ -1424,7 +1437,7 @@ GetOwnerAttribute(
} else {
Tcl_DString ds;
- Tcl_ExternalToUtfDStringEx(NULL, NULL, pwPtr->pw_name, TCL_INDEX_NONE, TCL_ENCODING_PROFILE_TCL8, &ds, NULL);
+ Tcl_ExternalToUtfDStringEx(NULL, NULL, pwPtr->pw_name, TCL_INDEX_NONE, 0, &ds, NULL);
*attributePtrPtr = Tcl_DStringToObj(&ds);
}
return TCL_OK;
@@ -1508,7 +1521,11 @@ SetGroupAttribute(
string = Tcl_GetStringFromObj(attributePtr, &length);
- native = Tcl_UtfToExternalDString(NULL, string, length, &ds);
+ if (Tcl_UtfToExternalDStringEx(interp, NULL, string, length, 0, &ds, NULL) != TCL_OK) {
+ Tcl_DStringFree(&ds);
+ return TCL_ERROR;
+ }
+ native = Tcl_DStringValue(&ds);
groupPtr = TclpGetGrNam(native); /* INTL: Native. */
Tcl_DStringFree(&ds);
@@ -1575,7 +1592,11 @@ SetOwnerAttribute(
string = Tcl_GetStringFromObj(attributePtr, &length);
- native = Tcl_UtfToExternalDString(NULL, string, length, &ds);
+ if (Tcl_UtfToExternalDStringEx(interp, NULL, string, length, 0, &ds, NULL) != TCL_OK) {
+ Tcl_DStringFree(&ds);
+ return TCL_ERROR;
+ }
+ native = Tcl_DStringValue(&ds);
pwPtr = TclpGetPwNam(native); /* INTL: Native. */
Tcl_DStringFree(&ds);
@@ -1935,7 +1956,7 @@ GetModeFromPermString(
int
TclpObjNormalizePath(
- TCL_UNUSED(Tcl_Interp *),
+ Tcl_Interp *interp,
Tcl_Obj *pathPtr, /* An unshared object containing the path to
* normalize. */
int nextCheckpoint) /* offset to start at in pathPtr. Must either
@@ -1969,8 +1990,12 @@ TclpObjNormalizePath(
const char *lastDir = strrchr(currentPathEndPosition, '/');
if (lastDir != NULL) {
- nativePath = Tcl_UtfToExternalDString(NULL, path,
- lastDir-path, &ds);
+ if (Tcl_UtfToExternalDStringEx(interp, NULL, path,
+ lastDir-path, 0, &ds, NULL) != TCL_OK) {
+ Tcl_DStringFree(&ds);
+ return -1;
+ }
+ nativePath = Tcl_DStringValue(&ds);
if (Realpath(nativePath, normPath) != NULL) {
if (*nativePath != '/' && *normPath == '/') {
/*
@@ -2005,8 +2030,12 @@ TclpObjNormalizePath(
int accessOk;
- nativePath = Tcl_UtfToExternalDString(NULL, path,
- currentPathEndPosition - path, &ds);
+ if (Tcl_UtfToExternalDStringEx(interp, NULL, path,
+ currentPathEndPosition - path, 0, &ds, NULL) != TCL_OK) {
+ Tcl_DStringFree(&ds);
+ return -1;
+ }
+ nativePath = Tcl_DStringValue(&ds);
accessOk = access(nativePath, F_OK);
Tcl_DStringFree(&ds);
@@ -2050,7 +2079,11 @@ TclpObjNormalizePath(
return 0;
}
- nativePath = Tcl_UtfToExternalDString(NULL, path,nextCheckpoint, &ds);
+ if (Tcl_UtfToExternalDStringEx(interp, NULL, path,nextCheckpoint, 0, &ds, NULL)) {
+ Tcl_DStringFree(&ds);
+ return -1;
+ }
+ nativePath = Tcl_DStringValue(&ds);
if (Realpath(nativePath, normPath) != NULL) {
Tcl_Size newNormLen;
@@ -2086,7 +2119,7 @@ TclpObjNormalizePath(
*/
Tcl_DStringFree(&ds);
- Tcl_ExternalToUtfDStringEx(NULL, NULL, normPath, newNormLen, TCL_ENCODING_PROFILE_TCL8, &ds, NULL);
+ Tcl_ExternalToUtfDStringEx(NULL, NULL, normPath, newNormLen, 0, &ds, NULL);
if (path[nextCheckpoint] != '\0') {
/*
@@ -2174,12 +2207,14 @@ TclUnixOpenTemporaryFile(
Tcl_Size length;
/*
- * We should also check against making more then TMP_MAX of these.
+ * We should also check against making more than TMP_MAX of these.
*/
if (dirObj) {
string = Tcl_GetStringFromObj(dirObj, &length);
- Tcl_UtfToExternalDStringEx(NULL, NULL, string, length, TCL_ENCODING_PROFILE_TCL8, &templ, NULL);
+ if (Tcl_UtfToExternalDStringEx(NULL, NULL, string, length, 0, &templ, NULL) != TCL_OK) {
+ return -1;
+ }
} else {
Tcl_DStringInit(&templ);
Tcl_DStringAppend(&templ, DefaultTempDir(), TCL_INDEX_NONE); /* INTL: native */
@@ -2189,7 +2224,10 @@ TclUnixOpenTemporaryFile(
if (basenameObj) {
string = Tcl_GetStringFromObj(basenameObj, &length);
- Tcl_UtfToExternalDStringEx(NULL, NULL, string, length, TCL_ENCODING_PROFILE_TCL8, &tmp, NULL);
+ if (Tcl_UtfToExternalDStringEx(NULL, NULL, string, length, 0, &tmp, NULL) != TCL_OK) {
+ Tcl_DStringFree(&tmp);
+ return -1;
+ }
TclDStringAppendDString(&templ, &tmp);
Tcl_DStringFree(&tmp);
} else {
@@ -2201,7 +2239,10 @@ TclUnixOpenTemporaryFile(
#ifdef HAVE_MKSTEMPS
if (extensionObj) {
string = Tcl_GetStringFromObj(extensionObj, &length);
- Tcl_UtfToExternalDStringEx(NULL, NULL, string, length, TCL_ENCODING_PROFILE_TCL8, &tmp, NULL);
+ if (Tcl_UtfToExternalDStringEx(NULL, NULL, string, length, 0, &tmp, NULL) != TCL_OK) {
+ Tcl_DStringFree(&templ);
+ return -1;
+ }
TclDStringAppendDString(&templ, &tmp);
fd = mkstemps(Tcl_DStringValue(&templ), Tcl_DStringLength(&tmp));
Tcl_DStringFree(&tmp);
@@ -2217,8 +2258,11 @@ TclUnixOpenTemporaryFile(
}
if (resultingNameObj) {
- Tcl_ExternalToUtfDStringEx(NULL, NULL, Tcl_DStringValue(&templ),
- Tcl_DStringLength(&templ), TCL_ENCODING_PROFILE_TCL8, &tmp, NULL);
+ if (Tcl_ExternalToUtfDStringEx(NULL, NULL, Tcl_DStringValue(&templ),
+ Tcl_DStringLength(&templ), 0, &tmp, NULL) != TCL_OK) {
+ Tcl_DStringFree(&templ);
+ return -1;
+ }
Tcl_SetStringObj(resultingNameObj, Tcl_DStringValue(&tmp),
Tcl_DStringLength(&tmp));
Tcl_DStringFree(&tmp);
@@ -2304,7 +2348,9 @@ TclpCreateTemporaryDirectory(
if (dirObj) {
string = TclGetString(dirObj);
- Tcl_UtfToExternalDStringEx(NULL, NULL, string, dirObj->length, TCL_ENCODING_PROFILE_TCL8, &templ, NULL);
+ if (Tcl_UtfToExternalDStringEx(NULL, NULL, string, dirObj->length, 0, &templ, NULL) != TCL_OK) {
+ return NULL;
+ }
} else {
Tcl_DStringInit(&templ);
Tcl_DStringAppend(&templ, DefaultTempDir(), TCL_INDEX_NONE); /* INTL: native */
@@ -2317,7 +2363,10 @@ TclpCreateTemporaryDirectory(
if (basenameObj) {
string = TclGetString(basenameObj);
if (basenameObj->length) {
- Tcl_UtfToExternalDStringEx(NULL, NULL, string, basenameObj->length, TCL_ENCODING_PROFILE_TCL8, &tmp, NULL);
+ if (Tcl_UtfToExternalDStringEx(NULL, NULL, string, basenameObj->length, 0, &tmp, NULL) != TCL_OK) {
+ Tcl_DStringFree(&templ);
+ return NULL;
+ }
TclDStringAppendDString(&templ, &tmp);
Tcl_DStringFree(&tmp);
} else {
@@ -2342,8 +2391,11 @@ TclpCreateTemporaryDirectory(
* The template has been updated. Tell the caller what it was.
*/
- Tcl_ExternalToUtfDStringEx(NULL, NULL, Tcl_DStringValue(&templ),
- Tcl_DStringLength(&templ), TCL_ENCODING_PROFILE_TCL8, &tmp, NULL);
+ if (Tcl_ExternalToUtfDStringEx(NULL, NULL, Tcl_DStringValue(&templ),
+ Tcl_DStringLength(&templ), 0, &tmp, NULL) != TCL_OK) {
+ Tcl_DStringFree(&templ);
+ return NULL;
+ }
Tcl_DStringFree(&templ);
return Tcl_DStringToObj(&tmp);
}