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