rev |
line source |
pascal@19515
|
1 #include "crtl.h"
|
pascal@24019
|
2 #include "common.h"
|
pascal@19515
|
3 #include "iso9660.h"
|
pascal@19515
|
4
|
pascal@24019
|
5 #ifdef ISO9660
|
pascal@23996
|
6 #define setdirpage(to,sec) ((to) = *(int*)&(sec)<<(SECTORBITS-8))
|
pascal@23996
|
7 #define cpytodirpage(to,from) ((to) = *(int*)((char*)&(from)+1))
|
pascal@23996
|
8 #define cpyfromdirpage(to,from) (*(int*)((char*)&(to)+1) = (from))
|
pascal@20747
|
9
|
pascal@23984
|
10 #define isoroot() \
|
pascal@23984
|
11 { \
|
pascal@23996
|
12 extern void isoreadrootsector(void); \
|
pascal@23996
|
13 isoreadrootsector(); \
|
pascal@24022
|
14 setdirpage(x->dirpage, (* (unsigned long *) (buf2k + 0x9E))); \
|
pascal@24022
|
15 x->dirsize = filesize2dirsize(* (unsigned long *) (buf2k + 0xA6)); \
|
pascal@23984
|
16 }
|
pascal@19515
|
17
|
pascal@24034
|
18 #if !defined(BASIC_ISO9660) && defined(CLEAN_ISO9660)
|
pascal@24022
|
19 #define BASIC_ISO9660
|
pascal@24022
|
20 #endif
|
pascal@24019
|
21 #if !defined(BASIC_ISO9660) && !defined(ROCKRIDGE)
|
pascal@24020
|
22 #define BASIC_ISO9660
|
pascal@24019
|
23 #endif
|
pascal@23996
|
24 static int isoreaddir(void)
|
pascal@19515
|
25 {
|
pascal@19636
|
26 char *p;
|
pascal@23870
|
27
|
pascal@19571
|
28 struct isostate *x=&isostate;
|
pascal@19515
|
29
|
pascal@24022
|
30 p = buf2k;
|
pascal@23999
|
31 if (x->curpos >= SECTORSZ || * (short *) (p + x->curpos) == 0) {
|
pascal@24022
|
32 x->curpos = 0;
|
pascal@23996
|
33 if ((x->curdirsize =- DIRSECTORSZ) < 0) return -1;
|
pascal@23996
|
34 isoreadsector(&x->curdirofs); // x->filepos = 0
|
pascal@20453
|
35 //x->curdirofs += SECTORSZ;
|
pascal@20453
|
36 *(int *)((char *) &x->curdirofs+1) += SECTORSZ/256;
|
pascal@19515
|
37 }
|
pascal@23999
|
38 p += x->curpos;
|
pascal@23996
|
39 x->fileofs = (* (unsigned long *) (p + 2)) << SECTORBITS;
|
pascal@21735
|
40 if ((x->entrysize = * (short *) p) == 0) {
|
pascal@19515
|
41 return -1;
|
pascal@20538
|
42 }
|
pascal@24022
|
43 #ifdef CHECKISOFILETYPE
|
pascal@24022
|
44 x->c = p[25];
|
pascal@24022
|
45 #endif
|
pascal@24020
|
46 register char *s;
|
pascal@19636
|
47 x->filesize = * (unsigned long *) (p + 10);
|
pascal@24020
|
48 s = ".."+1-p[33];
|
pascal@24020
|
49 #ifdef ROCKRIDGE
|
pascal@24022
|
50 p = buf2k + 34 + ((p[32] + x->curpos) & -2);
|
pascal@23871
|
51 x->curpos += x->entrysize;
|
pascal@19515
|
52 do {
|
pascal@23870
|
53 register len = p[2];
|
pascal@20751
|
54 if (* (short *) p == 0x4D4E) {
|
pascal@24020
|
55 s = p + 5;
|
pascal@23870
|
56 p[len] = 0;
|
pascal@23870
|
57 goto found;
|
pascal@19515
|
58 }
|
pascal@19636
|
59 p += len;
|
pascal@24022
|
60 } while (buf2k - 3 + x->curpos >= p);
|
pascal@24019
|
61 #endif
|
pascal@24019
|
62 #ifdef BASIC_ISO9660
|
pascal@24020
|
63 # ifdef ROCKRIDGE
|
pascal@24022
|
64 p = buf2k + 32 + x->curpos - x->entrysize;
|
pascal@24020
|
65 # else
|
pascal@24020
|
66 x->curpos += x->entrysize;
|
pascal@24020
|
67 p += 32;
|
pascal@24020
|
68 # endif
|
pascal@24019
|
69 if (((* (short *) p) & 0xFEFF) -1 != 0) {
|
pascal@24019
|
70 s = p + 1; p += *p;
|
pascal@24034
|
71 # ifdef CLEAN_ISO9660
|
pascal@24022
|
72 if (* (short *) (p-1) == 0x313B) p-=2; // remove ;1
|
pascal@24019
|
73 if (*p != '.') p++;
|
pascal@24022
|
74 # endif
|
pascal@24019
|
75 *p = 0;
|
pascal@24019
|
76 }
|
pascal@24019
|
77 #endif
|
pascal@23870
|
78 found:
|
pascal@24020
|
79 x->filename = s;
|
pascal@19515
|
80 return 0;
|
pascal@19515
|
81 }
|
pascal@19515
|
82
|
pascal@23996
|
83 #define isoreaddir_reset() \
|
pascal@23996
|
84 { \
|
pascal@23996
|
85 x->curdirsize = x->dirsize; \
|
pascal@23996
|
86 cpyfromdirpage(x->curdirofs, x->dirpage); \
|
pascal@23996
|
87 x->curpos = -1; \
|
pascal@23996
|
88 }
|
pascal@23996
|
89
|
pascal@21628
|
90 int _isoopen(void)
|
pascal@19515
|
91 {
|
pascal@21735
|
92 // char *name, *s, c;
|
pascal@21735
|
93 // char _64bits = cpuhaslm();
|
pascal@19571
|
94 struct isostate *x=&isostate;
|
pascal@21735
|
95 #define name (x->filename2open)
|
pascal@21754
|
96 #define c (x->c)
|
pascal@21754
|
97 #define _64bits (x->_64bits)
|
pascal@21735
|
98 char *s;
|
pascal@19515
|
99
|
pascal@23863
|
100 s = (char *) x->filename2open;
|
pascal@23863
|
101 if (*s == '/') {
|
pascal@24022
|
102 isoroot();
|
pascal@24022
|
103 //if (strncmp(buf2k+1,"CD001",5) == -1) return -1;
|
pascal@24022
|
104 //if (*(int*)(buf2k+1) != 0x4443) return -1;
|
pascal@24022
|
105 next:
|
pascal@23863
|
106 s++;
|
pascal@19515
|
107 }
|
pascal@20751
|
108 name = s;
|
pascal@21754
|
109 do s++; while (*s && *s != '/');
|
pascal@21750
|
110 c = *s; *s = 0;
|
pascal@24020
|
111 #ifdef ISOHOOK
|
pascal@24020
|
112 _64bits = cpuhaslm();
|
pascal@24020
|
113 _32bits:
|
pascal@24020
|
114 #endif
|
pascal@24020
|
115 isoreaddir_reset();
|
pascal@23996
|
116 do {
|
pascal@23996
|
117 if (isoreaddir() == -1) {
|
pascal@23999
|
118 #ifdef ISOHOOK
|
pascal@23996
|
119 if ((_64bits ^= CPUMASKLM) == 0) goto _32bits;
|
pascal@23999
|
120 #endif
|
pascal@23996
|
121 return -1;
|
pascal@23996
|
122 }
|
pascal@21735
|
123 const char *n = name;
|
pascal@21735
|
124 #define i (x->tmp)
|
pascal@21735
|
125 i = x->filename;
|
pascal@23999
|
126 #ifdef ISOHOOK
|
pascal@19825
|
127 if (_64bits) {
|
pascal@21628
|
128 if (strhead(i, n) == -1) continue;
|
pascal@19825
|
129 n = "64";
|
pascal@19825
|
130 i += s - name; // strlen(name);
|
pascal@19515
|
131 }
|
pascal@23999
|
132 #endif
|
pascal@23996
|
133 if (strcmp(i, n) != -1) break;
|
pascal@23996
|
134 } while (1);
|
pascal@24022
|
135 *s = c;
|
pascal@24022
|
136 if (c) {
|
pascal@24022
|
137 #ifdef CHECKISOFILETYPE
|
pascal@24022
|
138 if ((x->c & 2) == 0) return -1;
|
pascal@24022
|
139 #endif
|
pascal@23996
|
140 cpytodirpage(x->dirpage, x->fileofs);
|
pascal@23996
|
141 x->dirsize = filesize2dirsize(x->filesize);
|
pascal@24022
|
142 goto next;
|
pascal@19515
|
143 }
|
pascal@23996
|
144 isolseek(&x->fileofs);
|
pascal@23996
|
145 return x->fd;
|
pascal@19515
|
146 }
|
pascal@24019
|
147 #endif
|