? fileperm.diff
Index: tclFCmd.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclFCmd.c,v
retrieving revision 1.29
diff -b -u -r1.29 tclFCmd.c
--- tclFCmd.c	19 Oct 2004 21:54:07 -0000	1.29
+++ tclFCmd.c	12 Jan 2005 18:36:55 -0000
@@ -532,14 +532,50 @@
 	 * permissions, we'll let the actual copy/rename return
 	 * an error later.
 	 */
-#if !defined(__WIN32__)
 	{
+	    Tcl_Obj *listObj;
+	    int permIndex = -1;
+	    CONST char **strings = Tcl_FSFileAttrStrings(target, &listObj);
+	    if (strings != NULL) {
+		/* We have an array of strings */
+		CONST char **strCounter = strings;
+		while (*strCounter != NULL) {
+		    CONST char *str = *strCounter;
+		    if (str[1] == 'p' && !strcmp(str,"-permissions")) {
+			permIndex = (strCounter - strings);
+		        break;
+		    }
+		    strCounter++;
+		}
+	    } else {
+		/* We have a list-object of attribute string-objects */
+		Tcl_Obj **elements;
+		Tcl_IncrRefCount(listObj);
+		if (Tcl_ListObjGetElements(NULL, listObj, &permIndex, 
+					   &elements) == TCL_OK) {
+		    while (--permIndex >= 0) {
+			int len;
+		        CONST char *str = 
+			  Tcl_GetStringFromObj(elements[permIndex],&len);
+			if (len == 12 && str[1] == 'p' 
+			  && !strcmp(str,"-permissions")) {
+			    break;
+			}
+		    }
+		}
+		Tcl_DecrRefCount(listObj);
+	    }
+	    /* 
+	     * If we found a valid permission index, then set the
+	     * path's permissions to 'u+w'.
+	     */
+	    if (permIndex != -1) {
 	Tcl_Obj* perm = Tcl_NewStringObj("u+w",-1);
 	Tcl_IncrRefCount(perm);
-	Tcl_FSFileAttrsSet(NULL, 2, target, perm);
+		Tcl_FSFileAttrsSet(NULL, permIndex, target, perm);
 	Tcl_DecrRefCount(perm);
 	}
-#endif
+	}
     }
 
     if (copyFlag == 0) {
