aboutsummaryrefslogtreecommitdiff
path: root/src/lib9/dirstat.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2003-10-14 02:35:00 +0000
committerrsc <devnull@localhost>2003-10-14 02:35:00 +0000
commit3d7e9092a436b707f2160fb869ab68e2a222bc4e (patch)
tree1ef451afc85f7ecba3c8f97ad5222b7ccc515454 /src/lib9/dirstat.c
parent169aba14a4766b3d15695ef27681d0f1d04f8521 (diff)
downloadplan9port-3d7e9092a436b707f2160fb869ab68e2a222bc4e.tar.gz
plan9port-3d7e9092a436b707f2160fb869ab68e2a222bc4e.tar.bz2
plan9port-3d7e9092a436b707f2160fb869ab68e2a222bc4e.zip
Single-threaded plumber that can run "start" rules.
Thanks to Caerwyn Jones.
Diffstat (limited to 'src/lib9/dirstat.c')
-rw-r--r--src/lib9/dirstat.c83
1 files changed, 83 insertions, 0 deletions
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 <sys/types.h>
+#include <sys/stat.h>
+#include <pwd.h>
+#include <grp.h>
+
+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;
+}