Blame


1 7285a491 2004-06-17 devnull #include <u.h>
2 7285a491 2004-06-17 devnull #include <libc.h>
3 7285a491 2004-06-17 devnull #include <bio.h>
4 7285a491 2004-06-17 devnull #include <libsec.h>
5 7285a491 2004-06-17 devnull
6 7285a491 2004-06-17 devnull #include "iso9660.h"
7 7285a491 2004-06-17 devnull
8 7285a491 2004-06-17 devnull static void
9 7285a491 2004-06-17 devnull writelittlebig4(uchar *buf, ulong x)
10 7285a491 2004-06-17 devnull {
11 7285a491 2004-06-17 devnull buf[0] = buf[7] = x;
12 7285a491 2004-06-17 devnull buf[1] = buf[6] = x>>8;
13 7285a491 2004-06-17 devnull buf[2] = buf[5] = x>>16;
14 7285a491 2004-06-17 devnull buf[3] = buf[4] = x>>24;
15 7285a491 2004-06-17 devnull }
16 7285a491 2004-06-17 devnull
17 7285a491 2004-06-17 devnull void
18 7285a491 2004-06-17 devnull rewritedot(Cdimg *cd, Direc *d)
19 7285a491 2004-06-17 devnull {
20 7285a491 2004-06-17 devnull uchar buf[Blocksize];
21 7285a491 2004-06-17 devnull Cdir *c;
22 7285a491 2004-06-17 devnull
23 7285a491 2004-06-17 devnull Creadblock(cd, buf, d->block, Blocksize);
24 7285a491 2004-06-17 devnull c = (Cdir*)buf;
25 7285a491 2004-06-17 devnull assert(c->len != 0);
26 7285a491 2004-06-17 devnull assert(c->namelen == 1 && c->name[0] == '\0'); /* dot */
27 7285a491 2004-06-17 devnull writelittlebig4(c->dloc, d->block);
28 7285a491 2004-06-17 devnull writelittlebig4(c->dlen, d->length);
29 7285a491 2004-06-17 devnull
30 7285a491 2004-06-17 devnull Cwseek(cd, d->block*Blocksize);
31 7285a491 2004-06-17 devnull Cwrite(cd, buf, Blocksize);
32 7285a491 2004-06-17 devnull }
33 7285a491 2004-06-17 devnull
34 7285a491 2004-06-17 devnull void
35 7285a491 2004-06-17 devnull rewritedotdot(Cdimg *cd, Direc *d, Direc *dparent)
36 7285a491 2004-06-17 devnull {
37 7285a491 2004-06-17 devnull uchar buf[Blocksize];
38 7285a491 2004-06-17 devnull Cdir *c;
39 7285a491 2004-06-17 devnull
40 7285a491 2004-06-17 devnull Creadblock(cd, buf, d->block, Blocksize);
41 7285a491 2004-06-17 devnull c = (Cdir*)buf;
42 7285a491 2004-06-17 devnull assert(c->len != 0);
43 7285a491 2004-06-17 devnull assert(c->namelen == 1 && c->name[0] == '\0'); /* dot */
44 7285a491 2004-06-17 devnull
45 7285a491 2004-06-17 devnull c = (Cdir*)(buf+c->len);
46 7285a491 2004-06-17 devnull assert(c->len != 0);
47 7285a491 2004-06-17 devnull assert(c->namelen == 1 && c->name[0] == '\001'); /* dotdot*/
48 7285a491 2004-06-17 devnull
49 7285a491 2004-06-17 devnull writelittlebig4(c->dloc, dparent->block);
50 7285a491 2004-06-17 devnull writelittlebig4(c->dlen, dparent->length);
51 7285a491 2004-06-17 devnull
52 7285a491 2004-06-17 devnull Cwseek(cd, d->block*Blocksize);
53 7285a491 2004-06-17 devnull Cwrite(cd, buf, Blocksize);
54 7285a491 2004-06-17 devnull }
55 7285a491 2004-06-17 devnull
56 7285a491 2004-06-17 devnull /*
57 7285a491 2004-06-17 devnull * Write each non-directory file. We copy the file to
58 7285a491 2004-06-17 devnull * the cd image, and then if it turns out that we've
59 7285a491 2004-06-17 devnull * seen this stream of bits before, we push the next block
60 7285a491 2004-06-17 devnull * pointer back. This ensures consistency between the MD5s
61 7285a491 2004-06-17 devnull * and the data on the CD image. MD5 summing on one pass
62 7285a491 2004-06-17 devnull * and copying on another would not ensure this.
63 7285a491 2004-06-17 devnull */
64 7285a491 2004-06-17 devnull void
65 7285a491 2004-06-17 devnull writefiles(Dump *d, Cdimg *cd, Direc *direc)
66 7285a491 2004-06-17 devnull {
67 7285a491 2004-06-17 devnull int i;
68 7285a491 2004-06-17 devnull uchar buf[8192], digest[MD5dlen];
69 7285a491 2004-06-17 devnull ulong length, n, start;
70 7285a491 2004-06-17 devnull Biobuf *b;
71 7285a491 2004-06-17 devnull DigestState *s;
72 7285a491 2004-06-17 devnull Dumpdir *dd;
73 7285a491 2004-06-17 devnull
74 7285a491 2004-06-17 devnull if(direc->mode & DMDIR) {
75 7285a491 2004-06-17 devnull for(i=0; i<direc->nchild; i++)
76 7285a491 2004-06-17 devnull writefiles(d, cd, &direc->child[i]);
77 7285a491 2004-06-17 devnull return;
78 7285a491 2004-06-17 devnull }
79 7285a491 2004-06-17 devnull
80 7285a491 2004-06-17 devnull assert(direc->block == 0);
81 7285a491 2004-06-17 devnull
82 7285a491 2004-06-17 devnull if((b = Bopen(direc->srcfile, OREAD)) == nil){
83 7285a491 2004-06-17 devnull fprint(2, "warning: cannot open '%s': %r\n", direc->srcfile);
84 7285a491 2004-06-17 devnull direc->block = 0;
85 7285a491 2004-06-17 devnull direc->length = 0;
86 7285a491 2004-06-17 devnull return;
87 7285a491 2004-06-17 devnull }
88 7285a491 2004-06-17 devnull
89 7285a491 2004-06-17 devnull start = cd->nextblock;
90 7285a491 2004-06-17 devnull assert(start != 0);
91 7285a491 2004-06-17 devnull
92 7285a491 2004-06-17 devnull Cwseek(cd, start*Blocksize);
93 7285a491 2004-06-17 devnull
94 7285a491 2004-06-17 devnull s = md5(nil, 0, nil, nil);
95 7285a491 2004-06-17 devnull length = 0;
96 7285a491 2004-06-17 devnull while((n = Bread(b, buf, sizeof buf)) > 0) {
97 7285a491 2004-06-17 devnull md5(buf, n, nil, s);
98 7285a491 2004-06-17 devnull Cwrite(cd, buf, n);
99 7285a491 2004-06-17 devnull length += n;
100 7285a491 2004-06-17 devnull }
101 7285a491 2004-06-17 devnull md5(nil, 0, digest, s);
102 7285a491 2004-06-17 devnull Bterm(b);
103 7285a491 2004-06-17 devnull Cpadblock(cd);
104 7285a491 2004-06-17 devnull
105 7285a491 2004-06-17 devnull if(length != direc->length) {
106 7285a491 2004-06-17 devnull fprint(2, "warning: %s changed size underfoot\n", direc->srcfile);
107 7285a491 2004-06-17 devnull direc->length = length;
108 7285a491 2004-06-17 devnull }
109 7285a491 2004-06-17 devnull
110 7285a491 2004-06-17 devnull if(length == 0)
111 7285a491 2004-06-17 devnull direc->block = 0;
112 7285a491 2004-06-17 devnull else if((dd = lookupmd5(d, digest))) {
113 7285a491 2004-06-17 devnull assert(dd->length == length);
114 7285a491 2004-06-17 devnull assert(dd->block != 0);
115 7285a491 2004-06-17 devnull direc->block = dd->block;
116 7285a491 2004-06-17 devnull cd->nextblock = start;
117 7285a491 2004-06-17 devnull } else {
118 7285a491 2004-06-17 devnull direc->block = start;
119 7285a491 2004-06-17 devnull if(chatty > 1)
120 7285a491 2004-06-17 devnull fprint(2, "lookup %.16H %lud (%s) failed\n", digest, length, direc->name);
121 7285a491 2004-06-17 devnull insertmd5(d, atom(direc->name), digest, start, length);
122 7285a491 2004-06-17 devnull }
123 7285a491 2004-06-17 devnull }
124 7285a491 2004-06-17 devnull
125 7285a491 2004-06-17 devnull /*
126 7285a491 2004-06-17 devnull * Write a directory tree. We work from the leaves,
127 7285a491 2004-06-17 devnull * and patch the dotdot pointers afterward.
128 7285a491 2004-06-17 devnull */
129 7285a491 2004-06-17 devnull static void
130 7285a491 2004-06-17 devnull _writedirs(Cdimg *cd, Direc *d, int (*put)(Cdimg*, Direc*, int, int, int), int level)
131 7285a491 2004-06-17 devnull {
132 7285a491 2004-06-17 devnull int i, l, ll;
133 7285a491 2004-06-17 devnull ulong start, next;
134 7285a491 2004-06-17 devnull
135 7285a491 2004-06-17 devnull if((d->mode & DMDIR) == 0)
136 7285a491 2004-06-17 devnull return;
137 7285a491 2004-06-17 devnull
138 7285a491 2004-06-17 devnull if(chatty)
139 7285a491 2004-06-17 devnull fprint(2, "%*s%s\n", 4*level, "", d->name);
140 7285a491 2004-06-17 devnull
141 7285a491 2004-06-17 devnull for(i=0; i<d->nchild; i++)
142 7285a491 2004-06-17 devnull _writedirs(cd, &d->child[i], put, level+1);
143 7285a491 2004-06-17 devnull
144 7285a491 2004-06-17 devnull l = 0;
145 7285a491 2004-06-17 devnull l += put(cd, d, (level == 0) ? DTrootdot : DTdot, 0, l);
146 7285a491 2004-06-17 devnull l += put(cd, nil, DTdotdot, 0, l);
147 7285a491 2004-06-17 devnull for(i=0; i<d->nchild; i++)
148 7285a491 2004-06-17 devnull l += put(cd, &d->child[i], DTiden, 0, l);
149 7285a491 2004-06-17 devnull
150 7285a491 2004-06-17 devnull start = cd->nextblock;
151 7285a491 2004-06-17 devnull cd->nextblock += (l+Blocksize-1)/Blocksize;
152 7285a491 2004-06-17 devnull next = cd->nextblock;
153 7285a491 2004-06-17 devnull
154 7285a491 2004-06-17 devnull Cwseek(cd, start*Blocksize);
155 7285a491 2004-06-17 devnull ll = 0;
156 7285a491 2004-06-17 devnull ll += put(cd, d, (level == 0) ? DTrootdot : DTdot, 1, ll);
157 7285a491 2004-06-17 devnull ll += put(cd, nil, DTdotdot, 1, ll);
158 7285a491 2004-06-17 devnull for(i=0; i<d->nchild; i++)
159 7285a491 2004-06-17 devnull ll += put(cd, &d->child[i], DTiden, 1, ll);
160 7285a491 2004-06-17 devnull assert(ll == l);
161 7285a491 2004-06-17 devnull Cpadblock(cd);
162 7285a491 2004-06-17 devnull assert(Cwoffset(cd) == next*Blocksize);
163 7285a491 2004-06-17 devnull
164 7285a491 2004-06-17 devnull d->block = start;
165 7285a491 2004-06-17 devnull d->length = (next - start) * Blocksize;
166 7285a491 2004-06-17 devnull rewritedot(cd, d);
167 7285a491 2004-06-17 devnull rewritedotdot(cd, d, d);
168 7285a491 2004-06-17 devnull
169 7285a491 2004-06-17 devnull for(i=0; i<d->nchild; i++)
170 7285a491 2004-06-17 devnull if(d->child[i].mode & DMDIR)
171 7285a491 2004-06-17 devnull rewritedotdot(cd, &d->child[i], d);
172 7285a491 2004-06-17 devnull }
173 7285a491 2004-06-17 devnull
174 7285a491 2004-06-17 devnull void
175 7285a491 2004-06-17 devnull writedirs(Cdimg *cd, Direc *d, int (*put)(Cdimg*, Direc*, int, int, int))
176 7285a491 2004-06-17 devnull {
177 7285a491 2004-06-17 devnull /*
178 7285a491 2004-06-17 devnull * If we're writing a mk9660 image, then the root really
179 7285a491 2004-06-17 devnull * is the root, so start at level 0. If we're writing a dump image,
180 7285a491 2004-06-17 devnull * then the "root" is really going to be two levels down once
181 7285a491 2004-06-17 devnull * we patch in the dump hierarchy above it, so start at level non-zero.
182 7285a491 2004-06-17 devnull */
183 7285a491 2004-06-17 devnull if(chatty)
184 7285a491 2004-06-17 devnull fprint(2, ">>> writedirs\n");
185 7285a491 2004-06-17 devnull _writedirs(cd, d, put, mk9660 ? 0 : 1);
186 7285a491 2004-06-17 devnull }
187 7285a491 2004-06-17 devnull
188 7285a491 2004-06-17 devnull
189 7285a491 2004-06-17 devnull /*
190 7285a491 2004-06-17 devnull * Write the dump tree. This is like writedirs but once we get to
191 7285a491 2004-06-17 devnull * the roots of the individual days we just patch the parent dotdot blocks.
192 7285a491 2004-06-17 devnull */
193 7285a491 2004-06-17 devnull static void
194 7285a491 2004-06-17 devnull _writedumpdirs(Cdimg *cd, Direc *d, int (*put)(Cdimg*, Direc*, int, int, int), int level)
195 7285a491 2004-06-17 devnull {
196 7285a491 2004-06-17 devnull int i;
197 7285a491 2004-06-17 devnull ulong start;
198 7285a491 2004-06-17 devnull
199 7285a491 2004-06-17 devnull switch(level) {
200 7285a491 2004-06-17 devnull case 0:
201 7285a491 2004-06-17 devnull /* write root, list of years, also conform.map */
202 7285a491 2004-06-17 devnull for(i=0; i<d->nchild; i++)
203 7285a491 2004-06-17 devnull if(d->child[i].mode & DMDIR)
204 7285a491 2004-06-17 devnull _writedumpdirs(cd, &d->child[i], put, level+1);
205 7285a491 2004-06-17 devnull chat("write dump root dir at %lud\n", cd->nextblock);
206 7285a491 2004-06-17 devnull goto Writedir;
207 7285a491 2004-06-17 devnull
208 7285a491 2004-06-17 devnull case 1: /* write year, list of days */
209 7285a491 2004-06-17 devnull for(i=0; i<d->nchild; i++)
210 7285a491 2004-06-17 devnull _writedumpdirs(cd, &d->child[i], put, level+1);
211 7285a491 2004-06-17 devnull chat("write dump %s dir at %lud\n", d->name, cd->nextblock);
212 7285a491 2004-06-17 devnull goto Writedir;
213 7285a491 2004-06-17 devnull
214 7285a491 2004-06-17 devnull Writedir:
215 7285a491 2004-06-17 devnull start = cd->nextblock;
216 7285a491 2004-06-17 devnull Cwseek(cd, start*Blocksize);
217 7285a491 2004-06-17 devnull
218 7285a491 2004-06-17 devnull put(cd, d, (level == 0) ? DTrootdot : DTdot, 1, Cwoffset(cd));
219 7285a491 2004-06-17 devnull put(cd, nil, DTdotdot, 1, Cwoffset(cd));
220 7285a491 2004-06-17 devnull for(i=0; i<d->nchild; i++)
221 7285a491 2004-06-17 devnull put(cd, &d->child[i], DTiden, 1, Cwoffset(cd));
222 7285a491 2004-06-17 devnull Cpadblock(cd);
223 7285a491 2004-06-17 devnull
224 7285a491 2004-06-17 devnull d->block = start;
225 7285a491 2004-06-17 devnull d->length = (cd->nextblock - start) * Blocksize;
226 7285a491 2004-06-17 devnull
227 7285a491 2004-06-17 devnull rewritedot(cd, d);
228 7285a491 2004-06-17 devnull rewritedotdot(cd, d, d);
229 7285a491 2004-06-17 devnull
230 7285a491 2004-06-17 devnull for(i=0; i<d->nchild; i++)
231 7285a491 2004-06-17 devnull if(d->child[i].mode & DMDIR)
232 7285a491 2004-06-17 devnull rewritedotdot(cd, &d->child[i], d);
233 7285a491 2004-06-17 devnull break;
234 7285a491 2004-06-17 devnull
235 7285a491 2004-06-17 devnull case 2: /* write day: already written, do nothing */
236 7285a491 2004-06-17 devnull break;
237 7285a491 2004-06-17 devnull
238 7285a491 2004-06-17 devnull default:
239 7285a491 2004-06-17 devnull assert(0);
240 7285a491 2004-06-17 devnull }
241 7285a491 2004-06-17 devnull }
242 7285a491 2004-06-17 devnull
243 7285a491 2004-06-17 devnull void
244 7285a491 2004-06-17 devnull writedumpdirs(Cdimg *cd, Direc *d, int (*put)(Cdimg*, Direc*, int, int, int))
245 7285a491 2004-06-17 devnull {
246 7285a491 2004-06-17 devnull _writedumpdirs(cd, d, put, 0);
247 7285a491 2004-06-17 devnull }
248 7285a491 2004-06-17 devnull
249 7285a491 2004-06-17 devnull static int
250 7285a491 2004-06-17 devnull Cputplan9(Cdimg *cd, Direc *d, int dot, int dowrite)
251 7285a491 2004-06-17 devnull {
252 7285a491 2004-06-17 devnull int l, n;
253 7285a491 2004-06-17 devnull
254 7285a491 2004-06-17 devnull if(dot != DTiden)
255 7285a491 2004-06-17 devnull return 0;
256 7285a491 2004-06-17 devnull
257 7285a491 2004-06-17 devnull l = 0;
258 7285a491 2004-06-17 devnull if(d->flags & Dbadname) {
259 7285a491 2004-06-17 devnull n = strlen(d->name);
260 7285a491 2004-06-17 devnull l += 1+n;
261 7285a491 2004-06-17 devnull if(dowrite) {
262 7285a491 2004-06-17 devnull Cputc(cd, n);
263 7285a491 2004-06-17 devnull Cputs(cd, d->name, n);
264 7285a491 2004-06-17 devnull }
265 7285a491 2004-06-17 devnull } else {
266 7285a491 2004-06-17 devnull l++;
267 7285a491 2004-06-17 devnull if(dowrite)
268 7285a491 2004-06-17 devnull Cputc(cd, 0);
269 7285a491 2004-06-17 devnull }
270 7285a491 2004-06-17 devnull
271 7285a491 2004-06-17 devnull n = strlen(d->uid);
272 7285a491 2004-06-17 devnull l += 1+n;
273 7285a491 2004-06-17 devnull if(dowrite) {
274 7285a491 2004-06-17 devnull Cputc(cd, n);
275 7285a491 2004-06-17 devnull Cputs(cd, d->uid, n);
276 7285a491 2004-06-17 devnull }
277 7285a491 2004-06-17 devnull
278 7285a491 2004-06-17 devnull n = strlen(d->gid);
279 7285a491 2004-06-17 devnull l += 1+n;
280 7285a491 2004-06-17 devnull if(dowrite) {
281 7285a491 2004-06-17 devnull Cputc(cd, n);
282 7285a491 2004-06-17 devnull Cputs(cd, d->gid, n);
283 7285a491 2004-06-17 devnull }
284 7285a491 2004-06-17 devnull
285 7285a491 2004-06-17 devnull if(l & 1) {
286 7285a491 2004-06-17 devnull l++;
287 7285a491 2004-06-17 devnull if(dowrite)
288 7285a491 2004-06-17 devnull Cputc(cd, 0);
289 7285a491 2004-06-17 devnull }
290 7285a491 2004-06-17 devnull l += 8;
291 7285a491 2004-06-17 devnull if(dowrite)
292 7285a491 2004-06-17 devnull Cputn(cd, d->mode, 4);
293 7285a491 2004-06-17 devnull
294 7285a491 2004-06-17 devnull return l;
295 7285a491 2004-06-17 devnull }
296 7285a491 2004-06-17 devnull
297 7285a491 2004-06-17 devnull /*
298 7285a491 2004-06-17 devnull * Write a directory entry.
299 7285a491 2004-06-17 devnull */
300 7285a491 2004-06-17 devnull static int
301 7285a491 2004-06-17 devnull genputdir(Cdimg *cd, Direc *d, int dot, int joliet, int dowrite, int offset)
302 7285a491 2004-06-17 devnull {
303 7285a491 2004-06-17 devnull int f, n, l, lp;
304 7285a491 2004-06-17 devnull long o;
305 7285a491 2004-06-17 devnull
306 7285a491 2004-06-17 devnull f = 0;
307 7285a491 2004-06-17 devnull if(dot != DTiden || (d->mode & DMDIR))
308 7285a491 2004-06-17 devnull f |= 2;
309 7285a491 2004-06-17 devnull
310 7285a491 2004-06-17 devnull n = 1;
311 7285a491 2004-06-17 devnull if(dot == DTiden) {
312 7285a491 2004-06-17 devnull if(joliet)
313 7285a491 2004-06-17 devnull n = 2*utflen(d->confname);
314 7285a491 2004-06-17 devnull else
315 7285a491 2004-06-17 devnull n = strlen(d->confname);
316 7285a491 2004-06-17 devnull }
317 7285a491 2004-06-17 devnull
318 7285a491 2004-06-17 devnull l = 33+n;
319 7285a491 2004-06-17 devnull if(l & 1)
320 7285a491 2004-06-17 devnull l++;
321 7285a491 2004-06-17 devnull assert(l <= 255);
322 7285a491 2004-06-17 devnull
323 7285a491 2004-06-17 devnull if(joliet == 0) {
324 7285a491 2004-06-17 devnull if(cd->flags & CDplan9)
325 7285a491 2004-06-17 devnull l += Cputplan9(cd, d, dot, 0);
326 7285a491 2004-06-17 devnull else if(cd->flags & CDrockridge)
327 7285a491 2004-06-17 devnull l += Cputsysuse(cd, d, dot, 0, l);
328 7285a491 2004-06-17 devnull assert(l <= 255);
329 7285a491 2004-06-17 devnull }
330 7285a491 2004-06-17 devnull
331 7285a491 2004-06-17 devnull if(dowrite == 0) {
332 7285a491 2004-06-17 devnull if(Blocksize - offset%Blocksize < l)
333 7285a491 2004-06-17 devnull l += Blocksize - offset%Blocksize;
334 7285a491 2004-06-17 devnull return l;
335 7285a491 2004-06-17 devnull }
336 7285a491 2004-06-17 devnull
337 7285a491 2004-06-17 devnull assert(offset%Blocksize == Cwoffset(cd)%Blocksize);
338 7285a491 2004-06-17 devnull
339 7285a491 2004-06-17 devnull o = Cwoffset(cd);
340 7285a491 2004-06-17 devnull lp = 0;
341 7285a491 2004-06-17 devnull if(Blocksize - Cwoffset(cd)%Blocksize < l) {
342 7285a491 2004-06-17 devnull lp = Blocksize - Cwoffset(cd)%Blocksize;
343 7285a491 2004-06-17 devnull Cpadblock(cd);
344 7285a491 2004-06-17 devnull }
345 7285a491 2004-06-17 devnull
346 7285a491 2004-06-17 devnull Cputc(cd, l); /* length of directory record */
347 7285a491 2004-06-17 devnull Cputc(cd, 0); /* extended attribute record length */
348 7285a491 2004-06-17 devnull if(d) {
349 7285a491 2004-06-17 devnull if((d->mode & DMDIR) == 0)
350 7285a491 2004-06-17 devnull assert(d->length == 0 || d->block >= 18);
351 7285a491 2004-06-17 devnull
352 7285a491 2004-06-17 devnull Cputn(cd, d->block, 4); /* location of extent */
353 7285a491 2004-06-17 devnull Cputn(cd, d->length, 4); /* data length */
354 7285a491 2004-06-17 devnull } else {
355 7285a491 2004-06-17 devnull Cputn(cd, 0, 4);
356 7285a491 2004-06-17 devnull Cputn(cd, 0, 4);
357 7285a491 2004-06-17 devnull }
358 7285a491 2004-06-17 devnull Cputdate(cd, d ? d->mtime : now); /* recorded date */
359 7285a491 2004-06-17 devnull Cputc(cd, f); /* file flags */
360 7285a491 2004-06-17 devnull Cputc(cd, 0); /* file unit size */
361 7285a491 2004-06-17 devnull Cputc(cd, 0); /* interleave gap size */
362 7285a491 2004-06-17 devnull Cputn(cd, 1, 2); /* volume sequence number */
363 7285a491 2004-06-17 devnull Cputc(cd, n); /* length of file identifier */
364 7285a491 2004-06-17 devnull
365 7285a491 2004-06-17 devnull if(dot == DTiden) { /* identifier */
366 7285a491 2004-06-17 devnull if(joliet)
367 7285a491 2004-06-17 devnull Cputrscvt(cd, d->confname, n);
368 7285a491 2004-06-17 devnull else
369 7285a491 2004-06-17 devnull Cputs(cd, d->confname, n);
370 7285a491 2004-06-17 devnull }else
371 7285a491 2004-06-17 devnull if(dot == DTdotdot)
372 7285a491 2004-06-17 devnull Cputc(cd, 1);
373 7285a491 2004-06-17 devnull else
374 7285a491 2004-06-17 devnull Cputc(cd, 0);
375 7285a491 2004-06-17 devnull
376 7285a491 2004-06-17 devnull if(Cwoffset(cd) & 1) /* pad */
377 7285a491 2004-06-17 devnull Cputc(cd, 0);
378 7285a491 2004-06-17 devnull
379 7285a491 2004-06-17 devnull if(joliet == 0) {
380 7285a491 2004-06-17 devnull if(cd->flags & CDplan9)
381 7285a491 2004-06-17 devnull Cputplan9(cd, d, dot, 1);
382 7285a491 2004-06-17 devnull else if(cd->flags & CDrockridge)
383 7285a491 2004-06-17 devnull Cputsysuse(cd, d, dot, 1, Cwoffset(cd)-(o+lp));
384 7285a491 2004-06-17 devnull }
385 7285a491 2004-06-17 devnull
386 7285a491 2004-06-17 devnull assert(o+lp+l == Cwoffset(cd));
387 7285a491 2004-06-17 devnull return lp+l;
388 7285a491 2004-06-17 devnull }
389 7285a491 2004-06-17 devnull
390 7285a491 2004-06-17 devnull int
391 7285a491 2004-06-17 devnull Cputisodir(Cdimg *cd, Direc *d, int dot, int dowrite, int offset)
392 7285a491 2004-06-17 devnull {
393 7285a491 2004-06-17 devnull return genputdir(cd, d, dot, 0, dowrite, offset);
394 7285a491 2004-06-17 devnull }
395 7285a491 2004-06-17 devnull
396 7285a491 2004-06-17 devnull int
397 7285a491 2004-06-17 devnull Cputjolietdir(Cdimg *cd, Direc *d, int dot, int dowrite, int offset)
398 7285a491 2004-06-17 devnull {
399 7285a491 2004-06-17 devnull return genputdir(cd, d, dot, 1, dowrite, offset);
400 7285a491 2004-06-17 devnull }
401 7285a491 2004-06-17 devnull
402 7285a491 2004-06-17 devnull void
403 7285a491 2004-06-17 devnull Cputendvd(Cdimg *cd)
404 7285a491 2004-06-17 devnull {
405 7285a491 2004-06-17 devnull Cputc(cd, 255); /* volume descriptor set terminator */
406 7285a491 2004-06-17 devnull Cputs(cd, "CD001", 5); /* standard identifier */
407 7285a491 2004-06-17 devnull Cputc(cd, 1); /* volume descriptor version */
408 7285a491 2004-06-17 devnull Cpadblock(cd);
409 7285a491 2004-06-17 devnull }