1 fd04aace 2003-11-23 devnull #include <u.h>
2 fd04aace 2003-11-23 devnull #include <libc.h>
4 fd04aace 2003-11-23 devnull #include <sys/stat.h>
5 fd04aace 2003-11-23 devnull #include <sys/disklabel.h>
6 fd04aace 2003-11-23 devnull #include <dirent.h>
7 fd04aace 2003-11-23 devnull #include <pwd.h>
8 fd04aace 2003-11-23 devnull #include <grp.h>
11 fd04aace 2003-11-23 devnull _p9dir(struct stat *st, char *name, Dir *d, char **str, char *estr)
14 fd04aace 2003-11-23 devnull char tmp[20];
15 fd04aace 2003-11-23 devnull struct group *g;
16 fd04aace 2003-11-23 devnull struct pwd *p;
21 fd04aace 2003-11-23 devnull /* name */
22 fd04aace 2003-11-23 devnull s = strrchr(name, '/');
23 fd04aace 2003-11-23 devnull if(s && s[1])
28 fd04aace 2003-11-23 devnull if(*str + strlen(s)+1 > estr)
29 fd04aace 2003-11-23 devnull d->name = "oops";
31 fd04aace 2003-11-23 devnull strcpy(*str, s);
32 fd04aace 2003-11-23 devnull d->name = *str;
33 fd04aace 2003-11-23 devnull *str += strlen(*str)+1;
36 fd04aace 2003-11-23 devnull sz += strlen(s)+1;
38 fd04aace 2003-11-23 devnull /* user */
39 fd04aace 2003-11-23 devnull p = getpwuid(st->st_uid);
40 fd04aace 2003-11-23 devnull if(p == nil){
41 fd04aace 2003-11-23 devnull snprint(tmp, sizeof tmp, "%d", (int)st->st_uid);
44 fd04aace 2003-11-23 devnull s = p->pw_name;
45 fd04aace 2003-11-23 devnull sz += strlen(s)+1;
47 fd04aace 2003-11-23 devnull if(*str+strlen(s)+1 > estr)
48 fd04aace 2003-11-23 devnull d->uid = "oops";
50 fd04aace 2003-11-23 devnull strcpy(*str, s);
51 fd04aace 2003-11-23 devnull d->uid = *str;
52 fd04aace 2003-11-23 devnull *str += strlen(*str)+1;
56 fd04aace 2003-11-23 devnull /* group */
57 fd04aace 2003-11-23 devnull g = getgrgid(st->st_gid);
58 fd04aace 2003-11-23 devnull if(g == nil){
59 fd04aace 2003-11-23 devnull snprint(tmp, sizeof tmp, "%d", (int)st->st_gid);
62 fd04aace 2003-11-23 devnull s = g->gr_name;
63 fd04aace 2003-11-23 devnull sz += strlen(s)+1;
65 fd04aace 2003-11-23 devnull if(*str + strlen(s)+1 > estr){
66 fd04aace 2003-11-23 devnull d->gid = "oops";
68 fd04aace 2003-11-23 devnull strcpy(*str, s);
69 fd04aace 2003-11-23 devnull d->gid = *str;
70 fd04aace 2003-11-23 devnull *str += strlen(*str)+1;
75 fd04aace 2003-11-23 devnull d->muid = "";
76 fd04aace 2003-11-23 devnull d->qid.path = ((uvlong)st->st_dev<<32) | st->st_ino;
77 fd04aace 2003-11-23 devnull d->qid.vers = st->st_gen;
78 fd04aace 2003-11-23 devnull d->mode = st->st_mode&0777;
79 fd04aace 2003-11-23 devnull if(S_ISDIR(st->st_mode)){
80 fd04aace 2003-11-23 devnull d->mode |= DMDIR;
81 fd04aace 2003-11-23 devnull d->qid.type = QTDIR;
83 fd04aace 2003-11-23 devnull d->atime = st->st_atime;
84 fd04aace 2003-11-23 devnull d->mtime = st->st_mtime;
85 fd04aace 2003-11-23 devnull d->length = st->st_size;
87 fd04aace 2003-11-23 devnull /* fetch real size for disks */
88 fd04aace 2003-11-23 devnull if(S_ISCHR(st->st_mode)){
89 fd04aace 2003-11-23 devnull int fd, n;
90 fd04aace 2003-11-23 devnull struct disklabel lab;
92 fd04aace 2003-11-23 devnull if((fd = open(name, O_RDONLY)) < 0)
93 fd04aace 2003-11-23 devnull goto nosize;
94 fd04aace 2003-11-23 devnull if(ioctl(fd, DIOCGDINFO, &lab) < 0)
95 fd04aace 2003-11-23 devnull goto nosize;
96 fd04aace 2003-11-23 devnull n = minor(st->st_rdev)&0xFFFF;
97 fd04aace 2003-11-23 devnull if(n >= lab.d_npartitions)
98 fd04aace 2003-11-23 devnull goto nosize;
99 fd04aace 2003-11-23 devnull d->length = (vlong)lab.d_npartitions[n].p_size * lab.d_secsize;
101 fd04aace 2003-11-23 devnull if(fd >= 0)
102 fd04aace 2003-11-23 devnull close(fd);
106 fd04aace 2003-11-23 devnull return sz;
110 fd04aace 2003-11-23 devnull _dirfstat(char *name, int fd)
113 fd04aace 2003-11-23 devnull int size;