- while ((!tb || count) && l) {
- blob_buf_init(&b, 0);
- blobmsg_add_string(&b, "msg", l->data);
- blobmsg_add_u32(&b, "id", l->id);
- blobmsg_add_u32(&b, "priority", l->priority);
- blobmsg_add_u32(&b, "source", l->source);
- blobmsg_add_u64(&b, "time", l->ts.tv_sec * 1000LL);
- l = log_list(count, l);
- ret = ustream_write(&cl->s.stream, (void *) b.head, blob_len(b.head) + sizeof(struct blob_attr), false);
- blob_buf_free(&b);
- if (ret < 0)
- break;
+ if (stream) {
+ ubus_request_set_fd(ctx, req, fds[0]);
+ cl = calloc(1, sizeof(*cl));
+ cl->s.stream.notify_state = client_notify_state;
+ cl->fd = fds[1];
+ ustream_fd_init(&cl->s, cl->fd);
+ list_add(&cl->list, &clients);
+ while ((!tb[READ_LINES] || count) && l) {
+ log_fill_msg(&b, l);
+ l = log_list(count, l);
+ ret = ustream_write(&cl->s.stream, (void *) b.head, blob_len(b.head) + sizeof(struct blob_attr), false);
+ if (ret < 0)
+ break;
+ }
+ } else {
+ while ((!tb[READ_LINES] || count) && l) {
+ log_fill_msg(&b, l);
+ ubus_send_reply(ctx, req, b.head);
+ l = log_list(count, l);
+ }