Added control socket, doesn't do anything yet.

This commit is contained in:
mbloch
2012-05-18 18:44:34 +01:00
parent f5d8e740f8
commit b533e4e31c
4 changed files with 42 additions and 7 deletions

View File

@@ -14,10 +14,14 @@
void syntax() void syntax()
{ {
fprintf(stderr, fprintf(stderr,
"Syntax: flexnbd serve <IP address> <port> <file> [ip addresses ...]\n" "Syntax: flexnbd serve <listen IP address> <port> <file> \\\n"
" [full path to control socket] \\\n"
" [allowed connection addresses ...]\n"
" flexnbd mirror <control socket> <dst IP address> <dst port>\n"
" flexnbd status <control socket>\n"
" flexnbd read <IP address> <port> <offset> <length> > data\n" " flexnbd read <IP address> <port> <offset> <length> > data\n"
" flexnbd write <IP address> <port> <offset> <length> < data\n" " flexnbd write <IP address> <port> <offset> <length> < data\n"
" flexnbd write <IP address> <port> <offset> <data file>\n" " flexnbd write <IP address> <port> <offset> <file to write>\n"
); );
exit(1); exit(1);
} }
@@ -102,7 +106,7 @@ void params_serve(
char* s_port, char* s_port,
char* s_file, char* s_file,
int acl_entries, int acl_entries,
char** s_acl_entries char** s_acl_entries /* first may actually be path to control socket */
) )
{ {
int parsed; int parsed;
@@ -120,6 +124,12 @@ void params_serve(
SERVER_ERROR("Couldn't parse server address '%s' (use 0 if " SERVER_ERROR("Couldn't parse server address '%s' (use 0 if "
"you want to bind to all IPs)", s_ip_address); "you want to bind to all IPs)", s_ip_address);
if (acl_entries > 0 && s_acl_entries[0][0] == '/') {
out->control_socket_name = s_acl_entries[0];
s_acl_entries++;
acl_entries--;
}
out->acl_entries = acl_entries; out->acl_entries = acl_entries;
parsed = parse_acl(&out->acl, acl_entries, s_acl_entries); parsed = parse_acl(&out->acl, acl_entries, s_acl_entries);
if (parsed != acl_entries) if (parsed != acl_entries)

View File

@@ -44,7 +44,7 @@ char* build_allocation_map(int fd, off64_t size, int resolution)
fiemap->fm_extent_count = fiemap->fm_mapped_extents; fiemap->fm_extent_count = fiemap->fm_mapped_extents;
fiemap->fm_mapped_extents = 0; fiemap->fm_mapped_extents = 0;
if (ioctl(fd, FS_IOC_FIEMAP, fiemap) < -1) if (ioctl(fd, FS_IOC_FIEMAP, fiemap) < 0)
return NULL; return NULL;
for (i=0;i<fiemap->fm_mapped_extents;i++) { for (i=0;i<fiemap->fm_mapped_extents;i++) {

View File

@@ -27,9 +27,10 @@ struct mode_serve_params {
struct ip_and_mask** acl; struct ip_and_mask** acl;
char* filename; char* filename;
int tcp_backlog; int tcp_backlog;
char* control_socket_name;
int server; int server;
int threads; int control;
char* block_allocation_map; char* block_allocation_map;
}; };

28
serve.c
View File

@@ -7,6 +7,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/un.h>
#include <fcntl.h> #include <fcntl.h>
#include <string.h> #include <string.h>
@@ -315,7 +316,7 @@ int is_included_in_acl(int list_length, struct ip_and_mask** list, struct sockad
return 0; return 0;
} }
void serve_open_socket(struct mode_serve_params* params) void serve_open_server_socket(struct mode_serve_params* params)
{ {
params->server = socket(PF_INET, SOCK_STREAM, 0); params->server = socket(PF_INET, SOCK_STREAM, 0);
@@ -334,6 +335,28 @@ void serve_open_socket(struct mode_serve_params* params)
); );
} }
void serve_open_control_socket(struct mode_serve_params* params)
{
struct sockaddr_un bind_address;
if (!params->control_socket_name)
return;
params->control = socket(AF_UNIX, SOCK_DGRAM, 0);
SERVER_ERROR_ON_FAILURE(params->control,
"Couldn't create control socket");
memset(&bind_address, 0, sizeof(bind_address));
bind_address.sun_family = AF_UNIX;
strcpy(bind_address.sun_path, params->control_socket_name);
SERVER_ERROR_ON_FAILURE(
bind(params->control, &bind_address, sizeof(bind_address)),
"Couldn't bind control socket to %s",
params->control_socket_name
);
}
void serve_accept_loop(struct mode_serve_params* params) void serve_accept_loop(struct mode_serve_params* params)
{ {
while (1) { while (1) {
@@ -384,7 +407,8 @@ void serve_init_allocation_map(struct mode_serve_params* params)
void do_serve(struct mode_serve_params* params) void do_serve(struct mode_serve_params* params)
{ {
serve_open_socket(params); serve_open_server_socket(params);
serve_open_control_socket(params);
serve_init_allocation_map(params); serve_init_allocation_map(params);
serve_accept_loop(params); serve_accept_loop(params);
} }