Windows: Construct search string from directory name
The implementation of opendir() in lib/roken/dirent.c takes as input a directory name. For the contents of the specified directory to be enumerated correctly, this directory name must be converted to a wildcard.
This commit is contained in:
		| @@ -53,15 +53,66 @@ struct _dirent_dirinfo { | ||||
|  | ||||
| #define INITIAL_ENTRIES 16 | ||||
|  | ||||
| /** | ||||
|  * Create a filespec for use with _findfirst() using a path spec | ||||
|  * | ||||
|  * If the last component of the path spec contains wildcards, we let | ||||
|  * it be.  If the last component doesn't end with a slash, we add one. | ||||
|  */ | ||||
| static const char * | ||||
| filespec_from_dir_path(const char * path, char * buffer, size_t cch_buffer) | ||||
| { | ||||
|     char *comp, *t; | ||||
|     size_t pos; | ||||
|  | ||||
|     if (strcpy_s(buffer, cch_buffer, path) != 0) | ||||
|         return NULL; | ||||
|  | ||||
|     comp = strrchr(buffer, '\\'); | ||||
|     if (comp == NULL) | ||||
|         comp = buffer; | ||||
|  | ||||
|     t = strrchr(comp, '/'); | ||||
|     if (t != NULL) | ||||
|         comp = t; | ||||
|  | ||||
|     comp++; | ||||
|  | ||||
|     pos = strcspn(comp, "*?"); | ||||
|     if (comp[pos] != '\0') | ||||
|         return buffer; | ||||
|  | ||||
|     /* We don't append a slash if pos == 0 because that changes the | ||||
|      * meaning: | ||||
|      * | ||||
|      * "*.*" is all files in the current directory. | ||||
|      * "\*.*" is all files in the root directory of the current drive. | ||||
|      */ | ||||
|     if (pos > 0 && comp[pos - 1] != '\\' && | ||||
|         comp[pos - 1] != '/') { | ||||
|         strcat_s(comp, cch_buffer - (comp - buffer), "\\"); | ||||
|     } | ||||
|  | ||||
|     strcat_s(comp, cch_buffer - (comp - buffer), "*.*"); | ||||
|  | ||||
|     return buffer; | ||||
| } | ||||
|  | ||||
| ROKEN_LIB_FUNCTION DIR * ROKEN_LIB_CALL | ||||
| opendir(const char * filespec) | ||||
| opendir(const char * path) | ||||
| { | ||||
|     DIR *              dp; | ||||
|     struct _finddata_t fd; | ||||
|     intptr_t           fd_handle; | ||||
|     const char         *filespec; | ||||
|     char               path_buffer[1024]; | ||||
|  | ||||
|     memset(&fd, 0, sizeof(fd)); | ||||
|  | ||||
|     filespec = filespec_from_dir_path(path, path_buffer, sizeof(path_buffer)/sizeof(char)); | ||||
|     if (filespec == NULL) | ||||
|         return NULL; | ||||
|  | ||||
|     fd_handle = _findfirst(filespec, &fd); | ||||
|  | ||||
|     if (fd_handle == -1) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Asanka C. Herath
					Asanka C. Herath