finished monitor

This commit is contained in:
skilion 2015-09-11 11:02:07 +02:00
parent 482cd4be0b
commit 22b1107a10

View file

@ -34,19 +34,23 @@ struct Monitor
// map every watch descriptor to their dir // map every watch descriptor to their dir
private string[int] dirs; private string[int] dirs;
// map the inotify cookies of move_from events to their path // map the inotify cookies of move_from events to their path
private string[int] moveFromPaths; private string[int] cookieToPath;
// buffer to receive the inotify events // buffer to receive the inotify events
private void[] buffer; private void[] buffer;
void function(string path) onDirCreated; void function(string path) onDirCreated;
void function(string path) onDirDeleted;
void function(string path) onFileChanged; void function(string path) onFileChanged;
void function(string path) onFileDeleted; void function(string path) onDelete;
void function(string from, string to) onMove;
@disable this(this); @disable this(this);
void init() void init()
{ {
assert(onDirCreated);
assert(onFileChanged);
assert(onDelete);
assert(onMove);
fd = inotify_init(); fd = inotify_init();
if (fd == -1) throw new MonitorException("inotify_init failed"); if (fd == -1) throw new MonitorException("inotify_init failed");
buffer = new void[10000]; buffer = new void[10000];
@ -105,40 +109,49 @@ struct Monitor
if (length == -1) throw new MonitorException("read failed"); if (length == -1) throw new MonitorException("read failed");
int i = 0; int i = 0;
while ( i < length ) { while (i < length) {
inotify_event *event = cast(inotify_event*) &buffer[i]; inotify_event *event = cast(inotify_event*) &buffer[i];
if (event.mask & IN_IGNORED) { if (event.mask & IN_IGNORED) {
writeln(dirs);
writeln("ignored ", event.wd);
// forget the path associated to the watch descriptor // forget the path associated to the watch descriptor
dirs.remove(event.wd); dirs.remove(event.wd);
} else if (event.mask & IN_Q_OVERFLOW) { } else if (event.mask & IN_Q_OVERFLOW) {
writeln("Inotify overflow, events missing"); writeln("Inotify overflow, events missing");
assert(0);
} else if (event.mask & IN_MOVED_FROM) { } else if (event.mask & IN_MOVED_FROM) {
string path = getPath(event); string path = getPath(event);
moveFromPaths[event.cookie] = path; cookieToPath[event.cookie] = path;
writeln("moved from ", path); writeln("moved from ", path);
} else if (event.mask & IN_MOVED_TO) { } else if (event.mask & IN_MOVED_TO) {
string path = getPath(event); string path = getPath(event);
writeln("moved to ", path);
if (event.mask & IN_ISDIR) addRecursive(path); if (event.mask & IN_ISDIR) addRecursive(path);
auto from = event.cookie in cookieToPath;
if (from) {
cookieToPath.remove(event.cookie);
onMove(*from, path);
} else {
if (event.mask & IN_ISDIR) {
onDirCreated(path);
} else {
onFileChanged(path);
}
}
} else { } else {
if (event.mask & IN_ISDIR) { if (event.mask & IN_ISDIR) {
if (event.mask & IN_CREATE) { if (event.mask & IN_CREATE) {
string path = getPath(event); string path = getPath(event);
writeln("Directory created: ", path); addRecursive(path);
add(path); onDirCreated(path);
} else if (event.mask & IN_DELETE) { } else if (event.mask & IN_DELETE) {
string path = getPath(event); string path = getPath(event);
writeln("Directory deleted: ", path); onDelete(path);
} }
} else { } else {
if (event.mask & IN_ATTRIB || event.mask & IN_CLOSE_WRITE) { if (event.mask & IN_ATTRIB || event.mask & IN_CLOSE_WRITE) {
string path = getPath(event); string path = getPath(event);
writeln("File changed: ", path); onFileChanged(path);
} else if (event.mask & IN_DELETE) { } else if (event.mask & IN_DELETE) {
string path = getPath(event); string path = getPath(event);
writeln("File deleted: ", path); onDelete(path);
} }
} }
} }