14 #include <sys/socket.h>
16 #include <sys/param.h>
21 #define USES_EXTERNAL_BUFFER ~0U
42 int buflen =
sizeof(*ub);
47 ub = calloc(1, buflen);
58 ub->
data = (
void *) (ub + 1);
85 uint8_t fd_buf[CMSG_SPACE(
sizeof(
int))] = { 0 };
86 static struct iovec iov[2];
87 struct msghdr msghdr = { 0 };
94 msghdr.msg_iovlen = ARRAY_SIZE(iov);
95 msghdr.msg_control = fd_buf;
96 msghdr.msg_controllen =
sizeof(fd_buf);
98 cmsg = CMSG_FIRSTHDR(&msghdr);
99 cmsg->cmsg_type = SCM_RIGHTS;
100 cmsg->cmsg_level = SOL_SOCKET;
101 cmsg->cmsg_len = CMSG_LEN(
sizeof(
int));
103 pfd = (
int *) CMSG_DATA(cmsg);
104 msghdr.msg_controllen = cmsg->cmsg_len;
107 if (ub->
fd < 0 || offset) {
108 msghdr.msg_control = NULL;
109 msghdr.msg_controllen = 0;
112 if (offset <
sizeof(ub->
hdr)) {
118 iov[0].iov_base = ((
char *) &hdr) + offset;
119 iov[0].iov_len =
sizeof(hdr) - offset;
120 iov[1].iov_base = (
char *) ub->
data;
121 iov[1].iov_len = ub->
len;
123 offset -=
sizeof(ub->
hdr);
124 iov[0].iov_base = ((
char *) ub->
data) + offset;
125 iov[0].iov_len = ub->
len - offset;
126 msghdr.msg_iovlen = 1;
130 ret = sendmsg(fd, &msghdr, 0);
131 }
while (ret < 0 && errno == EINTR);
138 list_del_init(&ubl->
list);
154 INIT_LIST_HEAD(&ubl->
list);
175 if (written >= (ssize_t) (ub->
len +
sizeof(ub->
hdr)))
182 uloop_fd_add(&cl->
sock, ULOOP_READ | ULOOP_WRITE | ULOOP_EDGE_TRIGGER);
struct list_head tx_queue
struct ubus_msg_buf * msg
void ubus_msg_free(struct ubus_msg_buf *ub)
struct ubus_msg_buf * ubus_msg_new(void *data, int len, bool shared)
static struct ubus_msg_buf * ubus_msg_ref(struct ubus_msg_buf *ub)
void ubus_msg_list_free(struct ubus_msg_buf_list *ubl)
#define USES_EXTERNAL_BUFFER
void ubus_msg_send(struct ubus_client *cl, struct ubus_msg_buf *ub)
static void ubus_msg_enqueue(struct ubus_client *cl, struct ubus_msg_buf *ub)
ssize_t ubus_msg_writev(int fd, struct ubus_msg_buf *ub, size_t offset)
void ubusd_monitor_message(struct ubus_client *cl, struct ubus_msg_buf *ub, bool send)
#define UBUS_CLIENT_MAX_TXQ_LEN