From 1cbd9511f8f86a3201f0ac2383a226415de05584 Mon Sep 17 00:00:00 2001 From: niansa Date: Sun, 11 Oct 2020 12:11:56 +0200 Subject: [PATCH] Initial commit --- .gitmodules | 3 ++ a.out | Bin 0 -> 13320 bytes inotifyrun.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++ libcatch | 1 + test.sh | 1 + 5 files changed, 81 insertions(+) create mode 100644 .gitmodules create mode 100755 a.out create mode 100644 inotifyrun.c create mode 160000 libcatch create mode 100755 test.sh diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d6bef74 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "libcatch"] + path = libcatch + url = https://gitlab.com/niansa/libcatch.git diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..2af980b87f6404a4af7624042ea1de967b8b6ad8 GIT binary patch literal 13320 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 +#include +#include +#include +#include +#include +#include +#include +#include "libcatch/libcatch.h" + +struct fcmd_pair { + const char *fname; + const char *command; +}; +struct fcmdwatcher_pair { + struct fcmd_pair *pair; + int watcher; +}; + + +int main(int argc, char **argv) { + int inotifier; + libcatch_init(); + //int *p = NULL; *p = 1; //DEBUG + //*p = 1; //DEBUG + // Check arguments + if (argc == 1 || (argc - 1) % 2 != 0) { + // No arguments passed + printf("Usage: %s { }\n", argv[0]); + return EXIT_FAILURE; + } + // Initialise inotify + CATCH( + inotifier = inotify_init() + ); + // Get array of files and commands + libcatch_retry = 0; + struct fcmd_pair *assocs = (struct fcmd_pair *)(argv + 1); + struct fcmdwatcher_pair *assocs_watches = malloc((sizeof(struct fcmdwatcher_pair) * ((argc - 1) / 2)) + 1); + struct fcmdwatcher_pair *watcherpair_ptr; + CATCH(assocs_watches = malloc((sizeof(struct fcmdwatcher_pair) * ((argc - 1) / 2)) + 1)); + // Initlialise inotify further while checking if all files are actual files + libcatch_retry = 2; + for (struct fcmd_pair *thispair = assocs; *(char**)thispair; thispair++) { + // Check if file is an actual file + struct stat fname_stat; + stat(thispair->fname, &fname_stat); + if (S_ISDIR(fname_stat.st_mode)) { + fprintf(stderr, "'%s' is a directory and will be ignored.\n", thispair->fname); + continue; + } + // Initialise inotify further + watcherpair_ptr = &assocs_watches[thispair - assocs]; + watcherpair_ptr->pair = thispair; + CATCH( + watcherpair_ptr->watcher = inotify_add_watch(inotifier, thispair->fname, IN_OPEN) + ); + } + // Wait for events to occur + libcatch_retry = 1; + struct inotify_event thisevent; + while (1) { + // Read new event + CATCH( + read(inotifier, &thisevent, sizeof(thisevent) + NAME_MAX + 1) + ); + // Find associated event pair + for ( + watcherpair_ptr = assocs_watches; + watcherpair_ptr->watcher != thisevent.wd; + watcherpair_ptr++ + ); + // Run assiciated command + system(watcherpair_ptr->pair->command); + } +} diff --git a/libcatch b/libcatch new file mode 160000 index 0000000..4a7f680 --- /dev/null +++ b/libcatch @@ -0,0 +1 @@ +Subproject commit 4a7f680d19963b35c0688aa3dcf2ec4f06940ff9 diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..4dc7564 --- /dev/null +++ b/test.sh @@ -0,0 +1 @@ +#! /bin/true