@@ -77,6 +77,7 @@ static int unconfigure_drivers(dmfsi_context_t ctx);
7777static bool is_file (const char * path );
7878static bool is_driver ( const char * name );
7979static 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 );
8081static dmini_context_t read_driver_for_config (const char * config_path , char * driver_name , size_t name_size , const char * default_driver );
8182static Dmod_Context_t * prepare_driver_module (const char * driver_name , bool * was_loaded , bool * was_enabled );
8283static 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