Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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, 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
}