Make all directories in a path that do not already exist. Code in
MakeFullPath() based on WINE code.
Modified: trunk/reactos/subsys/system/cmd/internal.c
_____
Modified: trunk/reactos/subsys/system/cmd/internal.c
--- trunk/reactos/subsys/system/cmd/internal.c 2005-11-21 17:44:57 UTC
(rev 19408)
+++ trunk/reactos/subsys/system/cmd/internal.c 2005-11-21 17:50:05 UTC
(rev 19409)
@@ -423,6 +423,36 @@
#ifdef INCLUDE_CMD_MKDIR
+
+/* Helper funtion for mkdir to make directories in a path.
+Dont use the api to decrease depence on libs */
+BOOL
+MakeFullPath(TCHAR * DirPath)
+{
+ TCHAR path[MAX_PATH];
+ TCHAR *p = DirPath;
+ INT n;
+
+ if (p[0] && p[1] == _T(':'))
+ p += 2;
+ while (*p == _T('\\'))
+ p++; /* skip drive root */
+ while ((p = _tcschr(p, _T('\\'))) != NULL)
+ {
+ n = p - DirPath + 1;
+ memcpy(path, DirPath, n);
+ path[n] = _T('\0');
+ if( !CreateDirectory(path, NULL) &&
+ (GetLastError() != ERROR_ALREADY_EXISTS))
+ return FALSE;
+ p++;
+ }
+ if (GetLastError() == ERROR_ALREADY_EXISTS)
+ SetLastError(ERROR_SUCCESS);
+
+ return TRUE;
+}
+
/*
* MD / MKDIR
*
@@ -478,28 +508,24 @@
return 1;
}
- /* remove trailing \ if any, but ONLY if dir is not the root dir
*/
- if (_tcslen (dir) >= 2 && dir[_tcslen (dir) - 1] == _T('\\'))
- dir[_tcslen(dir) - 1] = _T('\0');
+ /* Add a \ at the end of the path is there isnt on already */
+ if (dir[_tcslen (dir) - 1] != _T('\\'))
+ _tcscat(dir,_T("\\"));
- if (!CreateDirectory (dir, NULL))
- {
- if(GetLastError() == ERROR_ALREADY_EXISTS)
- {
- ConErrResPuts(STRING_MD_ERROR);
- }
- else if(GetLastError() == ERROR_PATH_NOT_FOUND)
- {
- ConErrResPuts(STRING_MD_ERROR2);
- }
- else
- {
- ErrorMessage (GetLastError(), _T("MD"));
- }
- nErrorLevel = 1;
- freep (p);
- return 1;
- }
+ if (!MakeFullPath(dir))
+ {
+ if(GetLastError() == ERROR_PATH_NOT_FOUND)
+ {
+ ConErrResPuts(STRING_MD_ERROR2);
+ }
+ else
+ {
+ ErrorMessage (GetLastError(), _T("MD"));
+ }
+ nErrorLevel = 1;
+ freep (p);
+ return 1;
+ }
freep (p);
Show replies by date