add basic recursive watch support
This commit is contained in:
parent
64b55f3bfd
commit
a45a7a9acf
32
adhocify.c
32
adhocify.c
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2014 <adhocify@quitesimple.org>
|
* Copyright (c) 2014-2016 <adhocify@quitesimple.org>
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and distribute this software for any
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
@ -33,6 +33,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fnmatch.h>
|
#include <fnmatch.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
|
#include <ftw.h>
|
||||||
#include <linux/limits.h>
|
#include <linux/limits.h>
|
||||||
#define BUF_SIZE (sizeof(struct inotify_event) + NAME_MAX + 1) * 1024
|
#define BUF_SIZE (sizeof(struct inotify_event) + NAME_MAX + 1) * 1024
|
||||||
#define STREQ(s1,s2) ( strcmp(s1,s2) == 0 )
|
#define STREQ(s1,s2) ( strcmp(s1,s2) == 0 )
|
||||||
@ -210,6 +211,28 @@ void watchqueue_addpath(const char *pathname)
|
|||||||
watchlist= &e->next;
|
watchlist= &e->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int recursive_walker_callback(const char *path, const struct stat *sb,
|
||||||
|
int typeflag, struct FTW *ftwbuf)
|
||||||
|
|
||||||
|
{
|
||||||
|
if(typeflag == FTW_D)
|
||||||
|
{
|
||||||
|
watchqueue_addpath(path);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
void watchqueue_add_recursive(const char *pathname)
|
||||||
|
{
|
||||||
|
int walker = nftw(pathname, &recursive_walker_callback, 10, FTW_PHYS);
|
||||||
|
if(walker == -1)
|
||||||
|
{
|
||||||
|
perror("nftw");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void create_watches(int fd, uint32_t mask)
|
void create_watches(int fd, uint32_t mask)
|
||||||
{
|
{
|
||||||
for(struct watchlistentry *lkp = watchlist_head; lkp != NULL; lkp = lkp->next)
|
for(struct watchlistentry *lkp = watchlist_head; lkp != NULL; lkp = lkp->next)
|
||||||
@ -424,6 +447,7 @@ void print_usage()
|
|||||||
|
|
||||||
printf("--daemon, -d\t\t\tdaemonize\n");
|
printf("--daemon, -d\t\t\tdaemonize\n");
|
||||||
printf("--path, -w\t\t\tpath -- adds the specified path to the watchlist\n");
|
printf("--path, -w\t\t\tpath -- adds the specified path to the watchlist\n");
|
||||||
|
printf("--recursive, -r\t\t\tpath -- adds the specified path to the watchlist recursively (all subdirectories too)\n");
|
||||||
printf("--logfile, -o\t\t\tlogfile -- output goes here\n");
|
printf("--logfile, -o\t\t\tlogfile -- output goes here\n");
|
||||||
printf("--mask, -m\t\t\tmaskval -- inotify mask value. Can be specified multiple times, will be ORed.\n");
|
printf("--mask, -m\t\t\tmaskval -- inotify mask value. Can be specified multiple times, will be ORed.\n");
|
||||||
printf("--no-env, -a\t\t\tif specified, the inotify event which occured won't be passed to the script as an environment variable.\n");
|
printf("--no-env, -a\t\t\tif specified, the inotify event which occured won't be passed to the script as an environment variable.\n");
|
||||||
@ -479,7 +503,7 @@ void parse_options(int argc, char **argv)
|
|||||||
int option;
|
int option;
|
||||||
int option_index;
|
int option_index;
|
||||||
uint32_t optmask = 0;
|
uint32_t optmask = 0;
|
||||||
while((option = getopt_long(argc, argv, "absdo:w:m:l:i:e::", long_options, &option_index)) != -1)
|
while((option = getopt_long(argc, argv, "absdo:w:r:m:l:i:e::", long_options, &option_index)) != -1)
|
||||||
{
|
{
|
||||||
switch(option)
|
switch(option)
|
||||||
{
|
{
|
||||||
@ -501,6 +525,10 @@ void parse_options(int argc, char **argv)
|
|||||||
watchpath = optarg;
|
watchpath = optarg;
|
||||||
watchqueue_addpath(watchpath);
|
watchqueue_addpath(watchpath);
|
||||||
break;
|
break;
|
||||||
|
case 'r':
|
||||||
|
watchpath = optarg;
|
||||||
|
watchqueue_add_recursive(watchpath);
|
||||||
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
noenv=true;
|
noenv=true;
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user