diff options
| author | Brian Cully <bjc@kublai.com> | 2012-02-06 19:44:47 -0500 |
|---|---|---|
| committer | Brian Cully <github.20.shmit@spamgourmet.com> | 2012-02-06 19:46:56 -0500 |
| commit | 50f3c688a7cd4819680dbd19b9933c6cb5e62ca7 (patch) | |
| tree | 5d9bf2edac40d874ec05bafc1e1e38b443879ce3 /lib/src/io.c | |
| parent | d3b118481833acd44d724c06ce8c9d6b6ff2838a (diff) | |
| download | mysqlerl-50f3c688a7cd4819680dbd19b9933c6cb5e62ca7.tar.gz mysqlerl-50f3c688a7cd4819680dbd19b9933c6cb5e62ca7.zip | |
Move most files into lib, add top-level makefile
Diffstat (limited to 'lib/src/io.c')
| -rw-r--r-- | lib/src/io.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/src/io.c b/lib/src/io.c new file mode 100644 index 0000000..dcc055f --- /dev/null +++ b/lib/src/io.c @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2008, Brian Cully <bjc@kublai.com> + */ + +#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; +} |
