Commit be496c5e authored by Alberto Miranda's avatar Alberto Miranda ♨️
Browse files

Add support for local file deletion

The norns library and service now supports a new type of i/o task called
NORNS_IOTASK_REMOVE that enqueues the deletion of a resource from
a backend. As of right now, only the deletion of NORNS_LOCAL_PATHs is
supported.
parent f056c93d
Loading
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -80,8 +80,8 @@ typedef struct {
void norns_iotask_init(norns_iotask_t* task, norns_op_t operation,
void norns_iotask_init(norns_iotask_t* task, norns_op_t operation,
                       norns_resource_t* src, norns_resource_t* dst) __THROW;
                       norns_resource_t* src, norns_resource_t* dst) __THROW;


norns_iotask_t NORNS_IOTASK(norns_op_t operation, norns_resource_t src, 
norns_iotask_t 
                            norns_resource_t dst) __THROW;
NORNS_IOTASK(norns_op_t operation, norns_resource_t src, ...) __THROW;


/* Submit an asynchronous I/O task */
/* Submit an asynchronous I/O task */
norns_error_t norns_submit(norns_iotask_t* task) __THROW;
norns_error_t norns_submit(norns_iotask_t* task) __THROW;
+1 −0
Original line number Original line Diff line number Diff line
@@ -39,6 +39,7 @@ extern "C" {
/* Resource types */
/* Resource types */
#define NORNS_PROCESS_MEMORY    0x0100000   /* Memory buffer */
#define NORNS_PROCESS_MEMORY    0x0100000   /* Memory buffer */
#define NORNS_POSIX_PATH        0x0200000   /* POSIX path */
#define NORNS_POSIX_PATH        0x0200000   /* POSIX path */
#define NORNS_NULL_RESOURCE     0x1000000


/* Access types */
/* Access types */
#define R_LOCAL         0x0000010    /* Local resource (default) */
#define R_LOCAL         0x0000010    /* Local resource (default) */
+1 −0
Original line number Original line Diff line number Diff line
@@ -65,6 +65,7 @@ send_submit_request(norns_iotask_t* task) {
       (task->t_op != NORNS_IOTASK_COPY &&
       (task->t_op != NORNS_IOTASK_COPY &&
        task->t_op != NORNS_IOTASK_MOVE && 
        task->t_op != NORNS_IOTASK_MOVE && 
        task->t_op != NORNS_IOTASK_REMOVE)) {
        task->t_op != NORNS_IOTASK_REMOVE)) {
        ERR("Invalid fields detected in norns_iotask_t");
        return NORNS_EBADARGS;
        return NORNS_EBADARGS;
    }
    }


+21 −4
Original line number Original line Diff line number Diff line
@@ -149,10 +149,19 @@ libnorns_reload_config_file(void) {
/* Public API */
/* Public API */


norns_iotask_t
norns_iotask_t
NORNS_IOTASK(norns_op_t optype, norns_resource_t src, norns_resource_t dst) {
NORNS_IOTASK(norns_op_t optype, norns_resource_t src, ...) {
    norns_iotask_t task;
    norns_iotask_t task;


    if(optype == NORNS_IOTASK_REMOVE) {
        norns_iotask_init(&task, optype, &src, NULL);
        return task;
    }

    va_list ap;
    va_start(ap, src);
    norns_resource_t dst = va_arg(ap, norns_resource_t);
    norns_iotask_init(&task, optype, &src, &dst);
    norns_iotask_init(&task, optype, &src, &dst);
    va_end(ap);


    return task;
    return task;
}
}
@@ -165,15 +174,23 @@ norns_iotask_init(norns_iotask_t* task, norns_op_t optype,
        return;
        return;
    }
    }


    if(src == NULL || dst == NULL) {
    memset(task, 0, sizeof(*task));
    memset(task, 0, sizeof(*task));

    if(src == NULL) {
        return;
        return;
    }
    }


    task->t_id = 0;
    task->t_id = 0;
    task->t_op = optype;
    task->t_op = optype;
    task->t_src = *src;
    task->t_src = *src;

    if(dst != NULL) {
        task->t_dst = *dst;
        task->t_dst = *dst;
        return;
    }

    // dst is NULL, set r_flags so that we are aware of it later
    task->t_dst.r_flags = NORNS_NULL_RESOURCE;
}
}


norns_error_t
norns_error_t
+6 −2
Original line number Original line Diff line number Diff line
@@ -531,17 +531,21 @@ build_resource_msg(const norns_resource_t* res) {
        if(msg->buffer == NULL) {
        if(msg->buffer == NULL) {
            goto oom_cleanup;
            goto oom_cleanup;
        }
        }

        return msg;
    }
    }
    else {
        assert(res->r_flags & NORNS_POSIX_PATH);


    if(res->r_flags & NORNS_POSIX_PATH) {
        msg->path = build_path_msg(&res->r_posix_path);
        msg->path = build_path_msg(&res->r_posix_path);


        if(msg->path == NULL) {
        if(msg->path == NULL) {
            goto oom_cleanup;
            goto oom_cleanup;
        }
        }

        return msg;
    }
    }


    assert(res->r_flags & NORNS_NULL_RESOURCE);
    return msg;
    return msg;


oom_cleanup:
oom_cleanup:
Loading