wok annotate linld/stuff/src/ISO9660.CPP @ rev 24020

linld: fix iso9660/64
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Mar 06 18:15:05 2021 +0000 (2021-03-06)
parents 61df94a0fa43
children 217c02cbbe8d
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@23996 14 setdirpage(x->dirpage, (* (unsigned long *) (isostate.buffer + 0x9E))); \
pascal@23996 15 x->dirsize = filesize2dirsize(* (unsigned long *) (isostate.buffer + 0xA6)); \
pascal@23984 16 }
pascal@19515 17
pascal@24019 18 #if !defined(BASIC_ISO9660) && !defined(ROCKRIDGE)
pascal@24020 19 #define BASIC_ISO9660
pascal@24019 20 #endif
pascal@23996 21 static int isoreaddir(void)
pascal@19515 22 {
pascal@19636 23 char *p;
pascal@23870 24
pascal@19571 25 struct isostate *x=&isostate;
pascal@19515 26
pascal@23999 27 p = x->buffer;
pascal@23999 28 if (x->curpos >= SECTORSZ || * (short *) (p + x->curpos) == 0) {
pascal@23996 29 if ((x->curdirsize =- DIRSECTORSZ) < 0) return -1;
pascal@23996 30 isoreadsector(&x->curdirofs); // x->filepos = 0
pascal@20453 31 //x->curdirofs += SECTORSZ;
pascal@20453 32 *(int *)((char *) &x->curdirofs+1) += SECTORSZ/256;
pascal@20458 33 x->curpos = 0;
pascal@19515 34 }
pascal@23999 35 p += x->curpos;
pascal@23996 36 x->fileofs = (* (unsigned long *) (p + 2)) << SECTORBITS;
pascal@21735 37 if ((x->entrysize = * (short *) p) == 0) {
pascal@19515 38 return -1;
pascal@20538 39 }
pascal@24020 40 x->filemod = 0x81ED; if (p[25] & 2) ((char *)&(x->filemod))[1] = 0x41;
pascal@24020 41 register char *s;
pascal@19636 42 x->filesize = * (unsigned long *) (p + 10);
pascal@24020 43 s = ".."+1-p[33];
pascal@24020 44 #ifdef ROCKRIDGE
pascal@20534 45 p = x->buffer + 34 + ((p[32] + x->curpos) & -2);
pascal@23871 46 x->curpos += x->entrysize;
pascal@19515 47 do {
pascal@23870 48 register len = p[2];
pascal@20751 49 if (* (short *) p == 0x4D4E) {
pascal@24020 50 s = p + 5;
pascal@23870 51 p[len] = 0;
pascal@23870 52 goto found;
pascal@19515 53 }
pascal@19636 54 p += len;
pascal@23996 55 } while (x->buffer + x->curpos - 3 >= p);
pascal@24019 56 #endif
pascal@24019 57 #ifdef BASIC_ISO9660
pascal@24020 58 # ifdef ROCKRIDGE
pascal@24020 59 p = x->buffer + 32 + x->curpos - x->entrysize;
pascal@24020 60 # else
pascal@24020 61 x->curpos += x->entrysize;
pascal@24020 62 p += 32;
pascal@24020 63 # endif
pascal@24019 64 if (((* (short *) p) & 0xFEFF) -1 != 0) {
pascal@24019 65 s = p + 1; p += *p;
pascal@24019 66 if (* (short *) (p-1) != 0x313B) p+=2; // no ;1 to remove
pascal@24019 67 if (*p != '.') p++;
pascal@24019 68 *p = 0;
pascal@24019 69 }
pascal@24019 70 #endif
pascal@23870 71 found:
pascal@24020 72 x->filename = s;
pascal@19515 73 return 0;
pascal@19515 74 }
pascal@19515 75
pascal@23996 76 #define isoreaddir_reset() \
pascal@23996 77 { \
pascal@23996 78 x->curdirsize = x->dirsize; \
pascal@23996 79 cpyfromdirpage(x->curdirofs, x->dirpage); \
pascal@23996 80 x->curpos = -1; \
pascal@23996 81 }
pascal@23996 82
pascal@21628 83 int _isoopen(void)
pascal@19515 84 {
pascal@21735 85 // char *name, *s, c;
pascal@21735 86 // char _64bits = cpuhaslm();
pascal@19571 87 struct isostate *x=&isostate;
pascal@21735 88 #define name (x->filename2open)
pascal@21754 89 #define c (x->c)
pascal@21754 90 #define _64bits (x->_64bits)
pascal@21735 91 char *s;
pascal@19515 92
pascal@23863 93 s = (char *) x->filename2open;
pascal@23863 94 if (*s == '/') {
pascal@23863 95 s++;
pascal@23863 96 isoroot();
pascal@23996 97 //if (strncmp(x->buffer+1,"CD001,5) == -1) return -1;
pascal@23996 98 //if (*(int*)(x->buffer+1) != 0x4443) return -1;
pascal@19515 99 }
pascal@19825 100 next:
pascal@20751 101 name = s;
pascal@21754 102 do s++; while (*s && *s != '/');
pascal@21750 103 c = *s; *s = 0;
pascal@24020 104 #ifdef ISOHOOK
pascal@24020 105 _64bits = cpuhaslm();
pascal@24020 106 _32bits:
pascal@24020 107 #endif
pascal@24020 108 isoreaddir_reset();
pascal@23996 109 do {
pascal@23996 110 if (isoreaddir() == -1) {
pascal@23999 111 #ifdef ISOHOOK
pascal@23996 112 if ((_64bits ^= CPUMASKLM) == 0) goto _32bits;
pascal@23999 113 #endif
pascal@23996 114 return -1;
pascal@23996 115 }
pascal@21735 116 const char *n = name;
pascal@21735 117 #define i (x->tmp)
pascal@21735 118 i = x->filename;
pascal@23999 119 #ifdef ISOHOOK
pascal@19825 120 if (_64bits) {
pascal@21628 121 if (strhead(i, n) == -1) continue;
pascal@19825 122 n = "64";
pascal@19825 123 i += s - name; // strlen(name);
pascal@19515 124 }
pascal@23999 125 #endif
pascal@23996 126 if (strcmp(i, n) != -1) break;
pascal@23996 127 } while (1);
pascal@23996 128 *s++ = c;
pascal@23996 129 #define IS_DIR(x)( (*((char*) &x + 1) & (char)0676) == (char)0)
pascal@23996 130 if (IS_DIR(x->filemod)) {
pascal@23996 131 cpytodirpage(x->dirpage, x->fileofs);
pascal@23996 132 x->dirsize = filesize2dirsize(x->filesize);
pascal@23996 133 if (c) goto next;
pascal@19515 134 }
pascal@23996 135 isolseek(&x->fileofs);
pascal@23996 136 return x->fd;
pascal@19515 137 }
pascal@24019 138 #endif