aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2003-10-09 08:35:42 +0000
committerandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>2003-10-09 08:35:42 +0000
commitd279ec3d6a6fbe679b01862989573c87cb146d70 (patch)
tree0490983c989cc1fac5a5e5f34eb076d17c594e75
parentfc4e888abf25a500363e60a62aede05e2ad7af32 (diff)
downloadbusybox-w32-d279ec3d6a6fbe679b01862989573c87cb146d70.tar.gz
busybox-w32-d279ec3d6a6fbe679b01862989573c87cb146d70.tar.bz2
busybox-w32-d279ec3d6a6fbe679b01862989573c87cb146d70.zip
We did not have a safe_write, which is the analog to safe_read. Convert
full_write to use safe_write internally, which is needed to guarantee proper behavior, i.e. when writing to a pipe. git-svn-id: svn://busybox.net/trunk/busybox@7621 69ca8d6d-28ef-0310-b511-8ec308f3f277
-rw-r--r--include/libbb.h1
-rw-r--r--libbb/full_write.c2
-rw-r--r--libbb/safe_write.c48
3 files changed, 50 insertions, 1 deletions
diff --git a/include/libbb.h b/include/libbb.h
index eb6841d33..7587a407c 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -109,6 +109,7 @@ extern int is_directory(const char *name, int followLinks, struct stat *statBuf)
109extern int remove_file(const char *path, int flags); 109extern int remove_file(const char *path, int flags);
110extern int copy_file(const char *source, const char *dest, int flags); 110extern int copy_file(const char *source, const char *dest, int flags);
111extern ssize_t safe_read(int fd, void *buf, size_t count); 111extern ssize_t safe_read(int fd, void *buf, size_t count);
112extern ssize_t safe_write(int fd, void *buf, size_t count);
112extern ssize_t bb_full_write(int fd, const void *buf, size_t len); 113extern ssize_t bb_full_write(int fd, const void *buf, size_t len);
113extern ssize_t bb_full_read(int fd, void *buf, size_t len); 114extern ssize_t bb_full_read(int fd, void *buf, size_t len);
114extern int recursive_action(const char *fileName, int recurse, 115extern int recursive_action(const char *fileName, int recurse,
diff --git a/libbb/full_write.c b/libbb/full_write.c
index 6f2255516..30c7a5079 100644
--- a/libbb/full_write.c
+++ b/libbb/full_write.c
@@ -36,7 +36,7 @@ ssize_t bb_full_write(int fd, const void *buf, size_t len)
36 total = 0; 36 total = 0;
37 37
38 while (len > 0) { 38 while (len > 0) {
39 cc = write(fd, buf, len); 39 cc = safe_write(fd, buf, len);
40 40
41 if (cc < 0) 41 if (cc < 0)
42 return cc; /* write() returns -1 on failure. */ 42 return cc; /* write() returns -1 on failure. */
diff --git a/libbb/safe_write.c b/libbb/safe_write.c
new file mode 100644
index 000000000..dd35f35ae
--- /dev/null
+++ b/libbb/safe_write.c
@@ -0,0 +1,48 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
5 * Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.org>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22#include <stdio.h>
23#include <errno.h>
24#include <unistd.h>
25#include "libbb.h"
26
27
28
29ssize_t safe_write(int fd, void *buf, size_t count)
30{
31 ssize_t n;
32
33 do {
34 n = write(fd, buf, count);
35 } while (n < 0 && errno == EINTR);
36
37 return n;
38}
39
40
41/* END CODE */
42/*
43Local Variables:
44c-file-style: "linux"
45c-basic-offset: 4
46tab-width: 4
47End:
48*/