diff options
author | Daniel Stenberg <daniel@haxx.se> | 2020-08-24 08:31:36 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2020-08-24 22:41:37 +0200 |
commit | 5620d2cc78c018f6ae15ba9aab371aa388146df0 (patch) | |
tree | 897b7e75250a644e5aeae81de5daf3498602286b /src/tool_cb_wrt.c | |
parent | 510d98157f21dee5793c4e975fde3317b6139267 (diff) | |
download | curl-5620d2cc78c018f6ae15ba9aab371aa388146df0.tar.gz |
curl: add --output-dir
Works with --create-dirs and with -J
Add test 3008, 3009, 3011, 3012 and 3013 to verify.
Closes #5637
Diffstat (limited to 'src/tool_cb_wrt.c')
-rw-r--r-- | src/tool_cb_wrt.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/src/tool_cb_wrt.c b/src/tool_cb_wrt.c index 64b62fefd..6fc51f9a5 100644 --- a/src/tool_cb_wrt.c +++ b/src/tool_cb_wrt.c @@ -39,6 +39,15 @@ #include "memdebug.h" /* keep this as LAST include */ +#ifndef O_BINARY +#define O_BINARY 0 +#endif +#ifdef WIN32 +#define OPENMODE S_IREAD | S_IWRITE +#else +#define OPENMODE S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH +#endif + /* create a local file for writing, return TRUE on success */ bool tool_create_output_file(struct OutStruct *outs, struct OperationConfig *config) @@ -55,21 +64,24 @@ bool tool_create_output_file(struct OutStruct *outs, if(outs->is_cd_filename) { /* don't overwrite existing files */ -#ifndef O_BINARY -#define O_BINARY 0 -#endif - int fd = open(outs->filename, O_CREAT | O_WRONLY | O_EXCL | O_BINARY, -#ifdef WIN32 - S_IREAD | S_IWRITE -#else - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH -#endif - ); + int fd; + char *name = outs->filename; + char *aname = NULL; + if(config->output_dir) { + aname = aprintf("%s/%s", config->output_dir, name); + if(!aname) { + errorf(global, "out of memory\n"); + return FALSE; + } + name = aname; + } + fd = open(name, O_CREAT | O_WRONLY | O_EXCL | O_BINARY, OPENMODE); if(fd != -1) { file = fdopen(fd, "wb"); if(!file) close(fd); } + free(aname); } else /* open file for writing */ |