From f2acbec5b0d90ecf8634b215f5146d45daf924f7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 25 Nov 2025 17:44:39 +0000 Subject: [PATCH 1/7] Initial plan From 0896e4a1851cc5ea5eab2d63f2f2b9a83a38d1f1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 25 Nov 2025 17:59:39 +0000 Subject: [PATCH 2/7] Complete dmramfs implementation and update CI/release workflows Co-authored-by: JohnAmadis <17320783+JohnAmadis@users.noreply.github.com> --- .github/workflows/ci.yml | 31 +- .github/workflows/release.yml | 33 +- README.md | 97 ++- src/dmramfs.c | 1168 ++++++++++++++++++++++++++++++--- 4 files changed, 1195 insertions(+), 134 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d299e60..c11c56b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,7 +17,7 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Build dmffs project + - name: Build dmramfs project run: | mkdir -p build cd build @@ -31,24 +31,6 @@ jobs: cmake ../build/_deps/dmod-src -DDMOD_MODE=DMOD_SYSTEM cmake --build . --target dmod_loader - - name: Prepare test filesystem - run: | - mkdir -p /tmp/flashfs/subdir - echo "Hello from DMFFS!" > /tmp/flashfs/hello.txt - echo "Test file 1" > /tmp/flashfs/test1.txt - echo "File in subdirectory" > /tmp/flashfs/subdir/nested.txt - echo "Config data" > /tmp/flashfs/config.cfg - echo "Test filesystem created:" - find /tmp/flashfs -type f -exec echo " {}" \; - - - name: Create filesystem image with make_dmffs - run: | - ./build_dmod/examples/system/dmod_loader/dmod_loader \ - ./build/dmf/make_dmffs.dmf \ - --args /tmp/flashfs /tmp/flash-fs.ffs - echo "Filesystem image created:" - ls -lh /tmp/flash-fs.ffs - - name: Clone and build dmvfs run: | cd /tmp @@ -56,18 +38,13 @@ jobs: cd dmvfs mkdir build cd build - cmake .. -DDMOD_MODE=DMOD_SYSTEM -DDMOD_MEMORY="08080000:/tmp/flash-fs.ffs" -DDMVFS_BUILD_TESTS=ON + cmake .. -DDMOD_MODE=DMOD_SYSTEM -DDMVFS_BUILD_TESTS=ON cmake --build . echo "dmvfs built successfully, fs_tester available at:" ls -lh ./tests/fs_tester - name: Run filesystem tests run: | - export FLASH_FS_ADDR="0x08080000" - export FLASH_FS_SIZE="0x1000" - echo "Running filesystem tests in read-only mode..." - /tmp/dmvfs/build/tests/fs_tester --read-only-fs \ - --test-file /mnt/hello.txt \ - --test-dir /mnt \ - ./build/dmf/dmffs.dmf + echo "Running filesystem tests for dmramfs..." + /tmp/dmvfs/build/tests/fs_tester ./build/dmf/dmramfs.dmf echo "Filesystem test completed successfully" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f900931..018d051 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -64,7 +64,7 @@ jobs: echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Extracted version: $VERSION" - - name: Build dmffs for ${{ matrix.arch_name }} + - name: Build dmramfs for ${{ matrix.arch_name }} run: | set -e ARCH_DIR_NAME=$(echo "${{ matrix.arch_name }}" | sed 's|/|-|') @@ -91,20 +91,12 @@ jobs: DMF_DIR="$BUILD_DIR/dmf" DMFC_DIR="$BUILD_DIR/dmfc" - cp $DMF_DIR/dmffs.dmf release_package/ - cp $DMF_DIR/dmffs_version.txt release_package/ - cp $DMFC_DIR/dmffs.dmfc release_package/ + cp $DMF_DIR/dmramfs.dmf release_package/ + cp $DMF_DIR/dmramfs_version.txt release_package/ + cp $DMFC_DIR/dmramfs.dmfc release_package/ # Copy .dmd file if it exists - if [ -f $DMF_DIR/dmffs.dmd ]; then - cp $DMF_DIR/dmffs.dmd release_package/ - fi - - cp $DMF_DIR/make_dmffs.dmf release_package/ - cp $DMF_DIR/make_dmffs_version.txt release_package/ - cp $DMFC_DIR/make_dmffs.dmfc release_package/ - # Copy .dmd file if it exists - if [ -f $DMF_DIR/make_dmffs.dmd ]; then - cp $DMF_DIR/make_dmffs.dmd release_package/ + if [ -f $DMF_DIR/dmramfs.dmd ]; then + cp $DMF_DIR/dmramfs.dmd release_package/ fi # Copy documentation and license @@ -120,16 +112,16 @@ jobs: - name: Create release archive run: | cd release_package - zip -r ../dmffs-${{ github.event.release.tag_name }}-$ARCH_DIR_NAME.zip . + zip -r ../dmramfs-${{ github.event.release.tag_name }}-$ARCH_DIR_NAME.zip . cd .. echo "Created archive:" - ls -lh dmffs-*.zip + ls -lh dmramfs-*.zip - name: Upload artifact uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} - path: dmffs-${{ github.event.release.tag_name }}-*.zip + path: dmramfs-${{ github.event.release.tag_name }}-*.zip retention-days: 1 generate-versions-manifest: @@ -148,7 +140,7 @@ jobs: - name: Generate versions.dmm run: | set -e - echo "# List of available versions for dmffs modules" > versions.dmm + echo "# List of available versions for dmramfs modules" > versions.dmm echo "# Generated automatically by CI" >> versions.dmm echo "" >> versions.dmm @@ -166,9 +158,8 @@ jobs: echo "Found versions: $VERSIONS" - # Add $version-available directives for both modules - echo "\$version-available dmffs $VERSIONS" >> versions.dmm - echo "\$version-available make_dmffs $VERSIONS" >> versions.dmm + # Add $version-available directives for the module + echo "\$version-available dmramfs $VERSIONS" >> versions.dmm echo "Generated versions.dmm:" cat versions.dmm diff --git a/README.md b/README.md index 8c9d53c..edf8360 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,97 @@ # dmramfs -DMOD Ram FS + +DMOD RAM File System - an in-memory file system module for the DMOD framework. + +## Overview + +`dmramfs` is a RAM-based file system implementation that provides a fully featured, transient file system stored entirely in memory. It implements the DMOD File System Interface (DMFSI) and can be used with the DMOD Virtual File System (DMVFS). + +## Features + +- **In-Memory Storage**: All files and directories are stored in RAM for fast access +- **Full File Operations**: Support for read, write, seek, truncate, and append operations +- **Directory Support**: Create, list, and navigate directories +- **File Management**: Rename, delete, and get file statistics +- **DMFSI Compliant**: Implements the standard DMOD file system interface + +## Building + +```bash +mkdir build +cd build +cmake .. -DDMOD_MODE=DMOD_MODULE +cmake --build . +``` + +## Usage + +The module can be loaded and mounted using DMVFS: + +```c +#include "dmvfs.h" + +// Initialize DMVFS +dmvfs_init(16, 32); + +// Mount the RAM filesystem at /mnt +dmvfs_mount_fs("dmramfs", "/mnt", NULL); + +// Use standard file operations +void* fp; +dmvfs_fopen(&fp, "/mnt/test.txt", DMFSI_O_CREAT | DMFSI_O_RDWR, 0, 0); +dmvfs_fwrite(fp, "Hello, World!", 13, NULL); +dmvfs_fclose(fp); + +// Unmount when done +dmvfs_unmount_fs("/mnt"); +dmvfs_deinit(); +``` + +## API + +The module implements the full DMFSI interface: + +### File Operations +- `_fopen` - Open a file +- `_fclose` - Close a file +- `_fread` - Read from a file +- `_fwrite` - Write to a file +- `_lseek` - Seek to a position +- `_tell` - Get current position +- `_eof` - Check for end of file +- `_size` - Get file size +- `_getc` - Read a single character +- `_putc` - Write a single character +- `_sync` - Sync file (no-op for RAM FS) +- `_fflush` - Flush buffers (no-op for RAM FS) + +### Directory Operations +- `_mkdir` - Create a directory +- `_opendir` - Open a directory for reading +- `_readdir` - Read directory entries +- `_closedir` - Close a directory +- `_direxists` - Check if directory exists + +### File Management +- `_stat` - Get file/directory statistics +- `_unlink` - Delete a file +- `_rename` - Rename a file + +## Testing + +Tests are run using the `fs_tester` tool from the dmvfs repository: + +```bash +# Build dmvfs with tests +cd /path/to/dmvfs +mkdir build && cd build +cmake .. -DDMOD_MODE=DMOD_SYSTEM -DDMVFS_BUILD_TESTS=ON +cmake --build . + +# Run tests against dmramfs +./tests/fs_tester /path/to/dmramfs.dmf +``` + +## License + +See [LICENSE](LICENSE) file for details. diff --git a/src/dmramfs.c b/src/dmramfs.c index be8663d..38a6149 100644 --- a/src/dmramfs.c +++ b/src/dmramfs.c @@ -29,6 +29,7 @@ typedef struct file_t* file; int mode; int attribute; + size_t position; // Current read/write position } file_handle_t; /** @@ -41,6 +42,16 @@ typedef struct dir dmlist_context_t* dirs; } dir_t; +/** + * @brief Directory handle structure for reading directory entries + */ +typedef struct +{ + dir_t* dir; + size_t file_index; // Current index in files list + size_t dir_index; // Current index in dirs list +} dir_handle_t; + /** * @brief File system context structure */ @@ -54,12 +65,18 @@ struct dmfsi_context // ============================================================================ // Local Prototypes // ============================================================================ -static int compare_file_name (const void* a, const void* b); -static int compare_dir_name (const void* a, const void* b); -static file_t* find_file (dir_t* dir, dmfsi_path_t* path); -static dir_t* find_dir (dir_t* dir, dmfsi_path_t* path); -static file_t* create_file (dir_t* dir, dmfsi_path_t* path); -static file_handle_t* create_file_handle (file_t* file, int mode, int attribute); +static int compare_file_name (const void* a, const void* b); +static int compare_dir_name (const void* a, const void* b); +static int compare_handle_ptr (const void* a, const void* b); +static int compare_file_ptr (const void* a, const void* b); +static file_t* find_file (dir_t* dir, dmfsi_path_t* path); +static dir_t* find_dir (dir_t* dir, dmfsi_path_t* path); +static file_t* create_file (dir_t* dir, dmfsi_path_t* path); +static file_handle_t* create_file_handle (file_t* file, int mode, int attribute); +static dir_t* create_dir (dir_t* parent, dmfsi_path_t* path); +static dir_t* create_root_dir (void); +static void free_file (file_t* file); +static void free_dir (dir_t* dir); // ============================================================================ @@ -107,6 +124,13 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, dmfsi_context_t, _init, (const cha return NULL; } ctx->magic = DMRAMFS_CONTEXT_MAGIC; + ctx->root_dir = create_root_dir(); + if (ctx->root_dir == NULL) + { + DMOD_LOG_ERROR("dmramfs: Failed to create root directory\n"); + Dmod_Free(ctx); + return NULL; + } return ctx; } @@ -117,6 +141,10 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _deinit, (dmfsi_context_t ctx { if (ctx) { + if (ctx->root_dir) + { + free_dir(ctx->root_dir); + } Dmod_Free(ctx); } return DMFSI_OK; @@ -178,8 +206,29 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _fopen, (dmfsi_context_t ctx, */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _fclose, (dmfsi_context_t ctx, void* fp) ) { - // TODO: Implement file close - return DMFSI_ERR_GENERAL; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + DMOD_LOG_ERROR("dmramfs: Invalid context in fclose\n"); + return DMFSI_ERR_INVALID; + } + + if (fp == NULL) + { + DMOD_LOG_ERROR("dmramfs: NULL file pointer in fclose\n"); + return DMFSI_ERR_INVALID; + } + + file_handle_t* handle = (file_handle_t*)fp; + file_t* file = handle->file; + + // Remove handle from file's handle list + if (file && file->handles) + { + dmlist_remove(file->handles, handle, compare_handle_ptr); + } + + Dmod_Free(handle); + return DMFSI_OK; } /** @@ -187,9 +236,39 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _fclose, (dmfsi_context_t ctx */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _fread, (dmfsi_context_t ctx, void* fp, void* buffer, size_t size, size_t* read) ) { - // TODO: Implement file read - if (read) *read = 0; - return DMFSI_ERR_GENERAL; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + DMOD_LOG_ERROR("dmramfs: Invalid context in fread\n"); + return DMFSI_ERR_INVALID; + } + + if (fp == NULL || buffer == NULL) + { + if (read) *read = 0; + return DMFSI_ERR_INVALID; + } + + file_handle_t* handle = (file_handle_t*)fp; + file_t* file = handle->file; + + if (file == NULL || file->data == NULL) + { + if (read) *read = 0; + return DMFSI_OK; // Empty file, nothing to read + } + + // Calculate how much we can read + size_t available = (handle->position < file->size) ? (file->size - handle->position) : 0; + size_t to_read = (size < available) ? size : available; + + if (to_read > 0) + { + memcpy(buffer, (char*)file->data + handle->position, to_read); + handle->position += to_read; + } + + if (read) *read = to_read; + return DMFSI_OK; } /** @@ -197,9 +276,69 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _fread, (dmfsi_context_t ctx, */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _fwrite, (dmfsi_context_t ctx, void* fp, const void* buffer, size_t size, size_t* written) ) { - // TODO: Implement file write - if (written) *written = 0; - return DMFSI_ERR_GENERAL; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + DMOD_LOG_ERROR("dmramfs: Invalid context in fwrite\n"); + return DMFSI_ERR_INVALID; + } + + if (fp == NULL || buffer == NULL) + { + if (written) *written = 0; + return DMFSI_ERR_INVALID; + } + + file_handle_t* handle = (file_handle_t*)fp; + file_t* file = handle->file; + + if (file == NULL) + { + if (written) *written = 0; + return DMFSI_ERR_INVALID; + } + + // Calculate new size needed + size_t end_position = handle->position + size; + + // Resize the file data buffer if needed + if (end_position > file->size) + { + void* new_data = Dmod_Malloc(end_position); + if (new_data == NULL) + { + DMOD_LOG_ERROR("dmramfs: Failed to allocate memory for file data\n"); + if (written) *written = 0; + return DMFSI_ERR_GENERAL; + } + + // Copy existing data if any + if (file->data && file->size > 0) + { + memcpy(new_data, file->data, file->size); + } + + // Zero-fill gap between old size and current position + if (handle->position > file->size) + { + memset((char*)new_data + file->size, 0, handle->position - file->size); + } + + // Free old data + if (file->data) + { + Dmod_Free(file->data); + } + + file->data = new_data; + file->size = end_position; + } + + // Write the data + memcpy((char*)file->data + handle->position, buffer, size); + handle->position += size; + + if (written) *written = size; + return DMFSI_OK; } /** @@ -207,8 +346,43 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _fwrite, (dmfsi_context_t ctx */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, long, _lseek, (dmfsi_context_t ctx, void* fp, long offset, int whence) ) { - // TODO: Implement file seek - return -1; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + DMOD_LOG_ERROR("dmramfs: Invalid context in lseek\n"); + return -1; + } + + if (fp == NULL) + { + return -1; + } + + file_handle_t* handle = (file_handle_t*)fp; + file_t* file = handle->file; + long new_position; + + switch (whence) + { + case DMFSI_SEEK_SET: + new_position = offset; + break; + case DMFSI_SEEK_CUR: + new_position = (long)handle->position + offset; + break; + case DMFSI_SEEK_END: + new_position = (file ? (long)file->size : 0) + offset; + break; + default: + return -1; + } + + if (new_position < 0) + { + return -1; + } + + handle->position = (size_t)new_position; + return new_position; } /** @@ -234,8 +408,27 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _sync, (dmfsi_context_t ctx, */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _getc, (dmfsi_context_t ctx, void* fp) ) { - // TODO: Implement getc - return -1; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + return -1; + } + + if (fp == NULL) + { + return -1; + } + + file_handle_t* handle = (file_handle_t*)fp; + file_t* file = handle->file; + + if (file == NULL || file->data == NULL || handle->position >= file->size) + { + return -1; // EOF + } + + unsigned char c = ((unsigned char*)file->data)[handle->position]; + handle->position++; + return (int)c; } /** @@ -243,8 +436,26 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _getc, (dmfsi_context_t ctx, */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _putc, (dmfsi_context_t ctx, void* fp, int c) ) { - // TODO: Implement putc - return -1; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + return -1; + } + + if (fp == NULL) + { + return -1; + } + + unsigned char ch = (unsigned char)c; + size_t written = 0; + + int ret = dmfsi_dmramfs_fwrite(ctx, fp, &ch, 1, &written); + if (ret != DMFSI_OK || written != 1) + { + return -1; + } + + return c; } /** @@ -252,8 +463,18 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _putc, (dmfsi_context_t ctx, */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, long, _tell, (dmfsi_context_t ctx, void* fp) ) { - // TODO: Implement tell - return -1; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + return -1; + } + + if (fp == NULL) + { + return -1; + } + + file_handle_t* handle = (file_handle_t*)fp; + return (long)handle->position; } /** @@ -261,8 +482,25 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, long, _tell, (dmfsi_context_t ctx, */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _eof, (dmfsi_context_t ctx, void* fp) ) { - // TODO: Implement EOF check - return -1; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + return -1; + } + + if (fp == NULL) + { + return -1; + } + + file_handle_t* handle = (file_handle_t*)fp; + file_t* file = handle->file; + + if (file == NULL) + { + return 1; // Empty file is at EOF + } + + return (handle->position >= file->size) ? 1 : 0; } /** @@ -270,8 +508,25 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _eof, (dmfsi_context_t ctx, v */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, long, _size, (dmfsi_context_t ctx, void* fp) ) { - // TODO: Implement size - return -1; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + return -1; + } + + if (fp == NULL) + { + return -1; + } + + file_handle_t* handle = (file_handle_t*)fp; + file_t* file = handle->file; + + if (file == NULL) + { + return 0; + } + + return (long)file->size; } /** @@ -288,8 +543,8 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _fflush, (dmfsi_context_t ctx */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _error, (dmfsi_context_t ctx, void* fp) ) { - // TODO: Implement error reporting - return DMFSI_ERR_GENERAL; + // RAM filesystem doesn't track error state per handle + return DMFSI_OK; } /** @@ -297,8 +552,79 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _error, (dmfsi_context_t ctx, */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _opendir, (dmfsi_context_t ctx, void** dp, const char* path) ) { - // TODO: Implement directory open - return DMFSI_ERR_GENERAL; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + DMOD_LOG_ERROR("dmramfs: Invalid context in opendir\n"); + return DMFSI_ERR_INVALID; + } + + if (dp == NULL) + { + return DMFSI_ERR_INVALID; + } + + dir_t* dir = NULL; + + // Handle root directory case + if (path == NULL || strcmp(path, "/") == 0 || strcmp(path, "") == 0) + { + dir = ctx->root_dir; + } + else + { + // Remove leading slash if present + const char* search_path = path; + if (search_path[0] == '/') + { + search_path++; + } + + // Remove trailing slash if present + size_t len = strlen(search_path); + char* clean_path = dmfsi_strndup(search_path, len); + if (clean_path == NULL) + { + return DMFSI_ERR_GENERAL; + } + + if (len > 0 && clean_path[len - 1] == '/') + { + clean_path[len - 1] = '\0'; + } + + if (strlen(clean_path) == 0) + { + dir = ctx->root_dir; + } + else + { + dmfsi_path_t* p = dmfsi_path_create(clean_path); + if (p != NULL) + { + dir = find_dir(ctx->root_dir, p); + dmfsi_path_free(p); + } + } + Dmod_Free(clean_path); + } + + if (dir == NULL) + { + return DMFSI_ERR_NOT_FOUND; + } + + dir_handle_t* handle = Dmod_Malloc(sizeof(dir_handle_t)); + if (handle == NULL) + { + return DMFSI_ERR_GENERAL; + } + + handle->dir = dir; + handle->file_index = 0; + handle->dir_index = 0; + + *dp = handle; + return DMFSI_OK; } /** @@ -306,8 +632,19 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _opendir, (dmfsi_context_t ct */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _closedir, (dmfsi_context_t ctx, void* dp) ) { - // TODO: Implement directory close - return DMFSI_ERR_GENERAL; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + return DMFSI_ERR_INVALID; + } + + if (dp == NULL) + { + return DMFSI_ERR_INVALID; + } + + dir_handle_t* handle = (dir_handle_t*)dp; + Dmod_Free(handle); + return DMFSI_OK; } /** @@ -315,7 +652,59 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _closedir, (dmfsi_context_t c */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _readdir, (dmfsi_context_t ctx, void* dp, dmfsi_dir_entry_t* entry) ) { - // TODO: Implement directory read + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + return DMFSI_ERR_INVALID; + } + + if (dp == NULL || entry == NULL) + { + return DMFSI_ERR_INVALID; + } + + dir_handle_t* handle = (dir_handle_t*)dp; + dir_t* dir = handle->dir; + + if (dir == NULL) + { + return DMFSI_ERR_NOT_FOUND; + } + + // First iterate through files + size_t file_count = dmlist_size(dir->files); + if (handle->file_index < file_count) + { + file_t* file = (file_t*)dmlist_get(dir->files, handle->file_index); + if (file != NULL) + { + strncpy(entry->name, file->file_name, sizeof(entry->name) - 1); + entry->name[sizeof(entry->name) - 1] = '\0'; + entry->size = (uint32_t)file->size; + entry->attr = 0; // Regular file + entry->time = 0; + handle->file_index++; + return DMFSI_OK; + } + } + + // Then iterate through subdirectories + size_t dir_count = dmlist_size(dir->dirs); + if (handle->dir_index < dir_count) + { + dir_t* subdir = (dir_t*)dmlist_get(dir->dirs, handle->dir_index); + if (subdir != NULL) + { + strncpy(entry->name, subdir->dir_name, sizeof(entry->name) - 1); + entry->name[sizeof(entry->name) - 1] = '\0'; + entry->size = 0; + entry->attr = 0x10; // Directory attribute + entry->time = 0; + handle->dir_index++; + return DMFSI_OK; + } + } + + // No more entries return DMFSI_ERR_NOT_FOUND; } @@ -324,8 +713,69 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _readdir, (dmfsi_context_t ct */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _stat, (dmfsi_context_t ctx, const char* path, dmfsi_stat_t* stat) ) { - // TODO: Implement stat - return DMFSI_ERR_GENERAL; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + DMOD_LOG_ERROR("dmramfs: Invalid context in stat\n"); + return DMFSI_ERR_INVALID; + } + + if (path == NULL || stat == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Remove leading slash if present + const char* search_path = path; + if (search_path[0] == '/') + { + search_path++; + } + + if (strlen(search_path) == 0) + { + // Root directory stat + stat->size = 0; + stat->attr = 0x10; // Directory + stat->ctime = 0; + stat->mtime = 0; + stat->atime = 0; + return DMFSI_OK; + } + + dmfsi_path_t* p = dmfsi_path_create(search_path); + if (p == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Try to find as file first + file_t* file = find_file(ctx->root_dir, p); + if (file != NULL) + { + stat->size = (uint32_t)file->size; + stat->attr = 0; // Regular file + stat->ctime = 0; + stat->mtime = 0; + stat->atime = 0; + dmfsi_path_free(p); + return DMFSI_OK; + } + + // Try to find as directory + dir_t* dir = find_dir(ctx->root_dir, p); + if (dir != NULL) + { + stat->size = 0; + stat->attr = 0x10; // Directory + stat->ctime = 0; + stat->mtime = 0; + stat->atime = 0; + dmfsi_path_free(p); + return DMFSI_OK; + } + + dmfsi_path_free(p); + return DMFSI_ERR_NOT_FOUND; } /** @@ -333,26 +783,198 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _stat, (dmfsi_context_t ctx, */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _unlink, (dmfsi_context_t ctx, const char* path) ) { - // TODO: Implement file deletion - return DMFSI_ERR_GENERAL; -} - -/** - * @brief Rename a file or directory - */ -dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _rename, (dmfsi_context_t ctx, const char* oldpath, const char* newpath) ) -{ - // TODO: Implement rename - return DMFSI_ERR_GENERAL; -} - + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + DMOD_LOG_ERROR("dmramfs: Invalid context in unlink\n"); + return DMFSI_ERR_INVALID; + } + + if (path == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Remove leading slash if present + const char* search_path = path; + if (search_path[0] == '/') + { + search_path++; + } + + dmfsi_path_t* p = dmfsi_path_create(search_path); + if (p == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Find the parent directory and file + dir_t* parent_dir = ctx->root_dir; + dmfsi_path_t* current = p; + + // Navigate to parent directory + while (current->directory != NULL && current->next != NULL) + { + dir_t* subdir = dmlist_find(parent_dir->dirs, current->directory, compare_dir_name); + if (subdir == NULL) + { + dmfsi_path_free(p); + return DMFSI_ERR_NOT_FOUND; + } + parent_dir = subdir; + current = current->next; + } + + // Find and remove the file + const char* filename = (current->filename != NULL) ? current->filename : current->directory; + if (filename == NULL) + { + dmfsi_path_free(p); + return DMFSI_ERR_NOT_FOUND; + } + + file_t* file = dmlist_find(parent_dir->files, filename, compare_file_name); + if (file == NULL) + { + dmfsi_path_free(p); + return DMFSI_ERR_NOT_FOUND; + } + + // Check if file has open handles + if (file->handles && dmlist_size(file->handles) > 0) + { + dmfsi_path_free(p); + return DMFSI_ERR_INVALID; // File is in use + } + + // Remove from list and free + dmlist_remove(parent_dir->files, file, compare_file_ptr); + free_file(file); + + dmfsi_path_free(p); + return DMFSI_OK; +} + +/** + * @brief Rename a file or directory + */ +dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _rename, (dmfsi_context_t ctx, const char* oldpath, const char* newpath) ) +{ + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + DMOD_LOG_ERROR("dmramfs: Invalid context in rename\n"); + return DMFSI_ERR_INVALID; + } + + if (oldpath == NULL || newpath == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Remove leading slashes + const char* old_search = (oldpath[0] == '/') ? oldpath + 1 : oldpath; + const char* new_search = (newpath[0] == '/') ? newpath + 1 : newpath; + + dmfsi_path_t* old_p = dmfsi_path_create(old_search); + if (old_p == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Find the file + file_t* file = find_file(ctx->root_dir, old_p); + if (file == NULL) + { + dmfsi_path_free(old_p); + return DMFSI_ERR_NOT_FOUND; + } + + // Extract just the filename from the new path + dmfsi_path_t* new_p = dmfsi_path_create(new_search); + if (new_p == NULL) + { + dmfsi_path_free(old_p); + return DMFSI_ERR_INVALID; + } + + // Find the new filename (traverse to the end) + dmfsi_path_t* current = new_p; + while (current->next != NULL) + { + current = current->next; + } + + const char* new_name = (current->filename != NULL) ? current->filename : current->directory; + if (new_name == NULL) + { + dmfsi_path_free(old_p); + dmfsi_path_free(new_p); + return DMFSI_ERR_INVALID; + } + + // Update the filename + char* old_name = file->file_name; + file->file_name = dmfsi_strndup(new_name, strlen(new_name)); + if (file->file_name == NULL) + { + file->file_name = old_name; // Restore on failure + dmfsi_path_free(old_p); + dmfsi_path_free(new_p); + return DMFSI_ERR_GENERAL; + } + + Dmod_Free(old_name); + dmfsi_path_free(old_p); + dmfsi_path_free(new_p); + return DMFSI_OK; +} + /** * @brief Change file mode/permissions */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _chmod, (dmfsi_context_t ctx, const char* path, int mode) ) { - // TODO: Implement chmod - return DMFSI_ERR_GENERAL; + // RAM filesystem doesn't support permissions + // But we should verify the file exists + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + return DMFSI_ERR_INVALID; + } + + if (path == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Remove leading slash if present + const char* search_path = path; + if (search_path[0] == '/') + { + search_path++; + } + + if (strlen(search_path) == 0) + { + return DMFSI_OK; // Root directory + } + + dmfsi_path_t* p = dmfsi_path_create(search_path); + if (p == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Check if file or directory exists + file_t* file = find_file(ctx->root_dir, p); + dir_t* dir = (file == NULL) ? find_dir(ctx->root_dir, p) : NULL; + + dmfsi_path_free(p); + + if (file == NULL && dir == NULL) + { + return DMFSI_ERR_NOT_FOUND; + } + + return DMFSI_OK; } /** @@ -360,8 +982,48 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _chmod, (dmfsi_context_t ctx, */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _utime, (dmfsi_context_t ctx, const char* path, uint32_t atime, uint32_t mtime) ) { - // TODO: Implement utime - return DMFSI_ERR_GENERAL; + // RAM filesystem doesn't track timestamps + // But we should verify the file exists + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + return DMFSI_ERR_INVALID; + } + + if (path == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Remove leading slash if present + const char* search_path = path; + if (search_path[0] == '/') + { + search_path++; + } + + if (strlen(search_path) == 0) + { + return DMFSI_OK; // Root directory + } + + dmfsi_path_t* p = dmfsi_path_create(search_path); + if (p == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Check if file or directory exists + file_t* file = find_file(ctx->root_dir, p); + dir_t* dir = (file == NULL) ? find_dir(ctx->root_dir, p) : NULL; + + dmfsi_path_free(p); + + if (file == NULL && dir == NULL) + { + return DMFSI_ERR_NOT_FOUND; + } + + return DMFSI_OK; } /** @@ -369,8 +1031,53 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _utime, (dmfsi_context_t ctx, */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _mkdir, (dmfsi_context_t ctx, const char* path, int mode) ) { - // TODO: Implement directory creation - return DMFSI_ERR_GENERAL; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + DMOD_LOG_ERROR("dmramfs: Invalid context in mkdir\n"); + return DMFSI_ERR_INVALID; + } + + if (path == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Remove leading slash if present + const char* search_path = path; + if (search_path[0] == '/') + { + search_path++; + } + + if (strlen(search_path) == 0) + { + return DMFSI_ERR_INVALID; // Can't create root + } + + dmfsi_path_t* p = dmfsi_path_create(search_path); + if (p == NULL) + { + return DMFSI_ERR_INVALID; + } + + // Check if already exists + dir_t* existing = find_dir(ctx->root_dir, p); + if (existing != NULL) + { + dmfsi_path_free(p); + return DMFSI_OK; // Already exists + } + + // Create the directory + dir_t* new_dir = create_dir(ctx->root_dir, p); + dmfsi_path_free(p); + + if (new_dir == NULL) + { + return DMFSI_ERR_GENERAL; + } + + return DMFSI_OK; } /** @@ -378,8 +1085,60 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _mkdir, (dmfsi_context_t ctx, */ dmod_dmfsi_dif_api_declaration( 1.0, dmramfs, int, _direxists, (dmfsi_context_t ctx, const char* path) ) { - // TODO: Implement directory existence check - return 0; + if(dmfsi_dmramfs_context_is_valid(ctx) == 0) + { + return 0; + } + + if (path == NULL) + { + return 0; + } + + // Handle root directory + if (strcmp(path, "/") == 0 || strcmp(path, "") == 0) + { + return 1; + } + + // Remove leading slash if present + const char* search_path = path; + if (search_path[0] == '/') + { + search_path++; + } + + // Remove trailing slash if present + size_t len = strlen(search_path); + char* clean_path = dmfsi_strndup(search_path, len); + if (clean_path == NULL) + { + return 0; + } + + if (len > 0 && clean_path[len - 1] == '/') + { + clean_path[len - 1] = '\0'; + } + + if (strlen(clean_path) == 0) + { + Dmod_Free(clean_path); + return 1; // Root directory + } + + dmfsi_path_t* p = dmfsi_path_create(clean_path); + Dmod_Free(clean_path); + + if (p == NULL) + { + return 0; + } + + dir_t* dir = find_dir(ctx->root_dir, p); + dmfsi_path_free(p); + + return (dir != NULL) ? 1 : 0; } // ============================================================================ @@ -407,26 +1166,36 @@ static int compare_dir_name(const void* a, const void* b) return strcmp(dir_a->dir_name, name_b); } +/** + * @brief Compare file handle pointers + */ +static int compare_handle_ptr(const void* a, const void* b) +{ + return (a == b) ? 0 : 1; +} + +/** + * @brief Compare file pointers + */ +static int compare_file_ptr(const void* a, const void* b) +{ + return (a == b) ? 0 : 1; +} + /** * @brief Find a file by its path */ static file_t* find_file(dir_t* dir, dmfsi_path_t* path) { + if (dir == NULL || path == NULL) + { + return NULL; + } + if(path->filename != NULL) { file_t* file = dmlist_find(dir->files, path->filename, compare_file_name); - if(file == NULL) - { - dir_t* subdir = dmlist_find(dir->dirs, path->filename, compare_dir_name); - if(subdir != NULL) - { - DMOD_LOG_ERROR("dmramfs: Path '%s' is a directory, not a file\n", path->filename); - } - else - { - DMOD_LOG_ERROR("dmramfs: File '%s' not found in path\n", path->filename); - } - } + return file; // Return the found file (or NULL if not found) } else if(path->directory != NULL) { @@ -435,10 +1204,6 @@ static file_t* find_file(dir_t* dir, dmfsi_path_t* path) { return find_file(subdir, path->next); } - else - { - DMOD_LOG_ERROR("dmramfs: Directory '%s' not found in path\n", path->directory); - } } return NULL; } @@ -448,25 +1213,31 @@ static file_t* find_file(dir_t* dir, dmfsi_path_t* path) */ static dir_t* find_dir(dir_t* dir, dmfsi_path_t* path) { - if(path->directory != NULL) + if (dir == NULL || path == NULL) { - dir_t* subdir = dmlist_find(dir->dirs, path->directory, compare_dir_name); - if(subdir != NULL) + return NULL; + } + + // Handle case where path ends with a filename (treat as dir name for direxists) + const char* name = (path->directory != NULL) ? path->directory : path->filename; + if (name == NULL) + { + return NULL; + } + + dir_t* subdir = dmlist_find(dir->dirs, name, compare_dir_name); + if (subdir != NULL) + { + if (path->next != NULL) { - if(path->next != NULL) - { - return find_dir(subdir, path->next); - } - else - { - return subdir; - } + return find_dir(subdir, path->next); } - else + else { - DMOD_LOG_ERROR("dmramfs: Directory '%s' not found in path\n", path->directory); + return subdir; } } + return NULL; } @@ -538,6 +1309,24 @@ static file_handle_t* create_file_handle(file_t* file, int mode, int attribute) handle->file = file; handle->mode = mode; handle->attribute = attribute; + handle->position = 0; + + // Handle truncate mode + if ((mode & DMFSI_O_TRUNC) && file != NULL) + { + if (file->data) + { + Dmod_Free(file->data); + file->data = NULL; + } + file->size = 0; + } + + // Handle append mode - start at end of file + if ((mode & DMFSI_O_APPEND) && file != NULL) + { + handle->position = file->size; + } if(!dmlist_push_back(file->handles, handle)) { @@ -547,4 +1336,213 @@ static file_handle_t* create_file_handle(file_t* file, int mode, int attribute) } return handle; +} + +/** + * @brief Create the root directory + * + * @return dir_t* Pointer to the created root directory, or NULL on failure + */ +static dir_t* create_root_dir(void) +{ + dir_t* root = Dmod_Malloc(sizeof(dir_t)); + if (root == NULL) + { + DMOD_LOG_ERROR("dmramfs: Failed to allocate memory for root directory\n"); + return NULL; + } + + root->dir_name = dmfsi_strndup("/", 1); + root->files = dmlist_create(DMOD_MODULE_NAME); + root->dirs = dmlist_create(DMOD_MODULE_NAME); + + if (root->dir_name == NULL || root->files == NULL || root->dirs == NULL) + { + DMOD_LOG_ERROR("dmramfs: Failed to initialize root directory\n"); + if (root->dir_name) Dmod_Free(root->dir_name); + if (root->files) dmlist_destroy(root->files); + if (root->dirs) dmlist_destroy(root->dirs); + Dmod_Free(root); + return NULL; + } + + return root; +} + +/** + * @brief Create a directory at the specified path + * + * @param parent The parent directory + * @param path The path to create the directory at + * + * @return dir_t* Pointer to the created directory, or NULL on failure + */ +static dir_t* create_dir(dir_t* parent, dmfsi_path_t* path) +{ + if (path == NULL || parent == NULL) + { + return NULL; + } + + // If this is a filename entry, treat it as a directory name (for mkdir with no trailing slash) + const char* name = (path->filename != NULL) ? path->filename : path->directory; + if (name == NULL) + { + return NULL; + } + + // Check if it's the final component + if (path->filename != NULL || path->next == NULL) + { + // Check if directory already exists + dir_t* existing = dmlist_find(parent->dirs, name, compare_dir_name); + if (existing != NULL) + { + return existing; + } + + // Create new directory + dir_t* new_dir = Dmod_Malloc(sizeof(dir_t)); + if (new_dir == NULL) + { + DMOD_LOG_ERROR("dmramfs: Failed to allocate memory for directory '%s'\n", name); + return NULL; + } + + new_dir->dir_name = dmfsi_strndup(name, strlen(name)); + new_dir->files = dmlist_create(DMOD_MODULE_NAME); + new_dir->dirs = dmlist_create(DMOD_MODULE_NAME); + + if (new_dir->dir_name == NULL || new_dir->files == NULL || new_dir->dirs == NULL) + { + DMOD_LOG_ERROR("dmramfs: Failed to initialize directory '%s'\n", name); + if (new_dir->dir_name) Dmod_Free(new_dir->dir_name); + if (new_dir->files) dmlist_destroy(new_dir->files); + if (new_dir->dirs) dmlist_destroy(new_dir->dirs); + Dmod_Free(new_dir); + return NULL; + } + + if (dmlist_insert(parent->dirs, 0, new_dir) != 0) + { + DMOD_LOG_ERROR("dmramfs: Failed to insert directory '%s' into parent\n", name); + Dmod_Free(new_dir->dir_name); + dmlist_destroy(new_dir->files); + dmlist_destroy(new_dir->dirs); + Dmod_Free(new_dir); + return NULL; + } + + return new_dir; + } + else + { + // Navigate to or create intermediate directory + dir_t* subdir = dmlist_find(parent->dirs, name, compare_dir_name); + if (subdir == NULL) + { + // Create intermediate directory + subdir = Dmod_Malloc(sizeof(dir_t)); + if (subdir == NULL) + { + return NULL; + } + + subdir->dir_name = dmfsi_strndup(name, strlen(name)); + subdir->files = dmlist_create(DMOD_MODULE_NAME); + subdir->dirs = dmlist_create(DMOD_MODULE_NAME); + + if (dmlist_insert(parent->dirs, 0, subdir) != 0) + { + if (subdir->dir_name) Dmod_Free(subdir->dir_name); + if (subdir->files) dmlist_destroy(subdir->files); + if (subdir->dirs) dmlist_destroy(subdir->dirs); + Dmod_Free(subdir); + return NULL; + } + } + + return create_dir(subdir, path->next); + } +} + +/** + * @brief Free a file and all its resources + * + * @param file The file to free + */ +static void free_file(file_t* file) +{ + if (file == NULL) + { + return; + } + + if (file->file_name) + { + Dmod_Free(file->file_name); + } + + if (file->data) + { + Dmod_Free(file->data); + } + + if (file->handles) + { + // Free all handles + while (dmlist_size(file->handles) > 0) + { + file_handle_t* handle = (file_handle_t*)dmlist_front(file->handles); + dmlist_pop_front(file->handles); + if (handle) Dmod_Free(handle); + } + dmlist_destroy(file->handles); + } + + Dmod_Free(file); +} + +/** + * @brief Free a directory and all its contents recursively + * + * @param dir The directory to free + */ +static void free_dir(dir_t* dir) +{ + if (dir == NULL) + { + return; + } + + // Free all files + if (dir->files) + { + while (dmlist_size(dir->files) > 0) + { + file_t* file = (file_t*)dmlist_front(dir->files); + dmlist_pop_front(dir->files); + free_file(file); + } + dmlist_destroy(dir->files); + } + + // Free all subdirectories recursively + if (dir->dirs) + { + while (dmlist_size(dir->dirs) > 0) + { + dir_t* subdir = (dir_t*)dmlist_front(dir->dirs); + dmlist_pop_front(dir->dirs); + free_dir(subdir); + } + dmlist_destroy(dir->dirs); + } + + if (dir->dir_name) + { + Dmod_Free(dir->dir_name); + } + + Dmod_Free(dir); } \ No newline at end of file From 0e272cbaecd63a268df3e9e454ecb71ac321219a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 25 Nov 2025 18:02:43 +0000 Subject: [PATCH 3/7] Fix code review comments: add string.h include and improve error handling Co-authored-by: JohnAmadis <17320783+JohnAmadis@users.noreply.github.com> --- src/dmramfs.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/dmramfs.c b/src/dmramfs.c index 38a6149..2071568 100644 --- a/src/dmramfs.c +++ b/src/dmramfs.c @@ -4,6 +4,7 @@ #include "dmramfs.h" #include "dmfsi.h" #include "dmlist.h" +#include /** * @brief Magic number for RAMFS context validation @@ -1266,7 +1267,8 @@ static file_t* create_file(dir_t* dir, dmfsi_path_t* path) if(dmlist_insert(dir->files, 0, file) != 0) { DMOD_LOG_ERROR("dmramfs: Failed to insert new file '%s' into directory\n", path->filename); - Dmod_Free(file->file_name); + if (file->handles) dmlist_destroy(file->handles); + if (file->file_name) Dmod_Free(file->file_name); Dmod_Free(file); return NULL; } @@ -1426,9 +1428,9 @@ static dir_t* create_dir(dir_t* parent, dmfsi_path_t* path) if (dmlist_insert(parent->dirs, 0, new_dir) != 0) { DMOD_LOG_ERROR("dmramfs: Failed to insert directory '%s' into parent\n", name); - Dmod_Free(new_dir->dir_name); - dmlist_destroy(new_dir->files); - dmlist_destroy(new_dir->dirs); + if (new_dir->dir_name) Dmod_Free(new_dir->dir_name); + if (new_dir->files) dmlist_destroy(new_dir->files); + if (new_dir->dirs) dmlist_destroy(new_dir->dirs); Dmod_Free(new_dir); return NULL; } From b942d3f0f322a7d2226d84cacbd9260a1ed55e0f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 25 Nov 2025 18:04:44 +0000 Subject: [PATCH 4/7] Final: Complete dmramfs implementation with CI updates Co-authored-by: JohnAmadis <17320783+JohnAmadis@users.noreply.github.com> --- _codeql_build_dir/dmf/dmfsi.dmf | Bin 0 -> 560 bytes _codeql_build_dir/dmf/dmfsi_version.txt | 2 + _codeql_build_dir/dmf/dmramfs.dmf | Bin 0 -> 14968 bytes _codeql_build_dir/dmf/dmramfs_version.txt | 2 + _codeql_build_dir/dmramfs | Bin 0 -> 26304 bytes _codeql_build_dir/dmramfs_defs.h | 66 ++++++++++++++++++++++ _codeql_build_dir/dmramfs_header.c | 64 +++++++++++++++++++++ _codeql_detected_source_root | 1 + 8 files changed, 135 insertions(+) create mode 100755 _codeql_build_dir/dmf/dmfsi.dmf create mode 100644 _codeql_build_dir/dmf/dmfsi_version.txt create mode 100755 _codeql_build_dir/dmf/dmramfs.dmf create mode 100644 _codeql_build_dir/dmf/dmramfs_version.txt create mode 100755 _codeql_build_dir/dmramfs create mode 100644 _codeql_build_dir/dmramfs_defs.h create mode 100644 _codeql_build_dir/dmramfs_header.c create mode 120000 _codeql_detected_source_root diff --git a/_codeql_build_dir/dmf/dmfsi.dmf b/_codeql_build_dir/dmf/dmfsi.dmf new file mode 100755 index 0000000000000000000000000000000000000000..0f2d8b67294180d2c582859961da9fb7380219cc GIT binary patch literal 560 zcmZ?q_jUQe00fK-3>-kJ!on=x%mgGr9!SYeE6&8D)y3D}MZv|_E!a~bBsDP?L#3gf z0frb@0O&qspn%3_V1dYjgps8_Aaj6neQ5m8{BplMn%{7E^x7H%r40}K7rpua|9`^+ z9?eHM4yR2(lDCA)??je|cqKEhB(*3lF*#KsH$SB`CsiRcFS8^wF(5H4B~_2 zuWa+Z_cMNmAFnd!hRH6!TUM!a%mhk-0Vuw~aSo+H@eT?!2O#wZ8a^-@Is8Cu0Bpxz A+5i9m literal 0 HcmV?d00001 diff --git a/_codeql_build_dir/dmf/dmfsi_version.txt b/_codeql_build_dir/dmf/dmfsi_version.txt new file mode 100644 index 0000000..1f5bdb8 --- /dev/null +++ b/_codeql_build_dir/dmf/dmfsi_version.txt @@ -0,0 +1,2 @@ +dmod 1.0 4d4f735 +dmfsi 1.0 4d4f735 diff --git a/_codeql_build_dir/dmf/dmramfs.dmf b/_codeql_build_dir/dmf/dmramfs.dmf new file mode 100755 index 0000000000000000000000000000000000000000..3a8b0a9e5aa8e4661ed81d9f232f4a1f6f5ca1b9 GIT binary patch literal 14968 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

