diff options
Diffstat (limited to 'community/inotify-tools-inc/add-include-regex.patch')
-rw-r--r-- | community/inotify-tools-inc/add-include-regex.patch | 365 |
1 files changed, 365 insertions, 0 deletions
diff --git a/community/inotify-tools-inc/add-include-regex.patch b/community/inotify-tools-inc/add-include-regex.patch new file mode 100644 index 0000000000..31833e0df5 --- /dev/null +++ b/community/inotify-tools-inc/add-include-regex.patch @@ -0,0 +1,365 @@ +### adapted from https://github.com/rvoicilas/inotify-tools/pull/28 ### +diff -urp inotify-tools-3.14/libinotifytools/src/inotifytools/inotifytools.h inotify-tools.new/libinotifytools/src/inotifytools/inotifytools.h +--- inotify-tools-3.14/libinotifytools/src/inotifytools/inotifytools.h 2010-03-12 13:53:46.000000000 +0000 ++++ inotify-tools.new/libinotifytools/src/inotifytools/inotifytools.h 2015-05-10 02:22:22.971561931 +0000 +@@ -28,7 +28,7 @@ int inotifytools_watch_recursively_with_ + int events, + char const ** exclude_list ); + // [UH] +-int inotifytools_ignore_events_by_regex( char const *pattern, int flags ); ++int inotifytools_ignore_events_by_regex( char const *pattern, int flags, int invert ); + struct inotify_event * inotifytools_next_event( int timeout ); + struct inotify_event * inotifytools_next_events( int timeout, int num_events ); + int inotifytools_error(); +diff -urp inotify-tools-3.14/libinotifytools/src/inotifytools.c inotify-tools.new/libinotifytools/src/inotifytools.c +--- inotify-tools-3.14/libinotifytools/src/inotifytools.c 2010-03-12 13:53:46.000000000 +0000 ++++ inotify-tools.new/libinotifytools/src/inotifytools.c 2015-05-10 02:21:08.839560752 +0000 +@@ -149,6 +149,7 @@ static int error = 0; + static int init = 0; + static char* timefmt = 0; + static regex_t* regex = 0; ++static int invert_regex = 0; + + int isdir( char const * path ); + void record_stats( struct inotify_event const * event ); +@@ -1103,12 +1104,14 @@ struct inotify_event * inotifytools_next + static ssize_t bytes; + static jmp_buf jmp; + static char match_name[MAX_STRLEN]; ++ static int rv; + + #define RETURN(A) {\ + if (regex) {\ + inotifytools_snprintf(match_name, MAX_STRLEN, A, "%w%f");\ +- if (0 == regexec(regex, match_name, 0, 0, 0)) {\ +- longjmp(jmp,0);\ ++ rv = regexec(regex, match_name, 0, 0, 0); \ ++ if ((!invert_regex && 0 == rv) || (invert_regex && 0 != rv)) { \ ++ longjmp(jmp,0); \ + }\ + }\ + if ( collect_stats ) {\ +@@ -1999,7 +2002,7 @@ int inotifytools_get_max_user_watches() + * events occur. If the regular expression matches, the matched event will be + * ignored. + */ +-int inotifytools_ignore_events_by_regex( char const *pattern, int flags ) { ++int inotifytools_ignore_events_by_regex( char const *pattern, int flags, int invert ) { + if (!pattern) { + if (regex) { + regfree(regex); +@@ -2013,7 +2016,10 @@ int inotifytools_ignore_events_by_regex( + else { regex = (regex_t *)malloc(sizeof(regex_t)); } + + int ret = regcomp(regex, pattern, flags | REG_NOSUB); +- if (0 == ret) return 1; ++ if (0 == ret) { ++ invert_regex = invert; ++ return 1; ++ } + + regfree(regex); + free(regex); + +diff -urp inotify-tools-3.14/src/inotifywait.c inotify-tools.new/src/inotifywait.c +--- inotify-tools-3.14/src/inotifywait.c 2010-03-12 13:53:46.000000000 +0000 ++++ inotify-tools.new/src/inotifywait.c 2015-05-10 16:53:20.384393049 +0000 +@@ -48,7 +48,9 @@ bool parse_opts( + char ** fromfile, + char ** outfile, + char ** regex, +- char ** iregex ++ char ** iregex, ++ char ** include_regex, ++ char ** include_iregex + ); + + void print_help(); +@@ -157,16 +159,29 @@ int main(int argc, char ** argv) + char * outfile = NULL; + char * regex = NULL; + char * iregex = NULL; ++ char * include_regex = NULL; ++ char * include_iregex = NULL; ++ bool invert_regex = false; + pid_t pid; + int fd; + + // Parse commandline options, aborting if something goes wrong + if ( !parse_opts(&argc, &argv, &events, &monitor, &quiet, &timeout, +- &recursive, &csv, &daemon, &syslog, &format, &timefmt, +- &fromfile, &outfile, ®ex, &iregex) ) { ++ &recursive, &csv, &daemon, &syslog, &format, &timefmt, ++ &fromfile, &outfile, ®ex, &iregex, &include_regex, &include_iregex) ) { + return EXIT_FAILURE; + } + ++ if (include_regex) { ++ regex = include_regex; ++ invert_regex = true; ++ } ++ ++ if (include_iregex) { ++ iregex = include_iregex; ++ invert_regex = true; ++ } ++ + if ( !inotifytools_initialize() ) { + fprintf(stderr, "Couldn't initialize inotify. Are you running Linux " + "2.6.13 or later, and was the\n" +@@ -180,11 +195,11 @@ int main(int argc, char ** argv) + + if ( timefmt ) inotifytools_set_printf_timefmt( timefmt ); + if ( +- (regex && !inotifytools_ignore_events_by_regex(regex, REG_EXTENDED) ) || ++ (regex && !inotifytools_ignore_events_by_regex(regex, REG_EXTENDED, invert_regex) ) || + (iregex && !inotifytools_ignore_events_by_regex(iregex, REG_EXTENDED| +- REG_ICASE)) ++ REG_ICASE, invert_regex)) + ) { +- fprintf(stderr, "Error in `exclude' regular expression.\n"); ++ fprintf(stderr, "Error in `exclude' or `include' regular expression.\n"); + return EXIT_FAILURE; + } + +@@ -423,18 +438,20 @@ bool parse_opts( + char ** fromfile, + char ** outfile, + char ** regex, +- char ** iregex ++ char ** iregex, ++ char ** include_regex, ++ char ** include_iregex + ) { + assert( argc ); assert( argv ); assert( events ); assert( monitor ); + assert( quiet ); assert( timeout ); assert( csv ); assert( daemon ); +- assert( syslog ); assert( format ); assert( timefmt ); assert( fromfile ); ++ assert( syslog ); assert( format ); assert( timefmt ); assert( fromfile ); + assert( outfile ); assert( regex ); assert( iregex ); + + // Short options + char * opt_string = "mrhcdsqt:fo:e:"; + + // Construct array +- struct option long_opts[17]; ++ struct option long_opts[19]; + + // --help + long_opts[0].name = "help"; +@@ -520,11 +537,21 @@ bool parse_opts( + long_opts[15].has_arg = 1; + long_opts[15].flag = NULL; + long_opts[15].val = (int)'b'; ++ // --include ++ long_opts[16].name = "include"; ++ long_opts[16].has_arg = 1; ++ long_opts[16].flag = NULL; ++ long_opts[16].val = (int)'j'; ++ // --includei ++ long_opts[17].name = "includei"; ++ long_opts[17].has_arg = 1; ++ long_opts[17].flag = NULL; ++ long_opts[17].val = (int)'k'; + // Empty last element +- long_opts[16].name = 0; +- long_opts[16].has_arg = 0; +- long_opts[16].flag = 0; +- long_opts[16].val = 0; ++ long_opts[18].name = 0; ++ long_opts[18].has_arg = 0; ++ long_opts[18].flag = 0; ++ long_opts[18].val = 0; + + // Get first option + char curr_opt = getopt_long(*argc, *argv, opt_string, long_opts, NULL); +@@ -604,6 +631,16 @@ bool parse_opts( + (*iregex) = optarg; + break; + ++ // --include ++ case 'j': ++ (*include_regex) = optarg; ++ break; ++ ++ // --includei ++ case 'k': ++ (*include_iregex) = optarg; ++ break; ++ + // --fromfile + case 'z': + if (*fromfile) { +@@ -671,6 +708,16 @@ bool parse_opts( + return false; + } + ++ if ( *include_regex && *include_iregex ) { ++ fprintf(stderr, "--include and --includei cannot both be specified.\n"); ++ return false; ++ } ++ ++ if ( ( *include_regex || *include_iregex ) && ( *regex || *iregex ) ) { ++ fprintf(stderr, "Cannot use include and exclude options simultaneously.\n"); ++ return false; ++ } ++ + if ( *format && *csv ) { + fprintf(stderr, "-c and --format cannot both be specified.\n"); + return false; +@@ -715,6 +762,11 @@ void print_help() + "\t \textended regular expression <pattern>.\n"); + printf("\t--excludei <pattern>\n" + "\t \tLike --exclude but case insensitive.\n"); ++ printf("\t--include <pattern>\n" ++ "\t \tInclude all events on only those files matching\n" ++ "\t \tthe extended regular expression <pattern>.\n"); ++ printf("\t--includei <pattern>\n" ++ "\t \tLike --include but case insensitive.\n"); + printf("\t-m|--monitor \tKeep listening for events forever. Without\n" + "\t \tthis option, inotifywait will exit after one\n" + "\t \tevent is received.\n"); +diff -urp inotify-tools-3.14/src/inotifywatch.c inotify-tools.new/src/inotifywatch.c +--- inotify-tools-3.14/src/inotifywatch.c 2010-03-12 13:53:46.000000000 +0000 ++++ inotify-tools.new/src/inotifywatch.c 2015-05-10 16:51:40.060391453 +0000 +@@ -43,7 +43,9 @@ bool parse_opts( + int * recursive, + char ** fromfile, + char ** regex, +- char ** iregex ++ char ** iregex, ++ char ** include_regex, ++ char ** include_iregex + ); + + void print_help(); +@@ -91,21 +93,34 @@ int main(int argc, char ** argv) + done = false; + char * regex = NULL; + char * iregex = NULL; ++ char * include_regex = NULL; ++ char * include_iregex = NULL; ++ bool invert_regex = false; + + signal( SIGINT, handle_impatient_user ); + + // Parse commandline options, aborting if something goes wrong + if ( !parse_opts( &argc, &argv, &events, &timeout, &verbose, &zero, &sort, +- &recursive, &fromfile, ®ex, &iregex ) ) { ++ &recursive, &fromfile, ®ex, &iregex, &include_regex, &include_iregex ) ) { + return EXIT_FAILURE; + } + ++ if (include_regex) { ++ regex = include_regex; ++ invert_regex = true; ++ } ++ ++ if (include_iregex) { ++ iregex = include_iregex; ++ invert_regex = true; ++ } ++ + if ( +- (regex && !inotifytools_ignore_events_by_regex(regex, REG_EXTENDED) ) || ++ (regex && !inotifytools_ignore_events_by_regex(regex, REG_EXTENDED, invert_regex) ) || + (iregex && !inotifytools_ignore_events_by_regex(iregex, REG_EXTENDED| +- REG_ICASE)) ++ REG_ICASE, invert_regex)) + ) { +- fprintf(stderr, "Error in `exclude' regular expression.\n"); ++ fprintf(stderr, "Error in `exclude' or `include' regular expression.\n"); + return EXIT_FAILURE; + } + +@@ -390,7 +405,9 @@ bool parse_opts( + int * recursive, + char ** fromfile, + char ** regex, +- char ** iregex ++ char ** iregex, ++ char ** include_regex, ++ char ** include_iregex + ) { + assert( argc ); assert( argv ); assert( events ); assert( timeout ); + assert( verbose ); assert( zero ); assert( sort ); assert( recursive ); +@@ -400,7 +417,7 @@ bool parse_opts( + char * opt_string = "hra:d:zve:t:"; + + // Construct array +- struct option long_opts[12]; ++ struct option long_opts[14]; + + // --help + long_opts[0].name = "help"; +@@ -460,11 +477,21 @@ bool parse_opts( + long_opts[10].has_arg = 1; + long_opts[10].flag = NULL; + long_opts[10].val = (int)'b'; ++ // --include ++ long_opts[11].name = "include"; ++ long_opts[11].has_arg = 1; ++ long_opts[11].flag = NULL; ++ long_opts[11].val = (int)'j'; ++ // --includei ++ long_opts[12].name = "includei"; ++ long_opts[12].has_arg = 1; ++ long_opts[12].flag = NULL; ++ long_opts[12].val = (int)'k'; + // Empty last element +- long_opts[11].name = 0; +- long_opts[11].has_arg = 0; +- long_opts[11].flag = 0; +- long_opts[11].val = 0; ++ long_opts[13].name = 0; ++ long_opts[13].has_arg = 0; ++ long_opts[13].flag = 0; ++ long_opts[13].val = 0; + + // Get first option + char curr_opt = getopt_long(*argc, *argv, opt_string, long_opts, NULL); +@@ -506,6 +533,16 @@ bool parse_opts( + (*iregex) = optarg; + break; + ++ // --include ++ case 'j': ++ (*include_regex) = optarg; ++ break; ++ ++ // --includei ++ case 'k': ++ (*include_iregex) = optarg; ++ break; ++ + // --fromfile + case 'o': + if (*fromfile) { +@@ -625,6 +662,16 @@ bool parse_opts( + return false; + } + ++ if ( *include_regex && *include_iregex ) { ++ fprintf(stderr, "--include and --includei cannot both be specified.\n"); ++ return false; ++ } ++ ++ if ( ( *include_regex || *include_iregex ) && ( *regex || *iregex ) ) { ++ fprintf(stderr, "Cannot use include and exclude options simultaneously.\n"); ++ return false; ++ } ++ + // If ? returned, invalid option + return (curr_opt != '?'); + } +@@ -647,6 +694,11 @@ void print_help() + "\t\texpression <pattern>.\n"); + printf("\t--excludei <pattern>\n" + "\t\tLike --exclude but case insensitive.\n"); ++ printf("\t--include <pattern>\n" ++ "\t\tInclude all events only those files matching the extended\n" ++ "\t\tregular expression <pattern>.\n"); ++ printf("\t--includei <pattern>\n" ++ "\t\tLike --include but case insensitive.\n"); + printf("\t-z|--zero\n" + "\t\tIn the final table of results, output rows and columns even\n" + "\t\tif they consist only of zeros (the default is to not output\n" |