lunes, 4 de junio de 2007

scandir

Hay una pequeña diferencia en el scandir, en MacOS se declara como

int
scandir(const char *dirname, struct dirent ***namelist,
int (*select)(struct dirent *),
int (*compar)(const void *, const void *));

y en Linux me la encuentro como:

int scandir(const char *dir, struct dirent ***namelist,
int(*filter)(const struct dirent *),
int(*compar)(const struct dirent **, const struct dirent **));

Nos fijamos en el tercer parámetro, un puntero a función que Linux espera un "const struct dirent *" y en MacOS espera un "struct dirent *". Dicho en román-paladino, en Linux la función de filtrado no "debe" modificar la estructura que se le pasa, en MacOS se podría modificar.

Se resuelve con una compilación condicional del estilo de:

#if defined(__BUILD_FOR_INTEL_DARWIN)
int client_file_filter(struct dirent *entry)
#elif defined(__BUILD_FOR_INTEL_LINUX)
int client_file_filter(const struct dirent *entry)
#else
#error "Please, define client_file_filter for your OS"
#endif

Los items __BUILD_FOR_INTEL_DARWIN y __BUILD_FOR_INTEL_LINUX los construyo en el Makefile. Además, tengo la precaución de poner una directriz del procesador "#error" por si portamos el código a otra plataforma.