diff options
| author | Richard Nyberg <rnyberg@murmeldjur.se> | 2006-02-05 11:34:18 +0000 |
|---|---|---|
| committer | Richard Nyberg <rnyberg@murmeldjur.se> | 2006-02-05 11:34:18 +0000 |
| commit | 38418fcd2bb0d6ae159fecbb527bfa02ea9c9c3e (patch) | |
| tree | 0deadf5fac6fca207d04826a68b97bd4277ca369 /misc/subr.c | |
| parent | 65f3eb2185e3cb9ed91f3c76d68673fc0b8d4d4c (diff) | |
| download | btpd-38418fcd2bb0d6ae159fecbb527bfa02ea9c9c3e.tar.gz btpd-38418fcd2bb0d6ae159fecbb527bfa02ea9c9c3e.zip | |
Add functions read_fully and write_fully. They are simpler alternatives to
read and write on blocking sockets.
Diffstat (limited to 'misc/subr.c')
| -rw-r--r-- | misc/subr.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/misc/subr.c b/misc/subr.c index 729d588..e16a7dc 100644 --- a/misc/subr.c +++ b/misc/subr.c @@ -174,3 +174,35 @@ rand_between(long min, long max) { return min + (long)rint((double)random() * (max - min) / RAND_MAX); } + +int +write_fully(int fd, const void *buf, size_t len) +{ + ssize_t nw; + size_t off = 0; + + while (off < len) { + nw = write(fd, buf + off, len - off); + if (nw == -1) + return errno; + off += nw; + } + return 0; +} + +int +read_fully(int fd, void *buf, size_t len) +{ + ssize_t nread; + size_t off = 0; + + while (off < len) { + nread = read(fd, buf + off, len - off); + if (nread == 0) + return ECONNRESET; + else if (nread == -1) + return errno; + off += nread; + } + return 0; +} |