#include <libubus.h>
#include <libubox/blobmsg.h>
+#include <libubox/ustream.h>
-#define RPC_FILE_MAX_SIZE (1024 * 256)
+/* limit of sys & proc files */
+#define RPC_FILE_MIN_SIZE (128)
+
+/* limit of regular files and command output data */
+#define RPC_FILE_MAX_SIZE (4096 * 64)
+#define RPC_FILE_MAX_RUNTIME (3 * 1000)
+
+#define ustream_for_each_read_buffer(stream, ptr, len) \
+ for (ptr = ustream_get_read_buf(stream, &len); \
+ 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_FILE_MAX_SIZE / 4096; \
+ us.stream.notify_read = rpc_file_##name##_read_cb; \
+ us.stream.notify_state = rpc_file_##name##_state_cb; \
+ ustream_fd_init(&us, fd);
+
+struct rpc_file_exec_context {
+ struct ubus_context *context;
+ struct ubus_request_data request;
+ struct uloop_timeout timeout;
+ struct uloop_process process;
+ struct ustream_fd opipe;
+ struct ustream_fd epipe;
+ int outlen;
+ char *out;
+ int errlen;
+ char *err;
+ int stat;
+};
int rpc_file_api_init(struct ubus_context *ctx);