aboutsummaryrefslogtreecommitdiffstats
path: root/src/io.c
diff options
context:
space:
mode:
authorBrian Cully <bjc@kublai.com>2008-03-02 11:44:52 -0500
committerBrian Cully <github.20.shmit@spamgourmet.com>2008-03-02 11:44:52 -0500
commit4c31a79f1f76b6d80fffd05180dadcbb5a882293 (patch)
tree4452bb96e63748f0db3074f4f7f65bb8c19ed644 /src/io.c
parent26858b9722eb539cdb6fa762cb15071cfe753f45 (diff)
downloadmysqlerl-4c31a79f1f76b6d80fffd05180dadcbb5a882293.tar.gz
mysqlerl-4c31a79f1f76b6d80fffd05180dadcbb5a882293.zip
Move logger/io routines to separate modules.
Diffstat (limited to 'src/io.c')
-rw-r--r--src/io.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/io.c b/src/io.c
new file mode 100644
index 0000000..e255f61
--- /dev/null
+++ b/src/io.c
@@ -0,0 +1,55 @@
+#include "io.h"
+#include "log.h"
+
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
+
+int
+restartable_read(unsigned char *buf, size_t buflen)
+{
+ ssize_t rc, readb;
+
+ rc = 0;
+ READLOOP:
+ while (rc < buflen) {
+ readb = read(STDIN_FILENO, buf + rc, buflen - rc);
+ if (readb == -1) {
+ if (errno == EAGAIN || errno == EINTR)
+ goto READLOOP;
+
+ return -1;
+ } else if (readb == 0) {
+ logmsg("ERROR: EOF trying to read additional %d bytes from "
+ "standard input", buflen - rc);
+ return -1;
+ }
+
+ rc += readb;
+ }
+
+ return rc;
+}
+
+int
+restartable_write(const unsigned char *buf, size_t buflen)
+{
+ ssize_t rc, wroteb;
+
+ rc = 0;
+ WRITELOOP:
+ while (rc < buflen) {
+ wroteb = write(STDOUT_FILENO, buf + rc, buflen - rc);
+ if (wroteb == -1) {
+ if (errno == EAGAIN || errno == EINTR)
+ goto WRITELOOP;
+
+ return -1;
+ }
+
+ rc += wroteb;
+ }
+
+ return rc;
+}