int fr_event_list_time(struct timeval *when, fr_event_list_t *el);
int fr_event_fd_delete(fr_event_list_t *el, int fd);
-fr_event_fd_t *fr_event_fd_insert(fr_event_list_t *el, int fd,
- fr_event_fd_handler_t read,
- fr_event_fd_handler_t write,
- fr_event_fd_handler_t error,
- void *ctx);
+int fr_event_fd_insert(fr_event_list_t *el, int fd,
+ fr_event_fd_handler_t read,
+ fr_event_fd_handler_t write,
+ fr_event_fd_handler_t error,
+ void *ctx);
int fr_event_timer_delete(fr_event_list_t *el, fr_event_timer_t **parent);
int fr_event_timer_insert(fr_event_list_t *el,
* @param[in] write function to call when fd is writable.
* @param[in] error function to call when an error occurs on the fd.
* @param[in] ctx to pass to handler.
- * @return a handle to use for future deletion of the file descriptor event.
+ * @return
+ * - 0 on succes.
+ * - -1 on failure.
*/
-fr_event_fd_t *fr_event_fd_insert(fr_event_list_t *el, int fd,
- fr_event_fd_handler_t read,
- fr_event_fd_handler_t write,
- fr_event_fd_handler_t error,
- void *ctx)
+int fr_event_fd_insert(fr_event_list_t *el, int fd,
+ fr_event_fd_handler_t read,
+ fr_event_fd_handler_t write,
+ fr_event_fd_handler_t error,
+ void *ctx)
{
- int filter = 0;
- struct kevent evset[2];
- struct kevent *ev_p = evset;
- fr_event_fd_t *ef, find;
+ int filter = 0;
+ struct kevent evset[2];
+ struct kevent *ev_p = evset;
+ fr_event_fd_t *ef, find;
if (!el) {
fr_strerror_printf("Invalid argument: NULL event list");
- return NULL;
+ return -1;
}
if (!read && !write) {
fr_strerror_printf("Invalid arguments: NULL read and write callbacks");
- return NULL;
+ return -1;
}
if (fd < 0) {
fr_strerror_printf("Invalid arguments: Bad FD %i", fd);
- return NULL;
+ return -1;
}
if (el->exit) {
fr_strerror_printf("Event loop exiting");
- return NULL;
+ return -1;
}
memset(&find, 0, sizeof(find));
if (!ef) {
ef = talloc_zero(el, fr_event_fd_t);
if (!ef) {
- fr_strerror_printf("Failed allocating memory for FD");
- return NULL;
+ fr_strerror_printf("Out of memory");
+ return -1;
}
talloc_set_destructor(ef, _fr_event_fd_free);
el->num_fds++;
if (kevent(el->kq, evset, ev_p - evset, NULL, 0, NULL) < 0) {
fr_strerror_printf("Failed inserting event for FD %i: %s", fd, fr_syserror(errno));
talloc_free(ef);
- return NULL;
+ return -1;
}
ef->is_registered = true;
- return ef;
+ return 0;
}
/*
* All sockets: add the FD to the event handler.
*/
- if (!fr_event_fd_insert(el, this->fd, event_socket_handler, NULL, NULL, this)) {
+ if (fr_event_fd_insert(el, this->fd, event_socket_handler, NULL, NULL, this) < 0) {
ERROR("Failed adding event handler for socket: %s", fr_strerror());
fr_exit(1);
}
}
DEBUG4("Created signal pipe. Read end FD %i, write end FD %i", self_pipe[0], self_pipe[1]);
- if (!fr_event_fd_insert(el, self_pipe[0], event_signal_handler, NULL, NULL, el)) {
+ if (fr_event_fd_insert(el, self_pipe[0], event_signal_handler, NULL, NULL, el) < 0) {
ERROR("Failed creating signal pipe handler: %s", fr_strerror());
return -1;
}
exit(EXIT_FAILURE);
}
- if (!fr_event_fd_insert(events, self_pipe[0], rs_signal_action, NULL, NULL, events)) {
+ if (fr_event_fd_insert(events, self_pipe[0], rs_signal_action, NULL, NULL, events) < 0) {
ERROR("Failed inserting signal pipe descriptor: %s", fr_strerror());
goto finish;
}
event->out = out;
event->stats = stats;
- if (!fr_event_fd_insert(events, in_p->fd, rs_got_packet, NULL, NULL, event)) {
+ if (fr_event_fd_insert(events, in_p->fd, rs_got_packet, NULL, NULL, event) < 0) {
ERROR("Failed inserting file descriptor");
goto finish;
}
local_backlog = fr_heap_create(timestamp_cmp, offsetof(REQUEST, heap_id));
rad_assert(local_backlog != NULL);
- if (!fr_event_fd_insert(el, thread->pipe_fd[0], thread_fd_handler, NULL, NULL, thread)) {
+ if (fr_event_fd_insert(el, thread->pipe_fd[0], thread_fd_handler, NULL, NULL, thread) < 0) {
ERROR("Failed inserting event for self");
goto done;
}
ev->thread = frame->modcall.thread;
ev->ctx = ctx;
- if (!fr_event_fd_insert(request->el, fd, unlang_event_fd_handler, NULL, NULL, ev)) {
+ if (fr_event_fd_insert(request->el, fd, unlang_event_fd_handler, NULL, NULL, ev) < 0) {
talloc_free(ev);
return -1;
}
fcntl(session->pipefd[1], F_SETFL, O_NONBLOCK | FD_CLOEXEC);
#endif
- if (!fr_event_fd_insert(session->el, session->pipefd[0], bfd_pipe_recv, NULL, NULL, session)) {
+ if (fr_event_fd_insert(session->el, session->pipefd[0], bfd_pipe_recv, NULL, NULL, session) < 0) {
ERROR("Failed inserting file descriptor into event list: %s", fr_strerror());
goto close_pipes;
}
return -1;
}
- if (!fr_event_fd_insert(el, sockfd, mod_event_fd, NULL, NULL, conn)) {
+ if (fr_event_fd_insert(el, sockfd, mod_event_fd, NULL, NULL, conn) < 0) {
DEBUG("Failed adding event for socket: %s", fr_strerror());
close(sockfd);
return -1;
inst->log_fd = ub_fd(inst->ub);
if (inst->log_fd >= 0) {
- if (!fr_event_fd_insert(inst->el, inst->log_fd, ub_fd_handler, NULL, NULL, inst)) {
+ if (fr_event_fd_insert(inst->el, inst->log_fd, ub_fd_handler, NULL, NULL, inst) < 0) {
cf_log_err_cs(conf, "could not insert async fd");
inst->log_fd = -1;
goto error_nores;