448
+ − 1 /*
+ − 2 * Copyright (c) 2000, Red Hat, Inc.
+ − 3 *
+ − 4 * This program is free software; you can redistribute it and/or modify
+ − 5 * it under the terms of the GNU General Public License as published by
+ − 6 * the Free Software Foundation; either version 2 of the License, or
+ − 7 * (at your option) any later version.
+ − 8 *
+ − 9 * A copy of the GNU General Public License can be found at
+ − 10 * http://www.gnu.org/
+ − 11 *
+ − 12 * Written by DJ Delorie <dj@cygnus.com>
+ − 13 *
+ − 14 */
+ − 15
+ − 16 /* see mkdir.h */
+ − 17
+ − 18 #include "win32.h"
+ − 19 #include <stdio.h>
+ − 20 #include "mkdir.h"
+ − 21
+ − 22 int
+ − 23 mkdir_p (int isadir, char *path)
+ − 24 {
+ − 25 char saved_char, *slash = 0;
+ − 26 char *c;
+ − 27 DWORD d, gse;
+ − 28
+ − 29 d = GetFileAttributes (path);
+ − 30 if (d != 0xffffffff && d & FILE_ATTRIBUTE_DIRECTORY)
+ − 31 return 0;
+ − 32
+ − 33 if (isadir)
+ − 34 {
+ − 35 if (CreateDirectory (path, 0))
+ − 36 return 0;
+ − 37 gse = GetLastError ();
+ − 38 if (gse != ERROR_PATH_NOT_FOUND && gse != ERROR_FILE_NOT_FOUND)
+ − 39 {
+ − 40 if (gse == ERROR_ALREADY_EXISTS)
+ − 41 {
+ − 42 fprintf (stderr, "warning: deleting \"%s\" so I can make a directory there\n",
+ − 43 path);
+ − 44 if (DeleteFileA (path))
+ − 45 return mkdir_p (isadir, path);
+ − 46 }
+ − 47 return 1;
+ − 48 }
+ − 49 }
+ − 50
+ − 51 for (c=path; *c; c++)
+ − 52 {
+ − 53 if (*c == ':')
+ − 54 slash = 0;
+ − 55 if (*c == '/' || *c == '\\')
+ − 56 slash = c;
+ − 57 }
+ − 58
+ − 59 if (!slash)
+ − 60 return 0;
+ − 61
+ − 62 saved_char = *slash;
+ − 63 *slash = 0;
+ − 64 if (mkdir_p (1, path))
+ − 65 {
+ − 66 *slash = saved_char;
+ − 67 return 1;
+ − 68 }
+ − 69 *slash = saved_char;
+ − 70
+ − 71 if (!isadir)
+ − 72 return 0;
+ − 73
+ − 74 return mkdir_p (isadir, path);
+ − 75 }