diff options
-rw-r--r-- | libc/misc/ftw/Makefile | 8 | ||||
-rw-r--r-- | libc/misc/ftw/ftw.c | 63 |
2 files changed, 51 insertions, 20 deletions
diff --git a/libc/misc/ftw/Makefile b/libc/misc/ftw/Makefile index 7af2caca2..ae21c222c 100644 --- a/libc/misc/ftw/Makefile +++ b/libc/misc/ftw/Makefile @@ -23,6 +23,10 @@ CSRC=ftw.c COBJS=$(patsubst %.c,%.o, $(CSRC)) OBJS=$(COBJS) +MSRC=ftw.c +MOBJ=ftw.o ftw64.o +OBJS=$(MOBJ) + all: $(OBJS) $(LIBC) $(LIBC): ar-target @@ -30,8 +34,8 @@ $(LIBC): ar-target ar-target: $(OBJS) $(AR) $(ARFLAGS) $(LIBC) $(OBJS) -$(COBJS): %.o : %.c - $(CC) $(CFLAGS) -c $< -o $@ +$(MOBJ): $(MSRC) + $(CC) $(CFLAGS) -DL_$* $< -c -o $*.o $(STRIPTOOL) -x -R .note -R .comment $*.o clean: diff --git a/libc/misc/ftw/ftw.c b/libc/misc/ftw/ftw.c index ff3920fe9..75c58d6a5 100644 --- a/libc/misc/ftw/ftw.c +++ b/libc/misc/ftw/ftw.c @@ -21,9 +21,13 @@ #define _GNU_SOURCE #include <features.h> +#ifdef __UCLIBC_HAS_LFS__ + +#ifdef L_ftw64 +#define L_ftw + /* If Large file support is enabled, transparently remap * things to use the 64-bit interfaces */ -#ifdef __UCLIBC_HAS_LFS__ #if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS != 64 #undef _FILE_OFFSET_BITS #define _FILE_OFFSET_BITS 64 @@ -34,8 +38,30 @@ #ifndef __USE_FILE_OFFSET64 # define __USE_FILE_OFFSET64 1 #endif + +#define FTW_NAME ftw64 +#define NFTW_NAME nftw64 +#define INO_T ino64_t +#define STAT stat64 +#define LSTAT lstat64 +#define XSTAT stat64 +#define FTW_FUNC_T __ftw64_func_t +#define NFTW_FUNC_T __nftw64_func_t +#else + +#define FTW_NAME ftw +#define NFTW_NAME nftw +#define INO_T ino_t +#define STAT stat +#define LSTAT lstat +#define XSTAT stat +#define FTW_FUNC_T __ftw_func_t +#define NFTW_FUNC_T __nftw_func_t +#endif #endif +#ifdef L_ftw + #include <alloca.h> #include <errno.h> #include <ftw.h> @@ -66,7 +92,7 @@ struct dir_data struct known_object { dev_t dev; - ino_t ino; + INO_T ino; }; struct ftw_data @@ -93,7 +119,7 @@ struct ftw_data const int *cvt_arr; /* Callback function. We always use the `nftw' form. */ - __nftw_func_t func; + NFTW_FUNC_T func; /* Device of starting point. Needed for FTW_MOUNT. */ dev_t dev; @@ -117,7 +143,7 @@ static const int ftw_arr[] = }; /* Forward declarations of local functions. */ -static int ftw_dir (struct ftw_data *data, struct stat *st) internal_function; +static int ftw_dir (struct ftw_data *data, struct STAT *st) internal_function; static int @@ -136,7 +162,7 @@ object_compare (const void *p1, const void *p2) static inline int -add_object (struct ftw_data *data, struct stat *st) +add_object (struct ftw_data *data, struct STAT *st) { struct known_object *newp = malloc (sizeof (struct known_object)); if (newp == NULL) @@ -148,7 +174,7 @@ add_object (struct ftw_data *data, struct stat *st) static inline int -find_object (struct ftw_data *data, struct stat *st) +find_object (struct ftw_data *data, struct STAT *st) { struct known_object obj; obj.dev = st->st_dev; @@ -253,7 +279,7 @@ static int internal_function process_entry (struct ftw_data *data, struct dir_data *dir, const char *name, size_t namlen) { - struct stat st; + struct STAT st; int result = 0; int flag = 0; size_t new_buflen; @@ -282,13 +308,13 @@ process_entry (struct ftw_data *data, struct dir_data *dir, const char *name, si name = data->dirbuf; if (((data->flags & FTW_PHYS) - ? lstat (name, &st) - : stat (name, &st)) < 0) + ? LSTAT (name, &st) + : XSTAT (name, &st)) < 0) { if (errno != EACCES && errno != ENOENT) result = -1; else if (!(data->flags & FTW_PHYS) - && lstat (name, &st) == 0 + && LSTAT (name, &st) == 0 && S_ISLNK (st.st_mode)) flag = FTW_SLN; else @@ -349,7 +375,7 @@ process_entry (struct ftw_data *data, struct dir_data *dir, const char *name, si static int internal_function -ftw_dir (struct ftw_data *data, struct stat *st) +ftw_dir (struct ftw_data *data, struct STAT *st) { struct dir_data dir; struct dirent *d; @@ -462,7 +488,7 @@ internal_function ftw_startup (const char *dir, int is_nftw, void *func, int descriptors, int flags) { struct ftw_data data; - struct stat st; + struct STAT st; int result = 0; int save_err; char *cwd = NULL; @@ -507,7 +533,7 @@ ftw_startup (const char *dir, int is_nftw, void *func, int descriptors, int flag every case the callback using the format of the `nftw' version and get the correct result since the stack layout for a function call in C allows this. */ - data.func = (__nftw_func_t) func; + data.func = (NFTW_FUNC_T) func; /* Since we internally use the complete set of FTW_* values we need to reduce the value range before calling a `ftw' callback. */ @@ -549,12 +575,12 @@ ftw_startup (const char *dir, int is_nftw, void *func, int descriptors, int flag : data.dirbuf); if (((flags & FTW_PHYS) - ? lstat (name, &st) - : stat (name, &st)) < 0) + ? LSTAT (name, &st) + : XSTAT (name, &st)) < 0) { if (!(flags & FTW_PHYS) && errno == ENOENT - && lstat (name, &st) == 0 + && LSTAT (name, &st) == 0 && S_ISLNK (st.st_mode)) result = (*data.func) (data.dirbuf, &st, data.cvt_arr[FTW_SLN], &data.ftw); @@ -610,12 +636,13 @@ ftw_startup (const char *dir, int is_nftw, void *func, int descriptors, int flag /* Entry points. */ -int ftw (const char *path, __ftw_func_t func, int descriptors) +int FTW_NAME (const char *path, FTW_FUNC_T func, int descriptors) { return ftw_startup (path, 0, func, descriptors, 0); } -int nftw (const char *path, __nftw_func_t func, int descriptors, int flags) +int NFTW_NAME (const char *path, NFTW_FUNC_T func, int descriptors, int flags) { return ftw_startup (path, 1, func, descriptors, flags); } +#endif |