xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/dirtostat.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include "lib.h"
2 #include <sys/stat.h>
3 #include <errno.h>
4 #include "sys9.h"
5 #include "dir.h"
6 
7 /* fi is non-null if there is an fd associated with s */
8 void
9 _dirtostat(struct stat *s, char *cd, Fdinfo *fi)
10 {
11 	Dir *d, db;
12 	int num;
13 	char *nam;
14 
15 	convM2D(cd, &db);
16 	d = &db;
17 	s->st_dev = (d->type<<8)|(d->dev&0xFF);
18 	s->st_ino = d->qid.path;
19 	s->st_mode = d->mode&0777;
20 	if(fi && (fi->flags&FD_ISTTY))
21 		s->st_mode |= S_IFCHR;
22 	else if(d->mode & 0x80000000)
23 		s->st_mode |= S_IFDIR;
24 	else if(d->type == '|' || d->type == 's')
25 		s->st_mode |= S_IFIFO;
26 	else if(d->type != 'M')
27 		s->st_mode |= S_IFCHR;
28 	else
29 		s->st_mode |= S_IFREG;
30 	s->st_nlink = 1;
31 	s->st_uid = 1;
32 	s->st_gid = 1;
33 	if(fi && (fi->flags&FD_BUFFERED))
34 		s->st_size = fi->buf->n;
35 	else
36 		s->st_size = d->length;
37 	s->st_atime = d->atime;
38 	s->st_mtime = d->mtime;
39 	s->st_ctime = d->mtime;
40 	if(fi){
41 		s->st_uid = fi->uid;
42 		s->st_gid = fi->gid;
43 	} else {
44 		nam = db.uid;
45 		if(_getpw(&num, &nam, 0))
46 			s->st_uid = num;
47 		nam = db.gid;
48 		if(_getpw(&num, &nam, 0))
49 			s->st_gid = num;
50 	}
51 }
52