3 * Copyright (C) 2002 Simone Piccardi
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or (at
8 * your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 /*****************************************************************************
23 * An example for shared memory use: monitor a directory status,
24 * saving data in a shared memory segment. This version use POSIX
27 * Author: S. Piccardi Jan. 2003
29 *****************************************************************************/
30 #include <sys/types.h> /* primitive system data types */
31 #include <sys/stat.h> /* file characteristics constants and functions */
32 #include <dirent.h> /* directory operation constants and functions */
33 #include <stdlib.h> /* C standard library */
34 #include <unistd.h> /* unix standard library */
35 #include <string.h> /* C strings library */
40 /* Help printing routine */
42 /* computation function for dir_scan */
43 int ComputeValues(struct dirent * direntry);
44 void HandSIGTERM(int signo);
46 /* global variables for shared memory segment */
61 int main(int argc, char *argv[])
66 * Input section: decode command line parameters
69 opterr = 0; /* don't want writing to stderr */
70 while ( (i = getopt(argc, argv, "hp:")) != -1) {
75 case 'p': /* set pause (in sec.) */
76 pause = strtol(optarg, NULL, 10);
78 case 'h': /* help option */
79 printf("Wrong -h option use\n");
83 case '?': /* unrecognized options */
84 printf("Unrecognized options -%c\n",optopt);
86 default: /* should not reached */
90 /* ***********************************************************
92 * Options processing completed
96 * ***********************************************************/
97 if ((argc - optind) != 1) { /* There must be remaing parameters */
98 printf("Wrong number of arguments %d\n", argc - optind);
101 if (chdir(argv[1])) { /* chdir to be sure dir exist */
102 perror("Cannot find directory to monitor");
105 Signal(SIGTERM, HandSIGTERM); /* set handlers for termination */
106 Signal(SIGINT, HandSIGTERM);
107 Signal(SIGQUIT, HandSIGTERM);
108 key = ftok("~/gapil/sources/DirMonitor.c", 1); /* define a key, use dir */
109 shmid = shmget(key, 4096, IPC_CREAT|0666); /* get a shared memory */
111 perror("Cannot create shared memory");
114 if ( (shmptr = shmat(shmid, NULL, 0)) == NULL ) { /* attach to process */
115 perror("Cannot attach segment");
118 if ((mutex = MutexCreate(key)) == -1) { /* get a Mutex */
119 perror("Cannot create mutex");
122 /* main loop, monitor directory properties each 10 sec */
123 daemon(1, 0); /* demonize process, staying in monitored dir */
125 MutexLock(mutex); /* lock shared memory */
126 memset(shmptr, 0, sizeof(struct DirProp)); /* erase previous data */
127 dir_scan(argv[1], ComputeValues); /* execute scan */
128 MutexUnlock(mutex); /* unlock shared memory */
129 sleep(pause); /* sleep until next watch */
133 * Routine to compute directory properties inside dir_scan
135 int ComputeValues(struct dirent * direntry)
138 stat(direntry->d_name, &data); /* get stat data */
139 shmptr->tot_size += data.st_size;
141 if (S_ISREG(data.st_mode)) shmptr->tot_regular++;
142 if (S_ISFIFO(data.st_mode)) shmptr->tot_fifo++;
143 if (S_ISLNK(data.st_mode)) shmptr->tot_link++;
144 if (S_ISDIR(data.st_mode)) shmptr->tot_dir++;
145 if (S_ISBLK(data.st_mode)) shmptr->tot_block++;
146 if (S_ISCHR(data.st_mode)) shmptr->tot_char++;
147 if (S_ISSOCK(data.st_mode)) shmptr->tot_sock++;
151 * routine to print usage info and exit
154 printf("Program myls: list file in a directory \n");
156 printf(" DirMonitor [-h] [-p sec] dirname \n");
157 printf(" -h print this help\n");
158 printf(" -p sec set watch interval to sec seconds \n");
162 * Signal Handler to manage termination
164 void HandSIGTERM(int signo) {
166 debug("Terminated by %s\n", strsignal(signo));
168 perror("Error detaching shared memory");
171 if (shmctl(shmid, IPC_RMID, NULL)) {
172 perror("Cannot remove shared memory segment");