diff options
Diffstat (limited to 'Utilities/cmlibarchive/libarchive/archive_write_open_fd.c')
-rw-r--r-- | Utilities/cmlibarchive/libarchive/archive_write_open_fd.c | 135 |
1 files changed, 68 insertions, 67 deletions
diff --git a/Utilities/cmlibarchive/libarchive/archive_write_open_fd.c b/Utilities/cmlibarchive/libarchive/archive_write_open_fd.c index 1e05bc5..d5c426c 100644 --- a/Utilities/cmlibarchive/libarchive/archive_write_open_fd.c +++ b/Utilities/cmlibarchive/libarchive/archive_write_open_fd.c @@ -24,7 +24,7 @@ */ #include "archive_platform.h" -__FBSDID("$FreeBSD: src/lib/libarchive/archive_write_open_fd.c,v 1.9 2007/01/09 08:05:56 kientzle Exp $"); +__FBSDID("$FreeBSD: head/lib/libarchive/archive_write_open_fd.c 201093 2009-12-28 02:28:44Z kientzle $"); #ifdef HAVE_SYS_STAT_H #include <sys/stat.h> @@ -51,93 +51,94 @@ __FBSDID("$FreeBSD: src/lib/libarchive/archive_write_open_fd.c,v 1.9 2007/01/09 #include "archive.h" struct write_fd_data { - off_t offset; - int fd; + int fd; }; -static int file_close(struct archive *, void *); -static int file_open(struct archive *, void *); -static ssize_t file_write(struct archive *, void *, const void *buff, size_t); +static int file_close(struct archive *, void *); +static int file_open(struct archive *, void *); +static ssize_t file_write(struct archive *, void *, const void *buff, size_t); int archive_write_open_fd(struct archive *a, int fd) { - struct write_fd_data *mine; - - mine = (struct write_fd_data *)malloc(sizeof(*mine)); - if (mine == NULL) { - archive_set_error(a, ENOMEM, "No memory"); - return (ARCHIVE_FATAL); - } - mine->fd = fd; -#if defined(__CYGWIN__) || defined(__BORLANDC__) - setmode(mine->fd, O_BINARY); -#elif defined(_WIN32) - _setmode(mine->fd, _O_BINARY); + struct write_fd_data *mine; + + mine = (struct write_fd_data *)malloc(sizeof(*mine)); + if (mine == NULL) { + archive_set_error(a, ENOMEM, "No memory"); + return (ARCHIVE_FATAL); + } + mine->fd = fd; +#if defined(__CYGWIN__) || defined(_WIN32) + setmode(mine->fd, O_BINARY); #endif - return (archive_write_open(a, mine, - file_open, file_write, file_close)); + return (archive_write_open(a, mine, + file_open, file_write, file_close)); } static int file_open(struct archive *a, void *client_data) { - struct write_fd_data *mine; - struct stat st; - - mine = (struct write_fd_data *)client_data; - - if (fstat(mine->fd, &st) != 0) { - archive_set_error(a, errno, "Couldn't stat fd %d", mine->fd); - return (ARCHIVE_FATAL); - } - - /* - * If this is a regular file, don't add it to itself. - */ - if (S_ISREG(st.st_mode)) - archive_write_set_skip_file(a, st.st_dev, st.st_ino); - - /* - * If client hasn't explicitly set the last block handling, - * then set it here. - */ - if (archive_write_get_bytes_in_last_block(a) < 0) { - /* If the output is a block or character device, fifo, - * or stdout, pad the last block, otherwise leave it - * unpadded. */ - if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode) || - S_ISFIFO(st.st_mode) || (mine->fd == 1)) - /* Last block will be fully padded. */ - archive_write_set_bytes_in_last_block(a, 0); - else - archive_write_set_bytes_in_last_block(a, 1); - } - - return (ARCHIVE_OK); + struct write_fd_data *mine; + struct stat st; + + mine = (struct write_fd_data *)client_data; + + if (fstat(mine->fd, &st) != 0) { + archive_set_error(a, errno, "Couldn't stat fd %d", mine->fd); + return (ARCHIVE_FATAL); + } + + /* + * If this is a regular file, don't add it to itself. + */ + if (S_ISREG(st.st_mode)) + archive_write_set_skip_file(a, st.st_dev, st.st_ino); + + /* + * If client hasn't explicitly set the last block handling, + * then set it here. + */ + if (archive_write_get_bytes_in_last_block(a) < 0) { + /* If the output is a block or character device, fifo, + * or stdout, pad the last block, otherwise leave it + * unpadded. */ + if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode) || + S_ISFIFO(st.st_mode) || (mine->fd == 1)) + /* Last block will be fully padded. */ + archive_write_set_bytes_in_last_block(a, 0); + else + archive_write_set_bytes_in_last_block(a, 1); + } + + return (ARCHIVE_OK); } static ssize_t file_write(struct archive *a, void *client_data, const void *buff, size_t length) { - struct write_fd_data *mine; - ssize_t bytesWritten; - - mine = (struct write_fd_data *)client_data; - bytesWritten = write(mine->fd, buff, length); - if (bytesWritten <= 0) { - archive_set_error(a, errno, "Write error"); - return (-1); - } - return (bytesWritten); + struct write_fd_data *mine; + ssize_t bytesWritten; + + mine = (struct write_fd_data *)client_data; + for (;;) { + bytesWritten = write(mine->fd, buff, length); + if (bytesWritten <= 0) { + if (errno == EINTR) + continue; + archive_set_error(a, errno, "Write error"); + return (-1); + } + return (bytesWritten); + } } static int file_close(struct archive *a, void *client_data) { - struct write_fd_data *mine = (struct write_fd_data *)client_data; + struct write_fd_data *mine = (struct write_fd_data *)client_data; - (void)a; /* UNUSED */ - free(mine); - return (ARCHIVE_OK); + (void)a; /* UNUSED */ + free(mine); + return (ARCHIVE_OK); } |