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

Remove linux-mmc
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Dec 01 11:07:58 2018 +0100 (2018-12-01)
parents 65366955881f
children ab907169f156
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@20534 20 x->dirofs = (* (unsigned long *) (x->buffer + 0x9E)) << SECTORBITS;
pascal@20534 21 x->dirsize = filesize2dirsize(* (unsigned long *) (x->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 }