mirror of
				https://github.com/optim-enterprises-bv/nDPId.git
				synced 2025-10-31 02:07:47 +00:00 
			
		
		
		
	Correctly handle EINTR while doing I/O..
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
This commit is contained in:
		
							
								
								
									
										11
									
								
								nDPId-test.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								nDPId-test.c
									
									
									
									
									
								
							| @@ -360,6 +360,10 @@ static void * nDPIsrvd_mainloop_thread(void * const arg) | ||||
|             logger(1, "%s", "nDPIsrvd epoll wait failed."); | ||||
|             THREAD_ERROR_GOTO(arg); | ||||
|         } | ||||
|         else if (errno == EINTR) | ||||
|         { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         for (int i = 0; i < nready; i++) | ||||
|         { | ||||
| @@ -374,7 +378,8 @@ static void * nDPIsrvd_mainloop_thread(void * const arg) | ||||
|                     if (remote == mock_json_desc) | ||||
|                     { | ||||
|                         remote_desc_name = "Mock JSON"; | ||||
|                         do { | ||||
|                         do | ||||
|                         { | ||||
|                             if (mock_test_desc->fd >= 0) | ||||
|                                 drain_write_buffers_blocking(mock_test_desc); | ||||
|                             if (mock_buff_desc->fd >= 0) | ||||
| @@ -906,6 +911,10 @@ static void * distributor_client_mainloop_thread(void * const arg) | ||||
|             logger(1, "%s", "Distributor epoll wait failed."); | ||||
|             THREAD_ERROR_GOTO(trv); | ||||
|         } | ||||
|         else if (nready < 0 && errno == EINTR) | ||||
|         { | ||||
|             continue; | ||||
|         } | ||||
|  | ||||
|         for (int i = 0; i < nready; i++) | ||||
|         { | ||||
|   | ||||
							
								
								
									
										29
									
								
								nDPIsrvd.c
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								nDPIsrvd.c
									
									
									
									
									
								
							| @@ -301,6 +301,7 @@ static void logger_nDPIsrvd(struct remote_desc const * const remote, | ||||
|  | ||||
| static int drain_main_buffer(struct remote_desc * const remote) | ||||
| { | ||||
|     ssize_t bytes_written; | ||||
|     struct nDPIsrvd_write_buffer * const write_buffer = get_write_buffer(remote); | ||||
|  | ||||
|     if (write_buffer == NULL) | ||||
| @@ -314,7 +315,7 @@ static int drain_main_buffer(struct remote_desc * const remote) | ||||
|     } | ||||
|  | ||||
|     errno = 0; | ||||
|     ssize_t bytes_written = write(remote->fd, write_buffer->buf.ptr.raw, write_buffer->buf.used); | ||||
|     while ((bytes_written = write(remote->fd, write_buffer->buf.ptr.raw, write_buffer->buf.used)) < 0 && errno == EINTR) { errno = 0; } | ||||
|     if (errno == EAGAIN) | ||||
|     { | ||||
|         return 0; | ||||
| @@ -358,8 +359,9 @@ static int drain_write_buffers(struct remote_desc * const remote) | ||||
|     while (utarray_len(additional_write_buffers) > 0) | ||||
|     { | ||||
|         struct nDPIsrvd_write_buffer * buf = (struct nDPIsrvd_write_buffer *)utarray_front(additional_write_buffers); | ||||
|         ssize_t written = write(remote->fd, buf->buf.ptr.raw + buf->written, buf->buf.used - buf->written); | ||||
|         ssize_t written; | ||||
|  | ||||
|         while ((written = write(remote->fd, buf->buf.ptr.raw + buf->written, buf->buf.used - buf->written)) < 0 && errno == EINTR) {} | ||||
|         switch (written) | ||||
|         { | ||||
|             case -1: | ||||
| @@ -732,6 +734,7 @@ static void free_remotes(int epollfd) | ||||
|  | ||||
| static int add_event(int epollfd, int events, int fd, void * ptr) | ||||
| { | ||||
|     int retval; | ||||
|     struct epoll_event event = {}; | ||||
|  | ||||
|     if (ptr != NULL) | ||||
| @@ -744,7 +747,8 @@ static int add_event(int epollfd, int events, int fd, void * ptr) | ||||
|     } | ||||
|     event.events = events; | ||||
|  | ||||
|     return epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &event); | ||||
|     while ((retval = epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &event)) != 0 && errno == EINTR) {} | ||||
|     return retval; | ||||
| } | ||||
|  | ||||
| static int add_in_event_fd(int epollfd, int fd) | ||||
| @@ -759,12 +763,14 @@ static int add_in_event(int epollfd, struct remote_desc * const remote) | ||||
|  | ||||
| static int mod_event(int epollfd, int events, int fd, void * ptr) | ||||
| { | ||||
|     int retval; | ||||
|     struct epoll_event event = {}; | ||||
|  | ||||
|     event.data.ptr = ptr; | ||||
|     event.events = events; | ||||
|  | ||||
|     return epoll_ctl(epollfd, EPOLL_CTL_MOD, fd, &event); | ||||
|     while ((retval = epoll_ctl(epollfd, EPOLL_CTL_MOD, fd, &event)) != 0 && errno == EINTR) {} | ||||
|     return retval; | ||||
| } | ||||
|  | ||||
| static int add_out_event(int epollfd, struct remote_desc * const remote) | ||||
| @@ -779,7 +785,10 @@ static int del_out_event(int epollfd, struct remote_desc * const remote) | ||||
|  | ||||
| static int del_event(int epollfd, int fd) | ||||
| { | ||||
|     return epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL); | ||||
|     int retval; | ||||
|  | ||||
|     while ((retval = epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, NULL)) != 0 && errno == EINTR) {} | ||||
|     return retval; | ||||
| } | ||||
|  | ||||
| static void disconnect_client(int epollfd, struct remote_desc * const remote) | ||||
| @@ -931,7 +940,9 @@ static struct remote_desc * accept_remote(int server_fd, | ||||
|                                           struct sockaddr * const sockaddr, | ||||
|                                           socklen_t * const addrlen) | ||||
| { | ||||
|     int client_fd = accept(server_fd, sockaddr, addrlen); | ||||
|     int client_fd; | ||||
|  | ||||
|     while ((client_fd = accept(server_fd, sockaddr, addrlen)) < 0 && errno == EINTR) {} | ||||
|     if (client_fd < 0) | ||||
|     { | ||||
|         logger(1, "Accept failed: %s", strerror(errno)); | ||||
| @@ -1227,9 +1238,11 @@ static int handle_incoming_data(int epollfd, struct remote_desc * const current) | ||||
|     else | ||||
|     { | ||||
|         errno = 0; | ||||
|         ssize_t bytes_read = read(current->fd, | ||||
|         ssize_t bytes_read; | ||||
|  | ||||
|         while ((bytes_read = read(current->fd, | ||||
|                                   json_read_buffer->buf.ptr.raw + json_read_buffer->buf.used, | ||||
|                                   json_read_buffer->buf.max - json_read_buffer->buf.used); | ||||
|                                   json_read_buffer->buf.max - json_read_buffer->buf.used)) < 0 && errno == EINTR) {} | ||||
|         if (bytes_read < 0 || errno != 0) | ||||
|         { | ||||
|             logger_nDPIsrvd(current, "Could not read remote", ": %s", strerror(errno)); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Toni Uhlig
					Toni Uhlig