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

linld: more ram for zImage
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat May 25 13:19:35 2019 +0200 (2019-05-25)
parents cbcb33ee9044
children 0e811092e7bb
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@19571 6 struct isostate isostate;
pascal@19515 7
pascal@20747 8 #if 1
pascal@20747 9 #define setdirofs(to,sec) (*(int*)((char*)&(to)+1) = *(int*)&(sec)<<(SECTORBITS-8))
pascal@20747 10 #define cpydirofs(to,from) (*(int*)((char*)&(to)+1) = *(int*)((char*)&(from)+1))
pascal@20747 11 #else
pascal@20747 12 #define setdirofs(to,sec) (to = (sec)<<SECTORBITS)
pascal@20747 13 #define cpydirofs(to,from) ((to) = (from))
pascal@20747 14 #endif
pascal@20747 15
pascal@19515 16 int isoreset(char *name)
pascal@19515 17 {
pascal@19825 18 static const unsigned long root = 16UL * 2048;
pascal@19571 19 struct isostate *x=&isostate;
pascal@20538 20 if (name) {
pascal@19571 21 //x->fd = open(name, O_RDONLY);
pascal@19571 22 x->fd = open(name);
pascal@20538 23 }
pascal@20534 24 if (isoreadsector(&root) < 0 || strhead(x->buffer+1,"CD001")) {
pascal@19571 25 //close(x->fd);
pascal@19515 26 return -1;
pascal@19515 27 }
pascal@20747 28 setdirofs(x->dirofs, (* (unsigned long *) (isostate.buffer + 0x9E)));
pascal@20632 29 x->dirsize = filesize2dirsize(* (unsigned long *) (isostate.buffer + 0xA6));
pascal@19515 30 return 0;
pascal@19515 31 }
pascal@19515 32
pascal@20747 33 int isoreaddir(void)
pascal@19515 34 {
pascal@19636 35 int size;
pascal@19636 36 char *p;
pascal@19515 37 #ifdef __ROCKRIDGE
pascal@19515 38 char *endname;
pascal@19515 39 #endif
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@20538 57 if ((size = * (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@19515 66 endname = NULL;
pascal@19636 67 // p += 34 + (p[32] & -2); ?
pascal@20534 68 p = x->buffer + 34 + ((p[32] + x->curpos) & -2);
pascal@19515 69 do {
pascal@19636 70 int len = p[2];
pascal@20751 71 # if 0
pascal@19636 72 switch (* (short *) p) {
pascal@19515 73 case 0x5850: // PX
pascal@19636 74 x->filemod = * (short *) (p + 4);
pascal@19515 75 break;
pascal@20751 76 case 0x4D4E: // NM
pascal@20751 77 # else
pascal@20751 78 if (* (short *) p == 0x4D4E) {
pascal@20751 79 # endif
pascal@20751 80 x->filename = p + 5;
pascal@20751 81 endname = p + len;
pascal@19515 82 }
pascal@19636 83 p += len;
pascal@20534 84 } while (x->buffer + x->curpos + size - p > 2);
pascal@19515 85 if (endname)
pascal@19515 86 *endname = 0;
pascal@19515 87 else
pascal@19515 88 #endif
pascal@19515 89 {
pascal@20534 90 p = x->buffer + 33; x->filename = p += x->curpos;
pascal@19636 91 p--;
pascal@20453 92 if (((* (short *) p) & 0xFEFF) -1 == 0) {
pascal@20453 93 x->filename = "..";
pascal@20453 94 if ((* (short *) p) == 1)
pascal@20453 95 x->filename++;
pascal@20453 96 }
pascal@20453 97 else {
pascal@19636 98 p += *p; p--;
pascal@19636 99 if (* (short *) (p) != 0x313B) {
pascal@19636 100 p++; p++; // no ;1 to remove
pascal@19636 101 }
pascal@19636 102 if (p[-1] == '.') p--;
pascal@19636 103 *p = 0;
pascal@19515 104 }
pascal@19515 105 }
pascal@19571 106 x->curpos += size;
pascal@19515 107 return 0;
pascal@19515 108 }
pascal@19515 109
pascal@19825 110 //#define IS_DIR(x)( ((x) & ~0777) == 040000)
pascal@20454 111 //#define IS_DIR(x)( (char)((x) >> 9) == (char)040)
pascal@20454 112 //#define IS_DIR(x)( (*((char*) &x + 1) & (char)0776) == (char)0100)
pascal@20454 113 #define IS_DIR(x)( (*((char*) &x + 1) & (char)0676) == (char)0)
pascal@19825 114 int isoopen(const char *filename)
pascal@19515 115 {
pascal@19825 116 char *name, *s, c;
pascal@19825 117 char _64bits = cpuhaslm();
pascal@19571 118 struct isostate *x=&isostate;
pascal@19515 119
pascal@20528 120 do {
pascal@19825 121 for (s = (char *) filename; *s == '/' ; s++) {
pascal@19515 122 isoreset(NULL);
pascal@19515 123 }
pascal@19825 124 next:
pascal@20751 125 name = s;
pascal@20751 126 do s++; while (*s != '/' && *s);
pascal@19825 127 c = *s;
pascal@19825 128 *s = 0;
pascal@21576 129 for (x->curdirsize = 0xFFFF; isoreaddir() != -1;) {
pascal@19825 130 const char *n = name, *i = x->filename;
pascal@19825 131 if (_64bits) {
pascal@19825 132 if (strhead(i, n)) continue;
pascal@19825 133 n = "64";
pascal@19825 134 i += s - name; // strlen(name);
pascal@19515 135 }
pascal@19825 136 if (strcmp(i, n)) continue;
pascal@19825 137 *s++ = c;
pascal@19825 138 if (IS_DIR(x->filemod)) {
pascal@20747 139 cpydirofs(x->dirofs, x->fileofs);
pascal@19826 140 x->dirsize = filesize2dirsize(x->filesize);
pascal@19825 141 if (c) goto next;
pascal@19515 142 }
pascal@19825 143 isolseek(&x->fileofs);
pascal@19825 144 return 0;
pascal@19515 145 }
pascal@20528 146 } while ((_64bits ^= CPUMASKLM) == 0);
pascal@19825 147 return -1;
pascal@19515 148 }