mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-08-12 00:37:08 +02:00
albatross-themes apk-post-messages autossh bitcoin btrbk entr ffmpegthumbnailer firejail firetools fwsnort gnome-colors imapsync inetutils-syslogd inotify-tools-inc isync junit ktsuss letsencrypt-nosudo libmbim libndp libqmi libteam mini-sendmail modemmanager namecoin networkmanager nginx-naxsi numix-themes nxapi opencl-headers opencl-icd-loader opus-tools perl-authen-ntlm perl-bit-vector perl-data-uniqid perl-file-copy-recursive perl-getopt-argvfile perl-io-tee perl-iptables-chainmgr perl-iptables-parse perl-module-scandeps perl-par-dist perl-par-packer perl-par perl-uri-escape psad py-crcmod py-graphviz py-lz4 py-opencl py-opengl-accelerate runit secpwgen secure-delete socklog spacefm tinyssh udevil virt-viewer virtualbricks whois wrk xpra zram-init
366 lines
12 KiB
Diff
366 lines
12 KiB
Diff
### 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"
|