summaryrefslogtreecommitdiffstats
path: root/sockutil.c
diff options
context:
space:
mode:
authorNathan Straz <nstraz@redhat.com>2013-08-29 16:47:14 -0400
committerNathan Straz <nstraz@redhat.com>2013-09-11 17:49:40 -0400
commit5a8fc22727bc20624dd915f1e6fd805ba5e0f85f (patch)
treef514e667e0c114b89988a57d41daf5d408abd181 /sockutil.c
parentceaf5360d969f2507018f51876f64aaae767e367 (diff)
downloadqarsh-5a8fc22727bc20624dd915f1e6fd805ba5e0f85f.tar.gz
qarsh-5a8fc22727bc20624dd915f1e6fd805ba5e0f85f.tar.xz
qarsh-5a8fc22727bc20624dd915f1e6fd805ba5e0f85f.zip
Remove complicated remote file descriptor code
Only handle one file transfer at a time so we don't need an array to track multiple transfers or know the remote's fd number. Loop in recv_packet until we read a whole packet.
Diffstat (limited to 'sockutil.c')
-rw-r--r--sockutil.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/sockutil.c b/sockutil.c
index 1a53e62..9ff9210 100644
--- a/sockutil.c
+++ b/sockutil.c
@@ -207,10 +207,13 @@ recv_packet(int fd)
{
char buf[QARSH_MAX_PACKET_SIZE];
uint32_t packetsize;
+ int bufused = 0;
int ret = 0;
if ((ret = read(fd, &packetsize, sizeof packetsize)) < 0) {
- fprintf(stderr, "Read error while reading packet size: %s\n", strerror(errno));
+ if (errno != ECONNRESET) {
+ fprintf(stderr, "Read error while reading packet size: %s\n", strerror(errno));
+ }
return NULL;
} else if (ret == 0) {
return NULL;
@@ -223,15 +226,14 @@ recv_packet(int fd)
fprintf(stderr, "Packet size too large, %d > %d\n", packetsize, QARSH_MAX_PACKET_SIZE);
return NULL;
}
- if ((ret = read(fd, buf, packetsize)) < 0) {
- fprintf(stderr, "Read error while reading packet data: %s\n", strerror(errno));
- return NULL;
- }
- if (ret != packetsize) {
- fprintf(stderr, "Read something other than packetsize bytes, %d != %d\n",
- ret, packetsize);
- return NULL;
- }
+ /* Keep reading until we get the whole packet and nothing but the packet, so help me socket */
+ do {
+ if ((ret = read(fd, buf+bufused, packetsize-bufused)) < 0) {
+ fprintf(stderr, "Read error while reading packet data: %s\n", strerror(errno));
+ return NULL;
+ }
+ bufused += ret;
+ } while (bufused < packetsize);
return parse_packet(buf, packetsize);
}