diff options
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 */ |