-bool
-connection::readpdu()
-{
- if (!rpdu_.sz) {
- uint32_t sz1;
- ssize_t n = read(fd_, &sz1, sizeof(sz1));
-
- if (n == 0) {
- return false;
- }
-
- if (n < 0) {
- VERIFY(errno!=EAGAIN);
- return false;
- }
-
- if (n > 0 && n != sizeof(sz1)) {
- jsl_log(JSL_DBG_OFF, "connection::readpdu short read of sz\n");
- return false;
- }
-
- size_t sz = ntohl(sz1);
-
- if (sz > MAX_PDU) {
- char *tmpb = (char *)&sz1;
- jsl_log(JSL_DBG_2, "connection::readpdu read pdu TOO BIG %lu network order=%x %x %x %x %x\n", sz,
- sz1, tmpb[0],tmpb[1],tmpb[2],tmpb[3]);
- return false;
- }
-
- rpdu_.sz = sz;
- VERIFY(rpdu_.buf == NULL);
- rpdu_.buf = (char *)malloc(sz+sizeof(sz1));
- VERIFY(rpdu_.buf);
- bcopy(&sz1,rpdu_.buf,sizeof(sz1));
- rpdu_.solong = sizeof(sz1);
- }
-
- ssize_t n = read(fd_, rpdu_.buf + rpdu_.solong, rpdu_.sz - rpdu_.solong);
- if (n <= 0) {
- if (errno == EAGAIN)
- return true;
- if (rpdu_.buf)
- free(rpdu_.buf);
- rpdu_.buf = NULL;
- rpdu_.sz = rpdu_.solong = 0;
- return (errno == EAGAIN);
- }
- rpdu_.solong += (size_t)n;
- return true;
+bool connection::readpdu() {
+ IF_LEVEL(5) LOG("the receive buffer has length " << rpdu_.buf.size());
+ if (!rpdu_.buf.size()) {
+ rpc_sz_t sz1;
+ ssize_t n = read(fd_, &sz1, sizeof(sz1));
+
+ if (n == 0) {
+ return false;
+ }
+
+ if (n < 0) {
+ VERIFY(errno!=EAGAIN);
+ return false;
+ }
+
+ if (n > 0 && n != sizeof(sz1)) {
+ IF_LEVEL(0) LOG("short read of sz");
+ return false;
+ }
+
+ size_t sz = ntoh(sz1);
+
+ if (sz > MAX_PDU) {
+ IF_LEVEL(2) LOG("read pdu TOO BIG " << sz << " network order=" << hex << sz1);
+ return false;
+ }
+
+ IF_LEVEL(5) LOG("read size of datagram = " << sz);
+
+ VERIFY(rpdu_.buf.size() == 0);
+ rpdu_.buf = string(sz+sizeof(sz1), 0);
+ rpdu_.solong = sizeof(sz1);
+ }
+
+ ssize_t n = read(fd_, &rpdu_.buf[rpdu_.solong], rpdu_.buf.size() - rpdu_.solong);
+
+ IF_LEVEL(5) LOG("read " << n << " bytes");
+
+ if (n <= 0) {
+ if (errno == EAGAIN)
+ return true;
+ rpdu_.buf.clear();
+ rpdu_.solong = 0;
+ return (errno == EAGAIN);
+ }
+ rpdu_.solong += (size_t)n;
+ return true;