15 #include <sys/types.h>
17 #include <sys/socket.h>
23 #include <libubox/usock.h>
24 #include <libubox/blob.h>
25 #include <libubox/blobmsg.h>
30 #define STATIC_IOV(_var) { .iov_base = (char *) &(_var), .iov_len = sizeof(_var) }
32 #define UBUS_MSGBUF_REDUCTION_INTERVAL 16
54 struct pollfd pfd = { .fd = fd };
56 pfd.events = write ? POLLOUT : POLLIN;
60 static int writev_retry(
int fd,
struct iovec *iov,
int iov_len,
int sock_fd)
62 uint8_t fd_buf[CMSG_SPACE(
sizeof(
int))] = { 0 };
63 struct msghdr msghdr = { 0 };
69 msghdr.msg_iovlen = iov_len,
70 msghdr.msg_control = fd_buf;
71 msghdr.msg_controllen =
sizeof(fd_buf);
73 cmsg = CMSG_FIRSTHDR(&msghdr);
74 cmsg->cmsg_type = SCM_RIGHTS;
75 cmsg->cmsg_level = SOL_SOCKET;
76 cmsg->cmsg_len = CMSG_LEN(
sizeof(
int));
78 pfd = (
int *) CMSG_DATA(cmsg);
79 msghdr.msg_controllen = cmsg->cmsg_len;
85 msghdr.msg_control = NULL;
86 msghdr.msg_controllen = 0;
91 cur_len = sendmsg(fd, &msghdr, 0);
109 while (cur_len >= (ssize_t) iov->iov_len) {
110 cur_len -= iov->iov_len;
116 iov->iov_base += cur_len;
117 iov->iov_len -= cur_len;
118 msghdr.msg_iov = iov;
119 msghdr.msg_iovlen = iov_len;
127 struct blob_attr *msg,
int cmd, uint32_t
peer,
int fd)
130 struct iovec iov[2] = {
137 hdr.
seq = cpu_to_be16(
seq);
141 blob_buf_init(&
b, 0);
145 iov[1].iov_base = (
char *) msg;
146 iov[1].iov_len = blob_raw_len(msg);
160 uint8_t fd_buf[CMSG_SPACE(
sizeof(
int))] = { 0 };
161 struct msghdr msghdr = { 0 };
162 struct cmsghdr *cmsg;
170 msghdr.msg_iov = iov,
171 msghdr.msg_iovlen = 1,
172 msghdr.msg_control = fd_buf;
173 msghdr.msg_controllen =
sizeof(fd_buf);
175 cmsg = CMSG_FIRSTHDR(&msghdr);
176 cmsg->cmsg_type = SCM_RIGHTS;
177 cmsg->cmsg_level = SOL_SOCKET;
178 cmsg->cmsg_len = CMSG_LEN(
sizeof(
int));
180 pfd = (
int *) CMSG_DATA(cmsg);
182 while (iov->iov_len > 0) {
184 msghdr.msg_control = fd_buf;
185 msghdr.msg_controllen = cmsg->cmsg_len;
187 msghdr.msg_control = NULL;
188 msghdr.msg_controllen = 0;
192 bytes = recvmsg(fd, &msghdr, 0);
213 iov->iov_len -= bytes;
214 iov->iov_base += bytes;
217 if (iov->iov_len > 0)
226 struct blob_attr *data = (
struct blob_attr *) (hdr + 1);
231 if (blob_raw_len(data) <
sizeof(*data))
234 if (blob_pad_len(data) > UBUS_MAX_MSGLEN)
275 struct blob_attr data;
290 hdrbuf.hdr.seq = be16_to_cpu(hdrbuf.hdr.seq);
291 hdrbuf.hdr.peer = be32_to_cpu(hdrbuf.hdr.peer);
296 len = blob_raw_len(&hdrbuf.data);
300 memcpy(&
ctx->
msgbuf.
hdr, &hdrbuf.hdr,
sizeof(hdrbuf.hdr));
303 iov.iov_base = (
char *)
ctx->
msgbuf.
data +
sizeof(hdrbuf.data);
305 if (iov.iov_len > 0 &&
337 struct pollfd pfd = {
339 .events = POLLIN | POLLERR,
383 objs = alloca(
ctx->
objects.count *
sizeof(*objs));
389 for (n = i, i = 0; i < n; i++)
399 struct blob_attr data;
401 struct blob_attr *buf;
405 path = UBUS_UNIX_SOCKET;
420 if (read(
ctx->
sock.fd, &hdr,
sizeof(hdr)) !=
sizeof(hdr))
429 buf = calloc(1, blob_raw_len(&hdr.data));
433 memcpy(buf, &hdr.data,
sizeof(hdr.data));
434 if (read(
ctx->
sock.fd, blob_data(buf), blob_len(buf)) != (ssize_t) blob_len(buf))
442 fcntl(
ctx->
sock.fd, F_SETFL, fcntl(
ctx->
sock.fd, F_GETFL) | O_NONBLOCK | O_CLOEXEC);
static struct ubus_context * ctx
void ubus_process_msg(struct ubus_context *ctx, struct ubus_msghdr_buf *buf, int fd)
static void ubus_auto_sub_lookup(struct ubus_context *ctx, struct ubus_object_data *obj, void *priv)
static bool get_next_msg(struct ubus_context *ctx, int *recv_fd)
static int recv_retry(struct ubus_context *ctx, struct iovec *iov, bool wait, int *recv_fd)
static const struct blob_attr_info ubus_policy[UBUS_ATTR_MAX]
static bool alloc_msg_buf(struct ubus_context *ctx, int len)
static struct blob_attr * attrbuf[UBUS_ATTR_MAX]
int __hidden ubus_send_msg(struct ubus_context *ctx, uint32_t seq, struct blob_attr *msg, int cmd, uint32_t peer, int fd)
#define UBUS_MSGBUF_REDUCTION_INTERVAL
static void ubus_refresh_auto_subscribe(struct ubus_context *ctx)
void __hidden ubus_poll_data(struct ubus_context *ctx, int timeout)
static void ubus_refresh_state(struct ubus_context *ctx)
static int writev_retry(int fd, struct iovec *iov, int iov_len, int sock_fd)
void __hidden ubus_handle_data(struct uloop_fd *u, unsigned int events)
__hidden struct blob_attr ** ubus_parse_msg(struct blob_attr *msg, size_t len)
int ubus_reconnect(struct ubus_context *ctx, const char *path)
static void wait_data(int fd, bool write)
bool ubus_validate_hdr(struct ubus_msghdr *hdr)
int ubus_add_object(struct ubus_context *ctx, struct ubus_object *obj)
const struct ubus_method watch_method __hidden
int ubus_subscribe(struct ubus_context *ctx, struct ubus_subscriber *obj, uint32_t id)
int ubus_lookup(struct ubus_context *ctx, const char *path, ubus_lookup_handler_t cb, void *priv)
int ubus_register_event_handler(struct ubus_context *ctx, struct ubus_event_handler *ev, const char *pattern)
struct uloop_timeout pending_timer
int msgbuf_reduction_counter
struct ubus_msghdr_buf msgbuf
void(* connection_lost)(struct ubus_context *ctx)
struct list_head auto_subscribers
struct ubus_event_handler auto_subscribe_event_handler
struct ubus_object_type * type
ubus_new_object_handler_t new_obj_cb
#define UBUS_MSG_CHUNK_SIZE
@ UBUS_STATUS_CONNECTION_FAILED
@ UBUS_STATUS_UNKNOWN_ERROR