|  |  |  | @ -550,31 +550,56 @@ static void add_buflen(connsock_t *cs, const char *readbuf, const int len) | 
			
		
	
		
			
				
					|  |  |  |  | 	cs->buf[cs->bufofs] = '\0'; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /* Receive as much data is currently available without blocking into a connsock
 | 
			
		
	
		
			
				
					|  |  |  |  |  * buffer. Returns length of read on success, -1 on failure */ | 
			
		
	
		
			
				
					|  |  |  |  | static int recv_available(connsock_t *cs) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 	char readbuf[PAGESIZE]; | 
			
		
	
		
			
				
					|  |  |  |  | 	int len = 0, ret; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	do { | 
			
		
	
		
			
				
					|  |  |  |  | 		ret = recv(cs->fd, readbuf, PAGESIZE - 4, MSG_DONTWAIT); | 
			
		
	
		
			
				
					|  |  |  |  | 		if (ret > 0) { | 
			
		
	
		
			
				
					|  |  |  |  | 			add_buflen(cs, readbuf, ret); | 
			
		
	
		
			
				
					|  |  |  |  | 			len += ret; | 
			
		
	
		
			
				
					|  |  |  |  | 		} else if (ret < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) | 
			
		
	
		
			
				
					|  |  |  |  | 			ret = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 	} while (ret > 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	return len; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /* Read from a socket into cs->buf till we get an '\n', converting it to '\0'
 | 
			
		
	
		
			
				
					|  |  |  |  |  * and storing how much extra data we've received, to be moved to the beginning | 
			
		
	
		
			
				
					|  |  |  |  |  * of the buffer for use on the next receive. */ | 
			
		
	
		
			
				
					|  |  |  |  | int read_socket_line(connsock_t *cs, float *timeout) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 	bool proxy = cs->ckp->proxy; | 
			
		
	
		
			
				
					|  |  |  |  | 	char *eom = NULL; | 
			
		
	
		
			
				
					|  |  |  |  | 	tv_t start, now; | 
			
		
	
		
			
				
					|  |  |  |  | 	int ret = -1; | 
			
		
	
		
			
				
					|  |  |  |  | 	float diff; | 
			
		
	
		
			
				
					|  |  |  |  | 	int ret; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	clear_bufline(cs); | 
			
		
	
		
			
				
					|  |  |  |  | 	ret = recv_available(cs); | 
			
		
	
		
			
				
					|  |  |  |  | 	eom = strchr(cs->buf, '\n'); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (unlikely((ret == -1 || cs->fd == -1) && !eom)) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (proxy) | 
			
		
	
		
			
				
					|  |  |  |  | 			LOGINFO("Failed to receive data in read_socket_line"); | 
			
		
	
		
			
				
					|  |  |  |  | 		else | 
			
		
	
		
			
				
					|  |  |  |  | 			LOGERR("Failed to receive data in read_socket_line"); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	tv_time(&start); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	while (!eom) { | 
			
		
	
		
			
				
					|  |  |  |  | 		char readbuf[PAGESIZE]; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (unlikely(cs->fd < 0)) { | 
			
		
	
		
			
				
					|  |  |  |  | 			ret = -1; | 
			
		
	
		
			
				
					|  |  |  |  | 			goto out; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (*timeout < 0) { | 
			
		
	
		
			
				
					|  |  |  |  | 			if (cs->ckp->proxy) | 
			
		
	
		
			
				
					|  |  |  |  | 			if (proxy) | 
			
		
	
		
			
				
					|  |  |  |  | 				LOGINFO("Timed out in read_socket_line"); | 
			
		
	
		
			
				
					|  |  |  |  | 			else | 
			
		
	
		
			
				
					|  |  |  |  | 				LOGERR("Timed out in read_socket_line"); | 
			
		
	
	
		
			
				
					|  |  |  | @ -583,25 +608,24 @@ int read_socket_line(connsock_t *cs, float *timeout) | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		ret = wait_read_select(cs->fd, *timeout); | 
			
		
	
		
			
				
					|  |  |  |  | 		if (ret < 1) { | 
			
		
	
		
			
				
					|  |  |  |  | 			if (cs->ckp->proxy) | 
			
		
	
		
			
				
					|  |  |  |  | 			if (proxy) | 
			
		
	
		
			
				
					|  |  |  |  | 				LOGINFO("Select %s in read_socket_line", !ret ? "timed out" : "failed"); | 
			
		
	
		
			
				
					|  |  |  |  | 			else | 
			
		
	
		
			
				
					|  |  |  |  | 				LOGERR("Select %s in read_socket_line", !ret ? "timed out" : "failed"); | 
			
		
	
		
			
				
					|  |  |  |  | 			goto out; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		ret = recv(cs->fd, readbuf, PAGESIZE - 4, MSG_DONTWAIT); | 
			
		
	
		
			
				
					|  |  |  |  | 		ret = recv_available(cs); | 
			
		
	
		
			
				
					|  |  |  |  | 		if (ret < 1) { | 
			
		
	
		
			
				
					|  |  |  |  | 			/* If we have done wait_read_select there should be
 | 
			
		
	
		
			
				
					|  |  |  |  | 			 * something to read and if we get nothing it means the | 
			
		
	
		
			
				
					|  |  |  |  | 			 * socket is closed. */ | 
			
		
	
		
			
				
					|  |  |  |  | 			if (cs->ckp->proxy) | 
			
		
	
		
			
				
					|  |  |  |  | 			if (proxy) | 
			
		
	
		
			
				
					|  |  |  |  | 				LOGINFO("Failed to recv in read_socket_line"); | 
			
		
	
		
			
				
					|  |  |  |  | 			else | 
			
		
	
		
			
				
					|  |  |  |  | 				LOGERR("Failed to recv in read_socket_line"); | 
			
		
	
		
			
				
					|  |  |  |  | 			ret = -1; | 
			
		
	
		
			
				
					|  |  |  |  | 			goto out; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		add_buflen(cs, readbuf, ret); | 
			
		
	
		
			
				
					|  |  |  |  | 		eom = strchr(cs->buf, '\n'); | 
			
		
	
		
			
				
					|  |  |  |  | 		tv_time(&now); | 
			
		
	
		
			
				
					|  |  |  |  | 		diff = tvdiff(&now, &start); | 
			
		
	
	
		
			
				
					|  |  |  | 
 |