- int32_t nbytes;
- int32_t pktsiz;
-
- bsock->msg[0] = 0;
- if (bsock->errors || bsock->terminated) {
- return BNET_HARDEOF;
- }
-
- bsock->read_seqno++; /* bump sequence number */
- bsock->timer_start = watchdog_time; /* set start wait time */
- bsock->timed_out = 0;
- /* get data size -- in int32_t */
- if ((nbytes = read_nbytes(bsock, (char *)&pktsiz, sizeof(int32_t))) <= 0) {
- bsock->timer_start = 0; /* clear timer */
- /* probably pipe broken because client died */
- if (errno == 0) {
- bsock->b_errno = ENODATA;
- } else {
- bsock->b_errno = errno;
- }
- bsock->errors++;
- return BNET_HARDEOF; /* assume hard EOF received */
- }
- bsock->timer_start = 0; /* clear timer */
- if (nbytes != sizeof(int32_t)) {
- bsock->errors++;
- bsock->b_errno = EIO;
- Jmsg3(bsock->jcr, M_ERROR, 0, _("Read %d expected %d from %s\n"), nbytes, sizeof(int32_t),
- bsock->who);
- return BNET_ERROR;
- }
-
- pktsiz = ntohl(pktsiz); /* decode no. of bytes that follow */
-
- if (pktsiz == 0) { /* No data transferred */
- bsock->timer_start = 0; /* clear timer */
- bsock->in_msg_no++;
- bsock->msglen = 0;
- return 0; /* zero bytes read */
- }
-
- /* If signal or packet size too big */
- if (pktsiz < 0 || pktsiz > 1000000) {
- if (pktsiz > 0) { /* if packet too big */
- pktsiz = BNET_TERMINATE; /* hang up */
- }
- if (pktsiz == BNET_TERMINATE) {
- bsock->terminated = 1;
- }
- bsock->timer_start = 0; /* clear timer */
- bsock->b_errno = ENODATA;
- bsock->msglen = pktsiz; /* signal code */
- return BNET_SIGNAL; /* signal */
- }
-
- /* Make sure the buffer is big enough + one byte for EOS */
- if (pktsiz >= (int32_t)sizeof_pool_memory(bsock->msg)) {
- bsock->msg = realloc_pool_memory(bsock->msg, pktsiz + 100);
- }
-
- bsock->timer_start = watchdog_time; /* set start wait time */
- bsock->timed_out = 0;
- /* now read the actual data */
- if ((nbytes = read_nbytes(bsock, bsock->msg, pktsiz)) <= 0) {
- bsock->timer_start = 0; /* clear timer */
- if (errno == 0) {
- bsock->b_errno = ENODATA;
- } else {
- bsock->b_errno = errno;
- }
- bsock->errors++;
- Jmsg4(bsock->jcr, M_ERROR, 0, _("Read error from %s:%s:%d: ERR=%s\n"),
- bsock->who, bsock->host, bsock->port, bnet_strerror(bsock));
- return BNET_ERROR;
- }
- bsock->timer_start = 0; /* clear timer */
- bsock->in_msg_no++;
- bsock->msglen = nbytes;
- if (nbytes != pktsiz) {
- bsock->b_errno = EIO;
- bsock->errors++;
- Jmsg5(bsock->jcr, M_ERROR, 0, _("Read expected %d got %d from %s:%s:%d\n"), pktsiz, nbytes,
- bsock->who, bsock->host, bsock->port);
- return BNET_ERROR;
- }
- /* always add a zero by to properly terminate any
- * string that was send to us. Note, we ensured above that the
- * buffer is at least one byte longer than the message length.
- */
- bsock->msg[nbytes] = 0; /* terminate in case it is a string */
- sm_check(__FILE__, __LINE__, False);
- return nbytes; /* return actual length of message */