typedef struct _proxy_server {
proxy_link_t link;
proxy_manager_t *manager;
+ proxy_settings_t *settings;
} proxy_server_t;
typedef struct _proxy_client {
proxy_link_negotiate_t neg;
proxy_async_t async;
proxy_link_t *link;
+ proxy_settings_t *settings;
proxy_random_t random;
void *buffer;
uint32_t buffer_size;
typedef struct _proxy {
proxy_manager_t manager;
proxy_log_handler_t log_handler;
- const char *socket_path;
+ proxy_settings_t settings;
} proxy_t;
typedef int32_t (*proxy_handler_t)(proxy_client_t *, proxy_req_t *,
id = CEPH_STR_GET(req->create, id, data);
- err = proxy_mount_create(&mount, id);
+ err = proxy_mount_create(&mount, client->settings, id);
TRACE("ceph_create(%p, '%s') -> %d", mount, id, err);
if (err >= 0) {
proxy_free(client);
}
-static int32_t accept_connection(proxy_link_t *link, int32_t sd)
+static int32_t accept_connection(proxy_link_t *link, proxy_settings_t *settings,
+ int32_t sd)
{
proxy_server_t *server;
proxy_client_t *client;
goto failed_close;
}
+ client->settings = settings;
+
client->buffer_size = 65536;
client->buffer = proxy_malloc(client->buffer_size);
if (client->buffer == NULL) {
proxy = container_of(manager, proxy_t, manager);
server.manager = manager;
+ server.settings = &proxy->settings;
- return proxy_link_server(&server.link, proxy->socket_path,
+ return proxy_link_server(&server.link, &proxy->settings,
accept_connection, check_stop);
}
proxy_log_register(&proxy.log_handler, log_print);
- proxy.socket_path = PROXY_SOCKET;
+ proxy.settings.socket_path = PROXY_SOCKET;
env = getenv(PROXY_SOCKET_ENV);
if (env != NULL) {
- proxy.socket_path = env;
+ proxy.settings.socket_path = env;
}
while ((val = getopt_long(argc, argv, ":s:", main_opts, NULL)) >= 0) {
if (val == 's') {
- proxy.socket_path = optarg;
+ proxy.settings.socket_path = optarg;
} else if (val == ':') {
proxy_log(LOG_ERR, ENODATA,
"Argument missing for '%s'\n", optopt);
struct _list;
typedef struct _list list_t;
+struct _proxy_settings;
+typedef struct _proxy_settings proxy_settings_t;
+
struct _proxy_buffer_ops;
typedef struct _proxy_buffer_ops proxy_buffer_ops_t;
typedef int32_t (*proxy_manager_start_t)(proxy_manager_t *);
-typedef int32_t (*proxy_link_start_t)(proxy_link_t *, int32_t);
+typedef int32_t (*proxy_link_start_t)(proxy_link_t *, proxy_settings_t *,
+ int32_t);
typedef bool (*proxy_link_stop_t)(proxy_link_t *);
struct _list {
list_t *prev;
};
+struct _proxy_settings {
+ const char *socket_path;
+};
+
#endif
link->sd = -1;
}
-int32_t proxy_link_server(proxy_link_t *link, const char *path,
+int32_t proxy_link_server(proxy_link_t *link, proxy_settings_t *settings,
proxy_link_start_t start, proxy_link_stop_t stop)
{
struct sockaddr_un addr;
+ const char *path;
socklen_t len;
int32_t cd, err;
link->stop = stop;
link->sd = -1;
+ path = settings->socket_path;
+
err = proxy_link_prepare(&addr, path);
if (err < 0) {
return err;
"Failed to accept a connection");
}
} else {
- start(link, cd);
+ start(link, settings, cd);
}
}
void proxy_link_close(proxy_link_t *link);
-int32_t proxy_link_server(proxy_link_t *link, const char *path,
+int32_t proxy_link_server(proxy_link_t *link, proxy_settings_t *settings,
proxy_link_start_t start, proxy_link_stop_t stop);
int32_t proxy_link_send(int32_t sd, struct iovec *iov, int32_t count);
/* Create a new Ceph client instance with the provided id */
static int32_t proxy_instance_create(proxy_instance_t **pinstance,
- const char *id)
+ proxy_settings_t *settings, const char *id)
{
struct ceph_mount_info *cmount;
proxy_instance_t *instance;
list_init(&instance->siblings);
list_init(&instance->changes);
+ instance->settings = settings;
instance->cmount = NULL;
instance->inited = false;
instance->mounted = false;
return 0;
}
-int32_t proxy_mount_create(proxy_mount_t **pmount, const char *id)
+int32_t proxy_mount_create(proxy_mount_t **pmount, proxy_settings_t *settings,
+ const char *id)
{
proxy_mount_t *mount;
int32_t err;
}
mount->root = NULL;
- err = proxy_instance_create(&mount->instance, id);
+ err = proxy_instance_create(&mount->instance, settings, id);
if (err < 0) {
proxy_free(mount);
return err;
list_t list;
list_t siblings;
list_t changes;
+ proxy_settings_t *settings;
struct ceph_mount_info *cmount;
struct Inode *root;
bool inited;
int32_t proxy_inode_ref(proxy_mount_t *mount, uint64_t inode);
-int32_t proxy_mount_create(proxy_mount_t **pmount, const char *id);
+int32_t proxy_mount_create(proxy_mount_t **pmount, proxy_settings_t *settings,
+ const char *id);
int32_t proxy_mount_config(proxy_mount_t *mount, const char *config);