mirror of https://github.com/octoleo/lsyncd.git
working on fsevents
This commit is contained in:
parent
84b513707b
commit
21b355ef75
123
fsevents.c
123
fsevents.c
|
@ -101,7 +101,7 @@ static const luaL_reg lfseventslib[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* event names */
|
/* event names */
|
||||||
static const char *eventNames[FSE_MAX_EVENTS] = {
|
/*static const char *eventNames[FSE_MAX_EVENTS] = {
|
||||||
"CREATE_FILE",
|
"CREATE_FILE",
|
||||||
"DELETE",
|
"DELETE",
|
||||||
"STAT_CHANGED",
|
"STAT_CHANGED",
|
||||||
|
@ -113,7 +113,7 @@ static const char *eventNames[FSE_MAX_EVENTS] = {
|
||||||
"CHOWN",
|
"CHOWN",
|
||||||
"XATTR_MODIFIED",
|
"XATTR_MODIFIED",
|
||||||
"XATTR_REMOVED",
|
"XATTR_REMOVED",
|
||||||
};
|
};*/
|
||||||
|
|
||||||
/* argument names*/
|
/* argument names*/
|
||||||
/*static const char *argNames[] = {
|
/*static const char *argNames[] = {
|
||||||
|
@ -148,11 +148,11 @@ handle_event(lua_State *L, struct kfs_event *event, ssize_t mlen)
|
||||||
/* the len of the event */
|
/* the len of the event */
|
||||||
ssize_t len = sizeof(int32_t) + sizeof(pid_t);
|
ssize_t len = sizeof(int32_t) + sizeof(pid_t);
|
||||||
|
|
||||||
bool expect_path = false;
|
int32_t atype;
|
||||||
bool expect_trg = false;
|
|
||||||
|
|
||||||
const char *path = NULL;
|
const char *path = NULL;
|
||||||
const char *trg = NULL;
|
const char *trg = NULL;
|
||||||
|
const char *etype = NULL;
|
||||||
|
int isdir = -1;
|
||||||
|
|
||||||
if (event->type == FSE_EVENTS_DROPPED) {
|
if (event->type == FSE_EVENTS_DROPPED) {
|
||||||
logstring("Fsevents", "Events dropped!");
|
logstring("Fsevents", "Events dropped!");
|
||||||
|
@ -166,36 +166,24 @@ handle_event(lua_State *L, struct kfs_event *event, ssize_t mlen)
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
int32_t atype = event->type & FSE_TYPE_MASK;
|
atype = event->type & FSE_TYPE_MASK;
|
||||||
uint32_t aflags = FSE_GET_FLAGS(event->type);
|
/*uint32_t aflags = FSE_GET_FLAGS(event->type);*/
|
||||||
|
|
||||||
if ((atype < FSE_MAX_EVENTS) && (atype >= -1)) {
|
if ((atype < FSE_MAX_EVENTS) && (atype >= -1)) {
|
||||||
printlogf(L, "Fsevents", "got event %s", eventNames[atype]);
|
/*printlogf(L, "Fsevents", "got event %s", eventNames[atype]);
|
||||||
if (aflags & FSE_COMBINED_EVENTS) {
|
if (aflags & FSE_COMBINED_EVENTS) {
|
||||||
logstring("Fsevents", "combined events");
|
logstring("Fsevents", "combined events");
|
||||||
}
|
}
|
||||||
if (aflags & FSE_CONTAINS_DROPPED_EVENTS) {
|
if (aflags & FSE_CONTAINS_DROPPED_EVENTS) {
|
||||||
logstring("Fsevents", "contains dropped events");
|
logstring("Fsevents", "contains dropped events");
|
||||||
}
|
}*/
|
||||||
} else {
|
} else {
|
||||||
printlogf(L, "Error", "unknown event(%d) in fsevents.",
|
printlogf(L, "Error", "unknown event(%d) in fsevents.",
|
||||||
atype);
|
atype);
|
||||||
exit(-1); // ERRNO
|
exit(-1); // ERRNO
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(atype) {
|
|
||||||
case FSE_RENAME :
|
|
||||||
expect_trg = true;
|
|
||||||
/* fallthrough */
|
|
||||||
case FSE_CONTENT_MODIFIED :
|
|
||||||
case FSE_CREATE_FILE :
|
|
||||||
case FSE_CREATE_DIR :
|
|
||||||
case FSE_DELETE :
|
|
||||||
expect_path = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
/* assigns the expected arguments */
|
/* assigns the expected arguments */
|
||||||
struct kfs_event_arg *arg = event->args;
|
struct kfs_event_arg *arg = event->args;
|
||||||
|
@ -208,10 +196,33 @@ handle_event(lua_State *L, struct kfs_event *event, ssize_t mlen)
|
||||||
|
|
||||||
switch (arg->type) {
|
switch (arg->type) {
|
||||||
case FSE_ARG_STRING :
|
case FSE_ARG_STRING :
|
||||||
if (expect_path && !path) {
|
switch(atype) {
|
||||||
path = (char *)&arg->data.str;
|
case FSE_RENAME :
|
||||||
} else if (expect_trg && path) {
|
if (path) {
|
||||||
trg = (char *)&arg->data.str;
|
/* for move events second string is target */
|
||||||
|
trg = (char *) &arg->data.str;
|
||||||
|
}
|
||||||
|
/* fallthrough */
|
||||||
|
case FSE_CHOWN :
|
||||||
|
case FSE_CONTENT_MODIFIED :
|
||||||
|
case FSE_CREATE_FILE :
|
||||||
|
case FSE_CREATE_DIR :
|
||||||
|
case FSE_DELETE :
|
||||||
|
case FSE_STAT_CHANGED :
|
||||||
|
if (!path) {
|
||||||
|
path = (char *)&arg->data.str;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FSE_ARG_MODE :
|
||||||
|
switch(atype) {
|
||||||
|
case FSE_CHOWN :
|
||||||
|
case FSE_RENAME :
|
||||||
|
case FSE_DELETE :
|
||||||
|
case FSE_STAT_CHANGED :
|
||||||
|
isdir = arg->data.mode & S_IFDIR ? 1 : 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -222,11 +233,58 @@ handle_event(lua_State *L, struct kfs_event *event, ssize_t mlen)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (path) {
|
switch(atype) {
|
||||||
printlogf(L, "Fsevents", "path:%s", path);
|
case FSE_CHOWN :
|
||||||
|
case FSE_STAT_CHANGED :
|
||||||
|
etype = "Attrib";
|
||||||
|
break;
|
||||||
|
case FSE_CREATE_DIR :
|
||||||
|
etype = "Create";
|
||||||
|
isdir = 1;
|
||||||
|
break;
|
||||||
|
case FSE_CREATE_FILE :
|
||||||
|
etype = "Create";
|
||||||
|
isdir = 0;
|
||||||
|
break;
|
||||||
|
case FSE_DELETE :
|
||||||
|
etype = "Delete";
|
||||||
|
isdir = 0;
|
||||||
|
break;
|
||||||
|
case FSE_RENAME :
|
||||||
|
etype = "Move";
|
||||||
|
break;
|
||||||
|
case FSE_CONTENT_MODIFIED :
|
||||||
|
etype = "Modify";
|
||||||
|
isdir = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (trg) {
|
|
||||||
printlogf(L, "Fsevents", "trg:%s", trg);
|
if (etype) {
|
||||||
|
if (!path) {
|
||||||
|
printlogf(L, "Error",
|
||||||
|
"Internal fail, fsevents, no path.");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
if (isdir < 0) {
|
||||||
|
printlogf(L, "Error",
|
||||||
|
"Internal fail, fsevents, neither dir nor file.");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
load_runner_func(L, "fsEventsEvent");
|
||||||
|
lua_pushstring(L, etype);
|
||||||
|
lua_pushboolean(L, isdir);
|
||||||
|
l_now(L);
|
||||||
|
lua_pushstring(L, path);
|
||||||
|
if (trg) {
|
||||||
|
lua_pushstring(L, path);
|
||||||
|
} else {
|
||||||
|
lua_pushnil(L);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lua_pcall(L, 5, 0, -7)) {
|
||||||
|
exit(-1); // ERRNO
|
||||||
|
}
|
||||||
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
@ -320,6 +378,13 @@ open_fsevents(lua_State *L)
|
||||||
.fd = &fsevents_fd,
|
.fd = &fsevents_fd,
|
||||||
};
|
};
|
||||||
int fd = open(DEV_FSEVENTS, O_RDONLY);
|
int fd = open(DEV_FSEVENTS, O_RDONLY);
|
||||||
|
printlogf(L, "Warn",
|
||||||
|
"Using /dev/fsevents which is considered an OSX internal interface.");
|
||||||
|
printlogf(L, "Warn",
|
||||||
|
"Functionality might break across OSX versions");
|
||||||
|
printlogf(L, "Warn",
|
||||||
|
"A hanging Lsyncd might cause Spotlight/Timemachine doing extra work.");
|
||||||
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
printlogf(L, "Error",
|
printlogf(L, "Error",
|
||||||
"Cannot access %s monitor! (%d:%s)",
|
"Cannot access %s monitor! (%d:%s)",
|
||||||
|
|
4
lsyncd.c
4
lsyncd.c
|
@ -699,7 +699,7 @@ user_obs_tidy(struct observance *obs)
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void daemonize(lua_State *L);
|
static void daemonize(lua_State *L);
|
||||||
static int l_stackdump(lua_State* L);
|
int l_stackdump(lua_State* L);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs a message.
|
* Logs a message.
|
||||||
|
@ -1002,7 +1002,7 @@ l_realdir(lua_State *L)
|
||||||
/**
|
/**
|
||||||
* Dumps the LUA stack. For debugging purposes.
|
* Dumps the LUA stack. For debugging purposes.
|
||||||
*/
|
*/
|
||||||
static int
|
int
|
||||||
l_stackdump(lua_State* L)
|
l_stackdump(lua_State* L)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -1908,7 +1908,7 @@ local Fsevents = (function()
|
||||||
-- @param filename2
|
-- @param filename2
|
||||||
--
|
--
|
||||||
local function event(etype, isdir, time, filename, filename2)
|
local function event(etype, isdir, time, filename, filename2)
|
||||||
log("Fsevents", etype, isdir, time, filename, filename2)
|
log("Fsevents",etype,",",isdir,",",time,",",filename,",",filename2)
|
||||||
end
|
end
|
||||||
|
|
||||||
-----
|
-----
|
||||||
|
@ -2701,6 +2701,7 @@ end
|
||||||
-- Simply forwards it directly to the object.
|
-- Simply forwards it directly to the object.
|
||||||
--
|
--
|
||||||
runner.inotifyEvent = Inotify.event
|
runner.inotifyEvent = Inotify.event
|
||||||
|
runner.fsEventsEvent = Fsevents.event
|
||||||
|
|
||||||
-----
|
-----
|
||||||
-- Collector for every child process that finished in startup phase
|
-- Collector for every child process that finished in startup phase
|
||||||
|
|
Loading…
Reference in New Issue