Implement irc_try_read()
This commit is contained in:
		
							
								
								
									
										33
									
								
								src/kike.c
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								src/kike.c
									
									
									
									
									
								
							@@ -380,8 +380,37 @@ irc_process_message (const struct irc_message *msg,
 | 
				
			|||||||
static bool
 | 
					static bool
 | 
				
			||||||
irc_try_read (struct connection *conn)
 | 
					irc_try_read (struct connection *conn)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	// TODO
 | 
						struct str *buf = &conn->read_buffer;
 | 
				
			||||||
	return true;
 | 
						ssize_t n_read;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (true)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							str_ensure_space (buf, 512);
 | 
				
			||||||
 | 
							n_read = recv (conn->socket_fd, buf->str + buf->len,
 | 
				
			||||||
 | 
								buf->alloc - buf->len - 1 /* null byte */, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (n_read > 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								buf->str[buf->len += n_read] = '\0';
 | 
				
			||||||
 | 
								// TODO: discard characters above the 512 character limit
 | 
				
			||||||
 | 
								irc_process_buffer (buf, irc_process_message, conn);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (n_read == 0)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								connection_abort (conn, NULL);
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (errno == EAGAIN)
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							if (errno == EINTR)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							print_debug ("%s: %s: %s", __func__, "recv", strerror (errno));
 | 
				
			||||||
 | 
							connection_abort (conn, strerror (errno));
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool
 | 
					static bool
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user