(wrong string) ünnich

From: <git_AT_suckless.org>
Date: Wed, 17 May 2017 20:26:18 +0200 (CEST)

commit 0e1a85d22485e2aac1b9930d1e3e0897a2076db3
Author: Bert Münnich <ber.t_AT_posteo.de>
AuthorDate: Wed May 17 20:14:36 2017 +0200
Commit: Bert Münnich <ber.t_AT_posteo.de>
CommitDate: Wed May 17 20:14:36 2017 +0200

    Read all available inotify events
    
    Loop reading from inotify fd in arl_handle(); requires non-blocking inotify fd.

diff --git a/autoreload_inotify.c b/autoreload_inotify.c
index 8e4d67a..a7378f6 100644
--- a/autoreload_inotify.c
+++ b/autoreload_inotify.c
_AT_@ -16,6 +16,7 @@
  * along with sxiv. If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <errno.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
_AT_@ -62,37 +63,41 @@ bool arl_handle(arl_t *arl, const char *filepath)
         char *ptr;
         const struct inotify_event *event;
 
- ssize_t len = read(arl->fd, buf, sizeof(buf));
+ for (;;) {
+ ssize_t len = read(arl->fd, buf, sizeof(buf));
 
- if (len == -1)
- return false;
-
- for (ptr = buf; ptr < buf + len; ptr += sizeof(*event) + event->len) {
- event = (const struct inotify_event*) ptr;
-
- /* events from watching the file itself */
- if (event->mask & IN_CLOSE_WRITE) {
- reload = true;
+ if (len == -1) {
+ if (errno == EINTR)
+ continue;
+ break;
                 }
- if (event->mask & IN_DELETE_SELF)
- arl_setup_dir(arl, filepath);
-
- /* events from watching the file's directory */
- if (event->mask & IN_CREATE) {
- char *fntmp = strdup(filepath);
- char *fn = basename(fntmp);
-
- if (STREQ(event->name, fn)) {
- /* this is the file we're looking for */
+ for (ptr = buf; ptr < buf + len; ptr += sizeof(*event) + event->len) {
+ event = (const struct inotify_event*) ptr;
 
- /* cleanup, this has not been one-shot */
- if (arl->watching_dir) {
- inotify_rm_watch(arl->fd, arl->wd);
- arl->watching_dir = false;
- }
+ /* events from watching the file itself */
+ if (event->mask & IN_CLOSE_WRITE) {
                                 reload = true;
                         }
- free(fntmp);
+ if (event->mask & IN_DELETE_SELF)
+ arl_setup_dir(arl, filepath);
+
+ /* events from watching the file's directory */
+ if (event->mask & IN_CREATE) {
+ char *fntmp = strdup(filepath);
+ char *fn = basename(fntmp);
+
+ if (STREQ(event->name, fn)) {
+ /* this is the file we're looking for */
+
+ /* cleanup, this has not been one-shot */
+ if (arl->watching_dir) {
+ inotify_rm_watch(arl->fd, arl->wd);
+ arl->watching_dir = false;
+ }
+ reload = true;
+ }
+ free(fntmp);
+ }
                 }
         }
         return reload;
_AT_@ -101,7 +106,7 @@ bool arl_handle(arl_t *arl, const char *filepath)
 void arl_init(arl_t *arl)
 {
         /* this needs to be done only once */
- arl->fd = inotify_init();
+ arl->fd = inotify_init1(IN_CLOEXEC | IN_NONBLOCK);
         arl->watching_dir = false;
         if (arl->fd == -1)
                 error(0, 0, "Could not initialize inotify, no automatic image reloading");
Received on Wed May 17 2017 - 20:26:18 CEST

This archive was generated by hypermail 2.3.0 : Wed May 17 2017 - 20:36:53 CEST