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