Commit Diff


commit - 17ea8246621a62d02fe0fba9266d5e3d916cca1c
commit + bee0a9e34b2c6fe77faf0c10b8f29a9d6cac611b
blob - a8396245e632897fe7177081b9411928e1b6c680
blob + fe426ae46c73966411795d28423d47f5a8967587
--- kamid/client.c
+++ kamid/client.c
@@ -1420,6 +1420,7 @@ serialize_stat(const char *fname, struct stat *sb, str
 	struct qid	 qid;
 	const char	*uid, *gid, *muid;
 	size_t		 tot;
+	uint32_t	 mode;
 	uint16_t	 namlen, uidlen, gidlen, ulen;
 
 	qid_update_from_sb(&qid, sb);
@@ -1440,15 +1441,16 @@ serialize_stat(const char *fname, struct stat *sb, str
 		    fname);
 		return -1;
 	}
+
+	mode = sb->st_mode & 0xFFFF;
+	if (qid.type & QTDIR)
+		mode |= 0x80000000;
 
 	np_write16(evb, tot);			/*	size[2]		*/
 	np_write16(evb, sb->st_rdev);		/*	type[2]		*/
 	np_write32(evb, sb->st_dev);		/*	dev[4]		*/
 	np_qid(evb, &qid);			/*	qid[13]		*/
-
-	/* XXX: translate? */
-	np_write32(evb, sb->st_mode);		/*	mode[4]		*/
-
+	np_write32(evb, mode);			/*	mode[4]		*/
 	np_write32(evb, sb->st_atim.tv_sec);	/*	atime[4]	*/
 	np_write32(evb, sb->st_mtim.tv_sec);	/*	mtime[4]	*/