file: create a file on write if it does not exist
[project/rpcd.git] / file.c
diff --git a/file.c b/file.c
index 57e0894e677a37d20e9ce2fc5d63818442acc302..8eef2b5013acf8c3c6a7f95bfb61d63f5aca622d 100644 (file)
--- a/file.c
+++ b/file.c
@@ -87,7 +87,7 @@ enum {
 };
 
 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  },
 };
@@ -203,17 +203,15 @@ rpc_file_write(struct ubus_context *ctx, struct ubus_object *obj,
                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();
 
        write(fd, blobmsg_data(tb[RPC_F_DATA]), blobmsg_data_len(tb[RPC_F_DATA]));
@@ -457,7 +455,7 @@ rpc_file_exec_epipe_state_cb(struct ustream *s)
 
 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;
@@ -580,7 +578,7 @@ rpc_file_exec(struct ubus_context *ctx, struct ubus_object *obj,
                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);
 }