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