commit bee0a9e34b2c6fe77faf0c10b8f29a9d6cac611b from: Omar Polo date: Wed Feb 02 14:32:11 2022 UTC stat: fix `mode' format Select only the lower two and set the correct bit for directory entries. While the lower two bytes seems to behave just as on UNIX, the upper ones don't (at least on OpenBSD.) 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] */