[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Lost] [PATCH] + cdi/fs: Loeschen von Dateien und Verzeichnissen implementiert



Am Sonntag, 5. Oktober 2008 15:58:50 schrieb Antoine Kaufmann:
> [Lost] [PATCH] + cdi/fs: Loeschen von Dateien und Verzeichnissen
> ---
>  src/modules/cdi/include/cdi/fs.h   |    4 ++
>  src/modules/cdi/lib/fs/fs.c        |    4 ++
>  src/modules/cdi/lib/fs/lostio_if.c |   67
> ++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 0
> deletions(-)
> 55aaacc1daea455b08a4bada2e8e09ad60081a32.diff
>   diff --git a/src/modules/cdi/include/cdi/fs.h
> b/src/modules/cdi/include/cdi/fs.h index c3309f3..76a6999 100644
> --- a/src/modules/cdi/include/cdi/fs.h
> +++ b/src/modules/cdi/include/cdi/fs.h
> @@ -361,6 +361,10 @@ struct cdi_fs_res_res {
>       * Diese Ressource aus einer Klasse entfernen. Diese Funktion wird nur
>       * aufgerufen, wenn die Ressource zu dieser Klasse gehoert.
>       *
> +     * Bei Verzeichnissen muss von der Implementation garantiert werden,

Implementierung heißt das Wort.

> dass +     * diese Funktion nicht aufgerufen wird, solange das Verzeichnis
> noch +     * Kindressourcen hat.
> +     *
>       * @param class Konstante fuer den Typ der klasse, aus der die
> Ressource *              entfernt werden soll.
>       *
> diff --git a/src/modules/cdi/lib/fs/fs.c b/src/modules/cdi/lib/fs/fs.c
> index 70b0ddf..9ef41af 100644
> --- a/src/modules/cdi/lib/fs/fs.c
> +++ b/src/modules/cdi/lib/fs/fs.c
> @@ -53,6 +53,7 @@ size_t lostio_read_handler(lostio_filehandle_t* fh, void*
> buf, size_t lostio_write_handler(lostio_filehandle_t* fh, size_t bs, size_t
> bc, void* data);
>  int lostio_seek_handler(lostio_filehandle_t* fh, uint64_t offset, int
> origin); +int lostio_unlink_handler(lostio_filehandle_t* fh, const char*
> name); size_t lostio_symlink_read_handler(lostio_filehandle_t* fh, void*
> buf, size_t bs, size_t bc);
>  size_t lostio_symlink_write_handler(lostio_filehandle_t* fh, size_t bs,
> @@ -66,6 +67,7 @@ typehandle_t cdi_typehandle = {
>      .read = &lostio_read_handler,
>      .write = &lostio_write_handler,
>      .seek = &lostio_seek_handler,
> +    .unlink = &lostio_unlink_handler,
>      .close = NULL
>  };
>  
> @@ -77,6 +79,7 @@ typehandle_t cdi_symlink_typehandle = {
>      .read = &lostio_symlink_read_handler,
>      .write = &lostio_symlink_write_handler,
>      .seek = &lostio_seek_handler,
> +    .unlink = &lostio_unlink_handler,
>      .close = NULL
>  };
>  
> @@ -111,6 +114,7 @@ void cdi_fs_driver_init(struct cdi_fs_driver* driver)
>          typehandle->pre_open = &lostio_pre_open_handler;
>          typehandle->not_found = &lostio_not_found_handler;
>          typehandle->post_open = NULL;
> +        typehandle->unlink = &lostio_unlink_handler;
>  
>          initialized = 1;
>      }
> diff --git a/src/modules/cdi/lib/fs/lostio_if.c
> b/src/modules/cdi/lib/fs/lostio_if.c index 66d3f75..aced058 100644
> --- a/src/modules/cdi/lib/fs/lostio_if.c
> +++ b/src/modules/cdi/lib/fs/lostio_if.c
> @@ -481,6 +481,73 @@ int lostio_seek_handler(lostio_filehandle_t* fh,
> uint64_t offset, int origin) return 0;
>  }
>  
> +/**
> + * Alle Klassen von einer Ressource entfernen und sie dann loeschen.
> + */
> +static int cdi_remove_res(struct cdi_fs_stream* stream)
> +{
> +    if (stream->res->file &&
> +        !stream->res->res->remove_class(stream,CDI_FS_CLASS_FILE))
> +    {
> +        return -1;
> +    }
> +    if (stream->res->dir &&
> +        !stream->res->res->remove_class(stream,CDI_FS_CLASS_DIR))
> +    {
> +        return -1;
> +    }
> +    if (stream->res->link &&
> +        !stream->res->res->remove_class(stream,CDI_FS_CLASS_LINK))
> +    {
> +        return -1;
> +    }
> +
> +    if (!stream->res->res->remove(stream)) {
> +        return -1;
> +    }
> +
> +    return 0;
> +}
> +
> +int lostio_unlink_handler(lostio_filehandle_t* fh, const char* name)
> +{
> +    struct cdi_fs_stream* stream;
> +    vfstree_node_t* node;
> +    int i;
> +    int result = 0;
> +
> +    p();
> +
> +    // Passender Kindknoten finden
> +    for (i = 0; (node = list_get_element_at(fh->node->children, i)); i++)
> { +        if (!strcmp(node->name, name)) {
> +            break;
> +        }
> +    }
> +    if (!node)  {
> +        result = -1;

Es gibt Fälle, in denen ein goto out eleganter ist als if-Gefummel...

> +    } else {
> +        stream = node->data;
> +
> +        // Spezialfall: Es handelt sich um ein Verzeichnis. Das heisst es
> darf +        // nur geloescht werden wenn es keine Kind-Eintraege mehr
> hat. +        if (stream->res->dir && list_size(node->children)) {
> +            result = -1;
> +        } else {
> +            // Sonst kann die Ressource geloescht werden.
> +            result = cdi_remove_res(stream);
> +        }
> +    }
> +
> +    // Aus LostIO-Baum loeschen
> +    if (!result && vfstree_delete_child(fh->node, name) == FALSE) {
> +        result = -2;

Wieso -2? LostIO prüft doch nur auf != 0.

> +    }
> +
> +    v();
> +    return result;
> +}
> +
>  size_t lostio_symlink_read_handler(lostio_filehandle_t* fh, void* buf,
>      size_t bs, size_t bc)
>  {

Das ganze sieht zumindest plausibel aus. Wenn es bei dir funktioniert, schieb 
es halt mal rein.