./ MultiCS.r69 / th-cfg.c
///////////////////////////////////////////////////////////////////////////////
// THREAD REREAD CONFIG
///////////////////////////////////////////////////////////////////////////////
#ifdef INOTIFY
#include "inotify/inotify.h"
#include "inotify/inotify-syscalls.h"
#else
#include <sys/inotify.h>
#endif
/*
static void displayInotifyEvent(struct inotify_event *i)
{
printf(" wd =%2d; ", i->wd);
if (i->cookie > 0)
printf("cookie =%4d; ", i->cookie);
printf("mask = ");
if (i->mask & IN_ACCESS) printf("IN_ACCESS ");
if (i->mask & IN_ATTRIB) printf("IN_ATTRIB ");
if (i->mask & IN_CLOSE_NOWRITE) printf("IN_CLOSE_NOWRITE ");
if (i->mask & IN_CLOSE_WRITE) printf("IN_CLOSE_WRITE ");
if (i->mask & IN_CREATE) printf("IN_CREATE ");
if (i->mask & IN_DELETE) printf("IN_DELETE ");
if (i->mask & IN_DELETE_SELF) printf("IN_DELETE_SELF ");
if (i->mask & IN_IGNORED) printf("IN_IGNORED ");
if (i->mask & IN_ISDIR) printf("IN_ISDIR ");
if (i->mask & IN_MODIFY) printf("IN_MODIFY ");
if (i->mask & IN_MOVE_SELF) printf("IN_MOVE_SELF ");
if (i->mask & IN_MOVED_FROM) printf("IN_MOVED_FROM ");
if (i->mask & IN_MOVED_TO) printf("IN_MOVED_TO ");
if (i->mask & IN_OPEN) printf("IN_OPEN ");
if (i->mask & IN_Q_OVERFLOW) printf("IN_Q_OVERFLOW ");
if (i->mask & IN_UNMOUNT) printf("IN_UNMOUNT ");
printf("\n");
if (i->len > 0)
printf(" name = %s\n", i->name);
}
*/
void *reread_config_thread(void *param)
{
prg.pid_cfg = syscall(SYS_gettid);
prg.tid_cfg = pthread_self();
init_config(&cfg);
read_config(&cfg);
//check for config data
if ( check_config(&cfg) ) return -1;
cfg_set_id_counters(&cfg);
int fd = inotify_init(); //1(IN_NONBLOCK);
while (1) {
struct filename_data *fs = cfg.files;
while (fs) {
fs->wd = inotify_add_watch(fd,fs->name, IN_CLOSE_WRITE|IN_IGNORED);
fs = fs->next;
}
struct inotify_event *event;
char buf[1024];
int changed = 0;
do {
int len = read(fd,buf,1024);
int i = 0;
while (i<len) {
event = (struct inotify_event *) &buf[i];
struct filename_data *fs = cfg.files;
while (fs) {
if (event->wd==fs->wd) {
if (event->mask & IN_CLOSE_WRITE) changed = 1;
if (event->mask & IN_IGNORED) {
inotify_rm_watch(fd, fs->wd);
fs->wd = inotify_add_watch(fd,fs->name, IN_CLOSE_WRITE|IN_IGNORED);
}
break;
}
fs = fs->next;
}
i += sizeof(struct inotify_event) + event->len;
}
usleep(30000);
} while (!changed);
if (changed) {
debugf(getdbgflag(DBG_CONFIG,0,0)," Config file Changed...\n");
struct filename_data *fs = cfg.files;
while (fs) {
inotify_rm_watch(fd, fs->wd);
fs = fs->next;
}
free_filenames( &cfg );
reread_config(&cfg);
check_config(&cfg);
cfg_set_id_counters(&cfg);
}
}
}
int start_thread_config()
{
create_prio_thread(&prg.tid_cfg, (threadfn)reread_config_thread,NULL,50);
return 0;
}