summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--contrib/smbfs/lib/smb/ctx.c19
-rw-r--r--sys/fs/smbfs/smbfs_smb.c4
-rw-r--r--sys/fs/smbfs/smbfs_subr.c36
-rw-r--r--sys/fs/smbfs/smbfs_subr.h2
-rw-r--r--usr.bin/smbutil/Makefile4
-rw-r--r--usr.sbin/mount_smbfs/Makefile4
6 files changed, 39 insertions, 30 deletions
diff --git a/contrib/smbfs/lib/smb/ctx.c b/contrib/smbfs/lib/smb/ctx.c
index 7a8d858..530cbb8 100644
--- a/contrib/smbfs/lib/smb/ctx.c
+++ b/contrib/smbfs/lib/smb/ctx.c
@@ -473,8 +473,6 @@ smb_ctx_resolve(struct smb_ctx *ctx)
struct sockaddr *sap;
struct sockaddr_nb *salocal, *saserver;
char *cp;
- u_char cstbl[256];
- u_int i;
int error = 0;
ctx->ct_flags &= ~SMBCF_RESOLVED;
@@ -496,7 +494,7 @@ smb_ctx_resolve(struct smb_ctx *ctx)
if (error)
return error;
if (ssn->ioc_localcs[0] == 0)
- strcpy(ssn->ioc_localcs, "default"); /* XXX: locale name ? */
+ strcpy(ssn->ioc_localcs, "ISO8859-1");
error = smb_addiconvtbl("tolower", ssn->ioc_localcs, nls_lower);
if (error)
return error;
@@ -504,18 +502,9 @@ smb_ctx_resolve(struct smb_ctx *ctx)
if (error)
return error;
if (ssn->ioc_servercs[0] != 0) {
- for(i = 0; i < sizeof(cstbl); i++)
- cstbl[i] = i;
- nls_mem_toext(cstbl, cstbl, sizeof(cstbl));
- error = smb_addiconvtbl(ssn->ioc_servercs, ssn->ioc_localcs, cstbl);
- if (error)
- return error;
- for(i = 0; i < sizeof(cstbl); i++)
- cstbl[i] = i;
- nls_mem_toloc(cstbl, cstbl, sizeof(cstbl));
- error = smb_addiconvtbl(ssn->ioc_localcs, ssn->ioc_servercs, cstbl);
- if (error)
- return error;
+ error = kiconv_add_xlat16_cspairs
+ (ssn->ioc_localcs, ssn->ioc_servercs);
+ if (error) return error;
}
if (ctx->ct_srvaddr) {
error = nb_resolvehost_in(ctx->ct_srvaddr, &sap);
diff --git a/sys/fs/smbfs/smbfs_smb.c b/sys/fs/smbfs/smbfs_smb.c
index ea1721e..f45d2ac 100644
--- a/sys/fs/smbfs/smbfs_smb.c
+++ b/sys/fs/smbfs/smbfs_smb.c
@@ -1449,8 +1449,8 @@ smbfs_findnext(struct smbfs_fctx *ctx, int limit, struct smb_cred *scred)
continue;
break;
}
- smbfs_fname_tolocal(SSTOVC(ctx->f_ssp), ctx->f_name, ctx->f_nmlen,
- ctx->f_dnp->n_mount->sm_caseopt);
+ smbfs_fname_tolocal(SSTOVC(ctx->f_ssp), ctx->f_name, &ctx->f_nmlen,
+ ctx->f_dnp->n_mount->sm_caseopt);
ctx->f_attr.fa_ino = smbfs_getino(ctx->f_dnp, ctx->f_name, ctx->f_nmlen);
return 0;
}
diff --git a/sys/fs/smbfs/smbfs_subr.c b/sys/fs/smbfs/smbfs_subr.c
index 683b2bd..5e04a37 100644
--- a/sys/fs/smbfs/smbfs_subr.c
+++ b/sys/fs/smbfs/smbfs_subr.c
@@ -316,13 +316,33 @@ smbfs_fullpath(struct mbchain *mbp, struct smb_vc *vcp, struct smbnode *dnp,
}
int
-smbfs_fname_tolocal(struct smb_vc *vcp, char *name, int nmlen, int caseopt)
+smbfs_fname_tolocal(struct smb_vc *vcp, char *name, int *nmlen, int caseopt)
{
-/* if (caseopt & SMB_CS_UPPER)
- iconv_convmem(vcp->vc_toupper, name, name, nmlen);
- else if (caseopt & SMB_CS_LOWER)
- iconv_convmem(vcp->vc_tolower, name, name, nmlen);*/
- if (vcp->vc_tolocal)
- iconv_convmem(vcp->vc_tolocal, name, name, nmlen);
- return 0;
+ int copt = (caseopt == SMB_CS_LOWER ? KICONV_FROM_LOWER :
+ (caseopt == SMB_CS_UPPER ? KICONV_FROM_UPPER : 0));
+ int error = 0;
+ int ilen = *nmlen;
+ int olen;
+ char *ibuf = name;
+ char outbuf[SMB_MAXFNAMELEN];
+ char *obuf = outbuf;
+
+ if (vcp->vc_tolocal) {
+ olen = sizeof(outbuf);
+ bzero(outbuf, sizeof(outbuf));
+
+ /*
+ error = iconv_conv_case
+ (vcp->vc_tolocal, NULL, NULL, &obuf, &olen, copt);
+ if (error) return error;
+ */
+
+ error = iconv_conv_case
+ (vcp->vc_tolocal, (const char **)&ibuf, &ilen, &obuf, &olen, copt);
+ if (!error) {
+ *nmlen = sizeof(outbuf) - olen;
+ memcpy(name, outbuf, *nmlen);
+ }
+ }
+ return error;
}
diff --git a/sys/fs/smbfs/smbfs_subr.h b/sys/fs/smbfs/smbfs_subr.h
index b50ecf8..a72b9e6 100644
--- a/sys/fs/smbfs/smbfs_subr.h
+++ b/sys/fs/smbfs/smbfs_subr.h
@@ -174,7 +174,7 @@ int smbfs_fullpath(struct mbchain *mbp, struct smb_vc *vcp,
int smbfs_smb_lookup(struct smbnode *dnp, const char *name, int nmlen,
struct smbfattr *fap, struct smb_cred *scred);
-int smbfs_fname_tolocal(struct smb_vc *vcp, char *name, int nmlen, int caseopt);
+int smbfs_fname_tolocal(struct smb_vc *vcp, char *name, int *nmlen, int caseopt);
void smb_time_local2server(struct timespec *tsp, int tzoff, u_long *seconds);
void smb_time_server2local(u_long seconds, int tzoff, struct timespec *tsp);
diff --git a/usr.bin/smbutil/Makefile b/usr.bin/smbutil/Makefile
index 8db8db7..13b5078 100644
--- a/usr.bin/smbutil/Makefile
+++ b/usr.bin/smbutil/Makefile
@@ -3,8 +3,8 @@
PROG= smbutil
SRCS= smbutil.c dumptree.c login.c lookup.c view.c print.c
-DPADD= ${LIBSMB}
-LDADD= -lsmb
+DPADD= ${LIBSMB} ${LIBKICONV}
+LDADD= -lsmb -lkiconv
CONTRIBDIR= ${.CURDIR}/../../contrib/smbfs
CFLAGS+= -I${CONTRIBDIR}/include
diff --git a/usr.sbin/mount_smbfs/Makefile b/usr.sbin/mount_smbfs/Makefile
index 9bbe0a4..e60f6b2 100644
--- a/usr.sbin/mount_smbfs/Makefile
+++ b/usr.sbin/mount_smbfs/Makefile
@@ -9,8 +9,8 @@ MOUNTDIR= ${.CURDIR}/../../sbin/mount
CONTRIBDIR= ${.CURDIR}/../../contrib/smbfs
CFLAGS+= -DSMBFS -I${MOUNTDIR} -I${CONTRIBDIR}/include
-LDADD= -lsmb
-DPADD= ${LIBSMB}
+LDADD= -lsmb -lkiconv
+DPADD= ${LIBSMB} ${LIBKICONV}
# Needs to be dynamically linked for optional dlopen() access to
# userland libiconv (see the -E option).
OpenPOWER on IntegriCloud