summaryrefslogtreecommitdiff
path: root/lib9/dirstat-Nt.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib9/dirstat-Nt.c')
-rw-r--r--lib9/dirstat-Nt.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib9/dirstat-Nt.c b/lib9/dirstat-Nt.c
new file mode 100644
index 00000000..84db4bda
--- /dev/null
+++ b/lib9/dirstat-Nt.c
@@ -0,0 +1,64 @@
+#include "lib9.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#define ISTYPE(s, t) (((s)->st_mode&S_IFMT) == t)
+
+static char nullstring[] = "";
+static char Enovmem[] = "out of memory";
+
+static Dir*
+statconv(struct stat *s, char *name)
+{
+ Dir *dir;
+
+#ifdef NO
+ extern char* GetNameFromID(int);
+
+ uid = GetNameFromID(s->st_uid), NAMELEN);
+ gid = GetNameFromID(s->st_gid), NAMELEN);
+#endif
+ dir = malloc(sizeof(Dir));
+ if(dir == nil){
+ werrstr(Enovmem);
+ return nil;
+ }
+ dir->name = name;
+ dir->uid = dir->gid = dir->muid = nullstring;
+ dir->qid.type = ISTYPE(s, _S_IFDIR)? QTDIR: QTFILE;
+ dir->qid.path = s->st_ino;
+ dir->qid.vers = s->st_mtime;
+ dir->mode = (dir->qid.type<<24)|(s->st_mode&0777);
+ dir->atime = s->st_atime;
+ dir->mtime = s->st_mtime;
+ dir->length = s->st_size;
+ dir->dev = s->st_dev;
+ dir->type = ISTYPE(s, _S_IFIFO)? '|': 'M';
+ return dir;
+}
+
+Dir*
+dirfstat(int fd)
+{
+ struct stat sbuf;
+
+ if(fstat(fd, &sbuf) < 0)
+ return nil;
+ return statconv(&sbuf, nullstring);
+}
+
+Dir*
+dirstat(char *f)
+{
+ struct stat sbuf;
+ char *p;
+
+ if(stat(f, &sbuf) < 0)
+ return nil;
+ p = strrchr(f, '/');
+ if(p)
+ p++;
+ else
+ p = nullstring;
+ return statconv(&sbuf, p);
+}