Use bufferevents to handle control socket buffering.
This commit is contained in:
		
							parent
							
								
									8c6131deda
								
							
						
					
					
						commit
						59108e4e4f
					
				
					 1 changed files with 27 additions and 28 deletions
				
			
		| 
						 | 
				
			
			@ -32,41 +32,35 @@ static struct event control_event;
 | 
			
		|||
static splay_tree_t *control_socket_tree;
 | 
			
		||||
extern char *controlsocketname;
 | 
			
		||||
 | 
			
		||||
static void handle_control_data(int fd, short events, void *event) {
 | 
			
		||||
	char buf[MAXBUFSIZE];
 | 
			
		||||
	size_t inlen;
 | 
			
		||||
	char *p;
 | 
			
		||||
 | 
			
		||||
	inlen = read(fd, buf, sizeof buf);
 | 
			
		||||
 | 
			
		||||
	if(inlen <= 0)
 | 
			
		||||
		goto close;
 | 
			
		||||
 | 
			
		||||
	p = memchr(buf, '\n', sizeof buf);
 | 
			
		||||
	if(!p || p - buf + 1 != inlen)
 | 
			
		||||
		goto malformed;
 | 
			
		||||
 | 
			
		||||
	*p = 0;
 | 
			
		||||
 | 
			
		||||
	if(!strcasecmp(buf, "stop")) {
 | 
			
		||||
static void handle_control_data(struct bufferevent *event, void *data) {
 | 
			
		||||
	char *line = evbuffer_readline(event->input);
 | 
			
		||||
	if(!line)
 | 
			
		||||
		return;
 | 
			
		||||
	
 | 
			
		||||
	if(!strcasecmp(line, "stop")) {
 | 
			
		||||
		logger(LOG_NOTICE, _("Got stop command"));
 | 
			
		||||
		event_loopexit(NULL);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
malformed:
 | 
			
		||||
	logger(LOG_DEBUG, _("Malformed control command received"));
 | 
			
		||||
 | 
			
		||||
close:
 | 
			
		||||
	logger(LOG_DEBUG, _("Closing control socket"));
 | 
			
		||||
	event_del(event);
 | 
			
		||||
	close(event->ev_read.ev_fd);
 | 
			
		||||
	splay_delete(control_socket_tree, event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_control_error(struct bufferevent *event, short what, void *data) {
 | 
			
		||||
	if(what & EVBUFFER_EOF)
 | 
			
		||||
		logger(LOG_DEBUG, _("Control socket connection closed by peer"));
 | 
			
		||||
	else
 | 
			
		||||
		logger(LOG_DEBUG, _("Error while reading from control socket: %s"), strerror(errno));
 | 
			
		||||
 | 
			
		||||
	close(event->ev_read.ev_fd);
 | 
			
		||||
	splay_delete(control_socket_tree, event);
 | 
			
		||||
	close(fd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void handle_new_control_socket(int fd, short events, void *data) {
 | 
			
		||||
	int newfd;
 | 
			
		||||
	struct event *ev;
 | 
			
		||||
	struct bufferevent *ev;
 | 
			
		||||
 | 
			
		||||
	newfd = accept(fd, NULL, NULL);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -76,9 +70,14 @@ static void handle_new_control_socket(int fd, short events, void *data) {
 | 
			
		|||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ev = xmalloc(sizeof *ev);
 | 
			
		||||
	event_set(ev, newfd, EV_READ | EV_PERSIST, handle_control_data, ev);
 | 
			
		||||
	event_add(ev, NULL);
 | 
			
		||||
	ev = bufferevent_new(newfd, handle_control_data, NULL, handle_control_error, NULL);
 | 
			
		||||
	if(!ev) {
 | 
			
		||||
		logger(LOG_ERR, _("Could not create bufferevent for new control connection: %s"), strerror(errno));
 | 
			
		||||
		close(newfd);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bufferevent_enable(ev, EV_READ);
 | 
			
		||||
	splay_insert(control_socket_tree, ev);
 | 
			
		||||
 | 
			
		||||
	logger(LOG_DEBUG, _("Control socket connection accepted"));
 | 
			
		||||
| 
						 | 
				
			
			@ -139,7 +138,7 @@ bool init_control() {
 | 
			
		|||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	control_socket_tree = splay_alloc_tree((splay_compare_t)control_compare, (splay_action_t)free);
 | 
			
		||||
	control_socket_tree = splay_alloc_tree((splay_compare_t)control_compare, (splay_action_t)bufferevent_free);
 | 
			
		||||
 | 
			
		||||
	event_set(&control_event, control_socket, EV_READ | EV_PERSIST, handle_new_control_socket, NULL);
 | 
			
		||||
	event_add(&control_event, NULL);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue