diff --git a/ntp_signd.c b/ntp_signd.c index 0d88d7b..6328b61 100644 --- a/ntp_signd.c +++ b/ntp_signd.c @@ -235,7 +235,7 @@ read_write_socket(int sock_fd, int event, void *anything) return; /* Disable output and wait for a response */ - SCH_SetFileHandlerEvents(sock_fd, SCH_FILE_INPUT); + SCH_SetFileHandlerEvent(sock_fd, SCH_FILE_OUTPUT, 0); } if (event == SCH_FILE_INPUT) { @@ -283,7 +283,7 @@ read_write_socket(int sock_fd, int event, void *anything) /* Move the head and enable output for the next packet */ queue_head = NEXT_QUEUE_INDEX(queue_head); if (!IS_QUEUE_EMPTY()) - SCH_SetFileHandlerEvents(sock_fd, SCH_FILE_INPUT | SCH_FILE_OUTPUT); + SCH_SetFileHandlerEvent(sock_fd, SCH_FILE_OUTPUT, 1); } } @@ -369,7 +369,7 @@ NSD_SignAndSendPacket(uint32_t key_id, NTP_Packet *packet, NTP_Remote_Address *r /* Enable output if there was no pending request */ if (IS_QUEUE_EMPTY()) - SCH_SetFileHandlerEvents(sock_fd, SCH_FILE_INPUT | SCH_FILE_OUTPUT); + SCH_SetFileHandlerEvent(sock_fd, SCH_FILE_OUTPUT, 1); queue_tail = NEXT_QUEUE_INDEX(queue_tail); diff --git a/sched.c b/sched.c index 21b55a7..45ef11c 100644 --- a/sched.c +++ b/sched.c @@ -219,13 +219,16 @@ SCH_RemoveFileHandler(int fd) /* ================================================== */ void -SCH_SetFileHandlerEvents(int fd, int events) +SCH_SetFileHandlerEvent(int fd, int event, int enable) { FileHandlerEntry *ptr; - assert(events); ptr = ARR_GetElement(file_handlers, fd); - ptr->events = events; + + if (enable) + ptr->events |= event; + else + ptr->events &= ~event; } /* ================================================== */ diff --git a/sched.h b/sched.h index bfb6169..5ff53c7 100644 --- a/sched.h +++ b/sched.h @@ -60,7 +60,7 @@ extern void SCH_Finalise(void); /* Register a handler for when select goes true on a file descriptor */ extern void SCH_AddFileHandler(int fd, int events, SCH_FileHandler handler, SCH_ArbitraryArgument arg); extern void SCH_RemoveFileHandler(int fd); -extern void SCH_SetFileHandlerEvents(int fd, int events); +extern void SCH_SetFileHandlerEvent(int fd, int event, int enable); /* Get the time stamp taken after a file descriptor became ready or a timeout expired */ extern void SCH_GetLastEventTime(struct timespec *cooked, double *err, struct timespec *raw);