Module: xenomai-head
Branch: master
Commit: 3d453b310fbba5e69ddcb98b2da7062dfe904270
URL:    
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=3d453b310fbba5e69ddcb98b2da7062dfe904270

Author: Philippe Gerum <r...@xenomai.org>
Date:   Wed Sep  9 17:36:17 2009 +0200

rtipc: introduce rtipc_get_iov_flatlen()

---

 ksrc/drivers/ipc/iddp.c     |   18 ++----------------
 ksrc/drivers/ipc/internal.h |    2 ++
 ksrc/drivers/ipc/rtipc.c    |   16 ++++++++++++++++
 ksrc/drivers/ipc/xddp.c     |   18 ++----------------
 4 files changed, 22 insertions(+), 32 deletions(-)

diff --git a/ksrc/drivers/ipc/iddp.c b/ksrc/drivers/ipc/iddp.c
index 2c18703..e1f0d46 100644
--- a/ksrc/drivers/ipc/iddp.c
+++ b/ksrc/drivers/ipc/iddp.c
@@ -261,14 +261,7 @@ static ssize_t __iddp_recvmsg(struct rtipc_private *priv,
        if (!test_bit(_IDDP_BOUND, &sk->status))
                return -EAGAIN;
 
-       /* Compute available iovec space to maxlen. */
-       for (maxlen = 0, nvec = 0; nvec < iovlen; nvec++) {
-               ssize_t l = iov[nvec].iov_len;
-               if (l < 0 || maxlen + l < maxlen) /* SuS wants this. */
-                       return -EINVAL;
-               maxlen += l;
-       }
-
+       maxlen = rtipc_get_iov_flatlen(iov, iovlen);
        if (maxlen == 0)
                return 0;
 
@@ -396,14 +389,7 @@ static ssize_t __iddp_sendmsg(struct rtipc_private *priv,
        ssize_t len, rdlen, vlen;
        struct xnbufd bufd;
 
-       /* Compute the required buffer space. */
-       for (len = 0, nvec = 0; nvec < iovlen; nvec++) {
-               ssize_t l = iov[nvec].iov_len;
-               if (l < 0 || len + l < len) /* SuS wants this. */
-                       return -EINVAL;
-               len += l;
-       }
-
+       len = rtipc_get_iov_flatlen(iov, iovlen);
        if (len == 0)
                return 0;
 
diff --git a/ksrc/drivers/ipc/internal.h b/ksrc/drivers/ipc/internal.h
index 1cbb581..b12b3c9 100644
--- a/ksrc/drivers/ipc/internal.h
+++ b/ksrc/drivers/ipc/internal.h
@@ -90,6 +90,8 @@ int rtipc_get_sockaddr(rtdm_user_info_t *user_info,
 int rtipc_put_sockaddr(rtdm_user_info_t *user_info, void *arg,
                       const struct sockaddr_ipc *saddr);
 
+ssize_t rtipc_get_iov_flatlen(struct iovec *iov, int iovlen);
+
 extern struct rtipc_protocol xddp_proto_driver;
 
 extern struct rtipc_protocol iddp_proto_driver;
diff --git a/ksrc/drivers/ipc/rtipc.c b/ksrc/drivers/ipc/rtipc.c
index 6874f3d..0ab66f4 100644
--- a/ksrc/drivers/ipc/rtipc.c
+++ b/ksrc/drivers/ipc/rtipc.c
@@ -119,6 +119,22 @@ int rtipc_put_sockaddr(rtdm_user_info_t *user_info, void 
*arg,
        return 0;
 }
 
+ssize_t rtipc_get_iov_flatlen(struct iovec *iov, int iovlen)
+{
+       ssize_t len;
+       int nvec;
+
+       /* Return the flattened vector length. */
+       for (len = 0, nvec = 0; nvec < iovlen; nvec++) {
+               ssize_t l = iov[nvec].iov_len;
+               if (l < 0 || len + l < len) /* SuS wants this. */
+                       return -EINVAL;
+               len += l;
+       }
+
+       return len;
+}
+
 static int rtipc_socket(struct rtdm_dev_context *context,
                        rtdm_user_info_t *user_info, int protocol)
 {
diff --git a/ksrc/drivers/ipc/xddp.c b/ksrc/drivers/ipc/xddp.c
index 76e95a9..d2c7a68 100644
--- a/ksrc/drivers/ipc/xddp.c
+++ b/ksrc/drivers/ipc/xddp.c
@@ -299,14 +299,7 @@ static ssize_t __xddp_recvmsg(struct rtipc_private *priv,
        if (!test_bit(_XDDP_BOUND, &sk->status))
                return -EAGAIN;
 
-       /* Compute available iovec space to maxlen. */
-       for (maxlen = 0, nvec = 0; nvec < iovlen; nvec++) {
-               ssize_t l = iov[nvec].iov_len;
-               if (l < 0 || maxlen + l < maxlen) /* SuS wants this. */
-                       return -EINVAL;
-               maxlen += l;
-       }
-
+       maxlen = rtipc_get_iov_flatlen(iov, iovlen);
        if (maxlen == 0)
                return 0;
 
@@ -495,14 +488,7 @@ static ssize_t __xddp_sendmsg(struct rtipc_private *priv,
        int nvec, to, from;
        struct xnbufd bufd;
 
-       /* Compute the required buffer space. */
-       for (len = 0, nvec = 0; nvec < iovlen; nvec++) {
-               ssize_t l = iov[nvec].iov_len;
-               if (l < 0 || len + l < len) /* SuS wants this. */
-                       return -EINVAL;
-               len += l;
-       }
-
+       len = rtipc_get_iov_flatlen(iov, iovlen);
        if (len == 0)
                return 0;
 


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to