Read returning -1 is an error here so make sure and print the actual
reason and close the socket. Otherwise we just loop over the fd with
read returning -1 every time.
EINTR is handled to not cause an error and because the socket is not
opened with O_NONBLOCK we don't need to check EAGAIN/EWOULDBLOCK.
---
openbsc/src/libmsc/smpp_smsc.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/openbsc/src/libmsc/smpp_smsc.c b/openbsc/src/libmsc/smpp_smsc.c
index 64ed200..943464f 100644
--- a/openbsc/src/libmsc/smpp_smsc.c
+++ b/openbsc/src/libmsc/smpp_smsc.c
@@ -778,8 +778,12 @@ static int esme_link_read_cb(struct osmo_fd *ofd)
rdlen = sizeof(uint32_t) - esme->read_idx;
rc = read(ofd->fd, lenptr + esme->read_idx, rdlen);
if (rc < 0) {
- LOGP(DSMPP, LOGL_ERROR, "[%s] read returned %d\n",
- esme->system_id, rc);
+ /* EINTR is a non-fatal error, just try again */
+ if (errno == EINTR)
+ return 0;
+ LOGP(DSMPP, LOGL_ERROR, "[%s] read returned %d (%s)\n",
+ esme->system_id, rc, strerror(errno));
+ goto dead_socket;
} else if (rc == 0) {
goto dead_socket;
} else
@@ -801,8 +805,9 @@ static int esme_link_read_cb(struct osmo_fd *ofd)
rdlen = esme->read_len - esme->read_idx;
rc = read(ofd->fd, msg->tail, OSMO_MIN(rdlen, msgb_tailroom(msg)));
if (rc < 0) {
- LOGP(DSMPP, LOGL_ERROR, "[%s] read returned %d\n",
- esme->system_id, rc);
+ LOGP(DSMPP, LOGL_ERROR, "[%s] read returned %d (%s)\n",
+ esme->system_id, rc, strerror(errno));
+ goto dead_socket;
} else if (rc == 0) {
goto dead_socket;
} else {
--
1.8.4.2