diff options
author | Volker Lendecke <vl@samba.org> | 2014-12-06 11:22:35 +0100 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2014-12-09 04:12:08 +0100 |
commit | d775c386e498d4c2062f8fc65f515f991d127dc1 (patch) | |
tree | 46bc6a9e8ec84b31d7a6f13138d8a6715a141423 /source3/lib/iov_buf.c | |
parent | 3a6a6f19410606a9028861ca95ac80d2651e2830 (diff) | |
download | samba-d775c386e498d4c2062f8fc65f515f991d127dc1.tar.gz samba-d775c386e498d4c2062f8fc65f515f991d127dc1.tar.xz samba-d775c386e498d4c2062f8fc65f515f991d127dc1.zip |
lib: Simplify iov_buf[len]
This makes iov_buf independent of talloc
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source3/lib/iov_buf.c')
-rw-r--r-- | source3/lib/iov_buf.c | 46 |
1 files changed, 18 insertions, 28 deletions
diff --git a/source3/lib/iov_buf.c b/source3/lib/iov_buf.c index dd99da3625..e05dfc9524 100644 --- a/source3/lib/iov_buf.c +++ b/source3/lib/iov_buf.c @@ -23,43 +23,33 @@ ssize_t iov_buflen(const struct iovec *iov, int iovcnt) { - size_t buflen = 0; + return iov_buf(iov, iovcnt, NULL, 0); +} + +ssize_t iov_buf(const struct iovec *iov, int iovcnt, + uint8_t *buf, size_t buflen) +{ + size_t needed = 0; + uint8_t *p = buf; int i; for (i=0; i<iovcnt; i++) { size_t thislen = iov[i].iov_len; - size_t tmp = buflen + thislen; + size_t tmp; + + tmp = needed + thislen; - if ((tmp < buflen) || (tmp < thislen)) { + if ((tmp < needed) || (tmp < thislen)) { /* overflow */ return -1; } - buflen = tmp; - } - return buflen; -} - -uint8_t *iov_buf(TALLOC_CTX *mem_ctx, const struct iovec *iov, int iovcnt) -{ - int i; - ssize_t buflen; - uint8_t *buf, *p; + needed = tmp; - buflen = iov_buflen(iov, iovcnt); - if (buflen == -1) { - return NULL; - } - buf = talloc_array(mem_ctx, uint8_t, buflen); - if (buf == NULL) { - return NULL; + if (needed <= buflen) { + memcpy(p, iov[i].iov_base, thislen); + p += thislen; + } } - p = buf; - for (i=0; i<iovcnt; i++) { - size_t len = iov[i].iov_len; - - memcpy(p, iov[i].iov_base, len); - p += len; - } - return buf; + return needed; } |