Próbuję uzyskać starą starszą wersję kodu działającą na nowych systemach 64-bitowych, a ja aktualnie utknąłem. Poniżej znajduje się mały plik C, którego używam do testowania funkcjonalności istniejącego w aktualnie łamanym programie.readdir() Problemy z kompatybilnością 32/64
#define _POSIX_SOURCE
#include <dirent.h>
#include <sys/types.h>
#undef _POSIX_SOURCE
#include <stdio.h>
main(){
DIR *dirp;
struct dirent *dp;
char *const_dir;
const_dir = "/any/path/goes/here";
if(!(dirp = opendir(const_dir)))
perror("opendir() error");
else{
puts("contents of path:");
while(dp = readdir(dirp))
printf(" %s\n", dp->d_name);
closedir(dirp);
}
}
Problem:
OS jest Red Hat 7.0 Maipo x86_64. Stary kod jest 32-bitowy i musi być przechowywany w ten sposób.
Dostałem kompilację programu działającego poprawnie przy użyciu flagi -m32
z g++
. Problem pojawia się podczas wykonywania, readdir()
pobiera 64-bitowy i-węzeł, a następnie generuje errno EOVERFLOW i oczywiście nic nie zostanie wydrukowane.
Próbowałem użyć readdir64()
zamiast readdir()
do jakiegoś sukcesu. Nie dostaję już errno EOVERFLOW, a linie wychodzą na terminal, ale same pliki nie są drukowane. Zakładam, że wynika to z tego, że bufor nie jest tym, czego oczekiwałby dirent
.
Mam próbował użyć dirent64
aby spróbować rozwiązać ten problem, ale gdy próbuję to uzyskać:
test.c:19:22 error: dereferencing pointer to incomplete type
printf(" %s\n", dp->d_name);
Zastanawiam się, czy istnieje sposób, aby ręcznie przesunąć bufor dp->d_name
dla dirent
być używany z readdir()
. Zauważyłem w Gdb, że używanie readdir()
i dirent
powoduje, że dp->d_name
ma katalogi wymienione na dp->d_name[1]
, natomiast readdir64()
i dirent
podaje pierwszy katalog pod numerem dp->d_name[8]
.
To lub w jakiś sposób sprawi, że dirent64
zadziała, a może jestem po prostu na niewłaściwej ścieżce całkowicie.
Na koniec warto zauważyć, że program działa doskonale bez dołączonej flagi -m32
, więc zakładam, że musi to być gdzieś błąd zgodności z 32/64. Każda pomoc jest doceniana.
Dlaczego po prostu nie zdefiniujesz brakującego typu i nie użyjesz dirent64? – Martin
Masz na myśli zdefiniować dirent64 w taki sam sposób, jak zdefiniowano go w dirent.h tylko w moim programie? – PKFiyah
To ...faktycznie działało idealnie po pobraniu struct out of bits/dirent.h i po prostu umieszczeniu go ręcznie w moim kodzie. Jestem pewien, że istnieje miejsce, które prawdopodobnie może być użyte zamiast tego, ale to działa na razie. Dzięki! – PKFiyah