From 3d7e9092a436b707f2160fb869ab68e2a222bc4e Mon Sep 17 00:00:00 2001 From: rsc Date: Tue, 14 Oct 2003 02:35:00 +0000 Subject: Single-threaded plumber that can run "start" rules. Thanks to Caerwyn Jones. --- src/lib9/dirstat.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/lib9/dirstat.c (limited to 'src/lib9/dirstat.c') diff --git a/src/lib9/dirstat.c b/src/lib9/dirstat.c new file mode 100644 index 00000000..fb9cd0ac --- /dev/null +++ b/src/lib9/dirstat.c @@ -0,0 +1,83 @@ +#include "u.h" +#include "libc.h" +#include +#include +#include +#include + +static void +statconv(Dir *dir, struct stat *s) +{ + struct passwd *p; + struct group *g; + ulong q; + + p = getpwuid(s->st_uid); + if (p) + strncpy(dir->uid, p->pw_name, NAMELEN); + g = getgrgid(s->st_gid); + if (g) + strncpy(dir->gid, g->gr_name, NAMELEN); + q = 0; + if(S_ISDIR(s->st_mode)) + q = CHDIR; + q |= s->st_ino & 0x00FFFFFFUL; + dir->qid.path = q; + dir->qid.vers = s->st_mtime; + dir->mode = (dir->qid.path&CHDIR)|(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 = 'M'; + if(S_ISFIFO(s->st_mode)) + dir->type = '|'; +} + +int +dirfstat(int fd, Dir *d) +{ + struct stat sbuf; + + if(fstat(fd, &sbuf) < 0) + return -1; + statconv(d, &sbuf); + return 0; +} + +static char * +lelem(char *path) +{ + char *pr; + + pr = utfrrune(path, '/'); + if(pr) + pr++; + else + pr = path; + return pr; +} + +int +dirstat(char *f, Dir *d) +{ + struct stat sbuf; + + if(stat(f, &sbuf) < 0) + return -1; + statconv(d, &sbuf); + strncpy(d->name, lelem(f), NAMELEN); + return 0; +} + +int +dirfwstat(int fd, Dir *d) +{ + return -1; +} + +int +dirwstat(char *name, Dir *d) +{ + return -1; +} -- cgit v1.2.3