+#ifdef _WIN32
+#define S_ISLNK(m) 0
+#define S_ISSOCK(m) 0
+#endif
+#ifdef _MSC_VER
+#define S_ISREG(m) (((m)&_S_IFMT)==_S_IFREG)
+#define S_ISDIR(m) (((m)&_S_IFMT)==_S_IFDIR)
+#define S_ISCHR(m) (((m)&_S_IFMT)==_S_IFCHR)
+#define S_ISFIFO(m) (((m)&_S_IFMT)==_S_IFIFO)
+#define S_ISBLK(m) 0
+typedef unsigned short mode_t;
+#endif
+static naRef ftype(naContext ctx, mode_t m)
+{
+ const char* t = "unk";
+ if(S_ISREG(m)) t = "reg";
+ else if(S_ISDIR(m)) t = "dir"; else if(S_ISCHR(m)) t = "chr";
+ else if(S_ISBLK(m)) t = "blk"; else if(S_ISFIFO(m)) t = "fifo";
+ else if(S_ISLNK(m)) t = "lnk"; else if(S_ISSOCK(m)) t = "sock";
+ return naStr_fromdata(naNewString(ctx), t, strlen(t));
+}
+