Refactoring.
This commit is contained in:
parent
fda61d7522
commit
02edbf8e44
141
adhocify.c
141
adhocify.c
@ -1,5 +1,7 @@
|
|||||||
//The author disclaims copyright to this source code.
|
/*The author disclaims copyright to this source code: Public domain.
|
||||||
// adhocify at quitesimple period org
|
* Do whatever you want with it.
|
||||||
|
* Contact: adhocify at quitesimple period org
|
||||||
|
*/
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -19,7 +21,8 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fnmatch.h>
|
#include <fnmatch.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#define BUF_SIZE (sizeof(struct inotify_event) * 1024) + 255
|
#include <linux/limits.h>
|
||||||
|
#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 )
|
||||||
|
|
||||||
struct watchlistentry
|
struct watchlistentry
|
||||||
@ -45,9 +48,12 @@ struct ignorelist *ignorelist_head = NULL;
|
|||||||
struct ignorelist **ignorelist_current = &ignorelist_head;
|
struct ignorelist **ignorelist_current = &ignorelist_head;
|
||||||
|
|
||||||
|
|
||||||
/* Write once globals */
|
/* Write once globals. Set from process_arguments*/
|
||||||
bool silent = false;
|
bool silent = false;
|
||||||
bool noappend = false;
|
bool noappend = false;
|
||||||
|
bool fromstdin = false;
|
||||||
|
bool forkbombcheck = true;
|
||||||
|
bool daemonize = false;
|
||||||
uint32_t mask = 0;
|
uint32_t mask = 0;
|
||||||
char *prog = NULL;
|
char *prog = NULL;
|
||||||
char *path_logfile = NULL;
|
char *path_logfile = NULL;
|
||||||
@ -176,7 +182,7 @@ void watchqueue_addpath(const char *pathname)
|
|||||||
watchlist= &e->next;
|
watchlist= &e->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
void start_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)
|
||||||
{
|
{
|
||||||
@ -401,35 +407,18 @@ static struct option long_options[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void parse_options(int argc, char **argv)
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
{
|
||||||
uint32_t optmask = 0;
|
|
||||||
bool fromstdin = false;
|
|
||||||
bool forkbombcheck = true;
|
|
||||||
int ifd;
|
|
||||||
char *watchpath = NULL;
|
char *watchpath = NULL;
|
||||||
|
|
||||||
if(argc < 2)
|
|
||||||
{
|
|
||||||
print_usage();
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
signal(SIGCHLD, SIG_IGN);
|
|
||||||
|
|
||||||
int option;
|
int option;
|
||||||
int option_index;
|
int option_index;
|
||||||
|
uint32_t optmask = 0;
|
||||||
while((option = getopt_long(argc, argv, "absdo:w:m:l:i:", long_options, &option_index)) != -1)
|
while((option = getopt_long(argc, argv, "absdo:w:m:l:i:", long_options, &option_index)) != -1)
|
||||||
{
|
{
|
||||||
switch(option)
|
switch(option)
|
||||||
{
|
{
|
||||||
case 'd':
|
case 'd':
|
||||||
if(daemon(0,0) == -1)
|
daemonize = true;
|
||||||
{
|
|
||||||
perror("daemon");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
path_logfile = optarg;
|
path_logfile = optarg;
|
||||||
@ -467,18 +456,6 @@ int main(int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fromstdin)
|
|
||||||
queue_watches_from_stdin();
|
|
||||||
|
|
||||||
if(watchlist_head == NULL)
|
|
||||||
{
|
|
||||||
watchpath = get_cwd();
|
|
||||||
watchqueue_addpath(watchpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(mask == 0)
|
|
||||||
mask |= IN_CLOSE_WRITE;
|
|
||||||
|
|
||||||
if(optind >= argc)
|
if(optind >= argc)
|
||||||
{
|
{
|
||||||
@ -487,10 +464,32 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
prog = argv[optind];
|
prog = argv[optind];
|
||||||
if(! file_exists(prog))
|
}
|
||||||
|
|
||||||
|
void process_options()
|
||||||
|
{
|
||||||
|
if(fromstdin)
|
||||||
|
queue_watches_from_stdin();
|
||||||
|
|
||||||
|
if(daemonize)
|
||||||
{
|
{
|
||||||
perror("file_exists");
|
if(daemon(0,0) == -1)
|
||||||
return false;
|
{
|
||||||
|
perror("daemon");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(watchlist_head == NULL)
|
||||||
|
watchqueue_addpath(get_cwd());
|
||||||
|
|
||||||
|
if(mask == 0)
|
||||||
|
mask |= IN_CLOSE_WRITE;
|
||||||
|
|
||||||
|
if(! prog || ! file_exists(prog))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "File %s does not exist", prog);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(path_logfile)
|
if(path_logfile)
|
||||||
@ -502,30 +501,52 @@ int main(int argc, char **argv)
|
|||||||
char *path_prog = xrealpath(prog, NULL);
|
char *path_prog = xrealpath(prog, NULL);
|
||||||
check_forkbomb(path_logfile, path_prog);
|
check_forkbomb(path_logfile, path_prog);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ifd = inotify_init();
|
void start_monitoring(int ifd)
|
||||||
start_watches(ifd, mask);
|
{
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
int len;
|
int len;
|
||||||
int offset =0;
|
int offset =0;
|
||||||
char buf[BUF_SIZE];
|
char buf[BUF_SIZE];
|
||||||
len = read(ifd, buf, BUF_SIZE);
|
len = read(ifd, buf, BUF_SIZE);
|
||||||
if(len == -1)
|
if(len == -1)
|
||||||
{
|
{
|
||||||
if(errno == EINTR)
|
if(errno == EINTR)
|
||||||
continue;
|
continue;
|
||||||
perror("read");
|
perror("read");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
while(offset < len)
|
while(offset < len)
|
||||||
{
|
{
|
||||||
|
|
||||||
struct inotify_event *event = (struct inotify_event *)&buf[offset];
|
struct inotify_event *event = (struct inotify_event *)&buf[offset];
|
||||||
handle_event(event);
|
handle_event(event);
|
||||||
offset+=sizeof(struct inotify_event) + event->len;
|
offset+=sizeof(struct inotify_event) + event->len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
if(argc < 2)
|
||||||
|
{
|
||||||
|
print_usage();
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
signal(SIGCHLD, SIG_IGN);
|
||||||
|
|
||||||
|
parse_options(argc, argv);
|
||||||
|
process_options();
|
||||||
|
|
||||||
|
int ifd = inotify_init();
|
||||||
|
if(ifd == -1)
|
||||||
|
{
|
||||||
|
perror("inotify_init");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
create_watches(ifd, mask);
|
||||||
|
start_monitoring(ifd);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user