static void logger_free(struct logger* l);
static int parse_args(int argc, char ** argv, struct buffering * b);
static int socket_initialize(struct sock_data * sock, struct log_buffer * buffer, int type, struct socket_config_data * data, int epoll_fd);
-static void fd_change_flag(int fd, int flag, int set);
+static void fd_set_flags(int fd, int mask);
+static void fd_clear_flags(int fd, int mask);
static void help();
/** signals handled to flush all buffered logs before exit */
free(w);
return -errno;
}
- fd_change_flag(w->working_fd, O_NONBLOCK, 1);
+ fd_set_flags(w->working_fd, O_NONBLOCK);
w->service_writer = service_writer_syslog;
w->buf_ptr = log_buffer;
}
/**
- * @brief Change FD flag
- * @details Set or clear a file descriptor's flag
- * @param[in] fd The FD whose flags to change
- * @param[in] flag The flag to change
- * @param[in] set Whether to set or to clear
+ * @brief Set FD flags
+ * @details Set a file descriptor's flags
+ * @param[in] fd The FD whose flags to set
+ * @param[in] mask The flags to set
*/
-static void fd_change_flag(int fd, int flag, int set)
+static void fd_set_flags(int fd, int mask)
{
- int flags = fcntl(fd, F_GETFL);
-
- if (set)
- flags |= flag;
- else
- flags &= ~flag;
+ fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | mask);
+}
- fcntl(fd, F_SETFL, flags);
+/**
+ * @brief Clear FD flags
+ * @details Clear a file descriptor's flags
+ * @param[in] fd The FD whose flags to clear
+ * @param[in] mask The flags to clear
+ */
+static void fd_clear_flags(int fd, int mask)
+{
+ fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~mask);
}
/**
wr->event.data.ptr = wr;
wr->event.events = EPOLLIN;
- fd_change_flag(pipe_fd[1], O_NONBLOCK, 0);
+ fd_clear_flags(pipe_fd[1], O_NONBLOCK);
fcntl(pipe_fd[1], F_SETPIPE_SZ, PIPE_REQUESTED_SIZE);
r = add_fd_loop(server->epollfd, pipe_fd[0], &wr->event);