KVsH`tNTO1P9?sP?&jkk*Q^fITIA)2qZww|$ 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 literal 0 HcmV?d00001 diff --git a/_codeql_build_dir/dmf/dmramfs_version.txt b/_codeql_build_dir/dmf/dmramfs_version.txt new file mode 100644 index 0000000..1b43df7 --- /dev/null +++ b/_codeql_build_dir/dmf/dmramfs_version.txt @@ -0,0 +1,2 @@ +dmod 1.0 0e272cb +dmramfs 0.1 0e272cb diff --git a/_codeql_build_dir/dmramfs b/_codeql_build_dir/dmramfs new file mode 100755 index 0000000000000000000000000000000000000000..b7f715b24eabd1eb811fd515f2a67cf36ad3115a GIT binary patch literal 26304 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" +#endif + +#ifndef DMOD_AUTHOR_NAME +# define DMOD_AUTHOR_NAME "" +#endif + +#ifndef DMOD_MODULE_VERSION +# define DMOD_MODULE_VERSION "0.0" +#endif + +#ifndef DMOD_MODULE_TYPE +# define Unknown +#endif + +#ifndef DMOD_STACK_SIZE +# define DMOD_STACK_SIZE 1024 +#endif + +#ifndef DMOD_PRIORITY +# define DMOD_PRIORITY 0 +#endif + +#ifndef DMOD_MANUAL_LOAD +# define DMOD_MANUAL_LOAD false +#endif + +extern void DMOD_WEAK_SYMBOL dmod_preinit(void); +extern int DMOD_WEAK_SYMBOL dmod_init(const Dmod_Config_t *Config); +extern int DMOD_WEAK_SYMBOL main(int argc, char** argv); +extern int DMOD_WEAK_SYMBOL dmod_deinit(void); +extern int DMOD_WEAK_SYMBOL dmod_signal( int SignalNumber ); + +extern Dmod_License_t DMOD_WEAK_SYMBOL License; +extern void* __footer_start; + +volatile const Dmod_ModuleHeader_t ModuleHeader DMOD_SECTION(".header") DMOD_USED = +{ + .Signature = DMOD_HEADER_SIGNATURE, + .HeaderSize = sizeof( Dmod_ModuleHeader_t ), + .DmodVersion = DMOD_VERSION, + .PointerSize = sizeof(void*), + .Arch = DMOD_ARCH, + .CpuName = DMOD_CPU_NAME, + .Name = "dmramfs", + .Author = "Patryk;Kubiak", + .Version = "0.1", + .Preinit.Ptr = dmod_preinit, + .Init.Ptr = dmod_init, + .Main.Ptr = main, + .Deinit.Ptr = dmod_deinit, + .Signal.Ptr = dmod_signal, + .RequiredStackSize = 1024, + .Priority = 1, + .ModuleType = Dmod_ModuleType_Library, + .License.Ptr = &License, + .Footer.Ptr = &__footer_start, + .ManualLoad = OFF, +}; + +volatile const Dmod_ModuleHeader_t* DMOD_Header DMOD_GLOBAL_POINTER = &ModuleHeader; diff --git a/_codeql_detected_source_root b/_codeql_detected_source_root new file mode 120000 index 0000000..945c9b4 --- /dev/null +++ b/_codeql_detected_source_root @@ -0,0 +1 @@ +. \ No newline at end of file From f78cd47b111e396a0ef2f511f4d9ddeb84712e84 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 25 Nov 2025 18:05:28 +0000 Subject: [PATCH 5/7] Remove codeql build artifacts and update gitignore Co-authored-by: JohnAmadis <17320783+JohnAmadis@users.noreply.github.com> --- .gitignore | 4 ++ _codeql_build_dir/dmf/dmfsi.dmf | Bin 560 -> 0 bytes _codeql_build_dir/dmf/dmfsi_version.txt | 2 - _codeql_build_dir/dmf/dmramfs.dmf | Bin 14968 -> 0 bytes _codeql_build_dir/dmf/dmramfs_version.txt | 2 - _codeql_build_dir/dmramfs | Bin 26304 -> 0 bytes _codeql_build_dir/dmramfs_defs.h | 66 ---------------------- _codeql_build_dir/dmramfs_header.c | 64 --------------------- _codeql_detected_source_root | 1 - 9 files changed, 4 insertions(+), 135 deletions(-) delete mode 100755 _codeql_build_dir/dmf/dmfsi.dmf delete mode 100644 _codeql_build_dir/dmf/dmfsi_version.txt delete mode 100755 _codeql_build_dir/dmf/dmramfs.dmf delete mode 100644 _codeql_build_dir/dmf/dmramfs_version.txt delete mode 100755 _codeql_build_dir/dmramfs delete mode 100644 _codeql_build_dir/dmramfs_defs.h delete mode 100644 _codeql_build_dir/dmramfs_header.c delete mode 120000 _codeql_detected_source_root diff --git a/.gitignore b/.gitignore index 8508d38..b268805 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,10 @@ build-*/ build_*/ cmake-build/* +# CodeQL analysis artifacts +_codeql_build_dir/ +_codeql_detected_source_root + # CLion # JetBrains specific template is maintained in a separate JetBrains.gitignore that can # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore diff --git a/_codeql_build_dir/dmf/dmfsi.dmf b/_codeql_build_dir/dmf/dmfsi.dmf deleted file mode 100755 index 0f2d8b67294180d2c582859961da9fb7380219cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmZ?q_jUQe00fK-3>-kJ!on=x%mgGr9!SYeE6&8D)y3D}MZv|_E!a~bBsDP?L#3gf z0frb@0O&qspn%3_V1dYjgps8_Aaj6neQ5m8{BplMn%{7E^x7H%r40}K7rpua|9`^+ z9?eHM4yR2(lDCA)??je|cqKEhB(*3lF*#KsH$SB`CsiRcFS8^wF(5H4B~_2 zuWa+Z_cMNmAFnd!hRH6!TUM!a%mhk-0Vuw~aSo+H@eT?!2O#wZ8a^-@Is8Cu0Bpxz A+5i9m diff --git a/_codeql_build_dir/dmf/dmfsi_version.txt b/_codeql_build_dir/dmf/dmfsi_version.txt deleted file mode 100644 index 1f5bdb8..0000000 --- a/_codeql_build_dir/dmf/dmfsi_version.txt +++ /dev/null @@ -1,2 +0,0 @@ -dmod 1.0 4d4f735 -dmfsi 1.0 4d4f735 diff --git a/_codeql_build_dir/dmf/dmramfs.dmf b/_codeql_build_dir/dmf/dmramfs.dmf deleted file mode 100755 index 3a8b0a9e5aa8e4661ed81d9f232f4a1f6f5ca1b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14968 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

KVsH`tNTO1P9?sP?&jkk*Q^fITIA)2qZww|$ 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 diff --git a/_codeql_build_dir/dmf/dmramfs_version.txt b/_codeql_build_dir/dmf/dmramfs_version.txt deleted file mode 100644 index 1b43df7..0000000 --- a/_codeql_build_dir/dmf/dmramfs_version.txt +++ /dev/null @@ -1,2 +0,0 @@ -dmod 1.0 0e272cb -dmramfs 0.1 0e272cb diff --git a/_codeql_build_dir/dmramfs b/_codeql_build_dir/dmramfs deleted file mode 100755 index b7f715b24eabd1eb811fd515f2a67cf36ad3115a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26304 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" -#endif - -#ifndef DMOD_AUTHOR_NAME -# define DMOD_AUTHOR_NAME "" -#endif - -#ifndef DMOD_MODULE_VERSION -# define DMOD_MODULE_VERSION "0.0" -#endif - -#ifndef DMOD_MODULE_TYPE -# define Unknown -#endif - -#ifndef DMOD_STACK_SIZE -# define DMOD_STACK_SIZE 1024 -#endif - -#ifndef DMOD_PRIORITY -# define DMOD_PRIORITY 0 -#endif - -#ifndef DMOD_MANUAL_LOAD -# define DMOD_MANUAL_LOAD false -#endif - -extern void DMOD_WEAK_SYMBOL dmod_preinit(void); -extern int DMOD_WEAK_SYMBOL dmod_init(const Dmod_Config_t *Config); -extern int DMOD_WEAK_SYMBOL main(int argc, char** argv); -extern int DMOD_WEAK_SYMBOL dmod_deinit(void); -extern int DMOD_WEAK_SYMBOL dmod_signal( int SignalNumber ); - -extern Dmod_License_t DMOD_WEAK_SYMBOL License; -extern void* __footer_start; - -volatile const Dmod_ModuleHeader_t ModuleHeader DMOD_SECTION(".header") DMOD_USED = -{ - .Signature = DMOD_HEADER_SIGNATURE, - .HeaderSize = sizeof( Dmod_ModuleHeader_t ), - .DmodVersion = DMOD_VERSION, - .PointerSize = sizeof(void*), - .Arch = DMOD_ARCH, - .CpuName = DMOD_CPU_NAME, - .Name = "dmramfs", - .Author = "Patryk;Kubiak", - .Version = "0.1", - .Preinit.Ptr = dmod_preinit, - .Init.Ptr = dmod_init, - .Main.Ptr = main, - .Deinit.Ptr = dmod_deinit, - .Signal.Ptr = dmod_signal, - .RequiredStackSize = 1024, - .Priority = 1, - .ModuleType = Dmod_ModuleType_Library, - .License.Ptr = &License, - .Footer.Ptr = &__footer_start, - .ManualLoad = OFF, -}; - -volatile const Dmod_ModuleHeader_t* DMOD_Header DMOD_GLOBAL_POINTER = &ModuleHeader; diff --git a/_codeql_detected_source_root b/_codeql_detected_source_root deleted file mode 120000 index 945c9b4..0000000 --- a/_codeql_detected_source_root +++ /dev/null @@ -1 +0,0 @@ -. \ No newline at end of file From 27e80e943f3054d4a0511fed2d2bccd1b8633903 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 25 Nov 2025 18:23:03 +0000 Subject: [PATCH 6/7] Fix segfault: correct dmlist_insert return value check and handle empty root paths Co-authored-by: JohnAmadis <17320783+JohnAmadis@users.noreply.github.com> --- src/dmramfs.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/dmramfs.c b/src/dmramfs.c index 2071568..42ede62 100644 --- a/src/dmramfs.c +++ b/src/dmramfs.c @@ -1200,6 +1200,12 @@ static file_t* find_file(dir_t* dir, dmfsi_path_t* path) } else if(path->directory != NULL) { + // Handle empty directory (root path like /file.txt) + if (strlen(path->directory) == 0 && path->next != NULL) + { + return find_file(dir, path->next); + } + dir_t* subdir = dmlist_find(dir->dirs, path->directory, compare_dir_name); if(subdir != NULL && path->next != NULL) { @@ -1225,6 +1231,12 @@ static dir_t* find_dir(dir_t* dir, dmfsi_path_t* path) { return NULL; } + + // Handle empty directory (root path) + if (strlen(name) == 0 && path->next != NULL) + { + return find_dir(dir, path->next); + } dir_t* subdir = dmlist_find(dir->dirs, name, compare_dir_name); if (subdir != NULL) @@ -1264,7 +1276,7 @@ static file_t* create_file(dir_t* dir, dmfsi_path_t* path) file->data = NULL; file->size = 0; file->handles = dmlist_create(DMOD_MODULE_NAME); - if(dmlist_insert(dir->files, 0, file) != 0) + if(!dmlist_insert(dir->files, 0, file)) { DMOD_LOG_ERROR("dmramfs: Failed to insert new file '%s' into directory\n", path->filename); if (file->handles) dmlist_destroy(file->handles); @@ -1276,6 +1288,12 @@ static file_t* create_file(dir_t* dir, dmfsi_path_t* path) } else if(path->directory != NULL) { + // Handle empty directory (root path like /file.txt) + if (strlen(path->directory) == 0 && path->next != NULL) + { + return create_file(dir, path->next); + } + dir_t* subdir = dmlist_find(dir->dirs, path->directory, compare_dir_name); if(subdir == NULL) { @@ -1392,6 +1410,12 @@ static dir_t* create_dir(dir_t* parent, dmfsi_path_t* path) { return NULL; } + + // Handle empty directory (root path) + if (strlen(name) == 0 && path->next != NULL) + { + return create_dir(parent, path->next); + } // Check if it's the final component if (path->filename != NULL || path->next == NULL) @@ -1425,7 +1449,7 @@ static dir_t* create_dir(dir_t* parent, dmfsi_path_t* path) return NULL; } - if (dmlist_insert(parent->dirs, 0, new_dir) != 0) + if (!dmlist_insert(parent->dirs, 0, new_dir)) { DMOD_LOG_ERROR("dmramfs: Failed to insert directory '%s' into parent\n", name); if (new_dir->dir_name) Dmod_Free(new_dir->dir_name); @@ -1454,7 +1478,7 @@ static dir_t* create_dir(dir_t* parent, dmfsi_path_t* path) subdir->files = dmlist_create(DMOD_MODULE_NAME); subdir->dirs = dmlist_create(DMOD_MODULE_NAME); - if (dmlist_insert(parent->dirs, 0, subdir) != 0) + if (!dmlist_insert(parent->dirs, 0, subdir)) { if (subdir->dir_name) Dmod_Free(subdir->dir_name); if (subdir->files) dmlist_destroy(subdir->files); From 73a3d16852c1f9659ede678aa30c0fe715e4ad4a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 25 Nov 2025 18:37:04 +0000 Subject: [PATCH 7/7] Add dmlist dependency info and document known fclose error messages in README Co-authored-by: JohnAmadis <17320783+JohnAmadis@users.noreply.github.com> --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index edf8360..b959e7b 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,11 @@ DMOD RAM File System - an in-memory file system module for the DMOD framework. - **File Management**: Rename, delete, and get file statistics - **DMFSI Compliant**: Implements the standard DMOD file system interface +## Dependencies + +This module requires the following system libraries: +- **dmlist** - DMOD linked list library (fetched automatically via CMake FetchContent) + ## Building ```bash @@ -92,6 +97,10 @@ cmake --build . ./tests/fs_tester /path/to/dmramfs.dmf ``` +## Known Issues + +When running `fs_tester`, you may see `[ERROR] Failed to close file` messages even though tests pass. This is due to a return value convention mismatch in the dmvfs layer (which expects boolean success/failure) versus the DMFSI interface convention (which uses 0 for success). The actual file operations work correctly despite these messages. + ## License See [LICENSE](LICENSE) file for details.