return 0;
}
-static void signal_cb(struct kmscon_fd *fd, void *data)
+static void signal_cb(struct kmscon_fd *fd, int mask, void *data)
{
struct kmscon_signal *sig = data;
struct signalfd_siginfo signal_info;
int len;
- len = read(fd->fd, &signal_info, sizeof(signal_info));
- if (len != sizeof(signal_info)) {
- log_warning("eloop: cannot read signalfd\n");
- return;
+ if (mask & KMSCON_READABLE) {
+ len = read(fd->fd, &signal_info, sizeof(signal_info));
+ if (len != sizeof(signal_info))
+ log_warning("eloop: cannot read signalfd\n");
+ else
+ sig->cb(sig, signal_info.ssi_signo, sig->data);
}
-
- sig->cb(sig, signal_info.ssi_signo, sig->data);
}
int kmscon_eloop_add_signal(struct kmscon_eloop *loop,
if (ep[i].events & EPOLLHUP)
mask |= KMSCON_HUP;
- fd->cb(fd, fd->data);
+ fd->cb(fd, mask, fd->data);
}
loop->cur_fds = NULL;
struct kmscon_signal;
typedef void (*kmscon_idle_cb) (struct kmscon_idle *idle, void *data);
-typedef void (*kmscon_fd_cb) (struct kmscon_fd *fd, void *data);
+typedef void (*kmscon_fd_cb) (struct kmscon_fd *fd, int mask, void *data);
typedef void (*kmscon_signal_cb)
(struct kmscon_signal *sig, int signum, void *data);