diff options
-rw-r--r-- | datatypes.h | 2 | ||||
-rw-r--r-- | rhdropbox.c | 53 |
2 files changed, 41 insertions, 14 deletions
diff --git a/datatypes.h b/datatypes.h index 36d018b..1168ec6 100644 --- a/datatypes.h +++ b/datatypes.h @@ -42,7 +42,7 @@ typedef struct buffer_struct buffer_t; struct read_buffer_struct { u_int32_t offset; - u_int8_t buf[100]; + u_int8_t buf[1024]; }; typedef struct read_buffer_struct read_buffer_t; diff --git a/rhdropbox.c b/rhdropbox.c index bbf4509..2478616 100644 --- a/rhdropbox.c +++ b/rhdropbox.c @@ -35,6 +35,7 @@ #include "daemon.h" #include "utils.h" +#include "sysexec.h" enum cmd_id_enum { ADD, REMOVE, STATUS, LOG, LISTEN }; typedef enum cmd_id_enum cmd_id_t; @@ -58,16 +59,29 @@ int send_response(int fd, const char* response) return ret; } -int process_watch(int inotify_fd) +int process_watch(int inotify_fd, read_buffer_t* buffer, options_t* opt) { - log_printf(INFO, "something changed on watch descriptor '%d'", inotify_fd); - u_int8_t buf[1000]; - int ret = read(inotify_fd, buf, 1000); - if(ret < 0) { - log_printf(ERROR, "read inotify_fd error: %s", strerror(errno)); - return ret; - } + log_printf(DEBUG, "something changed on watch descriptor '%d'", inotify_fd); + + int ret = 0; + for(;;) { + ret = read(inotify_fd, &buffer->buf[buffer->offset], sizeof(buffer->buf) - buffer->offset); + if(!ret) { + log_printf(ERROR, "read from inotfiy fd returned end of file!?"); + return -1; + } + if(ret == -1 && errno == EAGAIN) + return 0; + else if(ret < 0) + return ret; + buffer->offset += ret; + for(;;) { + if(buffer->offset >= sizeof(struct inotify_event)) { + struct inotify_event* event; + event = (struct inotify_event*)buffer->buf; + u_int32_t len = sizeof(struct inotify_event) + event->len; + if(buffer->offset >= len) { /* client_t* client; */ /* int listener_cnt = 0; */ /* for(client = client_lst; client; client = client->next) */ @@ -76,8 +90,21 @@ int process_watch(int inotify_fd) /* listener_cnt++; */ /* } */ /* log_printf(DEBUG, "sent status to %d additional listeners", listener_cnt); */ - - log_printf(DEBUG, "received %d bytes from watch", ret); + log_printf(DEBUG, "received event for %d (mask=0x%08X, cookie=0x%08X name[%u]='%s')", + event->wd, event->mask, event->cookie, event->len, event->len > 0 ? event->name : ""); + + if(buffer->offset > len) { + memmove(buffer->buf, &buffer->buf[len], buffer->offset - len); + buffer->offset -= len; + } + else + buffer->offset = 0; + } + } + else + break; + } + } return 0; } @@ -254,8 +281,8 @@ int main_loop(int cmd_listen_fd, int inotify_fd, options_t* opt) int max_fd = (cmd_listen_fd < inotify_fd) ? inotify_fd : cmd_listen_fd; client_t* client_lst = NULL; - read_buffer_t switch_buffer; - switch_buffer.offset = 0; + read_buffer_t event_buffer; + event_buffer.offset = 0; watch_list_t watch_lst; watch_list_init(&watch_lst); @@ -287,7 +314,7 @@ int main_loop(int cmd_listen_fd, int inotify_fd, options_t* opt) } if(FD_ISSET(inotify_fd, &tmpfds)) { - return_value = process_watch(inotify_fd); + return_value = process_watch(inotify_fd, &event_buffer, opt); if(return_value) break; } |