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