unpackers: check errors from close() too

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2009-10-05 03:03:07 +02:00
parent be168b1197
commit dcd27abcc4
3 changed files with 14 additions and 5 deletions

View File

@ -98,6 +98,7 @@ int FAST_FUNC bbunpack(char **argv,
status = unpacker(&info); status = unpacker(&info);
if (status < 0) if (status < 0)
exitcode = 1; exitcode = 1;
xclose(STDOUT_FILENO); /* with error check! */
if (filename) { if (filename) {
char *del = new_name; char *del = new_name;
@ -108,12 +109,11 @@ int FAST_FUNC bbunpack(char **argv,
times.actime = info.mtime; times.actime = info.mtime;
times.modtime = info.mtime; times.modtime = info.mtime;
/* Close first. /* Note: we closed it first.
* On some systems calling utime * On some systems calling utime
* then closing resets the mtime. */ * then closing resets the mtime
close(STDOUT_FILENO); * back to current time. */
/* Ignoring errors */ utime(new_name, &times); /* ignoring errors */
utime(new_name, &times);
} }
/* Delete _compressed_ file */ /* Delete _compressed_ file */

View File

@ -631,6 +631,9 @@ extern void xwrite(int fd, const void *buf, size_t count) FAST_FUNC;
extern void xwrite_str(int fd, const char *str) FAST_FUNC; extern void xwrite_str(int fd, const char *str) FAST_FUNC;
extern void xopen_xwrite_close(const char* file, const char *str) FAST_FUNC; extern void xopen_xwrite_close(const char* file, const char *str) FAST_FUNC;
/* Close fd, but check for failures (some types of write errors) */
extern void xclose(int fd) FAST_FUNC;
/* Reads and prints to stdout till eof, then closes FILE. Exits on error: */ /* Reads and prints to stdout till eof, then closes FILE. Exits on error: */
extern void xprint_and_close_file(FILE *file) FAST_FUNC; extern void xprint_and_close_file(FILE *file) FAST_FUNC;

View File

@ -213,6 +213,12 @@ void FAST_FUNC xwrite_str(int fd, const char *str)
xwrite(fd, str, strlen(str)); xwrite(fd, str, strlen(str));
} }
void FAST_FUNC xclose(int fd)
{
if (close(fd))
bb_perror_msg_and_die("close failed");
}
// Die with an error message if we can't lseek to the right spot. // Die with an error message if we can't lseek to the right spot.
off_t FAST_FUNC xlseek(int fd, off_t offset, int whence) off_t FAST_FUNC xlseek(int fd, off_t offset, int whence)
{ {