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

linld: fix isoreaddir
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Jun 23 13:35:04 2020 +0000 (2020-06-23)
parents 26195667e7c9
children 431c14b76522
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@23863 15 void isoroot(void)
pascal@23863 16 #else
pascal@21628 17 int isoroot(void)
pascal@23863 18 #endif
pascal@19515 19 {
pascal@19825 20 static const unsigned long root = 16UL * 2048;
pascal@23863 21 #ifdef ISOHOOK
pascal@23863 22 isoreadsector(&root);
pascal@23863 23 setdirofs(isostate.dirofs, (* (unsigned long *) (isostate.buffer + 0x9E)));
pascal@23863 24 isostate.dirsize = filesize2dirsize(* (unsigned long *) (isostate.buffer + 0xA6));
pascal@23863 25 #else
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@23863 33 #endif
pascal@19515 34 }
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@23806 125 #ifdef ISOHOOK
pascal@23806 126 extern int _cpuhaslm();
pascal@23806 127 _64bits = _cpuhaslm();
pascal@23806 128 #else
pascal@21735 129 _64bits = cpuhaslm();
pascal@23806 130 #endif
pascal@20528 131 do {
pascal@23863 132 #ifdef ISOHOOK
pascal@23863 133 s = (char *) x->filename2open;
pascal@23863 134 if (*s == '/') {
pascal@23863 135 s++;
pascal@23863 136 isoroot();
pascal@23863 137 }
pascal@23863 138 name = s;
pascal@23863 139 while (*++s);
pascal@23863 140 #else
pascal@21628 141 for (s = (char *) x->filename2open; *s == '/' ; s++) {
pascal@21628 142 isoroot();
pascal@19515 143 }
pascal@19825 144 next:
pascal@20751 145 name = s;
pascal@21754 146 do s++; while (*s && *s != '/');
pascal@21750 147 c = *s; *s = 0;
pascal@23863 148 #endif
pascal@21576 149 for (x->curdirsize = 0xFFFF; isoreaddir() != -1;) {
pascal@21735 150 const char *n = name;
pascal@21735 151 #define i (x->tmp)
pascal@21735 152 i = x->filename;
pascal@19825 153 if (_64bits) {
pascal@21628 154 if (strhead(i, n) == -1) continue;
pascal@19825 155 n = "64";
pascal@19825 156 i += s - name; // strlen(name);
pascal@19515 157 }
pascal@19825 158 if (strcmp(i, n)) continue;
pascal@23863 159 #ifndef ISOHOOK
pascal@19825 160 *s++ = c;
pascal@23863 161 #endif
pascal@19825 162 if (IS_DIR(x->filemod)) {
pascal@20747 163 cpydirofs(x->dirofs, x->fileofs);
pascal@19826 164 x->dirsize = filesize2dirsize(x->filesize);
pascal@23863 165 #ifndef ISOHOOK
pascal@19825 166 if (c) goto next;
pascal@23863 167 #endif
pascal@19515 168 }
pascal@19825 169 isolseek(&x->fileofs);
pascal@19825 170 return 0;
pascal@19515 171 }
pascal@20528 172 } while ((_64bits ^= CPUMASKLM) == 0);
pascal@19825 173 return -1;
pascal@19515 174 }