Added dummy control socket answering / changed serve_accept_loop to use

select() to avoid a separate listening thread.
This commit is contained in:
Matthew Bloch
2012-05-18 23:39:16 +01:00
parent b533e4e31c
commit 580b821f61
2 changed files with 59 additions and 26 deletions

63
serve.c
View File

@@ -342,7 +342,7 @@ void serve_open_control_socket(struct mode_serve_params* params)
if (!params->control_socket_name) if (!params->control_socket_name)
return; return;
params->control = socket(AF_UNIX, SOCK_DGRAM, 0); params->control = socket(AF_UNIX, SOCK_STREAM, 0);
SERVER_ERROR_ON_FAILURE(params->control, SERVER_ERROR_ON_FAILURE(params->control,
"Couldn't create control socket"); "Couldn't create control socket");
@@ -350,35 +350,34 @@ void serve_open_control_socket(struct mode_serve_params* params)
bind_address.sun_family = AF_UNIX; bind_address.sun_family = AF_UNIX;
strcpy(bind_address.sun_path, params->control_socket_name); strcpy(bind_address.sun_path, params->control_socket_name);
unlink(params->control_socket_name); /* ignore failure */
SERVER_ERROR_ON_FAILURE( SERVER_ERROR_ON_FAILURE(
bind(params->control, &bind_address, sizeof(bind_address)), bind(params->control, &bind_address, sizeof(bind_address)),
"Couldn't bind control socket to %s", "Couldn't bind control socket to %s",
params->control_socket_name params->control_socket_name
); );
SERVER_ERROR_ON_FAILURE(
listen(params->control, 5),
"Couldn't listen on control socket"
);
} }
void serve_accept_loop(struct mode_serve_params* params) void accept_nbd_client(struct mode_serve_params* params, int client_fd, struct sockaddr* client_address)
{ {
while (1) {
pthread_t client_thread; pthread_t client_thread;
struct sockaddr client_address;
struct client_params* client_params; struct client_params* client_params;
socklen_t socket_length=0;
int client_socket = accept(params->server, &client_address,
&socket_length);
SERVER_ERROR_ON_FAILURE(client_socket, "accept() failed");
if (params->acl && if (params->acl &&
!is_included_in_acl(params->acl_entries, params->acl, &client_address)) { !is_included_in_acl(params->acl_entries, params->acl, client_address)) {
write(client_socket, "Access control error", 20); write(client_fd, "Access control error", 20);
close(client_socket); close(client_fd);
continue; return;
} }
client_params = xmalloc(sizeof(struct client_params)); client_params = xmalloc(sizeof(struct client_params));
client_params->socket = client_socket; client_params->socket = client_fd;
client_params->filename = params->filename; client_params->filename = params->filename;
client_params->block_allocation_map = client_params->block_allocation_map =
params->block_allocation_map; params->block_allocation_map;
@@ -390,6 +389,40 @@ void serve_accept_loop(struct mode_serve_params* params)
/* FIXME: keep track of them? */ /* FIXME: keep track of them? */
/* FIXME: maybe shouldn't be fatal? */ /* FIXME: maybe shouldn't be fatal? */
} }
void accept_control_connection(struct mode_serve_params* params, int client_fd, struct sockaddr* client_address)
{
write(client_fd, "hello", 5);
close(client_fd);
}
void serve_accept_loop(struct mode_serve_params* params)
{
while (1) {
int activity_fd, client_fd;
struct sockaddr client_address;
fd_set fds;
socklen_t socklen=0;
FD_ZERO(&fds);
FD_SET(params->server, &fds);
FD_SET(params->control, &fds);
SERVER_ERROR_ON_FAILURE(
select(FD_SETSIZE, &fds, NULL, NULL, NULL),
"select() failed"
);
activity_fd = FD_ISSET(params->server, &fds) ? params->server :
params->control;
client_fd = accept(activity_fd, &client_address, &socklen);
SERVER_ERROR_ON_FAILURE(client_fd, "accept() failed");
if (activity_fd == params->server)
accept_nbd_client(params, client_fd, &client_address);
if (activity_fd == params->control)
accept_control_connection(params, client_fd, &client_address);
}
} }
void serve_init_allocation_map(struct mode_serve_params* params) void serve_init_allocation_map(struct mode_serve_params* params)