@@ -50,40 +50,68 @@ 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 ;
58
+ size_t i = 0 , seps = 0 ;
59
+ char saved ;
56
60
57
61
if (_fullpath (dir , path , MAX_PATH ) == NULL ) {
58
62
return 1 ;
59
63
}
60
64
65
+ /* Normalize to backslashes */
61
66
for (p = dir ; * p ; p ++ ) {
62
- /* Skip the drive letter (e.g., "C:") */
63
- if (p > dir && * p == ':' && * (p - 1 ) != '\0' ) {
64
- continue ;
67
+ if (* p == '/' ) {
68
+ * p = '\\' ;
65
69
}
70
+ }
66
71
67
- if (* p == '\\' || * p == '/' ) {
68
- char original_char = * p ;
69
- * p = '\0' ;
72
+ len = strlen (dir );
70
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' ;
71
97
if (!CreateDirectoryA (dir , NULL )) {
72
- if (GetLastError () != ERROR_ALREADY_EXISTS ) {
73
- * p = original_char ;
98
+ DWORD err = GetLastError ();
99
+ if (err != ERROR_ALREADY_EXISTS ) {
100
+ * p = saved ;
74
101
return 1 ;
75
102
}
76
103
}
77
- * p = original_char ;
104
+ * p = saved ;
78
105
}
79
106
}
80
107
108
+ /* Create the final directory */
81
109
if (!CreateDirectoryA (dir , NULL )) {
82
- if (GetLastError () != ERROR_ALREADY_EXISTS ) {
110
+ DWORD err = GetLastError ();
111
+ if (err != ERROR_ALREADY_EXISTS ) {
83
112
return 1 ;
84
113
}
85
114
}
86
-
87
115
return 0 ;
88
116
}
89
117
#endif
0 commit comments