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 char*
9 7285a491 2004-06-17 devnull jolietstring(uchar *buf, int len)
10 7285a491 2004-06-17 devnull {
11 7285a491 2004-06-17 devnull char *p, *q;
12 7285a491 2004-06-17 devnull int i;
13 7285a491 2004-06-17 devnull Rune *rp;
14 7285a491 2004-06-17 devnull
15 7285a491 2004-06-17 devnull rp = emalloc(sizeof(Rune)*(len/2+1));
16 7285a491 2004-06-17 devnull p = emalloc(UTFmax*(len/2+1));
17 7285a491 2004-06-17 devnull
18 7285a491 2004-06-17 devnull for(i=0; i<len/2; i++)
19 7285a491 2004-06-17 devnull rp[i] = (buf[2*i]<<8) | buf[2*i+1];
20 7285a491 2004-06-17 devnull rp[i] = (Rune)'\0';
21 7285a491 2004-06-17 devnull
22 7285a491 2004-06-17 devnull snprint(p, UTFmax*(len/2+1), "%S", rp);
23 7285a491 2004-06-17 devnull q = atom(p);
24 7285a491 2004-06-17 devnull free(p);
25 7285a491 2004-06-17 devnull return q;
26 7285a491 2004-06-17 devnull }
27 7285a491 2004-06-17 devnull
28 7285a491 2004-06-17 devnull /*
29 7285a491 2004-06-17 devnull * Joliet name validity check
30 7285a491 2004-06-17 devnull *
31 7285a491 2004-06-17 devnull * Joliet names have length at most 128 bytes (64 runes),
32 7285a491 2004-06-17 devnull * and cannot contain '*', '/', ':', ';', '?', or '\'.
33 7285a491 2004-06-17 devnull */
34 7285a491 2004-06-17 devnull int
35 7285a491 2004-06-17 devnull isjolietfrog(Rune r)
36 7285a491 2004-06-17 devnull {
37 bb0266fe 2005-05-07 devnull return r=='*' || r=='/' || r==':'
38 7285a491 2004-06-17 devnull || r==';' || r=='?' || r=='\\';
39 7285a491 2004-06-17 devnull }
40 7285a491 2004-06-17 devnull
41 7285a491 2004-06-17 devnull int
42 7285a491 2004-06-17 devnull isbadjoliet(char *s)
43 7285a491 2004-06-17 devnull {
44 7285a491 2004-06-17 devnull Rune r[256], *p;
45 7285a491 2004-06-17 devnull
46 7285a491 2004-06-17 devnull if(utflen(s) > 64)
47 7285a491 2004-06-17 devnull return 1;
48 7285a491 2004-06-17 devnull strtorune(r, s);
49 7285a491 2004-06-17 devnull for(p=r; *p; p++)
50 7285a491 2004-06-17 devnull if(isjolietfrog(*p))
51 7285a491 2004-06-17 devnull return 1;
52 7285a491 2004-06-17 devnull return 0;
53 7285a491 2004-06-17 devnull }
54 7285a491 2004-06-17 devnull
55 7285a491 2004-06-17 devnull /*
56 7285a491 2004-06-17 devnull * Joliet name comparison
57 7285a491 2004-06-17 devnull *
58 7285a491 2004-06-17 devnull * The standard algorithm is the ISO9660 algorithm but
59 7285a491 2004-06-17 devnull * on the encoded Runes. Runes are encoded in big endian
60 7285a491 2004-06-17 devnull * format, so we can just use runecmp.
61 7285a491 2004-06-17 devnull *
62 7285a491 2004-06-17 devnull * Padding is with zeros, but that still doesn't affect us.
63 7285a491 2004-06-17 devnull */
64 7285a491 2004-06-17 devnull
65 7285a491 2004-06-17 devnull static Rune emptystring[] = { (Rune)0 };
66 7285a491 2004-06-17 devnull int
67 7285a491 2004-06-17 devnull jolietcmp(const void *va, const void *vb)
68 7285a491 2004-06-17 devnull {
69 7285a491 2004-06-17 devnull int i;
70 7285a491 2004-06-17 devnull Rune s1[256], s2[256], *b1, *b2, *e1, *e2; /*BUG*/
71 7285a491 2004-06-17 devnull const Direc *a, *b;
72 7285a491 2004-06-17 devnull
73 7285a491 2004-06-17 devnull a = va;
74 7285a491 2004-06-17 devnull b = vb;
75 7285a491 2004-06-17 devnull
76 7285a491 2004-06-17 devnull b1 = strtorune(s1, a->confname);
77 7285a491 2004-06-17 devnull b2 = strtorune(s2, b->confname);
78 7285a491 2004-06-17 devnull if((e1 = runechr(b1, (Rune)'.')) != nil)
79 7285a491 2004-06-17 devnull *e1++ = '\0';
80 7285a491 2004-06-17 devnull else
81 7285a491 2004-06-17 devnull e1 = emptystring;
82 7285a491 2004-06-17 devnull
83 7285a491 2004-06-17 devnull if((e2 = runechr(b2, (Rune)'.')) != nil)
84 7285a491 2004-06-17 devnull *e2++ = '\0';
85 7285a491 2004-06-17 devnull else
86 7285a491 2004-06-17 devnull e2 = emptystring;
87 7285a491 2004-06-17 devnull
88 7285a491 2004-06-17 devnull if((i = runecmp(b1, b2)) != 0)
89 7285a491 2004-06-17 devnull return i;
90 7285a491 2004-06-17 devnull
91 7285a491 2004-06-17 devnull return runecmp(e1, e2);
92 7285a491 2004-06-17 devnull }
93 7285a491 2004-06-17 devnull
94 7285a491 2004-06-17 devnull /*
95 7285a491 2004-06-17 devnull * Write a Joliet secondary volume descriptor.
96 7285a491 2004-06-17 devnull */
97 7285a491 2004-06-17 devnull void
98 7285a491 2004-06-17 devnull Cputjolietsvd(Cdimg *cd, Cdinfo info)
99 7285a491 2004-06-17 devnull {
100 7285a491 2004-06-17 devnull Cputc(cd, 2); /* secondary volume descriptor */
101 7285a491 2004-06-17 devnull Cputs(cd, "CD001", 5); /* standard identifier */
102 7285a491 2004-06-17 devnull Cputc(cd, 1); /* volume descriptor version */
103 7285a491 2004-06-17 devnull Cputc(cd, 0); /* unused */
104 7285a491 2004-06-17 devnull
105 7285a491 2004-06-17 devnull Cputrscvt(cd, "Joliet Plan 9", 32); /* system identifier */
106 7285a491 2004-06-17 devnull Cputrscvt(cd, info.volumename, 32); /* volume identifier */
107 7285a491 2004-06-17 devnull
108 7285a491 2004-06-17 devnull Crepeat(cd, 0, 8); /* unused */
109 7285a491 2004-06-17 devnull Cputn(cd, 0, 4); /* volume space size */
110 7285a491 2004-06-17 devnull Cputc(cd, 0x25); /* escape sequences: UCS-2 Level 2 */
111 7285a491 2004-06-17 devnull Cputc(cd, 0x2F);
112 7285a491 2004-06-17 devnull Cputc(cd, 0x43);
113 7285a491 2004-06-17 devnull
114 7285a491 2004-06-17 devnull Crepeat(cd, 0, 29);
115 7285a491 2004-06-17 devnull Cputn(cd, 1, 2); /* volume set size */
116 7285a491 2004-06-17 devnull Cputn(cd, 1, 2); /* volume sequence number */
117 7285a491 2004-06-17 devnull Cputn(cd, Blocksize, 2); /* logical block size */
118 7285a491 2004-06-17 devnull Cputn(cd, 0, 4); /* path table size */
119 7285a491 2004-06-17 devnull Cputnl(cd, 0, 4); /* location of Lpath */
120 7285a491 2004-06-17 devnull Cputnl(cd, 0, 4); /* location of optional Lpath */
121 7285a491 2004-06-17 devnull Cputnm(cd, 0, 4); /* location of Mpath */
122 7285a491 2004-06-17 devnull Cputnm(cd, 0, 4); /* location of optional Mpath */
123 7285a491 2004-06-17 devnull Cputjolietdir(cd, nil, DTroot, 1, Cwoffset(cd)); /* root directory */
124 7285a491 2004-06-17 devnull Cputrscvt(cd, info.volumeset, 128); /* volume set identifier */
125 7285a491 2004-06-17 devnull Cputrscvt(cd, info.publisher, 128); /* publisher identifier */
126 7285a491 2004-06-17 devnull Cputrscvt(cd, info.preparer, 128); /* data preparer identifier */
127 7285a491 2004-06-17 devnull Cputrscvt(cd, info.application, 128); /* application identifier */
128 7285a491 2004-06-17 devnull Cputrscvt(cd, "", 37); /* copyright notice */
129 7285a491 2004-06-17 devnull Cputrscvt(cd, "", 37); /* abstract */
130 7285a491 2004-06-17 devnull Cputrscvt(cd, "", 37); /* bibliographic file */
131 7285a491 2004-06-17 devnull Cputdate1(cd, now); /* volume creation date */
132 7285a491 2004-06-17 devnull Cputdate1(cd, now); /* volume modification date */
133 7285a491 2004-06-17 devnull Cputdate1(cd, 0); /* volume expiration date */
134 7285a491 2004-06-17 devnull Cputdate1(cd, 0); /* volume effective date */
135 7285a491 2004-06-17 devnull Cputc(cd, 1); /* file structure version */
136 7285a491 2004-06-17 devnull Cpadblock(cd);
137 7285a491 2004-06-17 devnull }
138 7285a491 2004-06-17 devnull