- return;
-
-failure:
- logger(LOG_INFO, "Closing control socket on error");
- evbuffer_free(res_data);
- 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);
-}
-
-static void handle_new_control_socket(int fd, short events, void *data) {
- int newfd;
- struct bufferevent *ev;
- tinc_ctl_greeting_t greeting;
-
- newfd = accept(fd, NULL, NULL);
-
- if(newfd < 0) {
- logger(LOG_ERR, "Accepting a new connection failed: %s", strerror(errno));
- event_del(&control_event);
- return;
- }
-
- 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;
- }
-
- memset(&greeting, 0, sizeof greeting);
- greeting.version = TINC_CTL_VERSION_CURRENT;
- greeting.pid = getpid();
- if(bufferevent_write(ev, &greeting, sizeof greeting) == -1) {
- logger(LOG_ERR,
- "Cannot send greeting for new control connection: %s",
- strerror(errno));
- bufferevent_free(ev);
- close(newfd);
- return;
- }
-
- bufferevent_enable(ev, EV_READ);
- splay_insert(control_socket_tree, ev);
-
- logger(LOG_DEBUG, "Control socket connection accepted");
-}
-
-static int control_compare(const struct event *a, const struct event *b) {
- return a < b ? -1 : a > b ? 1 : 0;