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

linld: add iso support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Jan 08 20:15:35 2021 +0000 (2021-01-08)
parents 431c14b76522
children 5c1ce90eb1d6
rev   line source
pascal@19515 1 #include "crtl.h"
pascal@19515 2 #include "iso9660.h"
pascal@19515 3
pascal@23996 4 #define setdirpage(to,sec) ((to) = *(int*)&(sec)<<(SECTORBITS-8))
pascal@23996 5 #define cpytodirpage(to,from) ((to) = *(int*)((char*)&(from)+1))
pascal@23996 6 #define cpyfromdirpage(to,from) (*(int*)((char*)&(to)+1) = (from))
pascal@20747 7
pascal@23984 8 #define isoroot() \
pascal@23984 9 { \
pascal@23996 10 extern void isoreadrootsector(void); \
pascal@23996 11 isoreadrootsector(); \
pascal@23996 12 setdirpage(x->dirpage, (* (unsigned long *) (isostate.buffer + 0x9E))); \
pascal@23996 13 x->dirsize = filesize2dirsize(* (unsigned long *) (isostate.buffer + 0xA6)); \
pascal@23984 14 }
pascal@19515 15
pascal@23996 16 static int isoreaddir(void)
pascal@19515 17 {
pascal@19636 18 char *p;
pascal@23870 19
pascal@19571 20 struct isostate *x=&isostate;
pascal@19515 21
pascal@20534 22 if (x->curpos >= SECTORSZ || * (short *) (x->buffer + x->curpos) == 0) {
pascal@23996 23 if ((x->curdirsize =- DIRSECTORSZ) < 0) return -1;
pascal@23996 24 isoreadsector(&x->curdirofs); // x->filepos = 0
pascal@20453 25 //x->curdirofs += SECTORSZ;
pascal@20453 26 *(int *)((char *) &x->curdirofs+1) += SECTORSZ/256;
pascal@20458 27 x->curpos = 0;
pascal@19515 28 }
pascal@20534 29 p = x->buffer; p += x->curpos;
pascal@23996 30 x->fileofs = (* (unsigned long *) (p + 2)) << SECTORBITS;
pascal@21735 31 if ((x->entrysize = * (short *) p) == 0) {
pascal@19515 32 return -1;
pascal@20538 33 }
pascal@23996 34 // x->filename = "";
pascal@19636 35 x->filesize = * (unsigned long *) (p + 10);
pascal@20543 36 x->filemod = 0x81ED; if (p[25] & 2) ((char *)&(x->filemod))[1] = 0x41;
pascal@20534 37 p = x->buffer + 34 + ((p[32] + x->curpos) & -2);
pascal@23871 38 x->curpos += x->entrysize;
pascal@19515 39 do {
pascal@23870 40 register len = p[2];
pascal@20751 41 if (* (short *) p == 0x4D4E) {
pascal@20751 42 x->filename = p + 5;
pascal@23870 43 p[len] = 0;
pascal@23870 44 goto found;
pascal@19515 45 }
pascal@19636 46 p += len;
pascal@23996 47 } while (x->buffer + x->curpos - 3 >= p);
pascal@23870 48 found:
pascal@19515 49 return 0;
pascal@19515 50 }
pascal@19515 51
pascal@23996 52 #define isoreaddir_reset() \
pascal@23996 53 { \
pascal@23996 54 x->curdirsize = x->dirsize; \
pascal@23996 55 cpyfromdirpage(x->curdirofs, x->dirpage); \
pascal@23996 56 x->curpos = -1; \
pascal@23996 57 }
pascal@23996 58
pascal@21628 59 int _isoopen(void)
pascal@19515 60 {
pascal@21735 61 // char *name, *s, c;
pascal@21735 62 // char _64bits = cpuhaslm();
pascal@19571 63 struct isostate *x=&isostate;
pascal@21735 64 #define name (x->filename2open)
pascal@21754 65 #define c (x->c)
pascal@21754 66 #define _64bits (x->_64bits)
pascal@21735 67 char *s;
pascal@19515 68
pascal@21735 69 _64bits = cpuhaslm();
pascal@23996 70 _32bits:
pascal@23863 71 s = (char *) x->filename2open;
pascal@23863 72 if (*s == '/') {
pascal@23863 73 s++;
pascal@23863 74 isoroot();
pascal@23996 75 //if (strncmp(x->buffer+1,"CD001,5) == -1) return -1;
pascal@23996 76 //if (*(int*)(x->buffer+1) != 0x4443) return -1;
pascal@19515 77 }
pascal@19825 78 next:
pascal@23996 79 isoreaddir_reset();
pascal@20751 80 name = s;
pascal@21754 81 do s++; while (*s && *s != '/');
pascal@21750 82 c = *s; *s = 0;
pascal@23996 83 do {
pascal@23996 84 if (isoreaddir() == -1) {
pascal@23996 85 if ((_64bits ^= CPUMASKLM) == 0) goto _32bits;
pascal@23996 86 return -1;
pascal@23996 87 }
pascal@21735 88 const char *n = name;
pascal@21735 89 #define i (x->tmp)
pascal@21735 90 i = x->filename;
pascal@19825 91 if (_64bits) {
pascal@21628 92 if (strhead(i, n) == -1) continue;
pascal@19825 93 n = "64";
pascal@19825 94 i += s - name; // strlen(name);
pascal@19515 95 }
pascal@23996 96 if (strcmp(i, n) != -1) break;
pascal@23996 97 } while (1);
pascal@23996 98 *s++ = c;
pascal@23996 99 #define IS_DIR(x)( (*((char*) &x + 1) & (char)0676) == (char)0)
pascal@23996 100 if (IS_DIR(x->filemod)) {
pascal@23996 101 cpytodirpage(x->dirpage, x->fileofs);
pascal@23996 102 x->dirsize = filesize2dirsize(x->filesize);
pascal@23996 103 if (c) goto next;
pascal@19515 104 }
pascal@23996 105 isolseek(&x->fileofs);
pascal@23996 106 return x->fd;
pascal@19515 107 }