PDA

View Full Version : [C] problema warning


f.bandiera
28-02-2009, 19:23
Buonasera,
vorrei chiedere un consiglio...

In un programma voglio "aprire" una directory, tra i vari modi in cui questo è possibile, ce ne sono alcuni che mi danno dei problemi. In particolare:

1) se scrivo:
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
.
.
int value;
DIR * dfs;
dfs = fdopendir( ( value=open(".", O_RDONLY) ) );
.
.
al momento della compilazione con gcc -g -Wall -o ...... mi segnala
WARNING implicit declaration of fdopendir
WARNING assignment makes pointer from integer without a cast

2) se scrivo:
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <fcntl.h>
.
.
int value;
value = open(".", O_RDONLY | O_DIRECTORY);
.
.
al momento della compilazione con gcc -g -Wall -o ...... mi segnala
ERROR O_DIRECTORY undeclared...


PERCHE'?


Ho anche visto (man 2 open) che per usare O_DIRECTORY potrebbe essere necessario specificare la _GNU_SOURCE macro..... cosa vuol dire????


Ciao e grazie,
Francesco

cionci
01-03-2009, 09:21
Per il secondo:

O_DIRECTORY
If pathname is not a directory, cause the open to fail. This
flag is Linux-specific, and was added in kernel version 2.1.126,
to avoid denial-of-service problems if opendir(3) is called on a
FIFO or tape device, but should not be used outside of the
implementation of opendir(3)

Quindi l'uso è sconsigliato. Probabilmente è definito in qualche header relativo all'implementazione delle system call.

Per la prima, è strano che non funzioni. E' definita all'interno di dirent.h, probabilmente c'è qualche bug.

In ogni caso se prima dichiari te la funzione dovrebbe andare tranquillamente:

extern DIR *fdopendir (int __fd);

Ci sta anche che non venga definita perché rinchiusa in qualche define. A quanto sembra è una estensione GNU ancora non POSIX.

In ogni caso la scelta migliore è usare opendir.

f.bandiera
02-03-2009, 01:12
Ciao Cionci...

il fatto è che la opendir mi serve per poi mandare l'elenco delle entries tramite una socket (che dovrebbe essere un FIFO), quindi volevo provare negli altri 2 modi.

Alla fine ho capito che bastava includere la macro:
#define _GNU_SOURCE

ma perchè funzioni DEVE essere messa PRIMA dei vari #include...

ciao e grazie per la risposta
(ma ho aperto anche un'altra discussione)

Francesco