diff options
Diffstat (limited to 'libarchive/archive_write_open_filename.c')
-rw-r--r-- | libarchive/archive_write_open_filename.c | 47 |
1 files changed, 15 insertions, 32 deletions
diff --git a/libarchive/archive_write_open_filename.c b/libarchive/archive_write_open_filename.c index 72eeb540..b9ae1747 100644 --- a/libarchive/archive_write_open_filename.c +++ b/libarchive/archive_write_open_filename.c @@ -71,24 +71,18 @@ archive_write_open_filename(struct archive *a, const char *filename) { struct write_file_data *mine; - if (filename == NULL || filename[0] == '\0') { - mine = (struct write_file_data *)malloc(sizeof(*mine)); - if (mine == NULL) { - archive_set_error(a, ENOMEM, "No memory"); - return (ARCHIVE_FATAL); - } - mine->filename[0] = '\0'; /* Record that we're using stdout. */ - } else { - mine = (struct write_file_data *)malloc(sizeof(*mine) + strlen(filename)); - if (mine == NULL) { - archive_set_error(a, ENOMEM, "No memory"); - return (ARCHIVE_FATAL); - } - strcpy(mine->filename, filename); + if (filename == NULL || filename[0] == '\0') + return (archive_write_open_fd(a, 0)); + + mine = (struct write_file_data *)malloc(sizeof(*mine) + strlen(filename)); + if (mine == NULL) { + archive_set_error(a, ENOMEM, "No memory"); + return (ARCHIVE_FATAL); } + strcpy(mine->filename, filename); mine->fd = -1; return (archive_write_open(a, mine, - file_open, file_write, file_close)); + file_open, file_write, file_close)); } static int @@ -104,21 +98,11 @@ file_open(struct archive *a, void *client_data) /* * Open the file. */ - if (mine->filename[0] != '\0') { - mine->fd = open(mine->filename, flags, 0666); - if (mine->fd < 0) { - archive_set_error(a, errno, "Failed to open '%s'", - mine->filename); - return (ARCHIVE_FATAL); - } - } else { - /* - * NULL filename is stdout. - */ - mine->fd = 1; - /* By default, pad archive when writing to stdout. */ - if (archive_write_get_bytes_in_last_block(a) < 0) - archive_write_set_bytes_in_last_block(a, 0); + mine->fd = open(mine->filename, flags, 0666); + if (mine->fd < 0) { + archive_set_error(a, errno, "Failed to open '%s'", + mine->filename); + return (ARCHIVE_FATAL); } if (fstat(mine->fd, &st) != 0) { @@ -172,8 +156,7 @@ file_close(struct archive *a, void *client_data) struct write_file_data *mine = (struct write_file_data *)client_data; (void)a; /* UNUSED */ - if (mine->filename[0] != '\0') - close(mine->fd); + close(mine->fd); free(mine); return (ARCHIVE_OK); } |