X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fubus.git;a=blobdiff_plain;f=ubusd_proto.c;fp=ubusd_proto.c;h=811aa79f478782544e2ee236e09da0a21832a468;hp=fd38dbdafc920ac196dd991e8d75c5d7e5177fe8;hb=37cc5d2f25c162c1e125922e91bbc741e2e4a6d1;hpb=4e82a1fabb87b5e3c948a792e16b0fac3702721b diff --git a/ubusd_proto.c b/ubusd_proto.c index fd38dbd..811aa79 100644 --- a/ubusd_proto.c +++ b/ubusd_proto.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 Felix Fietkau + * Copyright (C) 2011-2014 Felix Fietkau * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1 @@ -12,6 +12,8 @@ */ #include +#include + #include "ubusd.h" struct blob_buf b; @@ -38,6 +40,15 @@ static struct blob_attr **ubus_parse_msg(struct blob_attr *msg) return attrbuf; } +static void ubus_msg_close_fd(struct ubus_msg_buf *ub) +{ + if (ub->fd < 0) + return; + + close(ub->fd); + ub->fd = -1; +} + static void ubus_msg_init(struct ubus_msg_buf *ub, uint8_t type, uint16_t seq, uint32_t peer) { ub->hdr.version = 0; @@ -409,6 +420,9 @@ void ubusd_proto_receive_message(struct ubus_client *cl, struct ubus_msg_buf *ub if (ub->hdr.type < __UBUS_MSG_LAST) cb = handlers[ub->hdr.type]; + if (ub->hdr.type != UBUS_MSG_STATUS) + ubus_msg_close_fd(ub); + if (cb) ret = cb(cl, ub, ubus_parse_msg(ub->data)); else @@ -434,6 +448,7 @@ struct ubus_client *ubusd_proto_new_client(int fd, uloop_fd_handler cb) INIT_LIST_HEAD(&cl->objects); cl->sock.fd = fd; cl->sock.cb = cb; + cl->pending_msg_fd = -1; if (!ubus_alloc_id(&clients, &cl->id, 0)) goto free;