Message-Id: <200507291322.j6TDMbTB060600@repoman.freebsd.org> From: "R. Imura" Date: Fri, 29 Jul 2005 13:22:37 +0000 (UTC) To: src-committers@FreeBSD.ORG, cvs-src@FreeBSD.ORG, cvs-all@FreeBSD.ORG Subject: cvs commit: src/sys/sys mchain.h src/sys/kern subr_mchain.c src/sys/netsmb smb_subr.c src/sys/netncp ncp_rq.c imura 2005-07-29 13:22:37 UTC FreeBSD src repository Modified files: sys/sys mchain.h sys/kern subr_mchain.c sys/netsmb smb_subr.c sys/netncp ncp_rq.c Log: Change API of mb_copy_t in libmchain so that netsmb can handle multibyte character share name correctly. Reviewed by: bp Revision Changes Path 1.18 +10 -6 src/sys/kern/subr_mchain.c 1.15 +11 -1 src/sys/netncp/ncp_rq.c 1.19 +12 -3 src/sys/netsmb/smb_subr.c 1.9 +2 -1 src/sys/sys/mchain.h Index: src/sys/kern/subr_mchain.c diff -u src/sys/kern/subr_mchain.c:1.17 src/sys/kern/subr_mchain.c:1.18 --- src/sys/kern/subr_mchain.c:1.17 Thu Jan 6 23:35:39 2005 +++ src/sys/kern/subr_mchain.c Fri Jul 29 13:22:36 2005 @@ -183,6 +183,7 @@ caddr_t dst; c_caddr_t src; int cplen, error, mleft, count; + size_t srclen, dstlen; m = mbp->mb_cur; mleft = mbp->mb_mleft; @@ -199,10 +200,13 @@ 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; @@ -222,11 +226,11 @@ 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; Index: src/sys/netncp/ncp_rq.c diff -u src/sys/netncp/ncp_rq.c:1.14 src/sys/netncp/ncp_rq.c:1.15 --- src/sys/netncp/ncp_rq.c:1.14 Fri Jan 7 01:45:49 2005 +++ src/sys/netncp/ncp_rq.c Fri Jul 29 13:22:37 2005 @@ -151,8 +151,18 @@ */ static int -ncp_rq_pathstrhelp(struct mbchain *mbp, c_caddr_t src, caddr_t dst, size_t len) +ncp_rq_pathstrhelp(struct mbchain *mbp, c_caddr_t src, caddr_t dst, + size_t *srclen, size_t *dstlen) { + int len; + + if (*srclen < *dstlen) { + *dstlen = *srclen; + len = (int)*srclen; + } else { + *srclen = *dstlen; + len = (int)*dstlen; + } ncp_pathcopy(src, dst, len, mbp->mb_udata); return 0; } Index: src/sys/netsmb/smb_subr.c diff -u src/sys/netsmb/smb_subr.c:1.18 src/sys/netsmb/smb_subr.c:1.19 --- src/sys/netsmb/smb_subr.c:1.18 Fri Jan 7 01:45:49 2005 +++ src/sys/netsmb/smb_subr.c Fri Jul 29 13:22:36 2005 @@ -319,11 +319,20 @@ } 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 Index: src/sys/sys/mchain.h diff -u src/sys/sys/mchain.h:1.8 src/sys/sys/mchain.h:1.9 --- src/sys/sys/mchain.h:1.8 Fri Jan 7 02:29:23 2005 +++ src/sys/sys/mchain.h Fri Jul 29 13:22:36 2005 @@ -96,7 +96,8 @@ struct mbuf; struct mbchain; -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 */