wordsplit str_ctype str_upper str_lower bucket conf object sorter \
finger proctitle ipaccess profile bitsig randomkey \
hashfunc base64 base224 fb-temp fb-mmap fb-printf urlkey \
- partmap fb-limfd fb-buffer mainloop exitstatus runcmd
+ partmap fb-limfd fb-buffer mainloop exitstatus runcmd carefulio
ifdef CONFIG_OWN_REGEX
include lib/regex/Makefile
--- /dev/null
+/*
+ * Sherlock Library -- Careful Read/Write
+ *
+ * (c) 2004 Martin Mares <mj@ucw.cz>
+ *
+ * This software may be freely distributed and used according to the terms
+ * of the GNU Lesser General Public License.
+ */
+
+#include "lib/lib.h"
+
+#include <unistd.h>
+
+/*
+ * Reads and writes on sockets and pipes can return partial results,
+ * so we implement an iterated read/write call.
+ */
+
+int
+careful_read(int fd, void *buf, int len)
+{
+ byte *pos = buf;
+ while (len)
+ {
+ int l = read(fd, pos, len);
+ if (l < 0)
+ return -1;
+ if (!l)
+ return 0;
+ pos += l;
+ len -= l;
+ }
+ return 1;
+}
+
+int
+careful_write(int fd, void *buf, int len)
+{
+ byte *pos = buf;
+ while (len)
+ {
+ int l = write(fd, pos, len);
+ if (l <= 0)
+ return -1;
+ if (!l)
+ return 0;
+ pos += l;
+ len -= l;
+ }
+ return 1;
+}
void NONRET exec_command_v(byte *cmd, va_list args);
void echo_command_v(byte *buf, int size, byte *cmd, va_list args);
+/* carefulio.c */
+
+int careful_read(int fd, void *buf, int len);
+int careful_write(int fd, void *buf, int len);
+
#endif