From 1d5adff0f1216f9930762c00cdb44d1e16e73836 Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Sat, 3 Dec 2005 18:02:15 +0100 Subject: [PATCH] wcmd: mkdir recursive create In at least both win2k and winxp mkdir from the command prompt can recursively create full directory paths. This implements that functionality. --- programs/wcmd/builtins.c | 49 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/programs/wcmd/builtins.c b/programs/wcmd/builtins.c index 56520895ae1..a47bc0a417e 100644 --- a/programs/wcmd/builtins.c +++ b/programs/wcmd/builtins.c @@ -150,11 +150,58 @@ char string[8], outpath[MAX_PATH], inpath[MAX_PATH], *infile; * WCMD_create_dir * * Create a directory. + * + * this works recursivly. so mkdir dir1\dir2\dir3 will create dir1 and dir2 if + * they do not already exist. */ +BOOL create_full_path(CHAR* path) +{ + int len; + CHAR *new_path; + BOOL ret = TRUE; + + new_path = HeapAlloc(GetProcessHeap(),0,strlen(path)+1); + strcpy(new_path,path); + + while ((len = strlen(new_path)) && new_path[len - 1] == '\\') + new_path[len - 1] = 0; + + while (!CreateDirectory(new_path,NULL)) + { + CHAR *slash; + DWORD last_error = GetLastError(); + if (last_error == ERROR_ALREADY_EXISTS) + break; + + if (last_error != ERROR_PATH_NOT_FOUND) + { + ret = FALSE; + break; + } + + if (!(slash = strrchr(new_path,'\\')) && ! (slash = strrchr(new_path,'/'))) + { + ret = FALSE; + break; + } + + len = slash - new_path; + new_path[len] = 0; + if (!create_full_path(new_path)) + { + ret = FALSE; + break; + } + new_path[len] = '\\'; + } + HeapFree(GetProcessHeap(),0,new_path); + return ret; +} + void WCMD_create_dir (void) { - if (!CreateDirectory (param1, NULL)) WCMD_print_error (); + if (!create_full_path(param1)) WCMD_print_error (); } /****************************************************************************