Merge from libarchive.googlecode.com: If we're

given an empty filename, just invoke write_open_fd()
instead of re-implementing the code to use stdout.
This commit is contained in:
Tim Kientzle 2009-04-17 00:39:35 +00:00
parent 018cd707c0
commit 625683944d

View File

@ -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, 1));
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);
}