1
/***************************************************************************
3
* Project ___| | | | _ \| |
5
* | (__| |_| | _ <| |___
6
* \___|\___/|_| \_\_____|
8
* Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
10
* This software is licensed as described in the file COPYING, which
11
* you should have received as part of this distribution. The terms
12
* are also available at http://curl.haxx.se/docs/copyright.html.
14
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
15
* copies of the Software, and permit persons to whom the Software is
16
* furnished to do so, under the terms of the COPYING file.
18
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19
* KIND, either express or implied.
21
***************************************************************************/
24
#include <curl/curl.h>
36
#define ENABLE_CURLX_PRINTF
37
/* use our own printf() functions */
40
#include "tool_dirhie.h"
42
#include "memdebug.h" /* keep this as LAST include */
45
# ifndef __NOVELL_LIBC__
46
# define mkdir mkdir_510
51
# define mkdir(x,y) (mkdir)((x))
57
static void show_dir_errno(FILE *errors, const char *name)
62
fprintf(errors, "You don't have permission to create %s.\n", name);
67
fprintf(errors, "The directory name %s is too long.\n", name);
72
fprintf(errors, "%s resides on a read-only file system.\n", name);
77
fprintf(errors, "No space left on the file system that will "
78
"contain the directory %s.\n", name);
83
fprintf(errors, "Cannot create directory %s because you "
84
"exceeded your quota.\n", name);
88
fprintf(errors, "Error creating directory %s.\n", name);
94
* Create the needed directory hierarchy recursively in order to save
95
* multi-GETs in file output, ie:
96
* curl "http://my.site/dir[1-5]/file[1-5].txt" -o "dir#1/file#2.txt"
97
* should create all the dir* automagically
100
CURLcode create_dir_hierarchy(const char *outfile, FILE *errors)
106
CURLcode result = CURLE_OK;
108
outdup = strdup(outfile);
110
return CURLE_OUT_OF_MEMORY;
112
dirbuildup = malloc(strlen(outfile) + 1);
114
Curl_safefree(outdup);
115
return CURLE_OUT_OF_MEMORY;
117
dirbuildup[0] = '\0';
119
tempdir = strtok(outdup, DIR_CHAR);
121
while(tempdir != NULL) {
122
tempdir2 = strtok(NULL, DIR_CHAR);
123
/* since strtok returns a token for the last word even
124
if not ending with DIR_CHAR, we need to prune it */
125
if(tempdir2 != NULL) {
126
size_t dlen = strlen(dirbuildup);
128
sprintf(&dirbuildup[dlen], "%s%s", DIR_CHAR, tempdir);
130
if(0 != strncmp(outdup, DIR_CHAR, 1))
131
strcpy(dirbuildup, tempdir);
133
sprintf(dirbuildup, "%s%s", DIR_CHAR, tempdir);
135
if(access(dirbuildup, F_OK) == -1) {
136
if(-1 == mkdir(dirbuildup,(mode_t)0000750)) {
137
show_dir_errno(errors, dirbuildup);
138
result = CURLE_WRITE_ERROR;
139
break; /* get out of loop */
146
Curl_safefree(dirbuildup);
147
Curl_safefree(outdup);