From 5e8a14a38da718561403517e00d2ab76880c681f Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Mon, 19 Nov 2012 17:38:44 +0800 Subject: [PATCH] mchian: Sync w/ FreeBSD a little bit subr_mchain.c CVS 1.{6, 8, 9, 10, 16, 18} Submitted-by: Alexey Slynko w/ modification by me DragonFly-bug: http://bugs.dragonflybsd.org/issues/80 --- sys/kern/libmchain/subr_mchain.c | 66 ++++++++++++++++++-------------- sys/netproto/smb/smb_iod.c | 5 ++- sys/netproto/smb/smb_subr.c | 19 +++++++-- sys/sys/mchain.h | 48 +---------------------- 4 files changed, 57 insertions(+), 81 deletions(-) diff --git a/sys/kern/libmchain/subr_mchain.c b/sys/kern/libmchain/subr_mchain.c index 23b61ca540..f62de3544b 100644 --- a/sys/kern/libmchain/subr_mchain.c +++ b/sys/kern/libmchain/subr_mchain.c @@ -10,9 +10,6 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Boris Popov. * 4. Neither the name of the author nor the names of any co-contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. @@ -36,8 +33,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -46,11 +43,11 @@ MODULE_VERSION(libmchain, 1); -#define MBERROR(format, args...) kprintf("%s(%d): "format, __func__ , \ - __LINE__ ,## args) +#define MBERROR(format, ...) kprintf("%s(%d): "format, __func__ , \ + __LINE__ , ## __VA_ARGS__) -#define MBPANIC(format, args...) kprintf("%s(%d): "format, __func__ , \ - __LINE__ ,## args) +#define MBPANIC(format, ...) kprintf("%s(%d): "format, __func__ , \ + __LINE__ , ## __VA_ARGS__) /* * Various helper functions @@ -156,42 +153,42 @@ mb_put_uint8(struct mbchain *mbp, u_int8_t x) int mb_put_uint16be(struct mbchain *mbp, u_int16_t x) { - x = htobes(x); + x = htobe16(x); return mb_put_mem(mbp, (caddr_t)&x, sizeof(x), MB_MSYSTEM); } int mb_put_uint16le(struct mbchain *mbp, u_int16_t x) { - x = htoles(x); + x = htole16(x); return mb_put_mem(mbp, (caddr_t)&x, sizeof(x), MB_MSYSTEM); } int mb_put_uint32be(struct mbchain *mbp, u_int32_t x) { - x = htobel(x); + x = htobe32(x); return mb_put_mem(mbp, (caddr_t)&x, sizeof(x), MB_MSYSTEM); } int mb_put_uint32le(struct mbchain *mbp, u_int32_t x) { - x = htolel(x); + x = htole32(x); return mb_put_mem(mbp, (caddr_t)&x, sizeof(x), MB_MSYSTEM); } int mb_put_int64be(struct mbchain *mbp, int64_t x) { - x = htobeq(x); + x = htobe64(x); return mb_put_mem(mbp, (caddr_t)&x, sizeof(x), MB_MSYSTEM); } int mb_put_int64le(struct mbchain *mbp, int64_t x) { - x = htoleq(x); + x = htole64(x); return mb_put_mem(mbp, (caddr_t)&x, sizeof(x), MB_MSYSTEM); } @@ -202,7 +199,7 @@ mb_put_mem(struct mbchain *mbp, c_caddr_t source, int size, int type) caddr_t dst; c_caddr_t src; int error, mleft, count; - size_t cplen; + size_t cplen, srclen, dstlen; m = mbp->mb_cur; mleft = mbp->mb_mleft; @@ -219,10 +216,13 @@ mb_put_mem(struct mbchain *mbp, c_caddr_t source, int size, int type) continue; } cplen = mleft > size ? size : mleft; + srclen = dstlen = cplen; dst = mtod(m, caddr_t) + m->m_len; switch (type) { case MB_MCUSTOM: - error = mbp->mb_copy(mbp, source, dst, cplen); + srclen = size; + dstlen = mleft; + error = mbp->mb_copy(mbp, source, dst, &srclen, &dstlen); if (error) return error; break; @@ -242,11 +242,11 @@ mb_put_mem(struct mbchain *mbp, c_caddr_t source, int size, int type) bzero(dst, cplen); break; } - size -= cplen; - source += cplen; - m->m_len += cplen; - mleft -= cplen; - mbp->mb_count += cplen; + size -= srclen; + source += srclen; + m->m_len += dstlen; + mleft -= dstlen; + mbp->mb_count += dstlen; } mbp->mb_cur = m; mbp->mb_mleft = mleft; @@ -295,7 +295,8 @@ mb_put_uio(struct mbchain *mbp, struct uio *uiop, int size) return error; uiop->uio_offset += left; uiop->uio_resid -= left; - uiop->uio_iov->iov_base = (char *)uiop->uio_iov->iov_base + left; + uiop->uio_iov->iov_base = + (char *)uiop->uio_iov->iov_base + left; uiop->uio_iov->iov_len -= left; size -= left; } @@ -393,7 +394,8 @@ md_get_uint16le(struct mdchain *mdp, u_int16_t *x) u_int16_t v; int error = md_get_uint16(mdp, &v); - *x = letohs(v); + if (x != NULL) + *x = le16toh(v); return error; } @@ -402,7 +404,8 @@ md_get_uint16be(struct mdchain *mdp, u_int16_t *x) { u_int16_t v; int error = md_get_uint16(mdp, &v); - *x = betohs(v); + if (x != NULL) + *x = be16toh(v); return error; } @@ -419,7 +422,8 @@ md_get_uint32be(struct mdchain *mdp, u_int32_t *x) int error; error = md_get_uint32(mdp, &v); - *x = betohl(v); + if (x != NULL) + *x = be32toh(v); return error; } @@ -430,7 +434,8 @@ md_get_uint32le(struct mdchain *mdp, u_int32_t *x) int error; error = md_get_uint32(mdp, &v); - *x = letohl(v); + if (x != NULL) + *x = le32toh(v); return error; } @@ -447,7 +452,8 @@ md_get_int64be(struct mdchain *mdp, int64_t *x) int error; error = md_get_int64(mdp, &v); - *x = betohq(v); + if (x != NULL) + *x = be64toh(v); return error; } @@ -458,7 +464,8 @@ md_get_int64le(struct mdchain *mdp, int64_t *x) int error; error = md_get_int64(mdp, &v); - *x = letohq(v); + if (x != NULL) + *x = le64toh(v); return error; } @@ -546,7 +553,8 @@ md_get_uio(struct mdchain *mdp, struct uio *uiop, int size) return error; uiop->uio_offset += left; uiop->uio_resid -= left; - uiop->uio_iov->iov_base = (char *)uiop->uio_iov->iov_base + left; + uiop->uio_iov->iov_base = + (char *)uiop->uio_iov->iov_base + left; uiop->uio_iov->iov_len -= left; size -= left; } diff --git a/sys/netproto/smb/smb_iod.c b/sys/netproto/smb/smb_iod.c index fba13b0a00..1a1e7838bd 100644 --- a/sys/netproto/smb/smb_iod.c +++ b/sys/netproto/smb/smb_iod.c @@ -35,6 +35,7 @@ #include #include +#include #include #include #include @@ -257,8 +258,8 @@ smb_iod_sendrq(struct smbiod *iod, struct smb_rq *rqp) if (vcp->vc_maxmux != 0 && iod->iod_muxcnt >= vcp->vc_maxmux) return 0; #endif - *rqp->sr_rqtid = htoles(ssp ? ssp->ss_tid : SMB_TID_UNKNOWN); - *rqp->sr_rquid = htoles(vcp ? vcp->vc_smbuid : 0); + *rqp->sr_rqtid = htole16(ssp ? ssp->ss_tid : SMB_TID_UNKNOWN); + *rqp->sr_rquid = htole16(vcp ? vcp->vc_smbuid : 0); mb_fixhdr(&rqp->sr_rq); } if (rqp->sr_sendcnt++ > 5) { diff --git a/sys/netproto/smb/smb_subr.c b/sys/netproto/smb/smb_subr.c index 5c9f39bd73..101cb75b8e 100644 --- a/sys/netproto/smb/smb_subr.c +++ b/sys/netproto/smb/smb_subr.c @@ -34,6 +34,7 @@ */ #include #include +#include #include #include #include @@ -187,7 +188,7 @@ void smb_strtouni(u_int16_t *dst, const char *src) { while (*src) { - *dst++ = htoles(*src++); + *dst++ = htole16(*src++); } *dst = 0; } @@ -309,11 +310,21 @@ smb_maperror(int eclass, int eno) } static int -smb_copy_iconv(struct mbchain *mbp, c_caddr_t src, caddr_t dst, size_t len) +smb_copy_iconv(struct mbchain *mbp, c_caddr_t src, caddr_t dst, + size_t *srclen, size_t *dstlen) { - size_t outlen = len; + int error; + size_t inlen = *srclen, outlen = *dstlen; - return iconv_conv((struct iconv_drv*)mbp->mb_udata, &src, &len, &dst, &outlen); + error = iconv_conv((struct iconv_drv*)mbp->mb_udata, &src, &inlen, + &dst, &outlen); + if (inlen != *srclen || outlen != *dstlen) { + *srclen -= inlen; + *dstlen -= outlen; + return 0; + } else { + return error; + } } int diff --git a/sys/sys/mchain.h b/sys/sys/mchain.h index 8113e644c1..a4e228ffe9 100644 --- a/sys/sys/mchain.h +++ b/sys/sys/mchain.h @@ -37,51 +37,6 @@ #ifndef _SYS_TYPES_H_ #include #endif -#include - -/* - * This macros probably belongs to the endian.h - */ -#if _BYTE_ORDER == _LITTLE_ENDIAN - -#define htoles(x) ((u_int16_t)(x)) -#define letohs(x) ((u_int16_t)(x)) -#define htolel(x) ((u_int32_t)(x)) -#define letohl(x) ((u_int32_t)(x)) -#define htoleq(x) ((int64_t)(x)) -#define letohq(x) ((int64_t)(x)) - -#define htobes(x) (__htons(x)) -#define betohs(x) (__ntohs(x)) -#define htobel(x) (__htonl(x)) -#define betohl(x) (__ntohl(x)) - -static __inline int64_t -htobeq(int64_t x) -{ - return (int64_t)__htonl((u_int32_t)(x >> 32)) | - (int64_t)__htonl((u_int32_t)(x & 0xffffffff)) << 32; -} - -static __inline int64_t -betohq(int64_t x) -{ - return (int64_t)__ntohl((u_int32_t)(x >> 32)) | - (int64_t)__ntohl((u_int32_t)(x & 0xffffffff)) << 32; -} - -#else /* (BYTE_ORDER == LITTLE_ENDIAN) */ - -#error "Macros for Big-Endians are incomplete" - -/* -#define htoles(x) ((u_int16_t)(x)) -#define letohs(x) ((u_int16_t)(x)) -#define htolel(x) ((u_int32_t)(x)) -#define letohl(x) ((u_int32_t)(x)) -*/ -#endif /* (BYTE_ORDER == LITTLE_ENDIAN) */ - #ifdef _KERNEL @@ -98,7 +53,8 @@ struct mbuf; struct mbchain; struct uio; -typedef int mb_copy_t(struct mbchain *mbp, c_caddr_t src, caddr_t dst, size_t len); +typedef int mb_copy_t(struct mbchain *mbp, c_caddr_t src, caddr_t dst, + size_t *srclen, size_t *dstlen); struct mbchain { struct mbuf * mb_top; /* head of mbufs chain */ -- 2.41.0