};
static const struct blobmsg_policy rpc_exec_policy[__RPC_E_MAX] = {
- [RPC_E_CMD] = { .name = "command", .type = BLOBMSG_TYPE_STRING },
+ [RPC_E_CMD] = { .name = "command", .type = BLOBMSG_TYPE_STRING },
[RPC_E_PARM] = { .name = "params", .type = BLOBMSG_TYPE_ARRAY },
[RPC_E_ENV] = { .name = "env", .type = BLOBMSG_TYPE_TABLE },
};
struct blob_attr *msg)
{
int fd;
- char *path;
- struct stat s;
- struct blob_attr **tb;
+ struct blob_attr *tb[__RPC_F_MAX];
- if (!(tb = rpc_check_path(msg, &path, &s)))
- return rpc_errno_status();
+ blobmsg_parse(rpc_file_policy, __RPC_F_MAX, tb,
+ blob_data(msg), blob_len(msg));
- if (!tb[RPC_F_DATA])
+ if (!tb[RPC_F_PATH] || !tb[RPC_F_DATA])
return UBUS_STATUS_INVALID_ARGUMENT;
- if ((fd = open(path, O_WRONLY)) < 0)
+ if ((fd = open(blobmsg_data(tb[RPC_F_PATH]), O_CREAT | O_TRUNC | O_WRONLY)) < 0)
+ return rpc_errno_status();
+
+ if (write(fd, blobmsg_data(tb[RPC_F_DATA]), blobmsg_data_len(tb[RPC_F_DATA])) < 0)
+ return rpc_errno_status();
+
+ if (fsync(fd) < 0)
return rpc_errno_status();
- write(fd, blobmsg_data(tb[RPC_F_DATA]), blobmsg_data_len(tb[RPC_F_DATA]));
close(fd);
+ sync();
return 0;
}
static int
rpc_file_exec_run(const char *cmd,
- const struct blob_attr *arg, const struct blob_attr *env,
+ const struct blob_attr *arg, const struct blob_attr *env,
struct ubus_context *ctx, struct ubus_request_data *req)
{
pid_t pid;
return UBUS_STATUS_INVALID_ARGUMENT;
return rpc_file_exec_run(blobmsg_data(tb[RPC_E_CMD]),
- tb[RPC_E_PARM], tb[RPC_E_ENV], ctx, req);
+ tb[RPC_E_PARM], tb[RPC_E_ENV], ctx, req);
}
return ubus_add_object(ctx, &obj);
}
-const struct rpc_plugin rpc_plugin = {
+struct rpc_plugin rpc_plugin = {
.init = rpc_file_api_init
};