Am Sonntag, 24. August 2008 13.19:27 schrieb stultus / dunklermeuchler: > So, hier dann mal der Patch für die ramdisk. Das Teil kann Verzeichnisse > anlegen, Dateien anlegen, Schreiben, Lesen, und truncate sollte für > verkleinern und vergrößern funktionieren. > Index: src/modules/cdi/ramdisk/dir.c > =================================================================== > --- src/modules/cdi/ramdisk/dir.c (revision 0) > +++ src/modules/cdi/ramdisk/dir.c (revision 0) > @@ -0,0 +1,65 @@ > .... > +int ramdisk_fs_dir_create_child(struct cdi_fs_stream* stream, const char* > name, + struct cdi_fs_res* parent) > +{ > + struct ramdisk_fs_res* res = malloc(sizeof(*res)); > + struct ramdisk_fs_res* parent_res = (struct ramdisk_fs_res*) parent; > + > + memset(res, 0, sizeof(*res)); > + > + res->res.loaded = 1; > + > + res->res.name = strdup(name); > + res->res.res = &ramdisk_fs_res; > + res->buffer = 0; NULL, wenns dir nichts ausmacht. ;-) > + res->size = 0; > + > + cdi_list_push(parent_res->res.children, res); > + res->res.parent = parent; > + > + stream->res = (struct cdi_fs_res*) res; > + return 1; > +} > Index: src/modules/cdi/ramdisk/ramdisk_cdi.h > =================================================================== > --- src/modules/cdi/ramdisk/ramdisk_cdi.h (revision 0) > +++ src/modules/cdi/ramdisk/ramdisk_cdi.h (revision 0) > @@ -0,0 +1,99 @@ > ... > +/** > + * Dateisystemressource fuer ramdisk > + */ > +struct ramdisk_fs_res { > + struct cdi_fs_res res; > + void* buffer; > + size_t size; > + int64_t access_time; > + int64_t modification_time; > +}; Hier hätte ich gegen Dokumentation der Member nichts einzuwenden. ;-) > .... > + > +// Pointer auf die ramdisk-Ressourcen Solche Kommentare darfst du gerne auch korrigieren beim Übernehmen. Das sind ja keine Pointer. > +extern struct cdi_fs_res_res ramdisk_fs_res; > +extern struct cdi_fs_res_file ramdisk_fs_file; > +extern struct cdi_fs_res_dir ramdisk_fs_dir; > +extern struct cdi_fs_res_link ramdisk_fs_link; > + > +#endif > + > Index: src/modules/cdi/ramdisk/file.c > =================================================================== > --- src/modules/cdi/ramdisk/file.c (revision 0) > +++ src/modules/cdi/ramdisk/file.c (revision 0) > @@ -0,0 +1,103 @@ > ... > +size_t ramdisk_fs_file_write(struct cdi_fs_stream* stream, uint64_t start, > + size_t size, const void* data) > +{ > + struct ramdisk_fs_res* res = (struct ramdisk_fs_res*) stream->res; > + > + // Es soll mehr geschrieben werden als Platz ist. Buffer vergr��ern!. oe statt ö > + if ((res->size - start) < size) { > + size_t new_size; > + new_size = start + size; > + void* new_buffer = malloc(new_size); > + if (new_size == 0) { Hier willst du vermutlich nicht new_size prüfen, aber siehe unten.... > + stream->error = CDI_FS_ERROR_INTERNAL; > + return 0; > + } > + memcpy(new_buffer,res->buffer,res->size); > + free(res->buffer); > + res->buffer = new_buffer; > + res->size = new_size; > + } > + > + memcpy(res->buffer + start, data, size); if (!(new_buffer = realloc(res->buffer, new_size))) { ... memset(res->buffer + res->size, 0, new_size - res->size); Dürfte effizienter als malloc memcpy und free sein. ;-) > + return size; > +} > + > +int ramdisk_fs_file_truncate(struct cdi_fs_stream* stream, uint64_t size) > +{ > + struct ramdisk_fs_res* res = (struct ramdisk_fs_res*) stream->res; > + > + // Nichts zu tun > + if (size == res->size) { > + return 1; > + } > + > + void* new_buffer; > + new_buffer = malloc(size); > + if (new_buffer == 0) { > + stream->error = CDI_FS_ERROR_INTERNAL; > + return 0; > + } > + > + if (res->size < size) { > + memcpy(new_buffer,res->buffer,res->size); > + memset(new_buffer + res->size,0,size - res->size); > + } > + else { > + memcpy(new_buffer,res->buffer,size); > + } > + free(res->buffer); Auch hier realloc() bitte > + res->buffer = new_buffer; > + res->size = size; > + return 1; > +} > Index: src/modules/cdi/ramdisk/init.c > =================================================================== > --- src/modules/cdi/ramdisk/init.c (revision 0) > +++ src/modules/cdi/ramdisk/init.c (revision 0) > @@ -0,0 +1,67 @@ > +#include "ramdisk_cdi.h" > +#include <stdio.h> > + > +int ramdisk_fs_init(struct cdi_fs_filesystem* cdi_fs) > +{ > + struct ramdisk_fs_res* root_res; > + //ramdisk_fs_t* fs = malloc(sizeof(*fs)) Das kannst du ja getrost rauswerfen. > + > + cdi_fs->opaque = NULL; Benutzt du das irgendwo? > + > + //fs->dev_read = null; > + //fs->dev_write = null; > + //fs->dev_private = cdi_fs; Raus damit > + > + root_res = malloc(sizeof(*root_res)); > + memset(root_res, 0, sizeof(*root_res)); > + root_res->res.name = strdup("/"); > + root_res->res.res = &ramdisk_fs_res; > + root_res->res.dir = &ramdisk_fs_dir; > + root_res->res.loaded = 1; > + root_res->buffer = 0; > + root_res->size = 0; > + > + cdi_fs->root_res = (struct cdi_fs_res*) root_res; > + puts("mounted"); Diese Debugausgabe aus ext2 darfst du auch gerne löschen. ;-) > + return 1; > +} > + > +int ramdisk_fs_destroy(struct cdi_fs_filesystem* fs) > +{ > + return 0; > +} > Index: src/modules/cdi/ramdisk/res.c > =================================================================== > --- src/modules/cdi/ramdisk/res.c (revision 0) > +++ src/modules/cdi/ramdisk/res.c (revision 0) > @@ -0,0 +1,160 @@ > ... > +int ramdisk_fs_res_unload(struct cdi_fs_stream* stream) > +{ > + struct ramdisk_fs_res* res = (struct ramdisk_fs_res*) stream->res; > + > + if (!res->res.loaded) { > + return 0; > + } > + > + if (res->res.dir) { > + // dir_clear(stream); > + } Raus damit. > + > + res->res.loaded = 0; > + return 1; > +} > + > ,,.
Attachment:
signature.asc
Description: This is a digitally signed message part.