Blame


1 d3df3087 2003-12-06 devnull #include <u.h>
2 d3df3087 2003-12-06 devnull #include <libc.h>
3 d3df3087 2003-12-06 devnull #include <fcall.h>
4 d3df3087 2003-12-06 devnull
5 d3df3087 2003-12-06 devnull uint
6 fb941e08 2005-09-13 devnull sizeD2Mu(Dir *d, int dotu)
7 d3df3087 2003-12-06 devnull {
8 fb941e08 2005-09-13 devnull char *sv[5];
9 fb941e08 2005-09-13 devnull int i, ns, nstr, fixlen;
10 d3df3087 2003-12-06 devnull
11 d3df3087 2003-12-06 devnull sv[0] = d->name;
12 d3df3087 2003-12-06 devnull sv[1] = d->uid;
13 d3df3087 2003-12-06 devnull sv[2] = d->gid;
14 d3df3087 2003-12-06 devnull sv[3] = d->muid;
15 fb941e08 2005-09-13 devnull
16 fb941e08 2005-09-13 devnull fixlen = STATFIXLEN;
17 fb941e08 2005-09-13 devnull nstr = 4;
18 fb941e08 2005-09-13 devnull if(dotu){
19 fb941e08 2005-09-13 devnull fixlen = STATFIXLENU;
20 fb941e08 2005-09-13 devnull sv[4] = d->ext;
21 fb941e08 2005-09-13 devnull nstr = 5;
22 fb941e08 2005-09-13 devnull }
23 fb941e08 2005-09-13 devnull
24 d3df3087 2003-12-06 devnull ns = 0;
25 fb941e08 2005-09-13 devnull for(i = 0; i < nstr; i++)
26 d3df3087 2003-12-06 devnull if(sv[i])
27 d3df3087 2003-12-06 devnull ns += strlen(sv[i]);
28 d3df3087 2003-12-06 devnull
29 fb941e08 2005-09-13 devnull return fixlen + ns;
30 d3df3087 2003-12-06 devnull }
31 d3df3087 2003-12-06 devnull
32 d3df3087 2003-12-06 devnull uint
33 fb941e08 2005-09-13 devnull sizeD2M(Dir *d)
34 d3df3087 2003-12-06 devnull {
35 fb941e08 2005-09-13 devnull return sizeD2Mu(d, 0);
36 fb941e08 2005-09-13 devnull }
37 fb941e08 2005-09-13 devnull
38 fb941e08 2005-09-13 devnull uint
39 fb941e08 2005-09-13 devnull convD2Mu(Dir *d, uchar *buf, uint nbuf, int dotu)
40 fb941e08 2005-09-13 devnull {
41 d3df3087 2003-12-06 devnull uchar *p, *ebuf;
42 fb941e08 2005-09-13 devnull char *sv[5];
43 adeb5ac9 2005-12-29 devnull int i, ns, nsv[5], ss, nstr, fixlen;
44 d3df3087 2003-12-06 devnull
45 d3df3087 2003-12-06 devnull if(nbuf < BIT16SZ)
46 d3df3087 2003-12-06 devnull return 0;
47 d3df3087 2003-12-06 devnull
48 d3df3087 2003-12-06 devnull p = buf;
49 d3df3087 2003-12-06 devnull ebuf = buf + nbuf;
50 d3df3087 2003-12-06 devnull
51 d3df3087 2003-12-06 devnull sv[0] = d->name;
52 d3df3087 2003-12-06 devnull sv[1] = d->uid;
53 d3df3087 2003-12-06 devnull sv[2] = d->gid;
54 d3df3087 2003-12-06 devnull sv[3] = d->muid;
55 d3df3087 2003-12-06 devnull
56 fb941e08 2005-09-13 devnull fixlen = STATFIXLEN;
57 fb941e08 2005-09-13 devnull nstr = 4;
58 fb941e08 2005-09-13 devnull if(dotu){
59 fb941e08 2005-09-13 devnull fixlen = STATFIXLENU;
60 fb941e08 2005-09-13 devnull sv[4] = d->ext;
61 fb941e08 2005-09-13 devnull nstr = 5;
62 fb941e08 2005-09-13 devnull }
63 fb941e08 2005-09-13 devnull
64 d3df3087 2003-12-06 devnull ns = 0;
65 fb941e08 2005-09-13 devnull for(i = 0; i < nstr; i++){
66 d3df3087 2003-12-06 devnull if(sv[i])
67 d3df3087 2003-12-06 devnull nsv[i] = strlen(sv[i]);
68 d3df3087 2003-12-06 devnull else
69 d3df3087 2003-12-06 devnull nsv[i] = 0;
70 d3df3087 2003-12-06 devnull ns += nsv[i];
71 d3df3087 2003-12-06 devnull }
72 d3df3087 2003-12-06 devnull
73 fb941e08 2005-09-13 devnull ss = fixlen + ns;
74 d3df3087 2003-12-06 devnull
75 d3df3087 2003-12-06 devnull /* set size befor erroring, so user can know how much is needed */
76 d3df3087 2003-12-06 devnull /* note that length excludes count field itself */
77 d3df3087 2003-12-06 devnull PBIT16(p, ss-BIT16SZ);
78 d3df3087 2003-12-06 devnull p += BIT16SZ;
79 d3df3087 2003-12-06 devnull
80 d3df3087 2003-12-06 devnull if(ss > nbuf)
81 d3df3087 2003-12-06 devnull return BIT16SZ;
82 d3df3087 2003-12-06 devnull
83 d3df3087 2003-12-06 devnull PBIT16(p, d->type);
84 d3df3087 2003-12-06 devnull p += BIT16SZ;
85 d3df3087 2003-12-06 devnull PBIT32(p, d->dev);
86 d3df3087 2003-12-06 devnull p += BIT32SZ;
87 d3df3087 2003-12-06 devnull PBIT8(p, d->qid.type);
88 d3df3087 2003-12-06 devnull p += BIT8SZ;
89 d3df3087 2003-12-06 devnull PBIT32(p, d->qid.vers);
90 d3df3087 2003-12-06 devnull p += BIT32SZ;
91 d3df3087 2003-12-06 devnull PBIT64(p, d->qid.path);
92 d3df3087 2003-12-06 devnull p += BIT64SZ;
93 d3df3087 2003-12-06 devnull PBIT32(p, d->mode);
94 d3df3087 2003-12-06 devnull p += BIT32SZ;
95 d3df3087 2003-12-06 devnull PBIT32(p, d->atime);
96 d3df3087 2003-12-06 devnull p += BIT32SZ;
97 d3df3087 2003-12-06 devnull PBIT32(p, d->mtime);
98 d3df3087 2003-12-06 devnull p += BIT32SZ;
99 d3df3087 2003-12-06 devnull PBIT64(p, d->length);
100 d3df3087 2003-12-06 devnull p += BIT64SZ;
101 d3df3087 2003-12-06 devnull
102 fb941e08 2005-09-13 devnull for(i = 0; i < nstr; i++){
103 d3df3087 2003-12-06 devnull ns = nsv[i];
104 d3df3087 2003-12-06 devnull if(p + ns + BIT16SZ > ebuf)
105 d3df3087 2003-12-06 devnull return 0;
106 d3df3087 2003-12-06 devnull PBIT16(p, ns);
107 d3df3087 2003-12-06 devnull p += BIT16SZ;
108 d3df3087 2003-12-06 devnull if(ns)
109 d3df3087 2003-12-06 devnull memmove(p, sv[i], ns);
110 d3df3087 2003-12-06 devnull p += ns;
111 d3df3087 2003-12-06 devnull }
112 fb941e08 2005-09-13 devnull
113 fb941e08 2005-09-13 devnull if(dotu){
114 fb941e08 2005-09-13 devnull PBIT32(p, d->uidnum);
115 fb941e08 2005-09-13 devnull p += BIT32SZ;
116 fb941e08 2005-09-13 devnull PBIT32(p, d->gidnum);
117 fb941e08 2005-09-13 devnull p += BIT32SZ;
118 fb941e08 2005-09-13 devnull PBIT32(p, d->muidnum);
119 fb941e08 2005-09-13 devnull p += BIT32SZ;
120 fb941e08 2005-09-13 devnull }
121 d3df3087 2003-12-06 devnull
122 d3df3087 2003-12-06 devnull if(ss != p - buf)
123 d3df3087 2003-12-06 devnull return 0;
124 d3df3087 2003-12-06 devnull
125 d3df3087 2003-12-06 devnull return p - buf;
126 d3df3087 2003-12-06 devnull }
127 fb941e08 2005-09-13 devnull
128 fb941e08 2005-09-13 devnull uint
129 fb941e08 2005-09-13 devnull convD2M(Dir *d, uchar *buf, uint nbuf)
130 fb941e08 2005-09-13 devnull {
131 fb941e08 2005-09-13 devnull return convD2Mu(d, buf, nbuf, 0);
132 fb941e08 2005-09-13 devnull }