From 37e914937b0ae4c88f067149eca1ad67a55c2952 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Mon, 7 Feb 2011 02:54:00 +0100 Subject: [PATCH 1/1] move more protocol related stuff to ubusd_proto.c --- ubusd.c | 38 +++++++------------------------------- ubusd.h | 6 +++--- ubusd_proto.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 54 insertions(+), 36 deletions(-) diff --git a/ubusd.c b/ubusd.c index 60c0404..80e5cfa 100644 --- a/ubusd.c +++ b/ubusd.c @@ -12,8 +12,6 @@ #include "ubusd.h" -struct avl_tree clients; - static struct ubus_msg_buf *ubus_msg_unshare(struct ubus_msg_buf *ub) { ub = realloc(ub, sizeof(*ub) + ub->len); @@ -144,17 +142,10 @@ static void ubus_msg_dequeue(struct ubus_client *cl) static void handle_client_disconnect(struct ubus_client *cl) { - struct ubus_object *obj; - - while (!list_empty(&cl->objects)) { - obj = list_first_entry(&cl->objects, struct ubus_object, list); - ubusd_free_object(obj); - } - while (ubus_msg_head(cl)) ubus_msg_dequeue(cl); - ubus_free_id(&clients, &cl->id); + ubusd_proto_free_client(cl); uloop_fd_delete(&cl->sock); close(cl->sock.fd); free(cl); @@ -237,7 +228,7 @@ retry: /* accept message */ cl->pending_msg_offset = 0; cl->pending_msg = NULL; - ubusd_receive_message(cl, ub); + ubusd_proto_receive_message(cl, ub); goto retry; } @@ -265,26 +256,13 @@ static bool get_next_connection(int fd) } } - cl = calloc(1, sizeof(*cl)); - cl->sock.fd = client_fd; - - INIT_LIST_HEAD(&cl->objects); - if (!ubus_alloc_id(&clients, &cl->id, 0)) - goto error; - - cl->sock.cb = client_cb; - uloop_fd_add(&cl->sock, ULOOP_READ | ULOOP_EDGE_TRIGGER); - if (!ubusd_send_hello(cl)) - goto error_free; + cl = ubusd_proto_new_client(client_fd, client_cb); + if (cl) + uloop_fd_add(&cl->sock, ULOOP_READ | ULOOP_EDGE_TRIGGER); + else + close(client_fd); return true; - -error_free: - ubus_free_id(&clients, &cl->id); -error: - close(cl->sock.fd); - free(cl); - return true; } static void server_cb(struct uloop_fd *fd, unsigned int events) @@ -317,8 +295,6 @@ int main(int argc, char **argv) signal(SIGPIPE, SIG_IGN); - ubus_init_id_tree(&clients); - uloop_init(); while ((ch = getopt(argc, argv, "s:")) != -1) { diff --git a/ubusd.h b/ubusd.h index 6d6e181..30f9f7d 100644 --- a/ubusd.h +++ b/ubusd.h @@ -13,7 +13,6 @@ #define UBUS_OBJ_HASH_BITS 4 extern struct blob_buf b; -extern struct avl_tree clients; struct ubus_msg_buf { uint32_t refcount; /* ~0: uses external data buffer */ @@ -48,8 +47,9 @@ struct ubus_msg_buf *ubus_msg_new(void *data, int len, bool shared); void ubus_msg_send(struct ubus_client *cl, struct ubus_msg_buf *ub, bool free); void ubus_msg_free(struct ubus_msg_buf *ub); -void ubusd_receive_message(struct ubus_client *cl, struct ubus_msg_buf *ub); -bool ubusd_send_hello(struct ubus_client *cl); +struct ubus_client *ubusd_proto_new_client(int fd, uloop_fd_handler cb); +void ubusd_proto_receive_message(struct ubus_client *cl, struct ubus_msg_buf *ub); +void ubusd_proto_free_client(struct ubus_client *cl); void ubusd_event_init(void); void ubusd_event_cleanup_object(struct ubus_object *obj); diff --git a/ubusd_proto.c b/ubusd_proto.c index 57f9a28..0654e99 100644 --- a/ubusd_proto.c +++ b/ubusd_proto.c @@ -4,6 +4,7 @@ struct blob_buf b; static struct ubus_msg_buf *retmsg; static int *retmsg_data; +static struct avl_tree clients; static struct blob_attr *attrbuf[UBUS_ATTR_MAX]; @@ -48,7 +49,7 @@ static struct ubus_msg_buf *ubus_reply_from_blob(struct ubus_msg_buf *ub, bool s return new; } -bool ubusd_send_hello(struct ubus_client *cl) +static bool ubusd_send_hello(struct ubus_client *cl) { struct ubus_msg_buf *ub; @@ -281,7 +282,7 @@ static const ubus_cmd_cb handlers[__UBUS_MSG_LAST] = { [UBUS_MSG_DATA] = ubusd_handle_response, }; -void ubusd_receive_message(struct ubus_client *cl, struct ubus_msg_buf *ub) +void ubusd_proto_receive_message(struct ubus_client *cl, struct ubus_msg_buf *ub) { ubus_cmd_cb cb = NULL; int ret; @@ -306,8 +307,49 @@ void ubusd_receive_message(struct ubus_client *cl, struct ubus_msg_buf *ub) ubus_msg_send(cl, retmsg, false); } +struct ubus_client *ubusd_proto_new_client(int fd, uloop_fd_handler cb) +{ + struct ubus_client *cl; + + cl = calloc(1, sizeof(*cl)); + if (!cl) + return NULL; + + INIT_LIST_HEAD(&cl->objects); + cl->sock.fd = fd; + cl->sock.cb = cb; + + if (!ubus_alloc_id(&clients, &cl->id, 0)) + goto free; + + if (!ubusd_send_hello(cl)) + goto delete; + + return cl; + +delete: + ubus_free_id(&clients, &cl->id); +free: + free(cl); + return NULL; +} + +void ubusd_proto_free_client(struct ubus_client *cl) +{ + struct ubus_object *obj; + + while (!list_empty(&cl->objects)) { + obj = list_first_entry(&cl->objects, struct ubus_object, list); + ubusd_free_object(obj); + } + + ubus_free_id(&clients, &cl->id); +} + static void __init ubusd_proto_init(void) { + ubus_init_id_tree(&clients); + blob_buf_init(&b, 0); blob_put_int32(&b, UBUS_ATTR_STATUS, 0); -- 2.11.0