- if (mode != -1 && mode != 4) {
- if (recurse == RecurseYes) {
- long address(0);
-
- for (;;) {
- char buffer[4096];
- int size(_syscall(getdirentries(fd, buffer, sizeof(buffer), &address)));
- if (size == 0)
- break;
-
- const char *next(buffer), *stop(next + size);
- while (next != stop) {
- const dirent *dir(reinterpret_cast<const dirent *>(next));
- const char *name(dir->d_name);
- size_t after(strlen(name));
-
- if (false);
- else if (after == 1 && name[0] == '.');
- else if (after == 2 && name[0] == '.' && name[1] == '.');
- else {
- size_t both(before + 1 + after);
- char sub[both + 1];
- memcpy(sub, path, before);
- sub[before] = '/';
- memcpy(sub + before + 1, name, after);
- sub[both] = '\0';
-
- switch (dir->d_type) {
- case DT_LNK:
- break;
- default:
- return -1;
+ if (mode == 4)
+ return 0;
+
+ if (recurse == RecurseYes)
+ for (long address(0);;) {
+ char buffer[4096];
+ int size(_syscall(__getdirentries64(fd, buffer, sizeof(buffer), &address)));
+ if (size == 0)
+ break;