ptr != NULL && len > 0; \
ustream_consume(stream, len), ptr = ustream_get_read_buf(stream, &len))
-#define ustream_declare(us, fd, name) \
- us.stream.string_data = true; \
- us.stream.r.buffer_len = 4096; \
- us.stream.r.max_buffers = RPC_EXEC_MAX_SIZE / 4096; \
- us.stream.notify_read = rpc_exec_##name##_read_cb; \
- us.stream.notify_state = rpc_exec_##name##_state_cb; \
- ustream_fd_init(&us, fd);
+#define ustream_declare_read(us, fd, name) \
+ do { \
+ us.stream.string_data = true; \
+ us.stream.r.buffer_len = 4096; \
+ us.stream.r.max_buffers = RPC_EXEC_MAX_SIZE / 4096; \
+ us.stream.notify_read = rpc_exec_##name##_read_cb; \
+ us.stream.notify_state = rpc_exec_##name##_state_cb; \
+ ustream_fd_init(&us, fd); \
+ } while(0)
+#define ustream_declare_write(us, fd, name) \
+ do { \
+ us.stream.string_data = true; \
+ us.stream.w.buffer_len = 4096; \
+ us.stream.w.max_buffers = RPC_EXEC_MAX_SIZE / 4096; \
+ us.stream.notify_write = rpc_exec_##name##_write_cb; \
+ ustream_fd_init(&us, fd); \
+ } while(0)
+
+
+typedef int (*rpc_exec_write_cb_t)(struct ustream *, void *);
typedef int (*rpc_exec_read_cb_t)(struct blob_buf *, char *, int, void *);
-typedef void (*rpc_exec_done_cb_t)(struct blob_buf *, int, void *);
+typedef int (*rpc_exec_done_cb_t)(struct blob_buf *, int, void *);
struct rpc_exec_context {
struct ubus_context *context;
struct ubus_request_data request;
struct uloop_timeout timeout;
struct uloop_process process;
+ struct ustream_fd ipipe;
struct ustream_fd opipe;
struct ustream_fd epipe;
int outlen;
bool blob_array;
void *blob_cookie;
struct blob_buf blob;
+ rpc_exec_write_cb_t stdin_cb;
rpc_exec_read_cb_t stdout_cb;
rpc_exec_read_cb_t stderr_cb;
rpc_exec_done_cb_t finish_cb;
};
-int rpc_exec(const char **args, rpc_exec_read_cb_t out, rpc_exec_read_cb_t err,
+int rpc_exec(const char **args, rpc_exec_write_cb_t in,
+ rpc_exec_read_cb_t out, rpc_exec_read_cb_t err,
rpc_exec_done_cb_t end, void *priv, struct ubus_context *ctx,
struct ubus_request_data *req);