synk

synchronize files between hosts
Log | Files | Refs | README | LICENSE

commit 91fe72f11a4c218d94a2694ad150ea1ed46edaae
parent 726cfff486a2c923d14397e15c8b64f95c7a96a3
Author: Willy <willyatmailoodotorg>
Date:   Fri Sep  2 00:38:15 +0200

Read struct from server in chunks

Structure will be sent from the server to the client in chunks of
RECVSIZ bytes, to deal with data fractionning over TCP.

Diffstat:
synk.c | 15++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/synk.c b/synk.c @@ -23,6 +23,7 @@ #define TIMESTAMP_MAX 19 /* length of LONG_MAX */ #define CONNECTION_MAX 1 +#define RECVSIZ 512 /* hold a socket connection, used to pass a connection to a thread */ struct client_t { @@ -355,7 +356,7 @@ int getpeermeta(struct peer_t *clt, struct metadata_t *local) { int cfd; - ssize_t len = 0; + ssize_t r, len = 0; if ((cfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("socket"); @@ -367,15 +368,19 @@ getpeermeta(struct peer_t *clt, struct metadata_t *local) return -1; } - if ((len = write(cfd, local, sizeof(struct metadata_t))) < 0) { + if (write(cfd, local, sizeof(struct metadata_t)) < 0) { perror("write"); return -1; } /* ... which should return the metadata for this file */ - if ((len = read(cfd, &(clt->meta), sizeof(struct metadata_t))) < 0) { - perror("read"); - return -1; + len = 0; + while (len < (ssize_t)sizeof(struct metadata_t)) { + if ((r = read(cfd, (unsigned char *)&(clt->meta) + len, RECVSIZ)) < 0) { + perror("read"); + return -1; + } + len += r; } return close(cfd);