mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-08-08 19:00:27 +00:00
[metal] Get zipos working
This commit is contained in:
parent
3b20faf371
commit
29fae6aca6
2 changed files with 8 additions and 4 deletions
|
@ -41,6 +41,7 @@ void *GetZipCdir(const uint8_t *p, size_t n) {
|
||||||
size_t i, j;
|
size_t i, j;
|
||||||
v8hi pk = {READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"),
|
v8hi pk = {READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK"),
|
||||||
READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK")};
|
READ16LE("PK"), READ16LE("PK"), READ16LE("PK"), READ16LE("PK")};
|
||||||
|
uint32_t magic;
|
||||||
i = n - 4;
|
i = n - 4;
|
||||||
asm("" : "+x"(pk));
|
asm("" : "+x"(pk));
|
||||||
do {
|
do {
|
||||||
|
@ -54,11 +55,14 @@ void *GetZipCdir(const uint8_t *p, size_t n) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (READ32LE(p + i) == kZipCdir64LocatorMagic &&
|
while (magic = READ32LE(p + i),
|
||||||
|
magic != kZipCdir64LocatorMagic && magic != kZipCdirHdrMagic &&
|
||||||
|
i + 0x10000 + 0x1000 >= n) --i;
|
||||||
|
if (magic == kZipCdir64LocatorMagic &&
|
||||||
i + kZipCdir64LocatorSize <= n &&
|
i + kZipCdir64LocatorSize <= n &&
|
||||||
IsZipCdir64(p, n, ZIP_LOCATE64_OFFSET(p + i))) {
|
IsZipCdir64(p, n, ZIP_LOCATE64_OFFSET(p + i))) {
|
||||||
return p + ZIP_LOCATE64_OFFSET(p + i);
|
return p + ZIP_LOCATE64_OFFSET(p + i);
|
||||||
} else if (READ32LE(p + i) == kZipCdirHdrMagic && IsZipCdir32(p, n, i)) {
|
} else if (magic == kZipCdirHdrMagic && IsZipCdir32(p, n, i)) {
|
||||||
j = i;
|
j = i;
|
||||||
do {
|
do {
|
||||||
if (READ32LE(p + j) == kZipCdir64LocatorMagic &&
|
if (READ32LE(p + j) == kZipCdir64LocatorMagic &&
|
||||||
|
@ -69,6 +73,6 @@ void *GetZipCdir(const uint8_t *p, size_t n) {
|
||||||
} while (j-- && i - j < 128);
|
} while (j-- && i - j < 128);
|
||||||
return p + i;
|
return p + i;
|
||||||
}
|
}
|
||||||
} while (i--);
|
} while (i-- + 0x10000 + 0x1000 >= n);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,7 +163,7 @@ static int __zipos_load(struct Zipos *zipos, size_t cf, unsigned flags,
|
||||||
minfd = 3;
|
minfd = 3;
|
||||||
__fds_lock();
|
__fds_lock();
|
||||||
TryAgain:
|
TryAgain:
|
||||||
if (IsWindows()) {
|
if (IsWindows() || IsMetal()) {
|
||||||
if ((fd = __reservefd_unlocked(-1)) != -1) {
|
if ((fd = __reservefd_unlocked(-1)) != -1) {
|
||||||
return __zipos_setfd(fd, h, flags, mode);
|
return __zipos_setfd(fd, h, flags, mode);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue