From: skeezix Date: Wed, 18 May 2011 01:33:29 +0000 (-0400) Subject: Added 'depth limit' option to pnd_disco searchpaths, so can search recursively foreve... X-Git-Tag: sz_beta3~51 X-Git-Url: https://git.openpandora.org/cgi-bin/gitweb.cgi?p=pandora-libraries.git;a=commitdiff_plain;h=54ea6b85bca341e53836985e5ab8404341393361 Added 'depth limit' option to pnd_disco searchpaths, so can search recursively forever, or be told how far max to go --- diff --git a/lib/pnd_discovery.c b/lib/pnd_discovery.c index 8afbb38..e1fc0ef 100644 --- a/lib/pnd_discovery.c +++ b/lib/pnd_discovery.c @@ -11,6 +11,7 @@ #define _XOPEN_SOURCE 500 #define __USE_XOPEN_EXTENDED +#define _GNU_SOURCE #include /* for nftw, tree walker */ #include "pnd_container.h" @@ -70,7 +71,10 @@ static int pnd_disco_callback ( const char *fpath, const struct stat *sb, if ( logit ) { pnd_log ( PND_LOG_DEFAULT, " .. is dir, skipping\n" ); } - return ( 0 ); // skip directories and other non-regular files + if ( ftwbuf -> level >= pathiter_depthlimit ) { + return ( FTW_SKIP_SUBTREE ); + } + return ( FTW_CONTINUE ); // skip directories and other non-regular files } // PND/PNZ file and others may be valid as well .. but lets leave that for now @@ -86,7 +90,7 @@ static int pnd_disco_callback ( const char *fpath, const struct stat *sb, if ( logit ) { pnd_log ( PND_LOG_DEFAULT, " .. bad filename, skipping\n" ); } - return ( 0 ); + return ( FTW_CONTINUE ); } // potentially a valid application @@ -114,13 +118,13 @@ static int pnd_disco_callback ( const char *fpath, const struct stat *sb, // try to locate the PXML portion if ( ! pnd_pnd_seek_pxml ( f ) ) { fclose ( f ); - return ( 0 ); // pnd or not, but not to spec. Pwn'd the pnd? + return ( FTW_CONTINUE ); // pnd or not, but not to spec. Pwn'd the pnd? } // accrue it into a buffer if ( ! pnd_pnd_accrue_pxml ( f, pxmlbuf, 32 * 1024 ) ) { fclose ( f ); - return ( 0 ); + return ( FTW_CONTINUE ); } //printf ( "buffer is %s\n", pxmlbuf ); @@ -170,7 +174,7 @@ static int pnd_disco_callback ( const char *fpath, const struct stat *sb, // pxmlh is useful? if ( ! pxmlapps ) { - return ( 0 ); // continue tree walk + return ( FTW_CONTINUE ); // continue tree walk } // for ovr-file @@ -392,7 +396,7 @@ static int pnd_disco_callback ( const char *fpath, const struct stat *sb, // free up the applist free ( pxmlapps ); - return ( 0 ); // continue the tree walk + return ( FTW_CONTINUE ); // continue the tree walk } pnd_box_handle pnd_disco_search ( char *searchpath, char *overridespath ) { @@ -413,7 +417,7 @@ pnd_box_handle pnd_disco_search ( char *searchpath, char *overridespath ) { nftw ( buffer, // path to descend pnd_disco_callback, // callback to do processing 10, // no more than X open fd's at once - FTW_PHYS ); // do not follow symlinks + FTW_PHYS | FTW_ACTIONRETVAL ); // do not follow symlinks } SEARCHPATH_POST diff --git a/lib/pnd_pathiter.h b/lib/pnd_pathiter.h index 5e13aa8..d3fabf0 100644 --- a/lib/pnd_pathiter.h +++ b/lib/pnd_pathiter.h @@ -13,6 +13,7 @@ #include #include #include +#include // for isdigit() // this really should be replaced by a function pair .. one to // start a new search and one to go to next, bailing when done. Maybe @@ -20,6 +21,11 @@ // func with a callback. Whatever. +// will be set to 0xFFFF for no limit currently set, or a smaller number +// if that is the depth limit +unsigned int pathiter_depthlimit; + + #if 1 // globbing is performed // only iterates actual existing paths; if you want to return @@ -29,6 +35,7 @@ char *end, *colon; \ char *head = searchpath; \ char chunk [ FILENAME_MAX ]; \ + char *lt; \ \ /*fprintf ( stderr, "sp %s\n", searchpath );*/ \ \ @@ -43,7 +50,16 @@ strncpy ( chunk, head, FILENAME_MAX - 1 ); \ } \ \ - /*fprintf ( stderr, "-> %s\n", chunk ); */ \ + pathiter_depthlimit = 0xFFFF; \ + \ + if ( ( lt = strchr ( chunk, '<' ) ) ) { \ + if ( isdigit ( *(lt+1) ) ) { \ + pathiter_depthlimit = atoi ( lt + 1 ); \ + } \ + *lt = '\0'; \ + } \ + \ + /*fprintf ( stderr, "-> chunk %s limit %d\n", chunk, pathiter_depthlimit );*/ \ \ struct stat statbuf; \ wordexp_t _p; \