wok-6.x annotate linld/stuff/src/ISO9660.CPP @ rev 20745
azpainter: update WGET_URL
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sun Feb 10 10:35:42 2019 +0100 (2019-02-10) |
parents | 16d1d23aefee |
children | 6f2188ee6be5 |
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@19515 | 8 int isoreset(char *name) |
pascal@19515 | 9 { |
pascal@19825 | 10 static const unsigned long root = 16UL * 2048; |
pascal@19571 | 11 struct isostate *x=&isostate; |
pascal@20538 | 12 if (name) { |
pascal@19571 | 13 //x->fd = open(name, O_RDONLY); |
pascal@19571 | 14 x->fd = open(name); |
pascal@20538 | 15 } |
pascal@20534 | 16 if (isoreadsector(&root) < 0 || strhead(x->buffer+1,"CD001")) { |
pascal@19571 | 17 //close(x->fd); |
pascal@19515 | 18 return -1; |
pascal@19515 | 19 } |
pascal@20632 | 20 x->dirofs = (* (unsigned long *) (isostate.buffer + 0x9E)) << SECTORBITS; |
pascal@20632 | 21 x->dirsize = filesize2dirsize(* (unsigned long *) (isostate.buffer + 0xA6)); |
pascal@19515 | 22 return 0; |
pascal@19515 | 23 } |
pascal@19515 | 24 |
pascal@19515 | 25 int isoreaddir(int restart) |
pascal@19515 | 26 { |
pascal@19636 | 27 int size; |
pascal@19636 | 28 char *p; |
pascal@19515 | 29 #ifdef __ROCKRIDGE |
pascal@19515 | 30 char *endname; |
pascal@19515 | 31 #endif |
pascal@19571 | 32 struct isostate *x=&isostate; |
pascal@19515 | 33 |
pascal@19515 | 34 if (restart) { |
pascal@19826 | 35 x->curdirsize = x->dirsize; |
pascal@19571 | 36 x->curdirofs = x->dirofs; |
pascal@19826 | 37 goto restarted; |
pascal@19515 | 38 } |
pascal@20534 | 39 if (x->curpos >= SECTORSZ || * (short *) (x->buffer + x->curpos) == 0) { |
pascal@20538 | 40 restarted: |
pascal@19826 | 41 if (x->curdirsize < DIRSECTORSZ) return -1; |
pascal@20534 | 42 isoreadsector(&x->curdirofs); |
pascal@20453 | 43 //x->curdirofs += SECTORSZ; |
pascal@20453 | 44 *(int *)((char *) &x->curdirofs+1) += SECTORSZ/256; |
pascal@19826 | 45 x->curdirsize -= DIRSECTORSZ; |
pascal@20458 | 46 x->curpos = 0; |
pascal@19515 | 47 } |
pascal@20534 | 48 p = x->buffer; p += x->curpos; |
pascal@20538 | 49 if ((size = * (short *) p) == 0) { |
pascal@19515 | 50 return -1; |
pascal@20538 | 51 } |
pascal@19636 | 52 x->fileofs = (* (unsigned long *) (p + 2)) << SECTORBITS; |
pascal@19636 | 53 x->filesize = * (unsigned long *) (p + 10); |
pascal@20543 | 54 x->filemod = 0x81ED; if (p[25] & 2) ((char *)&(x->filemod))[1] = 0x41; |
pascal@20543 | 55 //x->filemod = (p[25] & 2) ? 0040755 : 0100755; |
pascal@20453 | 56 //x->filemod = 0100755 - ((p[25] & (char)2) << 13); |
pascal@19515 | 57 #ifdef __ROCKRIDGE |
pascal@19515 | 58 endname = NULL; |
pascal@19636 | 59 // p += 34 + (p[32] & -2); ? |
pascal@20534 | 60 p = x->buffer + 34 + ((p[32] + x->curpos) & -2); |
pascal@19515 | 61 do { |
pascal@19636 | 62 int len = p[2]; |
pascal@19636 | 63 switch (* (short *) p) { |
pascal@19515 | 64 case 0x4D4E: // NM |
pascal@19636 | 65 x->filename = p + 5; |
pascal@19636 | 66 endname = p + len; |
pascal@19515 | 67 break; |
pascal@19515 | 68 case 0x5850: // PX |
pascal@19636 | 69 x->filemod = * (short *) (p + 4); |
pascal@19515 | 70 break; |
pascal@19515 | 71 } |
pascal@19636 | 72 p += len; |
pascal@20534 | 73 } while (x->buffer + x->curpos + size - p > 2); |
pascal@19515 | 74 if (endname) |
pascal@19515 | 75 *endname = 0; |
pascal@19515 | 76 else |
pascal@19515 | 77 #endif |
pascal@19515 | 78 { |
pascal@20534 | 79 p = x->buffer + 33; x->filename = p += x->curpos; |
pascal@19636 | 80 p--; |
pascal@20453 | 81 if (((* (short *) p) & 0xFEFF) -1 == 0) { |
pascal@20453 | 82 x->filename = ".."; |
pascal@20453 | 83 if ((* (short *) p) == 1) |
pascal@20453 | 84 x->filename++; |
pascal@20453 | 85 } |
pascal@20453 | 86 else { |
pascal@19636 | 87 p += *p; p--; |
pascal@19636 | 88 if (* (short *) (p) != 0x313B) { |
pascal@19636 | 89 p++; p++; // no ;1 to remove |
pascal@19636 | 90 } |
pascal@19636 | 91 if (p[-1] == '.') p--; |
pascal@19636 | 92 *p = 0; |
pascal@19515 | 93 } |
pascal@19515 | 94 } |
pascal@19571 | 95 x->curpos += size; |
pascal@19515 | 96 return 0; |
pascal@19515 | 97 } |
pascal@19515 | 98 |
pascal@19825 | 99 //#define IS_DIR(x)( ((x) & ~0777) == 040000) |
pascal@20454 | 100 //#define IS_DIR(x)( (char)((x) >> 9) == (char)040) |
pascal@20454 | 101 //#define IS_DIR(x)( (*((char*) &x + 1) & (char)0776) == (char)0100) |
pascal@20454 | 102 #define IS_DIR(x)( (*((char*) &x + 1) & (char)0676) == (char)0) |
pascal@19825 | 103 int isoopen(const char *filename) |
pascal@19515 | 104 { |
pascal@19515 | 105 int restart; |
pascal@19825 | 106 char *name, *s, c; |
pascal@19825 | 107 char _64bits = cpuhaslm(); |
pascal@19571 | 108 struct isostate *x=&isostate; |
pascal@19515 | 109 |
pascal@20528 | 110 do { |
pascal@19825 | 111 for (s = (char *) filename; *s == '/' ; s++) { |
pascal@19515 | 112 isoreset(NULL); |
pascal@19515 | 113 } |
pascal@19825 | 114 next: |
pascal@19826 | 115 for (name = s; *s && *s != '/'; s++); |
pascal@19825 | 116 c = *s; |
pascal@19825 | 117 *s = 0; |
pascal@19825 | 118 for (restart = 1; isoreaddir(restart) == 0; restart = 0) { |
pascal@19825 | 119 const char *n = name, *i = x->filename; |
pascal@19825 | 120 if (_64bits) { |
pascal@19825 | 121 if (strhead(i, n)) continue; |
pascal@19825 | 122 n = "64"; |
pascal@19825 | 123 i += s - name; // strlen(name); |
pascal@19515 | 124 } |
pascal@19825 | 125 if (strcmp(i, n)) continue; |
pascal@19825 | 126 *s++ = c; |
pascal@19825 | 127 if (IS_DIR(x->filemod)) { |
pascal@19825 | 128 x->dirofs = x->fileofs; |
pascal@19826 | 129 x->dirsize = filesize2dirsize(x->filesize); |
pascal@19825 | 130 if (c) goto next; |
pascal@19515 | 131 } |
pascal@19825 | 132 isolseek(&x->fileofs); |
pascal@19825 | 133 return 0; |
pascal@19515 | 134 } |
pascal@20528 | 135 } while ((_64bits ^= CPUMASKLM) == 0); |
pascal@19825 | 136 return -1; |
pascal@19515 | 137 } |