xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/dirtostat.c (revision fb7f0c934c48abaed6040d054ef636408c3c522d)
1bd389b36SDavid du Colombier #include "lib.h"
2bd389b36SDavid du Colombier #include <sys/stat.h>
3bd389b36SDavid du Colombier #include <errno.h>
4bd389b36SDavid du Colombier #include "sys9.h"
5bd389b36SDavid du Colombier #include "dir.h"
6bd389b36SDavid du Colombier 
7219b2ee8SDavid du Colombier /* fi is non-null if there is an fd associated with s */
8bd389b36SDavid du Colombier void
_dirtostat(struct stat * s,Dir * d,Fdinfo * fi)99a747e4fSDavid du Colombier _dirtostat(struct stat *s, Dir *d, Fdinfo *fi)
10bd389b36SDavid du Colombier {
11bd389b36SDavid du Colombier 	int num;
12219b2ee8SDavid du Colombier 	char *nam;
13bd389b36SDavid du Colombier 
14bd389b36SDavid du Colombier 	s->st_dev = (d->type<<8)|(d->dev&0xFF);
15bd389b36SDavid du Colombier 	s->st_ino = d->qid.path;
16219b2ee8SDavid du Colombier 	s->st_mode = d->mode&0777;
17219b2ee8SDavid du Colombier 	if(fi && (fi->flags&FD_ISTTY))
18219b2ee8SDavid du Colombier 		s->st_mode |= S_IFCHR;
19219b2ee8SDavid du Colombier 	else if(d->mode & 0x80000000)
20219b2ee8SDavid du Colombier 		s->st_mode |= S_IFDIR;
21219b2ee8SDavid du Colombier 	else if(d->type == '|' || d->type == 's')
22219b2ee8SDavid du Colombier 		s->st_mode |= S_IFIFO;
23219b2ee8SDavid du Colombier 	else if(d->type != 'M')
24219b2ee8SDavid du Colombier 		s->st_mode |= S_IFCHR;
25219b2ee8SDavid du Colombier 	else
26219b2ee8SDavid du Colombier 		s->st_mode |= S_IFREG;
27bd389b36SDavid du Colombier 	s->st_nlink = 1;
28bd389b36SDavid du Colombier 	s->st_uid = 1;
29bd389b36SDavid du Colombier 	s->st_gid = 1;
30219b2ee8SDavid du Colombier 	if(fi && (fi->flags&FD_BUFFERED))
31219b2ee8SDavid du Colombier 		s->st_size = fi->buf->n;
32219b2ee8SDavid du Colombier 	else
33bd389b36SDavid du Colombier 		s->st_size = d->length;
34bd389b36SDavid du Colombier 	s->st_atime = d->atime;
35bd389b36SDavid du Colombier 	s->st_mtime = d->mtime;
36bd389b36SDavid du Colombier 	s->st_ctime = d->mtime;
37*fb7f0c93SDavid du Colombier 	if(fi && fi->uid != -2){
38219b2ee8SDavid du Colombier 		s->st_uid = fi->uid;
39219b2ee8SDavid du Colombier 		s->st_gid = fi->gid;
40219b2ee8SDavid du Colombier 	} else {
419a747e4fSDavid du Colombier 		nam = d->uid;
42219b2ee8SDavid du Colombier 		if(_getpw(&num, &nam, 0))
43bd389b36SDavid du Colombier 			s->st_uid = num;
449a747e4fSDavid du Colombier 		nam = d->gid;
45219b2ee8SDavid du Colombier 		if(_getpw(&num, &nam, 0))
46bd389b36SDavid du Colombier 			s->st_gid = num;
47*fb7f0c93SDavid du Colombier 		if(fi){
48*fb7f0c93SDavid du Colombier 			fi->uid = s->st_uid;
49*fb7f0c93SDavid du Colombier 			fi->gid = s->st_gid;
50*fb7f0c93SDavid du Colombier 		}
51bd389b36SDavid du Colombier 	}
52219b2ee8SDavid du Colombier }
53