diff options
Diffstat (limited to 'lib9/dirstat-Nt.c')
| -rw-r--r-- | lib9/dirstat-Nt.c | 64 |
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); +} |
