From 290fec43c4316e4839690a7dce9fe716fa5fe501 Mon Sep 17 00:00:00 2001 From: FreeArtMan Date: Mon, 6 Apr 2015 20:28:09 +0900 Subject: +add event for file rename +add command line option parsing +debug mode +foreground mode --- dirwatch.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 78 insertions(+), 18 deletions(-) diff --git a/dirwatch.c b/dirwatch.c index 4671d4d..023791c 100644 --- a/dirwatch.c +++ b/dirwatch.c @@ -8,11 +8,10 @@ #include #include - -#define WATCH_DIR "/tmp" - #define BUF_SIZE (10 * (sizeof(struct inotify_event) + NAME_MAX + 1)) +int debug=0; + char *path2name( char *s ) { int i; @@ -23,7 +22,6 @@ char *path2name( char *s ) if ( s == NULL ) return NULL; - i = len; while ( i > 0 ) { @@ -66,7 +64,8 @@ void ftp_curl_upload( char *fpath, char *fevent, const char *u ) //printf("%s\n", path2name(f)); snprintf(buf, buf_size,"curl -T %s %s%s\n", fpath, u, fevent); system( buf ); - printf( "%s", buf ); + if (debug) + printf( "%s", buf ); } //takes str1+str2 and create new string with str1+str2 @@ -115,25 +114,85 @@ int main( int argc, char **argv ) char *p; ssize_t num_read; pid_t pid; + int daemonise=1; + //options to ge from argv char *watch_dir=NULL; char *send_url=NULL; - if ( argc != 3 ) + FILE *pid_f=NULL; + + //getopt stuff + int c; + + opterr = 0; + + while ( (c = getopt(argc, argv, "w:u:fd")) != -1 ) { - printf("%s [DIR_TO_WATCH] [CURL_URL_TO_UPLOAD]\n",argv[0]); - return 0; + switch ( c ) + { + //dir path to watch + case 'w': + watch_dir = optarg; + break; + //url to upload with curl + case 'u': + send_url = optarg; + break; + //dont daemonise + case 'f': + daemonise = 0; + break; + //debuging add some extra stuff to print + case 'd': + debug = 1; + break; + case '?': + printf("Run: %s [OPTIONS] ... \n", argv[0]); + printf("-w [DIR] watch dir\n"); + printf("-u [URL] url to upload\n"); + printf("-f foreground mode\n"); + printf("-d debug info\n"); + printf("-? show help\n"); + return -1; + break; + case ':': + printf("Missing options be carefull\n"); + break; + default: + printf("Unknown option\n"); + return -1; + } } - watch_dir = argv[1]; - send_url = argv[2]; + if ( watch_dir == NULL ) + { + printf("Need -w option\n"); + return -1; + } + if ( send_url == NULL ) + { + printf("Needed -u option\n"); + return -1; + } //make process daemon - if ( daemon(1,0) < -1 ) + if ( daemonise == 1 ) { - printf("Cannot become daemon\n"); - return -1; + if ( access( "/tmp/dirwatch.pid", F_OK ) != -1 ) + { + printf("PID file allready excists kill da process or rm file\n "); + return -1; + } + if ( daemon(1,0) < -1 ) + { + printf("Cannot become daemon\n"); + return -1; + } + pid_f = fopen("/tmp/dirwatch.pid","w"); + fprintf( pid_f, "%d", getpid() ); + fclose( pid_f ); } notify_fd = inotify_init(); @@ -144,10 +203,10 @@ int main( int argc, char **argv ) } //register dir to watch - fret = inotify_add_watch( notify_fd, watch_dir, IN_CREATE ); + fret = inotify_add_watch( notify_fd, watch_dir, IN_CREATE|IN_MOVED_TO ); if ( fret == -1 ) { - printf("Cannot add inotify watch\n"); + printf("Cannot add inotify watch %s\n", watch_dir); return -1; } @@ -171,11 +230,13 @@ int main( int argc, char **argv ) event = (struct inotify_event *)p; //if someone added file notify that - if (event->mask & IN_CREATE) + if ((event->mask & IN_CREATE) || + (event->mask & IN_MOVED_TO) ) { if ( !(event->mask & IN_ISDIR) ) { - printf("CREATE_FILE %s \n", event->name); + if (debug) + printf("CREATE_FILE|MOVED_TO %s \n", event->name); char *fpath = strncat_n( 1024, watch_dir, event->name ); if ( fpath != NULL ) ftp_curl_upload( fpath, event->name, send_url ); @@ -187,7 +248,6 @@ int main( int argc, char **argv ) } } - close( notify_fd ); return 0; -- cgit v1.2.3