@@ -50,40 +50,62 @@ int cio_os_isdir(const char *dir)
50
50
}
51
51
52
52
#ifdef _WIN32
53
- inline int cio_os_win32_make_recursive_path (const char * path ) {
54
- char dir [MAX_PATH ];
55
- char * p = NULL ;
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 ;
56
58
57
59
if (_fullpath (dir , path , MAX_PATH ) == NULL ) {
58
60
return 1 ;
59
61
}
60
62
63
+ /* Normalize to backslashes */
61
64
for (p = dir ; * p ; p ++ ) {
62
- /* Skip the drive letter (e.g., "C:") */
63
- if (p > dir && * p == ':' && * (p - 1 ) != '\0' ) {
64
- continue ;
65
+ if (* p == '/' ) { * p = '\\' ; }
66
+ }
67
+
68
+ len = strlen (dir );
69
+
70
+ /* Determine root length: "C:\" (3) or UNC root "\\server\share\" */
71
+ if (len >= 2 &&
72
+ ((dir [0 ] >= 'A' && dir [0 ] <= 'Z' ) || (dir [0 ] >= 'a' && dir [0 ] <= 'z' )) &&
73
+ dir [1 ] == ':' ) {
74
+ root_len = (len >= 3 && dir [2 ] == '\\' ) ? 3 : 2 ;
75
+ }
76
+ else if (len >= 5 && dir [0 ] == '\\' && dir [1 ] == '\\' ) {
77
+ /* Skip server and share components: \\server\share\ */
78
+ size_t i = 2 , seps = 0 ;
79
+ while (i < len && seps < 2 ) {
80
+ if (dir [i ] == '\\' ) { seps ++ ; }
81
+ i ++ ;
65
82
}
83
+ root_len = i ; /* points just past "\\server\share\" */
84
+ }
66
85
67
- if (* p == '\\' || * p == '/' ) {
68
- char original_char = * p ;
86
+ /* Create each intermediate component after the root */
87
+ for (p = dir + root_len ; * p ; p ++ ) {
88
+ if (* p == '\\' ) {
89
+ char saved = * p ;
69
90
* p = '\0' ;
70
-
71
91
if (!CreateDirectoryA (dir , NULL )) {
72
- if (GetLastError () != ERROR_ALREADY_EXISTS ) {
73
- * p = original_char ;
92
+ DWORD err = GetLastError ();
93
+ if (err != ERROR_ALREADY_EXISTS ) {
94
+ * p = saved ;
74
95
return 1 ;
75
96
}
76
97
}
77
- * p = original_char ;
98
+ * p = saved ;
78
99
}
79
100
}
80
101
102
+ /* Create the final directory */
81
103
if (!CreateDirectoryA (dir , NULL )) {
82
- if (GetLastError () != ERROR_ALREADY_EXISTS ) {
104
+ DWORD err = GetLastError ();
105
+ if (err != ERROR_ALREADY_EXISTS ) {
83
106
return 1 ;
84
107
}
85
108
}
86
-
87
109
return 0 ;
88
110
}
89
111
#endif
0 commit comments