Commit Diff


commit - 63a686861c04660c55e353e76d7760b1b038d047
commit + 115dbcecc8d35d12b54d17dc1cba39089ad37b5f
blob - 01eab59085aaf0ce923717b0fb904e63cafa5e3a
blob + 95e184447f56f02f2f7984fefbf792f4aaaf4b9f
--- src/lib9/dirfwstat.c
+++ src/lib9/dirfwstat.c
@@ -48,6 +48,10 @@ dirfwstat(int fd, Dir *dir)
 		if(futimes(fd, tv) < 0)
 			ret = -1;
 	}
+	if(~dir->length != 0){
+		if(ftruncate(fd, dir->length) < 0)
+			ret = -1;
+	}
 	return ret;
 }
 
blob - 396158dc97092896152910a758b343ce2dc515c6
blob + 0b81d90010e2f10fe501769c87727d67f258d607
--- src/lib9/dirwstat.c
+++ src/lib9/dirwstat.c
@@ -7,13 +7,24 @@
 int
 dirwstat(char *file, Dir *dir)
 {
+	int ret;
 	struct utimbuf ub;
 
 	/* BUG handle more */
-	if(~dir->mtime == 0)
-		return 0;
-
-	ub.actime = dir->mtime;
-	ub.modtime = dir->mtime;
-	return utime(file, &ub);
+	ret = 0;
+	if(~dir->mode != 0){
+		if(chmod(file, dir->mode) < 0)
+			ret = -1;
+	}
+	if(~dir->mtime != 0){
+		ub.actime = dir->mtime;
+		ub.modtime = dir->mtime;
+		if(utime(file, &ub) < 0)
+			ret = -1;
+	}
+	if(~dir->length != 0){
+		if(truncate(file, dir->length) < 0)
+			ret = -1;
+	}
+	return ret;
 }