rev |
line source |
pascal@19515
|
1 #include "crtl.h"
|
pascal@19515
|
2 #include "crtlx.h"
|
pascal@19515
|
3 #include "iso9660.h"
|
pascal@19515
|
4 #define __ROCKRIDGE
|
pascal@19515
|
5
|
pascal@20747
|
6 #if 1
|
pascal@20747
|
7 #define setdirofs(to,sec) (*(int*)((char*)&(to)+1) = *(int*)&(sec)<<(SECTORBITS-8))
|
pascal@20747
|
8 #define cpydirofs(to,from) (*(int*)((char*)&(to)+1) = *(int*)((char*)&(from)+1))
|
pascal@20747
|
9 #else
|
pascal@20747
|
10 #define setdirofs(to,sec) (to = (sec)<<SECTORBITS)
|
pascal@20747
|
11 #define cpydirofs(to,from) ((to) = (from))
|
pascal@20747
|
12 #endif
|
pascal@20747
|
13
|
pascal@23863
|
14 #ifdef ISOHOOK
|
pascal@23984
|
15 #define isoroot() \
|
pascal@23984
|
16 { \
|
pascal@23984
|
17 static const unsigned long root = 16UL * 2048; \
|
pascal@23984
|
18 isoreadsector(&root); \
|
pascal@23984
|
19 setdirofs(isostate.dirofs, (* (unsigned long *) (isostate.buffer + 0x9E))); \
|
pascal@23984
|
20 isostate.dirsize = filesize2dirsize(* (unsigned long *) (isostate.buffer + 0xA6)); \
|
pascal@23984
|
21 }
|
pascal@23863
|
22 #else
|
pascal@21628
|
23 int isoroot(void)
|
pascal@19515
|
24 {
|
pascal@19825
|
25 static const unsigned long root = 16UL * 2048;
|
pascal@23863
|
26 if (isoreadsector(&root) == -1 || strhead(isostate.buffer+1,"CD001") == -1) {
|
pascal@23863
|
27 //close(isostate.fd);
|
pascal@19515
|
28 return -1;
|
pascal@19515
|
29 }
|
pascal@23863
|
30 setdirofs(isostate.dirofs, (* (unsigned long *) (isostate.buffer + 0x9E)));
|
pascal@23863
|
31 isostate.dirsize = filesize2dirsize(* (unsigned long *) (isostate.buffer + 0xA6));
|
pascal@19515
|
32 return 0;
|
pascal@23984
|
33 }
|
pascal@23863
|
34 #endif
|
pascal@19515
|
35
|
pascal@20747
|
36 int isoreaddir(void)
|
pascal@19515
|
37 {
|
pascal@19636
|
38 char *p;
|
pascal@23870
|
39
|
pascal@19571
|
40 struct isostate *x=&isostate;
|
pascal@19515
|
41
|
pascal@20747
|
42 if (x->curdirsize == 0xFFFF) {
|
pascal@19826
|
43 x->curdirsize = x->dirsize;
|
pascal@20747
|
44 cpydirofs(x->curdirofs, x->dirofs);
|
pascal@19826
|
45 goto restarted;
|
pascal@19515
|
46 }
|
pascal@20534
|
47 if (x->curpos >= SECTORSZ || * (short *) (x->buffer + x->curpos) == 0) {
|
pascal@20538
|
48 restarted:
|
pascal@19826
|
49 if (x->curdirsize < DIRSECTORSZ) return -1;
|
pascal@20534
|
50 isoreadsector(&x->curdirofs);
|
pascal@20453
|
51 //x->curdirofs += SECTORSZ;
|
pascal@20453
|
52 *(int *)((char *) &x->curdirofs+1) += SECTORSZ/256;
|
pascal@19826
|
53 x->curdirsize -= DIRSECTORSZ;
|
pascal@20458
|
54 x->curpos = 0;
|
pascal@19515
|
55 }
|
pascal@20534
|
56 p = x->buffer; p += x->curpos;
|
pascal@21735
|
57 if ((x->entrysize = * (short *) p) == 0) {
|
pascal@19515
|
58 return -1;
|
pascal@20538
|
59 }
|
pascal@19636
|
60 x->fileofs = (* (unsigned long *) (p + 2)) << SECTORBITS;
|
pascal@19636
|
61 x->filesize = * (unsigned long *) (p + 10);
|
pascal@20543
|
62 x->filemod = 0x81ED; if (p[25] & 2) ((char *)&(x->filemod))[1] = 0x41;
|
pascal@20543
|
63 //x->filemod = (p[25] & 2) ? 0040755 : 0100755;
|
pascal@20453
|
64 //x->filemod = 0100755 - ((p[25] & (char)2) << 13);
|
pascal@19515
|
65 #ifdef __ROCKRIDGE
|
pascal@19636
|
66 // p += 34 + (p[32] & -2); ?
|
pascal@20534
|
67 p = x->buffer + 34 + ((p[32] + x->curpos) & -2);
|
pascal@23871
|
68 #ifdef ISOHOOK
|
pascal@23871
|
69 x->curpos += x->entrysize;
|
pascal@23871
|
70 #endif
|
pascal@19515
|
71 do {
|
pascal@23870
|
72 register len = p[2];
|
pascal@20751
|
73 if (* (short *) p == 0x4D4E) {
|
pascal@20751
|
74 x->filename = p + 5;
|
pascal@23870
|
75 p[len] = 0;
|
pascal@23870
|
76 goto found;
|
pascal@19515
|
77 }
|
pascal@19636
|
78 p += len;
|
pascal@23871
|
79 #ifdef ISOHOOK
|
pascal@23871
|
80 } while (x->buffer + x->curpos - 2 > p);
|
pascal@23871
|
81 #else
|
pascal@21735
|
82 } while (x->buffer + x->curpos + x->entrysize - 2 > p);
|
pascal@19515
|
83 #endif
|
pascal@23867
|
84 #endif
|
pascal@23867
|
85 #ifndef ISOHOOK
|
pascal@19515
|
86 {
|
pascal@20534
|
87 p = x->buffer + 33; x->filename = p += x->curpos;
|
pascal@19636
|
88 p--;
|
pascal@20453
|
89 if (((* (short *) p) & 0xFEFF) -1 == 0) {
|
pascal@20453
|
90 x->filename = "..";
|
pascal@22632
|
91 if (--(* (short *) p) == 0)
|
pascal@20453
|
92 x->filename++;
|
pascal@20453
|
93 }
|
pascal@20453
|
94 else {
|
pascal@19636
|
95 p += *p; p--;
|
pascal@19636
|
96 if (* (short *) (p) != 0x313B) {
|
pascal@19636
|
97 p++; p++; // no ;1 to remove
|
pascal@19636
|
98 }
|
pascal@19636
|
99 if (p[-1] == '.') p--;
|
pascal@19636
|
100 *p = 0;
|
pascal@19515
|
101 }
|
pascal@19515
|
102 }
|
pascal@23867
|
103 #endif
|
pascal@23870
|
104 found:
|
pascal@23871
|
105 #ifndef ISOHOOK
|
pascal@21735
|
106 x->curpos += x->entrysize;
|
pascal@23871
|
107 #endif
|
pascal@19515
|
108 return 0;
|
pascal@19515
|
109 }
|
pascal@19515
|
110
|
pascal@19825
|
111 //#define IS_DIR(x)( ((x) & ~0777) == 040000)
|
pascal@20454
|
112 //#define IS_DIR(x)( (char)((x) >> 9) == (char)040)
|
pascal@20454
|
113 //#define IS_DIR(x)( (*((char*) &x + 1) & (char)0776) == (char)0100)
|
pascal@20454
|
114 #define IS_DIR(x)( (*((char*) &x + 1) & (char)0676) == (char)0)
|
pascal@21628
|
115 int _isoopen(void)
|
pascal@19515
|
116 {
|
pascal@21735
|
117 // char *name, *s, c;
|
pascal@21735
|
118 // char _64bits = cpuhaslm();
|
pascal@19571
|
119 struct isostate *x=&isostate;
|
pascal@21735
|
120 #define name (x->filename2open)
|
pascal@21754
|
121 #define c (x->c)
|
pascal@21754
|
122 #define _64bits (x->_64bits)
|
pascal@21735
|
123 char *s;
|
pascal@19515
|
124
|
pascal@21735
|
125 _64bits = cpuhaslm();
|
pascal@20528
|
126 do {
|
pascal@23863
|
127 #ifdef ISOHOOK
|
pascal@23863
|
128 s = (char *) x->filename2open;
|
pascal@23863
|
129 if (*s == '/') {
|
pascal@23863
|
130 s++;
|
pascal@23863
|
131 isoroot();
|
pascal@23863
|
132 }
|
pascal@23863
|
133 name = s;
|
pascal@23863
|
134 while (*++s);
|
pascal@23863
|
135 #else
|
pascal@21628
|
136 for (s = (char *) x->filename2open; *s == '/' ; s++) {
|
pascal@21628
|
137 isoroot();
|
pascal@19515
|
138 }
|
pascal@19825
|
139 next:
|
pascal@20751
|
140 name = s;
|
pascal@21754
|
141 do s++; while (*s && *s != '/');
|
pascal@21750
|
142 c = *s; *s = 0;
|
pascal@23863
|
143 #endif
|
pascal@21576
|
144 for (x->curdirsize = 0xFFFF; isoreaddir() != -1;) {
|
pascal@21735
|
145 const char *n = name;
|
pascal@21735
|
146 #define i (x->tmp)
|
pascal@21735
|
147 i = x->filename;
|
pascal@19825
|
148 if (_64bits) {
|
pascal@21628
|
149 if (strhead(i, n) == -1) continue;
|
pascal@19825
|
150 n = "64";
|
pascal@19825
|
151 i += s - name; // strlen(name);
|
pascal@19515
|
152 }
|
pascal@23984
|
153 if (strcmp(i, n) == -1) continue;
|
pascal@23863
|
154 #ifndef ISOHOOK
|
pascal@19825
|
155 *s++ = c;
|
pascal@23863
|
156 #endif
|
pascal@19825
|
157 if (IS_DIR(x->filemod)) {
|
pascal@20747
|
158 cpydirofs(x->dirofs, x->fileofs);
|
pascal@19826
|
159 x->dirsize = filesize2dirsize(x->filesize);
|
pascal@23863
|
160 #ifndef ISOHOOK
|
pascal@19825
|
161 if (c) goto next;
|
pascal@23863
|
162 #endif
|
pascal@19515
|
163 }
|
pascal@19825
|
164 isolseek(&x->fileofs);
|
pascal@19825
|
165 return 0;
|
pascal@19515
|
166 }
|
pascal@20528
|
167 } while ((_64bits ^= CPUMASKLM) == 0);
|
pascal@19825
|
168 return -1;
|
pascal@19515
|
169 }
|