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);