tags:

views:

183

answers:

2

Hi,

I'm trying to use the nftw to process some files under a directory

#include <ftw.h>
#include <stdio.h>

 int wrapper(const char * fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf) {
  printf("File %d\n", ftwbuf->base);
  return(0);
} 


int main(int argc, char ** argv) {
    const char *name;
    int flags = 0;
    name = argv[1];
    nftw(name, wrapper, 20, flags);
    return 0;

}

When I'm compiling (gcc kconfig_parser.c -o parser) , I've got this warning and this error..

kconfig_parser.c:5: warning: ‘struct FTW’ declared inside parameter list 
kconfig_parser.c:5: warning: its scope is only this definition or declaration, which is probably not what you want
kconfig_parser.c: In function ‘wrapper’:
kconfig_parser.c:6: error: dereferencing pointer to incomplete type

I've checked the definition of the struct and the prototype of the callback, and some examples, it should be fine... What am I doing wrong ? (I've removed almost everything of my code to clear it)...

thanks

A: 

Hmm. Your code works for me. Check your include paths, maybe? Though this is a system header, so it should be pretty hard to miss this. Or were you accidentally compiling a version that didn't have the #include <ftw.h> line?

$ gcc -o ftw ftw.c
$ ./ftw my-directory
File 10
File 11
File 16
File 16
File 16
File 16
File 16
... etc ...

edit: The test above was done on Mac OS X. In a (now deleted) comment the OP mentioned he was on Debian, for which the man page mentions that #define _XOPEN_SOURCE 500 is necessary, as Juliano points out.

Brian Campbell
+2  A: 

Linux, for some reason, still uses SUSv1 for this API, where nfsw() is still considered an extension.

From the Linux manual page, the include has to be:

#define _XOPEN_SOURCE 500
#include <ftw.h>
Juliano
Actually, I linked to the SUSv2 specification for how nftw is supposed to work (which I have since updated to the SUSv3 link). On a SUSv2 or SUSv3 compliant system, you shouldn't need that #define, but it looks like you may need it on Linux.
Brian Campbell
great... it works... I didn't know that...thanks
LB
Brian: In fact, you are right. At the bottom of the new manual page you can read: "Issue 5: Moved from X/OPEN UNIX extension to BASE.". So, it was originally an X/OPEN extension, then moved to base. For some reason, Linux is still using SUSv1 of this API.
Juliano