[PATCH v2] inotifyd: -x: new option
Bartosz Gołaszewski
bartekgola at gmail.com
Tue Sep 15 10:21:31 UTC 2015
2015-08-25 15:39 GMT+02:00 Bartosz Golaszewski <bartekgola at gmail.com>:
> Add -x option which allows to specify the exit status of PROG for which
> inotifyd should exit.
>
> An example use case for this change is writing parallel system startup
> scripts with busybox' runit: inotifyd can be used to wait for a specific
> pid-file to appear in /var/run and then exit, allowing the blocked script
> to proceed.
Is there any chance of merging this? I suppose inotifyd in busybox is
loosely based on inotifywait from inotify-tools which has an option to
exit upon receiving an event. It's also much cleaner then killing
inotifyd from spawned processes.
--
Best regards,
Bartosz Golaszewski
> function old new delta
> inotifyd_main 653 742 +89
> .rodata 157197 157261 +64
> packed_usage 30460 30516 +56
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 3/0 up/down: 209/0) Total: 209 bytes
>
> Signed-off-by: Bartosz Golaszewski <bartekgola at gmail.com>
> ---
> v2:
> - don't call xstrtol_range() if -x is not specified
>
> v1:
> http://lists.busybox.net/pipermail/busybox/2015-August/083219.html
>
> miscutils/inotifyd.c | 26 ++++++++++++++++++++------
> 1 file changed, 20 insertions(+), 6 deletions(-)
>
> diff --git a/miscutils/inotifyd.c b/miscutils/inotifyd.c
> index 7a1a6a2..e142668 100644
> --- a/miscutils/inotifyd.c
> +++ b/miscutils/inotifyd.c
> @@ -28,7 +28,7 @@
> */
>
> //usage:#define inotifyd_trivial_usage
> -//usage: "PROG FILE1[:MASK]..."
> +//usage: "[OPTS] PROG FILE1[:MASK]..."
> //usage:#define inotifyd_full_usage "\n\n"
> //usage: "Run PROG on filesystem changes."
> //usage: "\nWhen a filesystem event matching MASK occurs on FILEn,"
> @@ -52,12 +52,17 @@
> //usage: "\n n Subfile is created"
> //usage: "\n d Subfile is deleted"
> //usage: "\n"
> +//usage: "\nOptions:"
> +//usage: "\n -x STATUS Exit if PROG returns STATUS"
> +//usage: "\n"
> //usage: "\ninotifyd waits for PROG to exit."
> //usage: "\nWhen x event happens for all FILEs, inotifyd exits."
>
> #include "libbb.h"
> #include <sys/inotify.h>
>
> +#define OPT_x (1 << 0)
> +
> static const char mask_names[] ALIGN1 =
> "a" // 0x00000001 File was accessed
> "c" // 0x00000002 File was modified
> @@ -84,17 +89,21 @@ enum {
> int inotifyd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> int inotifyd_main(int argc, char **argv)
> {
> - int n;
> - unsigned mask;
> + int n, exp_st, st;
> + unsigned mask, opts;
> struct pollfd pfd;
> char **watches; // names of files being watched
> const char *args[5];
> + char *opt_x_str;
> +
> + opts = getopt32(argv, "x:", &opt_x_str);
> + argc -= optind;
> + argv += optind;
>
> // sanity check: agent and at least one watch must be given
> - if (!argv[1] || !argv[2])
> + if (!argv[0] || !argv[1])
> bb_show_usage();
>
> - argv++;
> // inotify_add_watch will number watched files
> // starting from 1, thus watches[0] is unimportant,
> // and 1st file name is watches[1].
> @@ -190,7 +199,12 @@ int inotifyd_main(int argc, char **argv)
> args[1] = events;
> args[2] = watches[ie->wd];
> args[3] = ie->len ? ie->name : NULL;
> - spawn_and_wait((char **)args);
> + st = spawn_and_wait((char **)args);
> + if (opts & OPT_x) {
> + exp_st = xstrtol_range(opt_x_str, 10, 0, 255);
> + if (st == exp_st)
> + goto done;
> + }
> }
> // we are done if all files got final x event
> if (ie->mask & 0x8000) {
> --
> 2.1.4
>
More information about the busybox
mailing list