Skip to content

Commit 4734c29

Browse files
CopilotJohnAmadis
andcommitted
Fix subdirectory name extraction to handle trailing slashes correctly
Co-authored-by: JohnAmadis <17320783+JohnAmadis@users.noreply.github.com>
1 parent da15101 commit 4734c29

1 file changed

Lines changed: 59 additions & 2 deletions

File tree

src/dmdevfs.c

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ static int unconfigure_drivers(dmfsi_context_t ctx);
7777
static bool is_file(const char* path);
7878
static bool is_driver( const char* name);
7979
static void read_base_name(const char* path, char* base_name, size_t name_size);
80+
static void read_dir_name_from_path(const char* path, char* dir_name, size_t name_size);
8081
static dmini_context_t read_driver_for_config(const char* config_path, char* driver_name, size_t name_size, const char* default_driver);
8182
static Dmod_Context_t* prepare_driver_module(const char* driver_name, bool* was_loaded, bool* was_enabled);
8283
static void cleanup_driver_module(const char* driver_name, bool was_loaded, bool was_enabled);
@@ -663,8 +664,9 @@ dmod_dmfsi_dif_api_declaration( 1.0, dmdevfs, int, _readdir, (dmfsi_context_t ct
663664
}
664665
else
665666
{
666-
// Extract basename from parent directory for subdirectory entries
667-
read_base_name(parent_dir, entry->name, sizeof(entry->name));
667+
// Extract directory name from parent path for subdirectory entries
668+
// This handles paths like "dev/" -> "dev"
669+
read_dir_name_from_path(parent_dir, entry->name, sizeof(entry->name));
668670
entry->size = 0;
669671
entry->attr = DMFSI_ATTR_DIRECTORY;
670672
}
@@ -1009,6 +1011,61 @@ static void read_base_name(const char* path, char* base_name, size_t name_size)
10091011
base_name[name_size - 1] = '\0';
10101012
}
10111013

1014+
/**
1015+
* @brief Extract directory name from a path, handling trailing slashes
1016+
* @param path Path to extract directory name from (may have trailing slash)
1017+
* @param dir_name Output buffer for directory name
1018+
* @param name_size Size of output buffer
1019+
*
1020+
* Examples:
1021+
* - "dev/" -> "dev"
1022+
* - "/dev/" -> "dev"
1023+
* - "dmspiflash0/" -> "dmspiflash0"
1024+
* - "/" -> "" (root has no name)
1025+
*/
1026+
static void read_dir_name_from_path(const char* path, char* dir_name, size_t name_size)
1027+
{
1028+
if (path == NULL || dir_name == NULL || name_size == 0)
1029+
{
1030+
if (dir_name && name_size > 0)
1031+
{
1032+
dir_name[0] = '\0';
1033+
}
1034+
return;
1035+
}
1036+
1037+
// Find the length without trailing slashes
1038+
size_t len = strlen(path);
1039+
while (len > 1 && path[len - 1] == '/')
1040+
{
1041+
len--;
1042+
}
1043+
1044+
// Special case: if path is just "/", return empty
1045+
if (len == 1 && path[0] == '/')
1046+
{
1047+
dir_name[0] = '\0';
1048+
return;
1049+
}
1050+
1051+
// Find the last slash before the directory name
1052+
const char* last_slash = NULL;
1053+
for (size_t i = 0; i < len; i++)
1054+
{
1055+
if (path[i] == '/')
1056+
{
1057+
last_slash = &path[i];
1058+
}
1059+
}
1060+
1061+
// Extract the directory name
1062+
const char* name_start = (last_slash != NULL) ? last_slash + 1 : path;
1063+
size_t name_len = len - (name_start - path);
1064+
size_t copy_len = (name_len < name_size - 1) ? name_len : name_size - 1;
1065+
strncpy(dir_name, name_start, copy_len);
1066+
dir_name[copy_len] = '\0';
1067+
}
1068+
10121069
/**
10131070
* @brief Read driver name from configuration file
10141071
*/

0 commit comments

Comments
 (0)