*
* Author: S. Piccardi Jan. 2003
*
- * $Id: DirMonitor.c,v 1.1 2003/01/03 23:16:05 piccardi Exp $
- *
*****************************************************************************/
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <dirent.h> /* directory */
-#include <stdlib.h> /* C standard library */
-#include <unistd.h>
+#include <sys/types.h> /* primitive system data types */
+#include <sys/stat.h> /* file characteristics constants and functions */
+#include <dirent.h> /* directory operation constants and functions */
+#include <stdlib.h> /* C standard library */
+#include <unistd.h> /* unix standard library */
+#include <string.h> /* C strings library */
#include "Gapil.h"
+#include "macros.h"
/* Help printing routine */
void usage(void);
/* computation function for DirScan */
int ComputeValues(struct dirent * direntry);
+void HandSIGTERM(int signo);
-/* global variable for shared memory segment */
-int shmid; /* Shared memory identifier */
+/* global variables for shared memory segment */
+struct DirProp {
+ int tot_size;
+ int tot_files;
+ int tot_regular;
+ int tot_fifo;
+ int tot_link;
+ int tot_dir;
+ int tot_block;
+ int tot_char;
+ int tot_sock;
+} *shmptr;
+key_t key;
+int mutex;
int main(int argc, char *argv[])
{
- int i;
- int mutex;
+ int i, pause = 10;
/*
* Input section: decode command line parameters
* Use getopt function
*/
opterr = 0; /* don't want writing to stderr */
- while ( (i = getopt(argc, argv, "hs:l:wrbf")) != -1) {
+ while ( (i = getopt(argc, argv, "hp:")) != -1) {
switch (i) {
/*
* Handling options
*/
- case 'h': /* help option */
+ case 'p': /* set pause (in sec.) */
+ pause = strtol(optarg, NULL, 10);
+ break;
+ case 'h': /* help option */
printf("Wrong -h option use\n");
usage();
return -1;
printf("Wrong number of arguments %d\n", argc - optind);
usage();
}
-
- DirScan(argv[1], ComputeValues);
- exit(0);
+ if (chdir(argv[1])) { /* chdir to be sure dir exist */
+ perror("Cannot find directory to monitor");
+ exit(1);
+ }
+ Signal(SIGTERM, HandSIGTERM); /* set handlers for termination */
+ Signal(SIGINT, HandSIGTERM);
+ Signal(SIGQUIT, HandSIGTERM);
+ key = ftok("~/gapil/sources/DirMonitor.c", 1); /* define a key, use dir */
+ shmptr = ShmCreate(key, 4096, 0666, 0); /* get a shared memory segment */
+ if (!shmptr) {
+ perror("Cannot create shared memory");
+ exit(1);
+ }
+ if ((mutex = MutexCreate(key)) == -1) { /* get a Mutex */
+ perror("Cannot create mutex");
+ exit(1);
+ }
+ /* main loop, monitor directory properties each 10 sec */
+ daemon(1, 0); /* demonize process, staying in monitored dir */
+ while (1) {
+ MutexLock(mutex); /* lock shared memory */
+ memset(shmptr, 0, sizeof(struct DirProp)); /* erase previous data */
+ DirScan(argv[1], ComputeValues); /* execute scan */
+ MutexUnlock(mutex); /* unlock shared memory */
+ sleep(pause); /* sleep until next watch */
+ }
}
/*
- * Routine to print file name and size inside DirScan
+ * Routine to compute directory properties inside DirScan
*/
-int do_ls(struct dirent * direntry)
+int ComputeValues(struct dirent * direntry)
{
struct stat data;
stat(direntry->d_name, &data); /* get stat data */
- printf("File: %s \t size: %d\n", direntry->d_name, data.st_size);
+ shmptr->tot_size += data.st_size;
+ shmptr->tot_files++;
+ if (S_ISREG(data.st_mode)) shmptr->tot_regular++;
+ if (S_ISFIFO(data.st_mode)) shmptr->tot_fifo++;
+ if (S_ISLNK(data.st_mode)) shmptr->tot_link++;
+ if (S_ISDIR(data.st_mode)) shmptr->tot_dir++;
+ if (S_ISBLK(data.st_mode)) shmptr->tot_block++;
+ if (S_ISCHR(data.st_mode)) shmptr->tot_char++;
+ if (S_ISSOCK(data.st_mode)) shmptr->tot_sock++;
return 0;
}
/*
void usage(void) {
printf("Program myls: list file in a directory \n");
printf("Usage:\n");
- printf(" myls [-h] dirname \n");
+ printf(" DirMonitor [-h] [-p sec] dirname \n");
printf(" -h print this help\n");
+ printf(" -p sec set watch interval to sec seconds \n");
exit(1);
}
+/*
+ * Signal Handler to manage termination
+ */
+void HandSIGTERM(int signo) {
+ MutexLock(mutex);
+ debug("Terminated by %s\n", strsignal(signo));
+ ShmRemove(key, shmptr);
+ MutexRemove(mutex);
+ exit(0);
+}