summaryrefslogtreecommitdiffstats
path: root/c_pgms/inotify.c
blob: 42a20d02439d2e12671f4a9e9d138c5f9a0ab4b2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <sys/inotify.h>
/* This will watch for any new arrivals at TARGET directory and if found,it will invoke the SANITY_TEST script. */

#define TARGET "/home/raghavendrabhat/nightly_sanity"

#define MAIL "mutt -a /home/raghavendrabhat/result/logs* -s \"Sanity test for date `date +%F`\" -i /home/raghavendrabhat/nightly_sanity/tests_failed* dl-qa@gluster.com <."

void get_event (int fd, const char * target);


/* ----------------------------------------------------------------- */

int main (int argc, char *argv[])
{
   char target[FILENAME_MAX];
   int result;
   int fd;
   int wd;   /* watch descriptor */

   if (argc < 2) {
      strcpy (target,TARGET);
	
   }
   else {
      fprintf (stderr, "Watching %s\n", TARGET);
      strcpy (target, TARGET);
   }

   fd = inotify_init();
   if (fd < 0) {
      fprintf (stderr, "Error: %s\n", strerror(errno));
      return 1;
   }
   
   wd = inotify_add_watch (fd, target, IN_ALL_EVENTS);
   if (wd < 0) {
      fprintf (stderr, "Error: %s\n", strerror(errno));
      return 1;
   }
   
   daemon (0,0);
   while (1) {
      get_event(fd, target);
   }

   return 0;
}

/* ----------------------------------------------------------------- */
/* Allow for 1024 simultanious events */
#define BUFF_SIZE ((sizeof(struct inotify_event)+FILENAME_MAX)*1024)

void get_event (int fd, const char * target)
{
   ssize_t len, i = 0;
   int status;
   char action[81+FILENAME_MAX] = {0};
   char buff[BUFF_SIZE] = {0};

   len = read (fd, buff, BUFF_SIZE);
   
   while (i < len) {
      struct inotify_event *pevent = (struct inotify_event *)&buff[i];
      char action[81+FILENAME_MAX] = {0};

      if (pevent->len) 
         strcpy (action, pevent->name);
      else
         strcpy (action, target);
    
      if (pevent->mask & IN_CLOSE_WRITE){ 
	strcat(action, " opened for writing was closed");
	system(MAIL);
	system("rm /home/raghavendrabhat/nightly_sanity/tests_failed*");
	system ("rm /home/raghavendrabhat/result/*");
      }
      //  printf ("%s\n", action);
      i += sizeof(struct inotify_event) + pevent->len;
   }
}  /* get_event */