@@ -49,6 +49,73 @@ int cio_os_isdir(const char *dir)
4949 return -1 ;
5050}
5151
52+ #ifdef _WIN32
53+ static int cio_os_win32_make_recursive_path (const char * path ) {
54+ char dir [MAX_PATH ];
55+ char * p ;
56+ size_t len ;
57+ size_t root_len = 0 ;
58+ size_t i = 0 , seps = 0 ;
59+ char saved ;
60+
61+ if (_fullpath (dir , path , MAX_PATH ) == NULL ) {
62+ return 1 ;
63+ }
64+
65+ /* Normalize to backslashes */
66+ for (p = dir ; * p ; p ++ ) {
67+ if (* p == '/' ) {
68+ * p = '\\' ;
69+ }
70+ }
71+
72+ len = strlen (dir );
73+
74+ /* Determine root length: "C:\" (3) or UNC root "\\server\share\" */
75+ if (len >= 2 &&
76+ ((dir [0 ] >= 'A' && dir [0 ] <= 'Z' ) || (dir [0 ] >= 'a' && dir [0 ] <= 'z' )) &&
77+ dir [1 ] == ':' ) {
78+ root_len = (len >= 3 && dir [2 ] == '\\' ) ? 3 : 2 ;
79+ }
80+ else if (len >= 5 && dir [0 ] == '\\' && dir [1 ] == '\\' ) {
81+ /* Skip server and share components: \\server\share\ */
82+ i = 2 ;
83+ while (i < len && seps < 2 ) {
84+ if (dir [i ] == '\\' ) {
85+ seps ++ ;
86+ }
87+ i ++ ;
88+ }
89+ root_len = i ; /* points just past "\\server\share\" */
90+ }
91+
92+ /* Create each intermediate component after the root */
93+ for (p = dir + root_len ; * p ; p ++ ) {
94+ if (* p == '\\' ) {
95+ saved = * p ;
96+ * p = '\0' ;
97+ if (!CreateDirectoryA (dir , NULL )) {
98+ DWORD err = GetLastError ();
99+ if (err != ERROR_ALREADY_EXISTS ) {
100+ * p = saved ;
101+ return 1 ;
102+ }
103+ }
104+ * p = saved ;
105+ }
106+ }
107+
108+ /* Create the final directory */
109+ if (!CreateDirectoryA (dir , NULL )) {
110+ DWORD err = GetLastError ();
111+ if (err != ERROR_ALREADY_EXISTS ) {
112+ return 1 ;
113+ }
114+ }
115+ return 0 ;
116+ }
117+ #endif
118+
52119/* Create directory */
53120int cio_os_mkpath (const char * dir , mode_t mode )
54121{
@@ -85,7 +152,7 @@ int cio_os_mkpath(const char *dir, mode_t mode)
85152 return 1 ;
86153 }
87154
88- if (SHCreateDirectoryExA ( NULL , path , NULL ) != ERROR_SUCCESS ) {
155+ if (cio_os_win32_make_recursive_path ( path ) != ERROR_SUCCESS ) {
89156 return 1 ;
90157 }
91158 return 0 ;
0 commit comments