Max has uploaded this change for review. ( https://gerrit.osmocom.org/11911


Change subject: IPA: move duplicated error handling into inline function
......................................................................

IPA: move duplicated error handling into inline function

The code is re-ordered to put error handling upfront similar to te way
we do it in oter places.

Change-Id: Ic0147bffaf04b0baf97e5cca22948bd0e116668f
---
M src/gsm/ipa.c
1 file changed, 32 insertions(+), 23 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/11/11911/1

diff --git a/src/gsm/ipa.c b/src/gsm/ipa.c
index d423c26..6ee003d 100644
--- a/src/gsm/ipa.c
+++ b/src/gsm/ipa.c
@@ -541,6 +541,33 @@
        return rc;
 }

+/*! Attempt to recv() message and analyse return value
+ * \param[out] ret result of recv() will be stored in here.
+ * \param[in] fd The fd for the socket to read from.
+ * \param[in] msg Message buffer to read into.
+ * \param[in] needed Home many bytes we have to read.
+ * \returns boolean indicating whether message should be discarded.
+ */
+static inline bool recv_discard_msg(int *ret, int fd, struct msgb *msg, int 
needed)
+{
+       *ret = recv(fd, msg->tail, needed, 0);
+
+       if (*ret == 0) /* the socket is properly closed or we've requested to 
receive 0 bytes */
+               return true;
+
+       if (*ret > 0) /* some data was obtained */
+               return false;
+
+       if (errno == EAGAIN || errno == EINTR) {
+               *ret = 0;
+               return false;
+       }
+
+       /* errors indicated by -1 return value, let's save the actual error 
code */
+       *ret = -errno;
+       return true;
+}
+
 /*! Read one ipa message from socket fd or store part if still not fully 
received.
  *  \param[in] fd The fd for the socket to read from.
  *  \param[out] rmsg internally allocated msgb containing a fully received ipa 
message.
@@ -566,6 +593,7 @@
        struct ipaccess_head *hh;
        int len, ret;
        int needed;
+       bool discard;

        if (msg == NULL) {
                msg = ipa_msg_alloc(0);
@@ -579,19 +607,10 @@
        if (msg->l2h == NULL) {
                /* first read our 3-byte header */
                needed = sizeof(*hh) - msg->len;
-               ret = recv(fd, msg->tail, needed, 0);
-               if (ret == 0)
+               discard = recv_discard_msg(&ret, fd, msg, needed);
+               if (discard)
                       goto discard_msg;

-               if (ret < 0) {
-                       if (errno == EAGAIN || errno == EINTR)
-                               ret = 0;
-                       else {
-                               ret = -errno;
-                               goto discard_msg;
-                       }
-               }
-
                msgb_put(msg, ret);

                if (ret < needed) {
@@ -629,20 +648,10 @@
        needed = len - msgb_l2len(msg);

        if (needed > 0) {
-               ret = recv(fd, msg->tail, needed, 0);
-
-               if (ret == 0)
+               discard = recv_discard_msg(&ret, fd, msg, needed);
+               if (discard)
                        goto discard_msg;

-               if (ret < 0) {
-                       if (errno == EAGAIN || errno == EINTR)
-                               ret = 0;
-                       else {
-                               ret = -errno;
-                               goto discard_msg;
-                       }
-               }
-
                msgb_put(msg, ret);

                if (ret < needed) {

--
To view, visit https://gerrit.osmocom.org/11911
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic0147bffaf04b0baf97e5cca22948bd0e116668f
Gerrit-Change-Number: 11911
Gerrit-PatchSet: 1
Gerrit-Owner: Max <[email protected]>

Reply via email to