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