transfused: factor read_exactly out of read_message

Signed-off-by: David Sheets <dsheets@docker.com>
This commit is contained in:
David Sheets 2016-12-14 15:07:15 +00:00
parent 8580cfec80
commit fdc8afd32d

View File

@ -182,47 +182,46 @@ uint64_t message_id(uint64_t *message)
return message[1]; return message[1];
} }
int read_message(char *descr, parameters *params, int fd, void read_exactly(char *descr, int fd, void *p, size_t nbyte)
char *buf, size_t max_read){ {
ssize_t read_count; ssize_t read_count;
size_t upto = 0; char *buf = p;
size_t nbyte;
uint32_t len;
do { while (nbyte > 0) {
read_count = read(fd, buf + upto, sizeof(uint32_t) - upto); read_count = read(fd, buf, nbyte);
if (read_count == -1) { if (read_count < 0) {
if (errno == EAGAIN || errno == EINTR) if (errno == EAGAIN || errno == EINTR)
continue; continue;
die(1, params, "", "read %s: error reading: ", descr); die(1, NULL, "", "read %s: error reading: ", descr);
} }
if (read_count == 0) if (read_count == 0)
die(1, params, NULL, die(1, NULL, NULL, "read %s: EOF reading", descr);
"read %s: EOF reading length", descr); nbyte -= read_count;
upto += read_count; buf += read_count;
} while (upto < sizeof(uint32_t)); }
}
int read_message(char *descr, parameters *params, int fd,
char *buf, size_t max_read)
{
size_t nbyte = sizeof(uint32_t);
uint32_t len;
read_exactly(descr, fd, buf, nbyte);
len = *((uint32_t *) buf); len = *((uint32_t *) buf);
if (len > max_read) if (len > max_read)
die(1, params, NULL, die(1, params, NULL,
"read %s: message size %d exceeds buffer capacity %d", "read %s: message size %d exceeds buffer capacity %d",
len, max_read); len, max_read);
if (len < nbyte)
die(1, params, NULL,
"read %s: message size is %d but must be at least %d",
len, nbyte);
nbyte = (size_t)(len - 4); buf += nbyte;
buf += 4; nbyte = (size_t)(len - nbyte);
do { read_exactly(descr, fd, buf, nbyte);
read_count = read(fd, buf, nbyte);
if (read_count < 0) {
if (errno == EAGAIN || errno == EINTR)
continue;
die(1, params, "", "read %s: error reading: ", descr);
}
if (read_count == 0)
die(1, params, NULL, "read %s: EOF reading", descr);
nbyte -= read_count;
buf += read_count;
} while (nbyte != 0);
return (int)len; return (int)len;
} }
@ -302,7 +301,7 @@ void write_exactly(char *descr, int fd, void *p, size_t nbyte)
int write_count; int write_count;
char *buf = p; char *buf = p;
do { while (nbyte > 0) {
write_count = write(fd, buf, nbyte); write_count = write(fd, buf, nbyte);
if (write_count < 0) { if (write_count < 0) {
if (errno == EINTR || errno == EAGAIN) if (errno == EINTR || errno == EAGAIN)
@ -314,7 +313,7 @@ void write_exactly(char *descr, int fd, void *p, size_t nbyte)
nbyte -= write_count; nbyte -= write_count;
buf += write_count; buf += write_count;
} while (nbyte != 0); }
} }
void copy_outof_fuse(copy_thread_state *copy_state) void copy_outof_fuse(copy_thread_state *copy_state)