fix: fix ramdisk readdir inconsistency.

This commit is contained in:
2026-08-12 18:35:14 +02:00
parent 7f2d4b693f
commit a28b8ad0b2
8 changed files with 71 additions and 27 deletions
+44 -7
View File
@@ -124,23 +124,54 @@ bool installer_list_dir(const char* abs_dir, DirList* out) {
int scanned = 0;
int capacity = 0;
// The filesystem API returns direct-child names. Keep this installer's
// historical root-relative representation because component filtering
// and recursive source paths operate on paths such as "sdk/tcc".
const char* dir_rel = abs_dir;
for (int i = 0; dir_rel[i]; i++) {
if (dir_rel[i] == ':') {
dir_rel += i + 1;
if (dir_rel[0] == '/') dir_rel++;
break;
}
}
int dir_rel_len = slen(dir_rel);
while (dir_rel_len > 0 && dir_rel[dir_rel_len - 1] == '/') dir_rel_len--;
int got = montauk::readdir_at(abs_dir, batch, BATCH, 0);
if (got < 0) return false;
while (got > 0) {
for (int i = 0; i < got; i++) {
const char* raw = batch[i];
int len = slen(raw);
int raw_len = slen(raw);
bool is_dir = (len > 0 && raw[len - 1] == '/');
if (is_dir) len--;
if (len <= 0) continue;
bool is_dir = (raw_len > 0 && raw[raw_len - 1] == '/');
if (is_dir) raw_len--;
if (raw_len <= 0) continue;
bool already_root_relative = false;
if (dir_rel_len > 0 && raw_len > dir_rel_len &&
raw[dir_rel_len] == '/') {
already_root_relative = true;
for (int k = 0; k < dir_rel_len; k++) {
if (raw[k] != dir_rel[k]) {
already_root_relative = false;
break;
}
}
}
int len = raw_len;
if (dir_rel_len > 0 && !already_root_relative) {
len += dir_rel_len + 1;
}
// Skip "." and ".."
const char* base = raw;
for (int k = 0; k < len; k++)
for (int k = 0; k < raw_len; k++)
if (raw[k] == '/') base = raw + k + 1;
int base_len = (int)(len - (base - raw));
int base_len = (int)(raw_len - (base - raw));
if (base_len == 1 && base[0] == '.') continue;
if (base_len == 2 && base[0] == '.' && base[1] == '.') continue;
@@ -156,7 +187,13 @@ bool installer_list_dir(const char* abs_dir, DirList* out) {
char* rel = (char*)montauk::malloc(len + 1);
if (!rel) { installer_free_dir_list(out); return false; }
montauk::memcpy(rel, raw, len);
int pos = 0;
if (dir_rel_len > 0 && !already_root_relative) {
montauk::memcpy(rel, dir_rel, dir_rel_len);
pos = dir_rel_len;
rel[pos++] = '/';
}
montauk::memcpy(rel + pos, raw, raw_len);
rel[len] = '\0';
out->entries[out->count].rel = rel;