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 <disk.h>
5 7285a491 2004-06-17 devnull #include <libsec.h>
6 7285a491 2004-06-17 devnull #include "iso9660.h"
7 7285a491 2004-06-17 devnull
8 7285a491 2004-06-17 devnull ulong now;
9 7285a491 2004-06-17 devnull int chatty;
10 7285a491 2004-06-17 devnull int doabort;
11 7285a491 2004-06-17 devnull int docolon;
12 7285a491 2004-06-17 devnull int mk9660;
13 7285a491 2004-06-17 devnull Conform *map;
14 7285a491 2004-06-17 devnull
15 7285a491 2004-06-17 devnull static void addprotofile(char *new, char *old, Dir *d, void *a);
16 7285a491 2004-06-17 devnull void usage(void);
17 7285a491 2004-06-17 devnull
18 7285a491 2004-06-17 devnull char *argv0;
19 7285a491 2004-06-17 devnull
20 7285a491 2004-06-17 devnull void
21 7285a491 2004-06-17 devnull usage(void)
22 7285a491 2004-06-17 devnull {
23 7285a491 2004-06-17 devnull if(mk9660)
24 c8b6342d 2005-01-13 devnull fprint(2, "usage: mk9660 [-D:] [-9cjr] [-b bootfile] [-p proto] [-s src] cdimage\n");
25 7285a491 2004-06-17 devnull else
26 c8b6342d 2005-01-13 devnull fprint(2, "usage: dump9660 [-D:] [-9cjr] [-m maxsize] [-n now] [-p proto] [-s src] cdimage\n");
27 7285a491 2004-06-17 devnull exits("usage");
28 7285a491 2004-06-17 devnull }
29 7285a491 2004-06-17 devnull
30 7285a491 2004-06-17 devnull int
31 7285a491 2004-06-17 devnull main(int argc, char **argv)
32 7285a491 2004-06-17 devnull {
33 7285a491 2004-06-17 devnull int fix;
34 7285a491 2004-06-17 devnull char buf[256], *dumpname, *proto, *s, *src, *status;
35 7285a491 2004-06-17 devnull ulong block, length, newnull, cblock, clength, maxsize;
36 7285a491 2004-06-17 devnull Cdimg *cd;
37 7285a491 2004-06-17 devnull Cdinfo info;
38 7285a491 2004-06-17 devnull XDir dir;
39 7285a491 2004-06-17 devnull Direc *iconform, idumproot, iroot, *jconform, jdumproot, jroot, *r;
40 7285a491 2004-06-17 devnull Dump *dump;
41 7285a491 2004-06-17 devnull
42 7285a491 2004-06-17 devnull fix = 0;
43 7285a491 2004-06-17 devnull status = nil;
44 7285a491 2004-06-17 devnull memset(&info, 0, sizeof info);
45 c8b6342d 2005-01-13 devnull proto = unsharp("#9/proto/allproto");
46 7285a491 2004-06-17 devnull src = "./";
47 7285a491 2004-06-17 devnull
48 7285a491 2004-06-17 devnull info.volumename = atom("9CD");
49 7285a491 2004-06-17 devnull info.volumeset = atom("9VolumeSet");
50 7285a491 2004-06-17 devnull info.publisher = atom("9Publisher");
51 7285a491 2004-06-17 devnull info.preparer = atom("dump9660");
52 7285a491 2004-06-17 devnull info.application = atom("dump9660");
53 7285a491 2004-06-17 devnull info.flags = CDdump;
54 7285a491 2004-06-17 devnull maxsize = 0;
55 7285a491 2004-06-17 devnull mk9660 = 0;
56 7285a491 2004-06-17 devnull fmtinstall('H', encodefmt);
57 7285a491 2004-06-17 devnull
58 7285a491 2004-06-17 devnull ARGBEGIN{
59 7285a491 2004-06-17 devnull case 'D':
60 7285a491 2004-06-17 devnull chatty++;
61 7285a491 2004-06-17 devnull break;
62 7285a491 2004-06-17 devnull case 'M':
63 7285a491 2004-06-17 devnull mk9660 = 1;
64 7285a491 2004-06-17 devnull argv0 = "disk/mk9660";
65 7285a491 2004-06-17 devnull info.flags &= ~CDdump;
66 7285a491 2004-06-17 devnull break;
67 7285a491 2004-06-17 devnull case '9':
68 7285a491 2004-06-17 devnull info.flags |= CDplan9;
69 7285a491 2004-06-17 devnull break;
70 7285a491 2004-06-17 devnull case ':':
71 7285a491 2004-06-17 devnull docolon = 1;
72 7285a491 2004-06-17 devnull break;
73 7285a491 2004-06-17 devnull case 'a':
74 7285a491 2004-06-17 devnull doabort = 1;
75 7285a491 2004-06-17 devnull break;
76 7285a491 2004-06-17 devnull case 'b':
77 7285a491 2004-06-17 devnull if(!mk9660)
78 7285a491 2004-06-17 devnull usage();
79 7285a491 2004-06-17 devnull info.flags |= CDbootable;
80 7285a491 2004-06-17 devnull info.bootimage = EARGF(usage());
81 7285a491 2004-06-17 devnull break;
82 7285a491 2004-06-17 devnull case 'c':
83 7285a491 2004-06-17 devnull info.flags |= CDconform;
84 7285a491 2004-06-17 devnull break;
85 7285a491 2004-06-17 devnull case 'f':
86 7285a491 2004-06-17 devnull fix = 1;
87 7285a491 2004-06-17 devnull break;
88 7285a491 2004-06-17 devnull case 'j':
89 7285a491 2004-06-17 devnull info.flags |= CDjoliet;
90 7285a491 2004-06-17 devnull break;
91 7285a491 2004-06-17 devnull case 'n':
92 7285a491 2004-06-17 devnull now = atoi(EARGF(usage()));
93 7285a491 2004-06-17 devnull break;
94 7285a491 2004-06-17 devnull case 'm':
95 7285a491 2004-06-17 devnull maxsize = strtoul(EARGF(usage()), 0, 0);
96 7285a491 2004-06-17 devnull break;
97 7285a491 2004-06-17 devnull case 'p':
98 7285a491 2004-06-17 devnull proto = EARGF(usage());
99 7285a491 2004-06-17 devnull break;
100 7285a491 2004-06-17 devnull case 'r':
101 7285a491 2004-06-17 devnull info.flags |= CDrockridge;
102 7285a491 2004-06-17 devnull break;
103 7285a491 2004-06-17 devnull case 's':
104 7285a491 2004-06-17 devnull src = EARGF(usage());
105 7285a491 2004-06-17 devnull break;
106 7285a491 2004-06-17 devnull case 'v':
107 7285a491 2004-06-17 devnull info.volumename = atom(EARGF(usage()));
108 7285a491 2004-06-17 devnull break;
109 7285a491 2004-06-17 devnull default:
110 7285a491 2004-06-17 devnull usage();
111 7285a491 2004-06-17 devnull }ARGEND
112 7285a491 2004-06-17 devnull
113 7285a491 2004-06-17 devnull if(mk9660 && (fix || now || maxsize))
114 7285a491 2004-06-17 devnull usage();
115 7285a491 2004-06-17 devnull
116 7285a491 2004-06-17 devnull if(argc != 1)
117 7285a491 2004-06-17 devnull usage();
118 7285a491 2004-06-17 devnull
119 7285a491 2004-06-17 devnull if(now == 0)
120 7285a491 2004-06-17 devnull now = (ulong)time(0);
121 7285a491 2004-06-17 devnull if(mk9660){
122 7285a491 2004-06-17 devnull if((cd = createcd(argv[0], info)) == nil)
123 7285a491 2004-06-17 devnull sysfatal("cannot create '%s': %r", argv[0]);
124 7285a491 2004-06-17 devnull }else{
125 7285a491 2004-06-17 devnull if((cd = opencd(argv[0], info)) == nil)
126 7285a491 2004-06-17 devnull sysfatal("cannot open '%s': %r", argv[0]);
127 7285a491 2004-06-17 devnull if(!(cd->flags & CDdump))
128 7285a491 2004-06-17 devnull sysfatal("not a dump cd");
129 7285a491 2004-06-17 devnull }
130 7285a491 2004-06-17 devnull
131 7285a491 2004-06-17 devnull /* create ISO9660/Plan 9 tree in memory */
132 7285a491 2004-06-17 devnull memset(&dir, 0, sizeof dir);
133 7285a491 2004-06-17 devnull dir.name = atom("");
134 7285a491 2004-06-17 devnull dir.uid = atom("sys");
135 7285a491 2004-06-17 devnull dir.gid = atom("sys");
136 7285a491 2004-06-17 devnull dir.uidno = 0;
137 7285a491 2004-06-17 devnull dir.gidno = 0;
138 7285a491 2004-06-17 devnull dir.mode = DMDIR | 0755;
139 7285a491 2004-06-17 devnull dir.mtime = now;
140 7285a491 2004-06-17 devnull dir.atime = now;
141 7285a491 2004-06-17 devnull dir.ctime = now;
142 7285a491 2004-06-17 devnull
143 7285a491 2004-06-17 devnull mkdirec(&iroot, &dir);
144 7285a491 2004-06-17 devnull iroot.srcfile = src;
145 7285a491 2004-06-17 devnull
146 7285a491 2004-06-17 devnull /*
147 7285a491 2004-06-17 devnull * Read new files into memory
148 7285a491 2004-06-17 devnull */
149 a8763864 2004-07-09 devnull if(rdproto(proto, src, addprotofile, 0, &iroot) < 0)
150 7285a491 2004-06-17 devnull sysfatal("rdproto: %r");
151 7285a491 2004-06-17 devnull
152 7285a491 2004-06-17 devnull if(mk9660){
153 7285a491 2004-06-17 devnull dump = emalloc(sizeof *dump);
154 7285a491 2004-06-17 devnull dumpname = nil;
155 7285a491 2004-06-17 devnull }else{
156 7285a491 2004-06-17 devnull /*
157 7285a491 2004-06-17 devnull * Read current dump tree and _conform.map.
158 7285a491 2004-06-17 devnull */
159 7285a491 2004-06-17 devnull idumproot = readdumpdirs(cd, &dir, isostring);
160 7285a491 2004-06-17 devnull readdumpconform(cd);
161 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet)
162 7285a491 2004-06-17 devnull jdumproot = readdumpdirs(cd, &dir, jolietstring);
163 7285a491 2004-06-17 devnull
164 7285a491 2004-06-17 devnull if(fix){
165 7285a491 2004-06-17 devnull dumpname = nil;
166 7285a491 2004-06-17 devnull cd->nextblock = cd->nulldump+1;
167 7285a491 2004-06-17 devnull cd->nulldump = 0;
168 7285a491 2004-06-17 devnull Cwseek(cd, cd->nextblock*Blocksize);
169 7285a491 2004-06-17 devnull goto Dofix;
170 7285a491 2004-06-17 devnull }
171 fa325e9b 2020-01-10 cross
172 7285a491 2004-06-17 devnull dumpname = adddumpdir(&idumproot, now, &dir);
173 7285a491 2004-06-17 devnull /* note that we assume all names are conforming and thus sorted */
174 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet) {
175 7285a491 2004-06-17 devnull s = adddumpdir(&jdumproot, now, &dir);
176 7285a491 2004-06-17 devnull if(s != dumpname)
177 7285a491 2004-06-17 devnull sysfatal("dumpnames don't match %s %s\n", dumpname, s);
178 7285a491 2004-06-17 devnull }
179 7285a491 2004-06-17 devnull dump = dumpcd(cd, &idumproot);
180 7285a491 2004-06-17 devnull cd->nextblock = cd->nulldump+1;
181 7285a491 2004-06-17 devnull }
182 7285a491 2004-06-17 devnull
183 7285a491 2004-06-17 devnull /*
184 7285a491 2004-06-17 devnull * Write new files, starting where the dump tree was.
185 7285a491 2004-06-17 devnull * Must be done before creation of the Joliet tree so that
186 7285a491 2004-06-17 devnull * blocks and lengths are correct.
187 7285a491 2004-06-17 devnull */
188 7285a491 2004-06-17 devnull Cwseek(cd, cd->nextblock*Blocksize);
189 7285a491 2004-06-17 devnull writefiles(dump, cd, &iroot);
190 7285a491 2004-06-17 devnull
191 7285a491 2004-06-17 devnull if(cd->bootimage){
192 7285a491 2004-06-17 devnull findbootimage(cd, &iroot);
193 7285a491 2004-06-17 devnull Cupdatebootcat(cd);
194 7285a491 2004-06-17 devnull }
195 fa325e9b 2020-01-10 cross
196 7285a491 2004-06-17 devnull /* create Joliet tree */
197 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet)
198 7285a491 2004-06-17 devnull copydirec(&jroot, &iroot);
199 7285a491 2004-06-17 devnull
200 7285a491 2004-06-17 devnull if(info.flags & CDconform) {
201 7285a491 2004-06-17 devnull checknames(&iroot, isbadiso9660);
202 7285a491 2004-06-17 devnull convertnames(&iroot, struprcpy);
203 7285a491 2004-06-17 devnull } else
204 5241ed2b 2004-07-03 devnull convertnames(&iroot, (char* (*)(char*, char*))strcpy);
205 7285a491 2004-06-17 devnull
206 cbeb0b26 2006-04-01 devnull /* isoabstract = findconform(&iroot, abstract); */
207 cbeb0b26 2006-04-01 devnull /* isobiblio = findconform(&iroot, biblio); */
208 cbeb0b26 2006-04-01 devnull /* isonotice = findconform(&iroot, notice); */
209 7285a491 2004-06-17 devnull
210 7285a491 2004-06-17 devnull dsort(&iroot, isocmp);
211 7285a491 2004-06-17 devnull
212 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet) {
213 cbeb0b26 2006-04-01 devnull /* jabstract = findconform(&jroot, abstract); */
214 cbeb0b26 2006-04-01 devnull /* jbiblio = findconform(&jroot, biblio); */
215 cbeb0b26 2006-04-01 devnull /* jnotice = findconform(&jroot, notice); */
216 7285a491 2004-06-17 devnull
217 7285a491 2004-06-17 devnull checknames(&jroot, isbadjoliet);
218 5241ed2b 2004-07-03 devnull convertnames(&jroot, (char* (*)(char*, char*))strcpy);
219 7285a491 2004-06-17 devnull dsort(&jroot, jolietcmp);
220 7285a491 2004-06-17 devnull }
221 7285a491 2004-06-17 devnull
222 7285a491 2004-06-17 devnull /*
223 7285a491 2004-06-17 devnull * Write directories.
224 7285a491 2004-06-17 devnull */
225 7285a491 2004-06-17 devnull writedirs(cd, &iroot, Cputisodir);
226 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet)
227 7285a491 2004-06-17 devnull writedirs(cd, &jroot, Cputjolietdir);
228 7285a491 2004-06-17 devnull
229 7285a491 2004-06-17 devnull if(mk9660){
230 7285a491 2004-06-17 devnull cblock = 0;
231 7285a491 2004-06-17 devnull clength = 0;
232 7285a491 2004-06-17 devnull newnull = 0;
233 7285a491 2004-06-17 devnull }else{
234 7285a491 2004-06-17 devnull /*
235 7285a491 2004-06-17 devnull * Write incremental _conform.map block.
236 7285a491 2004-06-17 devnull */
237 7285a491 2004-06-17 devnull wrconform(cd, cd->nconform, &cblock, &clength);
238 fa325e9b 2020-01-10 cross
239 7285a491 2004-06-17 devnull /* jump here if we're just fixing up the cd */
240 7285a491 2004-06-17 devnull Dofix:
241 7285a491 2004-06-17 devnull /*
242 fa325e9b 2020-01-10 cross * Write null dump header block; everything after this will be
243 7285a491 2004-06-17 devnull * overwritten at the next dump. Because of this, it needs to be
244 7285a491 2004-06-17 devnull * reconstructable. We reconstruct the _conform.map and dump trees
245 fa325e9b 2020-01-10 cross * from the header blocks in dump.c, and we reconstruct the path
246 7285a491 2004-06-17 devnull * tables by walking the cd.
247 7285a491 2004-06-17 devnull */
248 7285a491 2004-06-17 devnull newnull = Cputdumpblock(cd);
249 7285a491 2004-06-17 devnull }
250 7285a491 2004-06-17 devnull
251 7285a491 2004-06-17 devnull /*
252 7285a491 2004-06-17 devnull * Write _conform.map.
253 7285a491 2004-06-17 devnull */
254 7285a491 2004-06-17 devnull dir.mode = 0444;
255 7285a491 2004-06-17 devnull if(cd->flags & (CDconform|CDjoliet)) {
256 7285a491 2004-06-17 devnull if(!mk9660 && cd->nconform == 0){
257 fa325e9b 2020-01-10 cross block = cblock;
258 7285a491 2004-06-17 devnull length = clength;
259 7285a491 2004-06-17 devnull }else
260 7285a491 2004-06-17 devnull wrconform(cd, 0, &block, &length);
261 7285a491 2004-06-17 devnull
262 fa325e9b 2020-01-10 cross if(mk9660)
263 7285a491 2004-06-17 devnull {
264 7285a491 2004-06-17 devnull idumproot = iroot;
265 7285a491 2004-06-17 devnull jdumproot = jroot;
266 7285a491 2004-06-17 devnull }
267 7285a491 2004-06-17 devnull if(length) {
268 7285a491 2004-06-17 devnull /* The ISO9660 name will get turned into uppercase when written. */
269 7285a491 2004-06-17 devnull if((iconform = walkdirec(&idumproot, "_conform.map")) == nil)
270 7285a491 2004-06-17 devnull iconform = adddirec(&idumproot, "_conform.map", &dir);
271 7285a491 2004-06-17 devnull jconform = nil;
272 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet) {
273 7285a491 2004-06-17 devnull if((jconform = walkdirec(&jdumproot, "_conform.map")) == nil)
274 7285a491 2004-06-17 devnull jconform = adddirec(&jdumproot, "_conform.map", &dir);
275 7285a491 2004-06-17 devnull }
276 7285a491 2004-06-17 devnull iconform->block = block;
277 7285a491 2004-06-17 devnull iconform->length = length;
278 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet) {
279 7285a491 2004-06-17 devnull jconform->block = block;
280 7285a491 2004-06-17 devnull jconform->length = length;
281 7285a491 2004-06-17 devnull }
282 7285a491 2004-06-17 devnull }
283 7285a491 2004-06-17 devnull if(mk9660) {
284 7285a491 2004-06-17 devnull iroot = idumproot;
285 7285a491 2004-06-17 devnull jroot = jdumproot;
286 7285a491 2004-06-17 devnull }
287 7285a491 2004-06-17 devnull }
288 7285a491 2004-06-17 devnull
289 7285a491 2004-06-17 devnull if(mk9660){
290 7285a491 2004-06-17 devnull /*
291 7285a491 2004-06-17 devnull * Patch in root directories.
292 7285a491 2004-06-17 devnull */
293 7285a491 2004-06-17 devnull setroot(cd, cd->iso9660pvd, iroot.block, iroot.length);
294 7285a491 2004-06-17 devnull setvolsize(cd, cd->iso9660pvd, cd->nextblock*Blocksize);
295 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet){
296 7285a491 2004-06-17 devnull setroot(cd, cd->jolietsvd, jroot.block, jroot.length);
297 7285a491 2004-06-17 devnull setvolsize(cd, cd->jolietsvd, cd->nextblock*Blocksize);
298 7285a491 2004-06-17 devnull }
299 7285a491 2004-06-17 devnull }else{
300 7285a491 2004-06-17 devnull /*
301 7285a491 2004-06-17 devnull * Write dump tree at end. We assume the name characters
302 7285a491 2004-06-17 devnull * are all conforming, so everything is already sorted properly.
303 7285a491 2004-06-17 devnull */
304 5241ed2b 2004-07-03 devnull convertnames(&idumproot, (info.flags & CDconform) ? struprcpy : (char* (*)(char*, char*)) strcpy);
305 7285a491 2004-06-17 devnull if(cd->nulldump) {
306 7285a491 2004-06-17 devnull r = walkdirec(&idumproot, dumpname);
307 7285a491 2004-06-17 devnull assert(r != nil);
308 7285a491 2004-06-17 devnull copybutname(r, &iroot);
309 7285a491 2004-06-17 devnull }
310 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet) {
311 5241ed2b 2004-07-03 devnull convertnames(&jdumproot, (char* (*)(char*, char*))strcpy);
312 7285a491 2004-06-17 devnull if(cd->nulldump) {
313 7285a491 2004-06-17 devnull r = walkdirec(&jdumproot, dumpname);
314 7285a491 2004-06-17 devnull assert(r != nil);
315 7285a491 2004-06-17 devnull copybutname(r, &jroot);
316 7285a491 2004-06-17 devnull }
317 7285a491 2004-06-17 devnull }
318 fa325e9b 2020-01-10 cross
319 7285a491 2004-06-17 devnull writedumpdirs(cd, &idumproot, Cputisodir);
320 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet)
321 7285a491 2004-06-17 devnull writedumpdirs(cd, &jdumproot, Cputjolietdir);
322 fa325e9b 2020-01-10 cross
323 7285a491 2004-06-17 devnull /*
324 7285a491 2004-06-17 devnull * Patch in new root directory entry.
325 7285a491 2004-06-17 devnull */
326 7285a491 2004-06-17 devnull setroot(cd, cd->iso9660pvd, idumproot.block, idumproot.length);
327 7285a491 2004-06-17 devnull setvolsize(cd, cd->iso9660pvd, cd->nextblock*Blocksize);
328 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet){
329 7285a491 2004-06-17 devnull setroot(cd, cd->jolietsvd, jdumproot.block, jdumproot.length);
330 7285a491 2004-06-17 devnull setvolsize(cd, cd->jolietsvd, cd->nextblock*Blocksize);
331 7285a491 2004-06-17 devnull }
332 7285a491 2004-06-17 devnull }
333 fa325e9b 2020-01-10 cross writepathtables(cd);
334 7285a491 2004-06-17 devnull
335 7285a491 2004-06-17 devnull if(!mk9660){
336 7285a491 2004-06-17 devnull /*
337 7285a491 2004-06-17 devnull * If we've gotten too big, truncate back to what we started with,
338 7285a491 2004-06-17 devnull * fix up the cd, and exit with a non-zero status.
339 7285a491 2004-06-17 devnull */
340 7285a491 2004-06-17 devnull Cwflush(cd);
341 7285a491 2004-06-17 devnull if(cd->nulldump && maxsize && Cwoffset(cd) > maxsize){
342 7285a491 2004-06-17 devnull fprint(2, "too big; writing old tree back\n");
343 7285a491 2004-06-17 devnull status = "cd too big; aborted";
344 fa325e9b 2020-01-10 cross
345 7285a491 2004-06-17 devnull rmdumpdir(&idumproot, dumpname);
346 7285a491 2004-06-17 devnull rmdumpdir(&jdumproot, dumpname);
347 fa325e9b 2020-01-10 cross
348 7285a491 2004-06-17 devnull cd->nextblock = cd->nulldump+1;
349 7285a491 2004-06-17 devnull cd->nulldump = 0;
350 7285a491 2004-06-17 devnull Cwseek(cd, cd->nextblock*Blocksize);
351 7285a491 2004-06-17 devnull goto Dofix;
352 7285a491 2004-06-17 devnull }
353 fa325e9b 2020-01-10 cross
354 7285a491 2004-06-17 devnull /*
355 7285a491 2004-06-17 devnull * Write old null header block; this commits all our changes.
356 7285a491 2004-06-17 devnull */
357 7285a491 2004-06-17 devnull if(cd->nulldump){
358 7285a491 2004-06-17 devnull Cwseek(cd, cd->nulldump*Blocksize);
359 7285a491 2004-06-17 devnull sprint(buf, "plan 9 dump cd\n");
360 7285a491 2004-06-17 devnull sprint(buf+strlen(buf), "%s %lud %lud %lud %lud %lud %lud",
361 7285a491 2004-06-17 devnull dumpname, now, newnull, cblock, clength, iroot.block,
362 7285a491 2004-06-17 devnull iroot.length);
363 7285a491 2004-06-17 devnull if(cd->flags & CDjoliet)
364 7285a491 2004-06-17 devnull sprint(buf+strlen(buf), " %lud %lud",
365 7285a491 2004-06-17 devnull jroot.block, jroot.length);
366 7285a491 2004-06-17 devnull strcat(buf, "\n");
367 7285a491 2004-06-17 devnull Cwrite(cd, buf, strlen(buf));
368 7285a491 2004-06-17 devnull Cpadblock(cd);
369 7285a491 2004-06-17 devnull Cwflush(cd);
370 7285a491 2004-06-17 devnull }
371 7285a491 2004-06-17 devnull }
372 7285a491 2004-06-17 devnull fdtruncate(cd->fd, cd->nextblock*Blocksize);
373 7285a491 2004-06-17 devnull exits(status);
374 7285a491 2004-06-17 devnull return 0;
375 7285a491 2004-06-17 devnull }
376 7285a491 2004-06-17 devnull
377 7285a491 2004-06-17 devnull static void
378 7285a491 2004-06-17 devnull addprotofile(char *new, char *old, Dir *d, void *a)
379 7285a491 2004-06-17 devnull {
380 7285a491 2004-06-17 devnull char *name, *p;
381 7285a491 2004-06-17 devnull Direc *direc;
382 7285a491 2004-06-17 devnull XDir xd;
383 7285a491 2004-06-17 devnull
384 7285a491 2004-06-17 devnull dirtoxdir(&xd, d);
385 7285a491 2004-06-17 devnull name = nil;
386 7285a491 2004-06-17 devnull if(docolon && strchr(new, ':')) {
387 7285a491 2004-06-17 devnull name = emalloc(strlen(new)+1);
388 7285a491 2004-06-17 devnull strcpy(name, new);
389 7285a491 2004-06-17 devnull while((p=strchr(name, ':')))
390 7285a491 2004-06-17 devnull *p=' ';
391 7285a491 2004-06-17 devnull new = name;
392 7285a491 2004-06-17 devnull }
393 7285a491 2004-06-17 devnull if((direc = adddirec((Direc*)a, new, &xd))) {
394 7285a491 2004-06-17 devnull direc->srcfile = atom(old);
395 7285a491 2004-06-17 devnull
396 cbeb0b26 2006-04-01 devnull /* BUG: abstract, biblio, notice */
397 7285a491 2004-06-17 devnull }
398 7285a491 2004-06-17 devnull if(name)
399 7285a491 2004-06-17 devnull free(name);
400 7285a491 2004-06-17 devnull
401 7285a491 2004-06-17 devnull }