Blame


1 fd04aace 2003-11-23 devnull #include <u.h>
2 fd04aace 2003-11-23 devnull #include <libc.h>
3 fd04aace 2003-11-23 devnull
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>
9 fd04aace 2003-11-23 devnull
10 fd04aace 2003-11-23 devnull int
11 fd04aace 2003-11-23 devnull _p9dir(struct stat *st, char *name, Dir *d, char **str, char *estr)
12 fd04aace 2003-11-23 devnull {
13 fd04aace 2003-11-23 devnull char *s;
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;
17 fd04aace 2003-11-23 devnull int sz;
18 fd04aace 2003-11-23 devnull
19 fd04aace 2003-11-23 devnull sz = 0;
20 fd04aace 2003-11-23 devnull
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])
24 fd04aace 2003-11-23 devnull s++;
25 fd04aace 2003-11-23 devnull else
26 fd04aace 2003-11-23 devnull s = "/";
27 fd04aace 2003-11-23 devnull if(d){
28 fd04aace 2003-11-23 devnull if(*str + strlen(s)+1 > estr)
29 fd04aace 2003-11-23 devnull d->name = "oops";
30 fd04aace 2003-11-23 devnull else{
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;
34 fd04aace 2003-11-23 devnull }
35 fd04aace 2003-11-23 devnull }
36 fd04aace 2003-11-23 devnull sz += strlen(s)+1;
37 fd04aace 2003-11-23 devnull
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);
42 fd04aace 2003-11-23 devnull s = tmp;
43 fd04aace 2003-11-23 devnull }else
44 fd04aace 2003-11-23 devnull s = p->pw_name;
45 fd04aace 2003-11-23 devnull sz += strlen(s)+1;
46 fd04aace 2003-11-23 devnull if(d){
47 fd04aace 2003-11-23 devnull if(*str+strlen(s)+1 > estr)
48 fd04aace 2003-11-23 devnull d->uid = "oops";
49 fd04aace 2003-11-23 devnull else{
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;
53 fd04aace 2003-11-23 devnull }
54 fd04aace 2003-11-23 devnull }
55 fd04aace 2003-11-23 devnull
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);
60 fd04aace 2003-11-23 devnull s = tmp;
61 fd04aace 2003-11-23 devnull }else
62 fd04aace 2003-11-23 devnull s = g->gr_name;
63 fd04aace 2003-11-23 devnull sz += strlen(s)+1;
64 fd04aace 2003-11-23 devnull if(d){
65 fd04aace 2003-11-23 devnull if(*str + strlen(s)+1 > estr){
66 fd04aace 2003-11-23 devnull d->gid = "oops";
67 fd04aace 2003-11-23 devnull else{
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;
71 fd04aace 2003-11-23 devnull }
72 fd04aace 2003-11-23 devnull }
73 fd04aace 2003-11-23 devnull
74 fd04aace 2003-11-23 devnull if(d){
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;
82 fd04aace 2003-11-23 devnull }
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;
86 fd04aace 2003-11-23 devnull
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;
91 fd04aace 2003-11-23 devnull
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;
100 fd04aace 2003-11-23 devnull nosize:
101 fd04aace 2003-11-23 devnull if(fd >= 0)
102 fd04aace 2003-11-23 devnull close(fd);
103 fd04aace 2003-11-23 devnull }
104 fd04aace 2003-11-23 devnull }
105 fd04aace 2003-11-23 devnull
106 fd04aace 2003-11-23 devnull return sz;
107 fd04aace 2003-11-23 devnull }
108 fd04aace 2003-11-23 devnull
109 fd04aace 2003-11-23 devnull Dir*
110 fd04aace 2003-11-23 devnull _dirfstat(char *name, int fd)
111 fd04aace 2003-11-23 devnull {
112 fd04aace 2003-11-23 devnull Dir *d;
113 fd04aace 2003-11-23 devnull int size;
114 fd04aace 2003-11-23 devnull
115 fd04aace 2003-11-23 devnull
116 fd04aace 2003-11-23 devnull }