[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.