changeset 10966:37e5dcdf36d3

6747532 ns_lookup_bypid spams syslog with too many messages 6888836 Not listing all files in a directory of a CIFS share in Windows XP 6812570 Trans2 is missing pass-through levels: FILE_RENAME_INFORMATION (and others) 6888827 Add Unicode codepage support 6865488 libadutils: leak in ldap_lookup_domains_in_forest() 6888708 idmapd crashing periodically. Need cores analyzed. 6891342 invalid, redundant SQL in rule WHERE expressions 6891767 minor cleanups in idmap 6892544 Panic occurred at smb_node_ref+0x7f(ffffffd612297310)
author Jordan Brown <Jordan.Brown@Sun.COM>
date Thu, 05 Nov 2009 14:34:36 -0800
parents 6172c8d12ec5
children 0f20d1dba80d
files usr/src/cmd/idmap/idmapd/dbutils.c usr/src/cmd/idmap/idmapd/idmapd.c usr/src/cmd/idmap/idmapd/server.c usr/src/cmd/smbsrv/smbadm/smbadm.c usr/src/cmd/smbsrv/smbd/smbd_join.c usr/src/cmd/smbsrv/smbd/smbd_main.c usr/src/common/smbsrv/smb_match.c usr/src/common/smbsrv/smb_msgbuf.c usr/src/common/smbsrv/smb_native.c usr/src/common/smbsrv/smb_netbios_util.c usr/src/common/smbsrv/smb_oem.c usr/src/common/smbsrv/smb_opmlang.c usr/src/common/smbsrv/smb_strcase.c usr/src/common/smbsrv/smb_string.c usr/src/common/smbsrv/smb_utf8.c usr/src/lib/libadutils/common/addisc.c usr/src/lib/libidmap/common/idmap_api.c usr/src/lib/libshare/smb/smb_share_doorclnt.c usr/src/lib/smbsrv/libmlrpc/common/ndr_heap.c usr/src/lib/smbsrv/libmlrpc/common/ndr_process.c usr/src/lib/smbsrv/libmlsvc/common/dssetup_svc.c usr/src/lib/smbsrv/libmlsvc/common/eventlog_svc.c usr/src/lib/smbsrv/libmlsvc/common/libmlsvc.h usr/src/lib/smbsrv/libmlsvc/common/lsalib.c usr/src/lib/smbsrv/libmlsvc/common/lsar_lookup.c usr/src/lib/smbsrv/libmlsvc/common/mlsvc_client.c usr/src/lib/smbsrv/libmlsvc/common/mlsvc_domain.c usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c usr/src/lib/smbsrv/libmlsvc/common/samlib.c usr/src/lib/smbsrv/libmlsvc/common/samr_lookup.c usr/src/lib/smbsrv/libmlsvc/common/smb_logon.c usr/src/lib/smbsrv/libmlsvc/common/smb_share.c usr/src/lib/smbsrv/libmlsvc/common/srvsvc_svc.c usr/src/lib/smbsrv/libmlsvc/common/svcctl_scm.c usr/src/lib/smbsrv/libmlsvc/common/svcctl_svc.c usr/src/lib/smbsrv/libmlsvc/common/winreg_svc.c usr/src/lib/smbsrv/libsmb/Makefile.com usr/src/lib/smbsrv/libsmb/common/libsmb.h usr/src/lib/smbsrv/libsmb/common/mapfile-vers usr/src/lib/smbsrv/libsmb/common/smb_acl.c usr/src/lib/smbsrv/libsmb/common/smb_auth.c usr/src/lib/smbsrv/libsmb/common/smb_domain.c usr/src/lib/smbsrv/libsmb/common/smb_info.c usr/src/lib/smbsrv/libsmb/common/smb_lgrp.c usr/src/lib/smbsrv/libsmb/common/smb_privilege.c usr/src/lib/smbsrv/libsmb/common/smb_sam.c usr/src/lib/smbsrv/libsmb/common/smb_wksids.c usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c usr/src/lib/smbsrv/libsmbns/common/smbns_browser.c usr/src/lib/smbsrv/libsmbns/common/smbns_ksetpwd.c usr/src/lib/smbsrv/libsmbns/common/smbns_netbios.c usr/src/lib/smbsrv/libsmbns/common/smbns_netlogon.c usr/src/lib/smbsrv/libsmbrdr/common/smbrdr.h usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_logon.c usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_netbios.c usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_netuse.c usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_rpcpipe.c usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_session.c usr/src/pkgdefs/etc/exception_list_i386 usr/src/pkgdefs/etc/exception_list_sparc usr/src/uts/common/Makefile.files usr/src/uts/common/fs/smbsrv/smb_acl.c usr/src/uts/common/fs/smbsrv/smb_alloc.c usr/src/uts/common/fs/smbsrv/smb_close.c usr/src/uts/common/fs/smbsrv/smb_common_open.c usr/src/uts/common/fs/smbsrv/smb_common_transact.c usr/src/uts/common/fs/smbsrv/smb_create.c usr/src/uts/common/fs/smbsrv/smb_delete.c usr/src/uts/common/fs/smbsrv/smb_directory.c usr/src/uts/common/fs/smbsrv/smb_dispatch.c usr/src/uts/common/fs/smbsrv/smb_echo.c usr/src/uts/common/fs/smbsrv/smb_fem.c usr/src/uts/common/fs/smbsrv/smb_find.c usr/src/uts/common/fs/smbsrv/smb_flush.c usr/src/uts/common/fs/smbsrv/smb_fsops.c usr/src/uts/common/fs/smbsrv/smb_init.c usr/src/uts/common/fs/smbsrv/smb_lock.c usr/src/uts/common/fs/smbsrv/smb_lock_byte_range.c usr/src/uts/common/fs/smbsrv/smb_locking_andx.c usr/src/uts/common/fs/smbsrv/smb_logoff_andx.c usr/src/uts/common/fs/smbsrv/smb_mangle_name.c usr/src/uts/common/fs/smbsrv/smb_mbuf_marshaling.c usr/src/uts/common/fs/smbsrv/smb_mbuf_util.c usr/src/uts/common/fs/smbsrv/smb_memory_manager.c usr/src/uts/common/fs/smbsrv/smb_negotiate.c usr/src/uts/common/fs/smbsrv/smb_node.c usr/src/uts/common/fs/smbsrv/smb_nt_cancel.c usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c usr/src/uts/common/fs/smbsrv/smb_nt_transact_create.c usr/src/uts/common/fs/smbsrv/smb_nt_transact_ioctl.c usr/src/uts/common/fs/smbsrv/smb_nt_transact_notify_change.c usr/src/uts/common/fs/smbsrv/smb_nt_transact_security.c usr/src/uts/common/fs/smbsrv/smb_odir.c usr/src/uts/common/fs/smbsrv/smb_ofile.c usr/src/uts/common/fs/smbsrv/smb_open_andx.c usr/src/uts/common/fs/smbsrv/smb_opipe.c usr/src/uts/common/fs/smbsrv/smb_oplock.c usr/src/uts/common/fs/smbsrv/smb_path_name_reduction.c usr/src/uts/common/fs/smbsrv/smb_print.c usr/src/uts/common/fs/smbsrv/smb_process_exit.c usr/src/uts/common/fs/smbsrv/smb_query_fileinfo.c usr/src/uts/common/fs/smbsrv/smb_query_information_disk.c usr/src/uts/common/fs/smbsrv/smb_read.c usr/src/uts/common/fs/smbsrv/smb_rename.c usr/src/uts/common/fs/smbsrv/smb_sd.c usr/src/uts/common/fs/smbsrv/smb_seek.c usr/src/uts/common/fs/smbsrv/smb_server.c usr/src/uts/common/fs/smbsrv/smb_session.c usr/src/uts/common/fs/smbsrv/smb_session_setup_andx.c usr/src/uts/common/fs/smbsrv/smb_set_fileinfo.c usr/src/uts/common/fs/smbsrv/smb_signing.c usr/src/uts/common/fs/smbsrv/smb_trans2_create_directory.c usr/src/uts/common/fs/smbsrv/smb_trans2_dfs.c usr/src/uts/common/fs/smbsrv/smb_trans2_find.c usr/src/uts/common/fs/smbsrv/smb_trans2_query_fs_information.c usr/src/uts/common/fs/smbsrv/smb_tree.c usr/src/uts/common/fs/smbsrv/smb_tree_connect.c usr/src/uts/common/fs/smbsrv/smb_unlock_byte_range.c usr/src/uts/common/fs/smbsrv/smb_user.c usr/src/uts/common/fs/smbsrv/smb_util.c usr/src/uts/common/fs/smbsrv/smb_vfs.c usr/src/uts/common/fs/smbsrv/smb_vops.c usr/src/uts/common/fs/smbsrv/smb_vss.c usr/src/uts/common/fs/smbsrv/smb_write.c usr/src/uts/common/fs/smbsrv/smb_write_raw.c usr/src/uts/common/fs/smbsrv/smb_xlate.c usr/src/uts/common/smbsrv/Makefile usr/src/uts/common/smbsrv/alloc.h usr/src/uts/common/smbsrv/cifs.h usr/src/uts/common/smbsrv/codepage.h usr/src/uts/common/smbsrv/cp_cyrillic.h usr/src/uts/common/smbsrv/cp_latin1.h usr/src/uts/common/smbsrv/cp_latin2.h usr/src/uts/common/smbsrv/cp_latin3.h usr/src/uts/common/smbsrv/cp_latin4.h usr/src/uts/common/smbsrv/cp_latin5.h usr/src/uts/common/smbsrv/cp_latin6.h usr/src/uts/common/smbsrv/cp_unicode.h usr/src/uts/common/smbsrv/cp_usascii.h usr/src/uts/common/smbsrv/ctype.h usr/src/uts/common/smbsrv/lm.h usr/src/uts/common/smbsrv/mac_cifs.h usr/src/uts/common/smbsrv/mbuf.h usr/src/uts/common/smbsrv/msgbuf.h usr/src/uts/common/smbsrv/ndl/srvsvc.ndl usr/src/uts/common/smbsrv/ndr.h usr/src/uts/common/smbsrv/nmpipes.h usr/src/uts/common/smbsrv/oem.h usr/src/uts/common/smbsrv/smb.h usr/src/uts/common/smbsrv/smb_fsops.h usr/src/uts/common/smbsrv/smb_i18n.h usr/src/uts/common/smbsrv/smb_incl.h usr/src/uts/common/smbsrv/smb_kproto.h usr/src/uts/common/smbsrv/smb_ktypes.h usr/src/uts/common/smbsrv/smb_vops.h usr/src/uts/common/smbsrv/smbfmt.h usr/src/uts/common/smbsrv/string.h
diffstat 157 files changed, 3257 insertions(+), 6493 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/idmap/idmapd/dbutils.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/cmd/idmap/idmapd/dbutils.c	Thu Nov 05 14:34:36 2009 -0800
@@ -602,6 +602,7 @@
 {
 	char	*s_windomain = NULL, *s_winname = NULL;
 	char	*s_unixname = NULL;
+	char	*dir;
 	char	*lower_winname;
 	int	retcode = IDMAP_SUCCESS;
 
@@ -642,10 +643,28 @@
 		}
 	}
 
-	*out = sqlite_mprintf("%s %s %s",
+	switch (rule->direction) {
+	case IDMAP_DIRECTION_BI:
+		dir = "AND w2u_order > 0 AND u2w_order > 0";
+		break;
+	case IDMAP_DIRECTION_W2U:
+		dir = "AND w2u_order > 0"
+		    " AND (u2w_order = 0 OR u2w_order ISNULL)";
+		break;
+	case IDMAP_DIRECTION_U2W:
+		dir = "AND u2w_order > 0"
+		    " AND (w2u_order = 0 OR w2u_order ISNULL)";
+		break;
+	default:
+		dir = "";
+		break;
+	}
+
+	*out = sqlite_mprintf("%s %s %s %s",
 	    s_windomain ? s_windomain : "",
 	    s_winname ? s_winname : "",
-	    s_unixname ? s_unixname : "");
+	    s_unixname ? s_unixname : "",
+	    dir);
 
 	if (*out == NULL) {
 		retcode = IDMAP_ERR_MEMORY;
@@ -945,31 +964,17 @@
 {
 	char		*sql = NULL;
 	idmap_stat	retcode;
-	char		buf[80];
 	char		*expr = NULL;
 
 	if (rule->direction < 0 && EMPTY_STRING(rule->windomain) &&
 	    EMPTY_STRING(rule->winname) && EMPTY_STRING(rule->unixname))
 		return (IDMAP_SUCCESS);
 
-	buf[0] = 0;
-
-	if (rule->direction == IDMAP_DIRECTION_BI)
-		(void) snprintf(buf, sizeof (buf), "AND w2u_order > 0"
-		    " AND u2w_order > 0");
-	else if (rule->direction == IDMAP_DIRECTION_W2U)
-		(void) snprintf(buf, sizeof (buf), "AND w2u_order > 0"
-		    " AND (u2w_order = 0 OR u2w_order ISNULL)");
-	else if (rule->direction == IDMAP_DIRECTION_U2W)
-		(void) snprintf(buf, sizeof (buf), "AND u2w_order > 0"
-		    " AND (w2u_order = 0 OR w2u_order ISNULL)");
-
 	retcode = gen_sql_expr_from_rule(rule, &expr);
 	if (retcode != IDMAP_SUCCESS)
 		goto out;
 
-	sql = sqlite_mprintf("DELETE FROM namerules WHERE 1 %s %s;", expr,
-	    buf);
+	sql = sqlite_mprintf("DELETE FROM namerules WHERE 1 %s;", expr);
 
 	if (sql == NULL) {
 		retcode = IDMAP_ERR_INTERNAL;
@@ -2683,8 +2688,6 @@
 	struct passwd	pwd, *pwdp;
 	struct group	grp, *grpp;
 	char		*buf;
-	int		errnum;
-	const char	*me = "ns_lookup_byname";
 	static size_t	pwdbufsiz = 0;
 	static size_t	grpbufsiz = 0;
 
@@ -2698,11 +2701,7 @@
 		    name != lower_name && strcmp(name, lower_name) != 0)
 			pwdp = getpwnam_r(lower_name, &pwd, buf, pwdbufsiz);
 		if (pwdp == NULL) {
-			errnum = errno;
-			idmapdlog(LOG_WARNING,
-			    "%s: getpwnam_r(%s) failed (%s).",
-			    me, name, errnum ? strerror(errnum) : "not found");
-			if (errnum == 0)
+			if (errno == 0)
 				return (IDMAP_ERR_NOTFOUND);
 			else
 				return (IDMAP_ERR_INTERNAL);
@@ -2718,11 +2717,7 @@
 		    name != lower_name && strcmp(name, lower_name) != 0)
 			grpp = getgrnam_r(lower_name, &grp, buf, grpbufsiz);
 		if (grpp == NULL) {
-			errnum = errno;
-			idmapdlog(LOG_WARNING,
-			    "%s: getgrnam_r(%s) failed (%s).",
-			    me, name, errnum ? strerror(errnum) : "not found");
-			if (errnum == 0)
+			if (errno == 0)
 				return (IDMAP_ERR_NOTFOUND);
 			else
 				return (IDMAP_ERR_INTERNAL);
@@ -2746,8 +2741,6 @@
 	struct passwd	pwd;
 	struct group	grp;
 	char		*buf;
-	int		errnum;
-	const char	*me = "ns_lookup_bypid";
 	static size_t	pwdbufsiz = 0;
 	static size_t	grpbufsiz = 0;
 
@@ -2757,11 +2750,7 @@
 		buf = alloca(pwdbufsiz);
 		errno = 0;
 		if (getpwuid_r(pid, &pwd, buf, pwdbufsiz) == NULL) {
-			errnum = errno;
-			idmapdlog(LOG_WARNING,
-			    "%s: getpwuid_r(%u) failed (%s).",
-			    me, pid, errnum ? strerror(errnum) : "not found");
-			if (errnum == 0)
+			if (errno == 0)
 				return (IDMAP_ERR_NOTFOUND);
 			else
 				return (IDMAP_ERR_INTERNAL);
@@ -2773,11 +2762,7 @@
 		buf = alloca(grpbufsiz);
 		errno = 0;
 		if (getgrgid_r(pid, &grp, buf, grpbufsiz) == NULL) {
-			errnum = errno;
-			idmapdlog(LOG_WARNING,
-			    "%s: getgrgid_r(%u) failed (%s).",
-			    me, pid, errnum ? strerror(errnum) : "not found");
-			if (errnum == 0)
+			if (errno == 0)
 				return (IDMAP_ERR_NOTFOUND);
 			else
 				return (IDMAP_ERR_INTERNAL);
--- a/usr/src/cmd/idmap/idmapd/idmapd.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/cmd/idmap/idmapd/idmapd.c	Thu Nov 05 14:34:36 2009 -0800
@@ -282,9 +282,9 @@
 				_idmapdstate.daemon_mode = FALSE;
 				break;
 			default:
-				fprintf(stderr, "Usage: /usr/lib/idmapd");
+				(void) fprintf(stderr,
+				    "Usage: /usr/lib/idmapd [-d]\n");
 				return (SMF_EXIT_ERR_CONFIG);
-				break;
 		}
 	}
 
--- a/usr/src/cmd/idmap/idmapd/server.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/cmd/idmap/idmapd/server.c	Thu Nov 05 14:34:36 2009 -0800
@@ -560,7 +560,6 @@
 	time_t		curtime;
 
 	(void) memset(result, 0, sizeof (*result));
-	lbuf[0] = rbuf[0] = 0;
 
 	/* Current time */
 	errno = 0;
@@ -588,6 +587,8 @@
 	if (limit > 0)
 		(void) snprintf(lbuf, sizeof (lbuf),
 		    "LIMIT %" PRIu64, limit + 1ULL);
+	else
+		lbuf[0] = '\0';
 
 	(void) snprintf(rbuf, sizeof (rbuf), "rowid > %" PRIu64, lastrowid);
 
@@ -704,7 +705,6 @@
 {
 
 	sqlite		*db = NULL;
-	char		w2ubuf[15], u2wbuf[15];
 	char		lbuf[30], rbuf[30];
 	char		*sql = NULL;
 	char		*expr = NULL;
@@ -712,7 +712,6 @@
 	idmap_retcode	retcode;
 
 	(void) memset(result, 0, sizeof (*result));
-	lbuf[0] = rbuf[0] = 0;
 
 	result->retcode = validate_rule(&rule);
 	if (result->retcode != IDMAP_SUCCESS)
@@ -727,22 +726,6 @@
 	if (result->retcode != IDMAP_SUCCESS)
 		goto out;
 
-	result->retcode = IDMAP_ERR_INTERNAL;
-
-	w2ubuf[0] = u2wbuf[0] = 0;
-	if (rule.direction == IDMAP_DIRECTION_BI) {
-		(void) snprintf(w2ubuf, sizeof (w2ubuf), "AND w2u_order > 0");
-		(void) snprintf(u2wbuf, sizeof (u2wbuf), "AND u2w_order > 0");
-	} else if (rule.direction == IDMAP_DIRECTION_W2U) {
-		(void) snprintf(w2ubuf, sizeof (w2ubuf), "AND w2u_order > 0");
-		(void) snprintf(u2wbuf, sizeof (u2wbuf),
-		    "AND (u2w_order = 0 OR u2w_order ISNULL)");
-	} else if (rule.direction == IDMAP_DIRECTION_U2W) {
-		(void) snprintf(w2ubuf, sizeof (w2ubuf),
-		    "AND (w2u_order = 0 OR w2u_order ISNULL)");
-		(void) snprintf(u2wbuf, sizeof (u2wbuf), "AND u2w_order > 0");
-	}
-
 	result->retcode = gen_sql_expr_from_rule(&rule, &expr);
 	if (result->retcode != IDMAP_SUCCESS)
 		goto out;
@@ -753,6 +736,8 @@
 	if (limit > 0)
 		(void) snprintf(lbuf, sizeof (lbuf),
 		    "LIMIT %" PRIu64, limit + 1ULL);
+	else
+		lbuf[0] = '\0';
 
 	(void) snprintf(rbuf, sizeof (rbuf), "rowid > %" PRIu64, lastrowid);
 
@@ -763,8 +748,8 @@
 	sql = sqlite_mprintf("SELECT rowid, is_user, is_wuser, windomain, "
 	    "winname_display, is_nt4, unixname, w2u_order, u2w_order "
 	    "FROM namerules WHERE "
-	    " %s %s %s %s %s;",
-	    rbuf, expr, w2ubuf, u2wbuf, lbuf);
+	    " %s %s %s;",
+	    rbuf, expr, lbuf);
 
 	if (sql == NULL) {
 		result->retcode = IDMAP_ERR_MEMORY;
--- a/usr/src/cmd/smbsrv/smbadm/smbadm.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/cmd/smbsrv/smbadm/smbadm.c	Thu Nov 05 14:34:36 2009 -0800
@@ -754,7 +754,7 @@
 		return (B_FALSE);
 
 	if (smb_getnetbiosname(netbiosname, NETBIOS_NAME_SZ) == 0) {
-		if (utf8_strcasecmp(workgroup, netbiosname) == 0)
+		if (smb_strcasecmp(workgroup, netbiosname, 0) == 0)
 			return (B_FALSE);
 	}
 
--- a/usr/src/cmd/smbsrv/smbd/smbd_join.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/cmd/smbsrv/smbd/smbd_join.c	Thu Nov 05 14:34:36 2009 -0800
@@ -122,7 +122,7 @@
 	 */
 	(void) smb_getsamaccount(sam_acct, sizeof (sam_acct));
 	smb_ipc_get_user(ipc_usr, SMB_USERNAME_MAXLEN);
-	if (utf8_strcasecmp(ipc_usr, sam_acct))
+	if (smb_strcasecmp(ipc_usr, sam_acct, 0))
 		return (B_FALSE);
 
 	di = &dxi.d_primary;
@@ -133,7 +133,7 @@
 	    sizeof (kpasswd_domain));
 
 	if (*kpasswd_domain != '\0' &&
-	    utf8_strcasecmp(kpasswd_domain, di->di_fqname)) {
+	    smb_strcasecmp(kpasswd_domain, di->di_fqname, 0)) {
 		dom = kpasswd_domain;
 		new_domain = B_TRUE;
 	} else {
@@ -145,7 +145,7 @@
 	 * currently cached or the SMB daemon has previously discovered a DC
 	 * that is different than the kpasswd server.
 	 */
-	if (new_domain || utf8_strcasecmp(dxi.d_dc, kpasswd_srv) != 0) {
+	if (new_domain || smb_strcasecmp(dxi.d_dc, kpasswd_srv, 0) != 0) {
 		if (*dxi.d_dc != '\0')
 			mlsvc_disconnect(dxi.d_dc);
 
@@ -217,7 +217,7 @@
 	} else {
 		if (smb_getfqdomainname(domain, MAXHOSTNAMELEN) != 0) {
 			(void) smb_getdomainname(domain, MAXHOSTNAMELEN);
-			(void) utf8_strupr(domain);
+			(void) smb_strupr(domain);
 		}
 
 		if (smb_locate_dc(domain, "", &new_domain)) {
--- a/usr/src/cmd/smbsrv/smbd/smbd_main.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/cmd/smbsrv/smbd/smbd_main.c	Thu Nov 05 14:34:36 2009 -0800
@@ -52,6 +52,7 @@
 
 #include <smbsrv/smb_door_svc.h>
 #include <smbsrv/smb_ioctl.h>
+#include <smbsrv/string.h>
 #include <smbsrv/libsmb.h>
 #include <smbsrv/libsmbns.h>
 #include <smbsrv/libmlsvc.h>
@@ -433,8 +434,7 @@
 		return (1);
 	}
 
-
-	(void) oem_language_set("english");
+	smb_codepage_init();
 
 	if (!smb_wka_init()) {
 		smbd_report("out of memory");
--- a/usr/src/common/smbsrv/smb_match.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/common/smbsrv/smb_match.c	Thu Nov 05 14:34:36 2009 -0800
@@ -30,7 +30,8 @@
 #include <sys/types.h>
 #include <sys/sunddi.h>
 #endif
-#include <smbsrv/ctype.h>
+#include <smbsrv/string.h>
+#include <smbsrv/smb.h>
 
 /*
  * Maximum recursion depth for the wildcard match functions.
@@ -80,8 +81,8 @@
 
 	for (;;) {
 		switch (*patn) {
-		case 0:
-			return (*str == 0);
+		case '\0':
+			return (*str == '\0');
 
 		case '?':
 			if (*str != 0) {
@@ -95,7 +96,7 @@
 
 		case '*':
 			patn += strspn(patn, "*");
-			if (*patn == 0)
+			if (*patn == '\0')
 				return (1);
 
 			if ((*depth)++ >= SMB_MATCH_DEPTH_MAX)
@@ -128,7 +129,8 @@
 	char	name83[14];
 
 	ptr = name83;
-	for (avail = 8; (avail > 0) && (*patn != '.') && (*patn != 0);
+	for (avail = SMB_NAME83_BASELEN;
+	    (avail > 0) && (*patn != '.') && (*patn != 0);
 	    avail--) {
 		*(ptr++) = *(patn++);
 	}
@@ -141,7 +143,7 @@
 	else if (*patn != 0)
 		return (0);
 
-	for (avail = 3; (avail > 0) && (*patn != 0); avail--) {
+	for (avail = SMB_NAME83_EXTLEN; (avail > 0) && (*patn != 0); avail--) {
 		*(ptr++) = *(patn++);
 	}
 	if (*patn != 0)
@@ -187,8 +189,10 @@
 static int
 smb_match_ci_private(const char *patn, const char *str, int *depth)
 {
-	const char *p;
-	int rc;
+	const char	*p;
+	smb_wchar_t	wc1, wc2;
+	int		nbytes1, nbytes2;
+	int		rc;
 
 	/*
 	 * "<" is a special pattern that matches only those names that do
@@ -204,8 +208,8 @@
 
 	for (;;) {
 		switch (*patn) {
-		case 0:
-			return (*str == 0);
+		case '\0':
+			return (*str == '\0');
 
 		case '?':
 			if (*str != 0) {
@@ -221,7 +225,7 @@
 
 		case '*':
 			patn += strspn(patn, "*");
-			if (*patn == 0)
+			if (*patn == '\0')
 				return (1);
 
 			if ((*depth)++ >= SMB_MATCH_DEPTH_MAX)
@@ -236,17 +240,20 @@
 			return (0);
 
 		default:
-			if (*str != *patn) {
-				int	c1 = *str;
-				int	c2 = *patn;
+			nbytes1 = smb_mbtowc(&wc1, patn, MTS_MB_CHAR_MAX);
+			nbytes2 = smb_mbtowc(&wc2, str, MTS_MB_CHAR_MAX);
+			if ((nbytes1 == -1) || (nbytes2 == -1))
+				return (-1);
 
-				c1 = mts_tolower(c1);
-				c2 = mts_tolower(c2);
-				if (c1 != c2)
+			if (wc1 != wc2) {
+				wc1 = smb_tolower(wc1);
+				wc2 = smb_tolower(wc2);
+				if (wc1 != wc2)
 					return (0);
 			}
-			str++;
-			patn++;
+
+			patn += nbytes1;
+			str += nbytes2;
 			continue;
 		}
 	}
--- a/usr/src/common/smbsrv/smb_msgbuf.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/common/smbsrv/smb_msgbuf.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,12 +19,10 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 /*
  * Msgbuf buffer management implementation. The smb_msgbuf interface is
  * typically used to encode or decode SMB data using sprintf/scanf
@@ -52,7 +50,7 @@
 static int buf_encode(smb_msgbuf_t *, char *, va_list ap);
 static void *smb_msgbuf_malloc(smb_msgbuf_t *, size_t);
 static int smb_msgbuf_chkerc(char *text, int erc);
-static void buf_decode_wcs(mts_wchar_t *, mts_wchar_t *, int wcstrlen);
+static void buf_decode_wcs(smb_wchar_t *, smb_wchar_t *, int wcstrlen);
 
 /*
  * Returns the offset or number of bytes used within the buffer.
@@ -221,7 +219,7 @@
 	uint16_t *wvalp;
 	uint32_t *lvalp;
 	uint64_t *llvalp;
-	mts_wchar_t *wcs;
+	smb_wchar_t *wcs;
 	int repc;
 	int rc;
 
@@ -328,7 +326,7 @@
 			if ((cvalp = smb_msgbuf_malloc(mb, ival * 2)) == 0)
 				return (SMB_MSGBUF_UNDERFLOW);
 
-			if ((ival = mts_stombs((char *)cvalp,
+			if ((ival = smb_stombs((char *)cvalp,
 			    (char *)mb->scan, ival * 2)) ==
 			    (uint32_t)-1) {
 				return (SMB_MSGBUF_DATA_ERROR);
@@ -349,12 +347,12 @@
 			 */
 			smb_msgbuf_word_align(mb);
 			/*LINTED E_BAD_PTR_CAST_ALIGN*/
-			wcs = (mts_wchar_t *)mb->scan;
+			wcs = (smb_wchar_t *)mb->scan;
 
 			/* count the null wchar */
-			repc = sizeof (mts_wchar_t);
+			repc = sizeof (smb_wchar_t);
 			while (*wcs++)
-				repc += sizeof (mts_wchar_t);
+				repc += sizeof (smb_wchar_t);
 
 			if (smb_msgbuf_has_space(mb, repc) == 0)
 				return (SMB_MSGBUF_UNDERFLOW);
@@ -364,15 +362,15 @@
 				return (SMB_MSGBUF_UNDERFLOW);
 
 			/*LINTED E_BAD_PTR_CAST_ALIGN*/
-			buf_decode_wcs(wcs, (mts_wchar_t *)mb->scan,
-			    repc / sizeof (mts_wchar_t));
+			buf_decode_wcs(wcs, (smb_wchar_t *)mb->scan,
+			    repc / sizeof (smb_wchar_t));
 
 			/* Get space for translated string */
 			if ((cvalp = smb_msgbuf_malloc(mb, repc * 2)) == 0)
 				return (SMB_MSGBUF_UNDERFLOW);
 
 			/* Translate string */
-			(void) mts_wcstombs((char *)cvalp, wcs, repc * 2);
+			(void) smb_wcstombs((char *)cvalp, wcs, repc * 2);
 
 			cvalpp = va_arg(ap, uint8_t **);
 			*cvalpp = cvalp;
@@ -450,7 +448,7 @@
 	uint32_t ival;
 	uint8_t *cvalp;
 	uint8_t c;
-	mts_wchar_t wcval;
+	smb_wchar_t wcval;
 	int count;
 	int repc = 1;
 	int rc;
@@ -559,7 +557,7 @@
 				return (SMB_MSGBUF_OVERFLOW);
 
 			ival =
-			    mts_mbstos((char *)mb->scan, (const char *)cvalp);
+			    smb_mbstos((char *)mb->scan, (const char *)cvalp);
 			mb->scan += ival + 1;
 			break;
 
@@ -573,11 +571,11 @@
 
 			for (;;) {
 				rc = smb_msgbuf_has_space(mb,
-				    sizeof (mts_wchar_t));
+				    sizeof (smb_wchar_t));
 				if (rc == 0)
 					return (SMB_MSGBUF_OVERFLOW);
 
-				count = mts_mbtowc(&wcval, (const char *)cvalp,
+				count = smb_mbtowc(&wcval, (const char *)cvalp,
 				    MTS_MB_CHAR_MAX);
 
 				if (count < 0) {
@@ -605,11 +603,11 @@
 					if ((mb->flags & SMB_MSGBUF_NOTERM) ==
 					    0)
 						mb->scan +=
-						    sizeof (mts_wchar_t);
+						    sizeof (smb_wchar_t);
 					break;
 				}
 
-				mb->scan += sizeof (mts_wchar_t);
+				mb->scan += sizeof (smb_wchar_t);
 				cvalp += count;
 			}
 			break;
@@ -697,7 +695,7 @@
 }
 
 static void
-buf_decode_wcs(mts_wchar_t *dst_wcstr, mts_wchar_t *src_wcstr, int wcstrlen)
+buf_decode_wcs(smb_wchar_t *dst_wcstr, smb_wchar_t *src_wcstr, int wcstrlen)
 {
 	int i;
 
--- a/usr/src/common/smbsrv/smb_native.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/common/smbsrv/smb_native.c	Thu Nov 05 14:34:36 2009 -0800
@@ -105,7 +105,7 @@
 		name = os_table[i].sn_name;
 		len = strlen(name);
 
-		if (utf8_strncasecmp(name, native_os, len) == 0)
+		if (smb_strcasecmp(name, native_os, len) == 0)
 			return (os_table[i].sn_value);
 	}
 
@@ -159,8 +159,8 @@
 		name = lm_table[i].sn_name;
 		len = strlen(name);
 
-		if ((utf8_strncasecmp(name, native_lm, len) == 0) ||
-		    (utf8_strncasecmp(&name[1], native_lm, len - 1) == 0)) {
+		if ((smb_strcasecmp(name, native_lm, len) == 0) ||
+		    (smb_strcasecmp(&name[1], native_lm, len - 1) == 0)) {
 			return (lm_table[i].sn_value);
 		}
 	}
@@ -209,8 +209,8 @@
 		name = pdc_table[i].sn_name;
 		len = strlen(name);
 
-		if ((utf8_strncasecmp(name, native_lm, len) == 0) ||
-		    (utf8_strncasecmp(&name[1], native_lm, len - 1) == 0)) {
+		if ((smb_strcasecmp(name, native_lm, len) == 0) ||
+		    (smb_strcasecmp(&name[1], native_lm, len - 1) == 0)) {
 			return (pdc_table[i].sn_value);
 		}
 	}
--- a/usr/src/common/smbsrv/smb_netbios_util.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/common/smbsrv/smb_netbios_util.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,12 +19,10 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #ifdef _KERNEL
 #include <sys/types.h>
 #include <sys/sunddi.h>
@@ -32,7 +30,6 @@
 #include <string.h>
 #endif
 #include <smbsrv/string.h>
-#include <smbsrv/ctype.h>
 #include <smbsrv/netbios.h>
 
 static int domainname_is_valid(char *domain_name);
@@ -286,7 +283,7 @@
 	 * to Appendix 1 - Domain Name Syntax Specification in RFC883.
 	 */
 	if (domainname_is_valid(scope))	{
-		(void) utf8_strupr(scope);
+		(void) smb_strupr(scope);
 		/*LINTED E_PTRDIFF_OVERFLOW*/
 		return (cp - in);
 	}
@@ -377,14 +374,14 @@
 		}
 
 		if (first_char)	{
-			if (mts_isalpha_ascii(*name) == 0)
+			if (smb_isalpha_ascii(*name) == 0)
 				return (0);
 
 			first_char = 0;
 			continue;
 		}
 
-		if (mts_isalnum_ascii(*name) || dns_is_allowed(*name))
+		if (smb_isalnum_ascii(*name) || dns_is_allowed(*name))
 			continue;
 
 		return (0);
--- a/usr/src/common/smbsrv/smb_oem.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/common/smbsrv/smb_oem.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,108 +19,83 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 /*
  * Support for oem <-> unicode translations.
  */
 
 #ifndef _KERNEL
-#include <stdio.h>
 #include <stdlib.h>
 #include <thread.h>
 #include <synch.h>
 #include <string.h>
+#else
+#include <sys/ksynch.h>
 #endif /* _KERNEL */
+
+#include <sys/byteorder.h>
 #include <smbsrv/alloc.h>
 #include <smbsrv/string.h>
-#include <smbsrv/oem.h>
-#include <sys/byteorder.h>
+
 /*
- * name: Name used to show on the telnet/GUI.
- * filename: The actual filename contains the codepage.
- * doublebytes: The codepage is double or single byte.
- * oempage: The oempage is used to convert Unicode to OEM chars.
- *		Memory needs to be allocated for value field of oempage
- *		to store the entire table.
- * unipage: The unipage is used to convert OEM to Unicode chars.
- *		Memory needs to be allocated for value field of unipage
- *		to store the entire table.
- * valid: This field indicates if the page is valid or not.
- * ref: This ref count is used to keep track of the usage of BOTH
- *		oempage and unipage.
- * Note: If the cpid of the table is changed, please change the
- * codepage_id in oem.h as well.
+ * cpid		The oemcpg_table index for this oempage.
+ * value	The conversion values.
+ */
+typedef struct oempage {
+	uint32_t	cpid;
+	smb_wchar_t	*value;
+} oempage_t;
+
+/*
+ * filename	The actual filename contains the codepage.
+ * bytesperchar	The codepage uses double or single bytes per char.
+ * oempage	The oempage is used to convert Unicode characters to
+ *		OEM characters.  Memory needs to be allocated for
+ *		the value field of oempage to store the table.
+ * ucspage	The unicode page is used to convert OEM characters
+ *		to Unicode characters.  Memory needs to be allocated
+ *		for the value field of ucspage to store the table.
+ * valid	True if the codepage has been initialized.
  */
 typedef struct oem_codepage {
-	char *filename;
-	unsigned int bytesperchar;
-	oempage_t oempage;
-	oempage_t unicodepage;
-	unsigned int valid;
-	unsigned int ref;
+	char		*filename;
+	uint32_t	bytesperchar;
+	oempage_t	oempage;
+	oempage_t	ucspage;
+	boolean_t	valid;
 } oem_codepage_t;
 
-static oem_codepage_t oemcp_table[] = {
-	{"850.cpg", 1, {0, 0}, {0, 0}, 0, 0},	/* Multilingual Latin1 */
-	{"950.cpg", 2, {1, 0}, {1, 0}, 0, 0},	/* Chinese Traditional */
-	{"1252.cpg", 1, {2, 0}, {2, 0}, 0, 0},	/* MS Latin1 */
-	{"949.cpg", 2, {3, 0}, {3, 0}, 0, 0},	/* Korean */
-	{"936.cpg", 2, {4, 0}, {4, 0}, 0, 0},	/* Chinese Simplified */
-	{"932.cpg", 2, {5, 0}, {5, 0}, 0, 0},	/* Japanese */
-	{"852.cpg", 1, {6, 0}, {6, 0}, 0, 0},	/* Multilingual Latin2 */
-	{"1250.cpg", 1, {7, 0}, {7, 0}, 0, 0},	/* MS Latin2 */
-	{"1253.cpg", 1, {8, 0}, {8, 0}, 0, 0},	/* MS Greek */
-	{"737.cpg", 1, {9, 0}, {9, 0}, 0, 0},	/* Greek */
-	{"1254.cpg", 1, {10, 0}, {10, 0}, 0, 0}, /* MS Turkish */
-	{"857.cpg", 1, {11, 0}, {11, 0}, 0, 0},	/* Multilingual Latin5 */
-	{"1251.cpg", 1, {12, 0}, {12, 0}, 0, 0}, /* MS Cyrillic */
-	{"866.cpg", 1, {13, 0}, {13, 0}, 0, 0},	/* Cyrillic II */
-	{"1255.cpg", 1, {14, 0}, {14, 0}, 0, 0}, /* MS Hebrew */
-	{"862.cpg", 1, {15, 0}, {15, 0}, 0, 0},	/* Hebrew */
-	{"1256.cpg", 1, {16, 0}, {16, 0}, 0, 0}, /* MS Arabic */
-	{"720.cpg", 1, {17, 0}, {17, 0}, 0, 0}	/* Arabic */
+static oem_codepage_t oemcpg_table[] = {
+	{"850.cpg",  1, {0, 0},  {0, 0},  0},	/* Multilingual Latin1 */
+	{"950.cpg",  2, {1, 0},  {1, 0},  0},	/* Chinese Traditional */
+	{"1252.cpg", 1, {2, 0},  {2, 0},  0},	/* MS Latin1 */
+	{"949.cpg",  2, {3, 0},  {3, 0},  0},	/* Korean */
+	{"936.cpg",  2, {4, 0},  {4, 0},  0},	/* Chinese Simplified */
+	{"932.cpg",  2, {5, 0},  {5, 0},  0},	/* Japanese */
+	{"852.cpg",  1, {6, 0},  {6, 0},  0},	/* Multilingual Latin2 */
+	{"1250.cpg", 1, {7, 0},  {7, 0},  0},	/* MS Latin2 */
+	{"1253.cpg", 1, {8, 0},  {8, 0},  0},	/* MS Greek */
+	{"737.cpg",  1, {9, 0},  {9, 0},  0},	/* Greek */
+	{"1254.cpg", 1, {10, 0}, {10, 0}, 0},	/* MS Turkish */
+	{"857.cpg",  1, {11, 0}, {11, 0}, 0},	/* Multilingual Latin5 */
+	{"1251.cpg", 1, {12, 0}, {12, 0}, 0},	/* MS Cyrillic */
+	{"866.cpg",  1, {13, 0}, {13, 0}, 0},	/* Cyrillic II */
+	{"1255.cpg", 1, {14, 0}, {14, 0}, 0},	/* MS Hebrew */
+	{"862.cpg",  1, {15, 0}, {15, 0}, 0},	/* Hebrew */
+	{"1256.cpg", 1, {16, 0}, {16, 0}, 0},	/* MS Arabic */
+	{"720.cpg",  1, {17, 0}, {17, 0}, 0}	/* Arabic */
 };
 
-static language lang_table[] = {
-	{"Arabic", OEM_CP_IND_720, OEM_CP_IND_1256},
-	{"Brazilian", OEM_CP_IND_850, OEM_CP_IND_1252},
-	{"Chinese Traditional", OEM_CP_IND_950, OEM_CP_IND_950},
-	{"Chinese Simplified", OEM_CP_IND_936, OEM_CP_IND_936},
-	{"Czech", OEM_CP_IND_852, OEM_CP_IND_1250},
-	{"Danish", OEM_CP_IND_850, OEM_CP_IND_1252},
-	{"Dutch", OEM_CP_IND_850, OEM_CP_IND_1252},
-	{"English", OEM_CP_IND_850, OEM_CP_IND_1252},
-	{"Finnish", OEM_CP_IND_850, OEM_CP_IND_1252},
-	{"French", OEM_CP_IND_850, OEM_CP_IND_1252},
-	{"German", OEM_CP_IND_850, OEM_CP_IND_1252},
-	{"Greek", OEM_CP_IND_737, OEM_CP_IND_1253},
-	{"Hebrew", OEM_CP_IND_862, OEM_CP_IND_1255},
-	{"Hungarian", OEM_CP_IND_852, OEM_CP_IND_1250},
-	{"Italian", OEM_CP_IND_850, OEM_CP_IND_1252},
-	{"Japanese", OEM_CP_IND_932, OEM_CP_IND_932},
-	{"Korean", OEM_CP_IND_949, OEM_CP_IND_949},
-	{"Norwegian", OEM_CP_IND_850, OEM_CP_IND_1252},
-	{"Polish", OEM_CP_IND_852, OEM_CP_IND_1250},
-	{"Russian", OEM_CP_IND_866, OEM_CP_IND_1251},
-	{"Slovak", OEM_CP_IND_852, OEM_CP_IND_1250},
-	{"Slovenian", OEM_CP_IND_852, OEM_CP_IND_1250},
-	{"Spanish", OEM_CP_IND_850, OEM_CP_IND_1252},
-	{"Swedish", OEM_CP_IND_850, OEM_CP_IND_1252},
-	{"Turkish", OEM_CP_IND_857, OEM_CP_IND_1254}
-};
-
-
+#define	MAX_OEMPAGES	(sizeof (oemcpg_table) / sizeof (oemcpg_table[0]))
+#define	MAX_UNICODE_IDX	65536
 
 /*
- * The oem_default_smb_cp is the default smb codepage for English.
- * It is actually codepage 850.
+ * The default SMB OEM codepage for English is codepage 850.
  */
-mts_wchar_t oem_default_smb_cp[256] = {
+smb_wchar_t oem_codepage_850[256] = {
 	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
 	0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
 	0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
@@ -155,13 +130,10 @@
 	0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0
 };
 
-
-
 /*
- * The oem_default_telnet_cp is the default telnet codepage for English.
- * It is actually codepage 1252.
+ * The default telnet OEM codepage for English is codepage 1252.
  */
-mts_wchar_t oem_default_telnet_cp[256] = {
+smb_wchar_t oem_codepage_1252[256] = {
 	0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
 	0x9, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, 0x10,
 	0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
@@ -196,567 +168,206 @@
 	0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF
 };
 
-
-#define	MAX_OEMPAGES (sizeof (oemcp_table) / sizeof (oemcp_table[0]))
-#define	MAX_UNI_IDX 65536
-
-
+static oempage_t *oem_get_oempage(uint32_t);
+static oempage_t *oem_get_ucspage(uint32_t);
+static void oem_codepage_init(uint32_t);
+static void oem_codepage_setup(uint32_t);
 
 /*
- * oem_codepage_bytesperchar
+ * Convert a unicode string to an oem string.
  *
- * This function returns the max bytes per oem char for the specified
- * oem table. This basically shows if the oem codepage is single or
- * double bytes.
+ * The conversion will stop at the end of the unicode string
+ * or when (nbytes - 1) oem characters have been stored.
+ *
+ * The number of converted unicode characters is returned,
+ * or 0 on error.
  */
-static unsigned int
-oem_codepage_bytesperchar(unsigned int cpid)
+size_t
+ucstooem(char *oem, const smb_wchar_t *ucs, size_t nbytes, uint32_t cpid)
 {
-	if (cpid >= MAX_OEMPAGES)
+	oempage_t	*ucspage;
+	uint32_t	count = 0;
+	smb_wchar_t	oemchar;
+
+	if (ucs == NULL || oem == NULL)
 		return (0);
-	else
-		return (oemcp_table[cpid].bytesperchar);
-}
-
-
 
-/*
- * oem_get_codepage_path
- *
- * This function will get the codepage path.
- */
-const char *
-oem_get_codepage_path(void)
-{
-#ifdef PBSHORTCUT /* */
-	const char *path = getenv("codepage.oem.directory");
-	if (path == 0)
-		return ("/");
-	else
-		return (path);
-#else /* PBSHORTCUT */
-	return ("/");
-#endif /* PBSHORTCUT */
+	if ((ucspage = oem_get_ucspage(cpid)) == NULL)
+		return (0);
+
+	while (nbytes != 0 && (oemchar = ucspage->value[*ucs]) != 0) {
+		if (oemchar & 0xff00 && nbytes >= MTS_MB_CHAR_MAX) {
+			*oem++ = oemchar >> 8;
+			*oem++ = (char)oemchar;
+			nbytes -= 2;
+		} else if (nbytes > 1) {
+			*oem++ = (char)oemchar;
+			nbytes--;
+		} else {
+			break;
+		}
+
+		count++;
+		ucs++;
+	}
+
+	*oem = '\0';
+	return (count);
 }
 
 /*
- * oem_codepage_init
+ * Convert an oem string to a unicode string.
+ *
+ * The conversion will stop at the end of the oem string or
+ * when nwchars - 1 have been converted.
  *
- * This function will init oem page via the cpid of the oem table.
- * The function oem_codepage_free must be called when the oempage is
- * no longer needed to free up the allocated memory. If the codepage is
- * successfully initialized, zero will be the return value; otherwise
- * -1 will be the return value.
+ * The number of converted oem chars is returned, or 0 on error.
+ * An oem char may be either 1 or 2 bytes.
  */
-int
-oem_codepage_init(unsigned int cpid)
+size_t
+oemtoucs(smb_wchar_t *ucs, const char *oem, size_t nwchars, uint32_t cpid)
 {
-#ifndef _KERNEL
-	FILE *fp;
-	static mutex_t mutex;
-	char buf[32];
-	char filePath[100];
-#endif /* _KERNEL */
-	unsigned int max_oem_index;
-	const char *codepagePath = oem_get_codepage_path();
-	mts_wchar_t *default_oem_cp = 0;
-	oem_codepage_t *oemcp;
-
-	/*
-	 * The OEM codepages 850 and 1252 are stored in kernel; therefore,
-	 * no need for codepagePath to be defined to work.
-	 */
-	if (cpid >= MAX_OEMPAGES ||
-	    (codepagePath == 0 &&
-	    cpid != oem_default_smb_cpid && cpid != oem_default_telnet_cpid))
-		return (-1);
-
-	max_oem_index = 1 << oem_codepage_bytesperchar(cpid) * 8;
-	/*
-	 * Use mutex so no two same index can be initialize
-	 * at the same time.
-	 */
-#ifndef _KERNEL
-	(void) mutex_lock(&mutex);
-#endif /* _KERNEL */
-
-	oemcp = &oemcp_table[cpid];
-	if (oemcp->valid) {
-		oemcp->valid++;
-#ifndef _KERNEL
-		(void) mutex_unlock(&mutex);
-#endif /* _KERNEL */
-		return (0);
-	}
-
-	oemcp->oempage.value =
-	    MEM_ZALLOC("oem", max_oem_index * sizeof (mts_wchar_t));
-	if (oemcp->oempage.value == 0) {
-#ifndef _KERNEL
-		(void) mutex_unlock(&mutex);
-#endif /* _KERNEL */
-		return (-1);
-	}
-
-	oemcp->unicodepage.value =
-	    MEM_ZALLOC("oem", MAX_UNI_IDX * sizeof (mts_wchar_t));
-	if (oemcp->unicodepage.value == 0) {
-		MEM_FREE("oem", oemcp->oempage.value);
-		oemcp->oempage.value = 0;
-#ifndef _KERNEL
-		(void) mutex_unlock(&mutex);
-#endif /* _KERNEL */
-		return (-1);
-	}
-
-	/*
-	 * The default English page is stored in kernel.
-	 * Therefore, no need to go to codepage files.
-	 */
-#ifndef _KERNEL
-	if (cpid == oem_default_smb_cpid)
-		default_oem_cp = oem_default_smb_cp;
-	else if (cpid == oem_default_telnet_cpid)
-		default_oem_cp = oem_default_telnet_cp;
-	else
-		default_oem_cp = 0;
-#else /* _KERNEL */
-	default_oem_cp = oem_default_smb_cp;
-#endif /* _KERNEL */
-
-	if (default_oem_cp) {
-		int i;
+	oempage_t	*oempage;
+	size_t		count = nwchars;
+	smb_wchar_t	oemchar;
 
-		for (i = 0; i < max_oem_index; i++) {
-			oemcp->oempage.value[i] = default_oem_cp[i];
-			oemcp->unicodepage.value[default_oem_cp[i]] =
-			    (mts_wchar_t)i;
-		}
-#ifdef _KERNEL
-	}
-	/*
-	 * XXX This doesn't seem right.  How do we handle the situation
-	 * where default_oem_cp == 0 in the kernel?
-	 * Is this a PBSHORTCUT?
-	 */
-#else
-	} else {
-
-		/*
-		 * The codepage is not one of the default that stores
-		 * in the include
-		 * file; therefore, we need to read from the file.
-		 */
-		(void) snprintf(filePath, sizeof (filePath),
-		    "%s/%s", codepagePath, oemcp->filename);
-		fp = fopen(filePath, "r");
-
-		if (fp == 0) {
-			MEM_FREE("oem", oemcp->oempage.value);
-			MEM_FREE("oem", oemcp->unicodepage.value);
-#ifndef _KERNEL
-			(void) mutex_unlock(&mutex);
-#endif /* _KERNEL */
-			return (-1);
-		}
-
-		while (fgets(buf, 32, fp) != 0) {
-			char *endptr;
-			unsigned int oemval, unival;
-
-			endptr = (char *)strchr(buf, ' ');
-			if (endptr == 0) {
-				continue;
-			}
-
-			oemval = strtol(buf, &endptr, 0);
-			unival = strtol(endptr+1, 0, 0);
-
-			if (oemval >= max_oem_index || unival >= MAX_UNI_IDX) {
-				continue;
-			}
-
-			oemcp->oempage.value[oemval] = unival;
-			oemcp->unicodepage.value[unival] = oemval;
-		}
-		(void) fclose(fp);
-	}
-#endif /* _KERNEL */
-
-	oemcp->valid = 1;
-#ifndef _KERNEL
-	(void) mutex_unlock(&mutex);
-#endif /* _KERNEL */
-	return (0);
-}
-
-
-
-
-/*
- * oem_codepage_free
- *
- * This function will clear the valid bit and free the memory
- * allocated to the oem/unipage by oem_codepage_init if the ref count
- * is zero.
- */
-void
-oem_codepage_free(unsigned int cpid)
-{
-	oem_codepage_t *oemcp;
-
-	if (cpid >= MAX_OEMPAGES || !oemcp_table[cpid].valid)
-		return;
-
-	oemcp = &oemcp_table[cpid];
-	oemcp->valid--;
-
-	if (oemcp->ref != 0 || oemcp->valid != 0)
-		return;
-
-	if (oemcp->oempage.value != 0) {
-		MEM_FREE("oem", oemcp->oempage.value);
-		oemcp->oempage.value = 0;
-	}
-
-	if (oemcp->unicodepage.value != 0) {
-		MEM_FREE("oem", oemcp->unicodepage.value);
-		oemcp->unicodepage.value = 0;
-	}
-}
-
-
-
-/*
- * oem_get_oempage
- *
- * This function will return the current oempage and increment
- * the ref count. The function oem_release_page should always
- * be called when finish using the oempage to decrement the
- * ref count.
- */
-static oempage_t *
-oem_get_oempage(unsigned int cpid)
-{
-	if (cpid >= MAX_OEMPAGES)
+	if (ucs == NULL || oem == NULL)
 		return (0);
 
-	if (oemcp_table[cpid].valid) {
-		oemcp_table[cpid].ref++;
-		return (&oemcp_table[cpid].oempage);
-	}
-	return (0);
-}
-
-
-
-/*
- * oem_get_unipage
- *
- * This function will return the current unipage and increment
- * the ref count. The function oem_release_page should always
- * be called when finish using the unipage to decrement the
- * ref count.
- */
-static oempage_t *
-oem_get_unipage(unsigned int cpid)
-{
-	if (cpid >= MAX_OEMPAGES)
+	if ((oempage = oem_get_oempage(cpid)) == NULL)
 		return (0);
 
-	if (oemcp_table[cpid].valid) {
-		oemcp_table[cpid].ref++;
-		return (&oemcp_table[cpid].unicodepage);
-	}
-	return (0);
-}
-
-
-
-/*
- * oem_release_page
- *
- * This function will decrement the ref count and check the valid
- * bit. It will free the memory allocated for the pages
- * if the
- * valid bit is not set, ref count is zero and the page is not
- * already freed.
- */
-static void
-oem_release_page(oempage_t *page)
-{
-	oem_codepage_t *oemcp = &oemcp_table[page->cpid];
-
-	page = 0;
-
-	if (oemcp->ref > 0)
-		oemcp->ref--;
-
-	if (oemcp->ref != 0 || oemcp->valid)
-		return;
-
-	if (oemcp->oempage.value != 0) {
-		MEM_FREE("oem", oemcp->oempage.value);
-		oemcp->oempage.value = 0;
-	}
-
-	if (oemcp->unicodepage.value != 0) {
-		MEM_FREE("oem", oemcp->unicodepage.value);
-		oemcp->unicodepage.value = 0;
-	}
-}
-
-
-
-/*
- * unicodestooems
- *
- * Convert unicode string to oem string. The function will stop
- * converting the unicode string when size nbytes - 1 is reached
- * or when there is not enough room to store another unicode.
- * If the function is called when the codepage is not initialized
- * or when the codepage initialize failed, it will return 0.
- * Otherwise, the total # of the converted unicode is returned.
- */
-size_t
-unicodestooems(
-    char *oemstring,
-    const mts_wchar_t *unicodestring,
-    size_t nbytes,
-    unsigned int cpid)
-{
-	oempage_t *unipage;
-	unsigned int count = 0;
-	mts_wchar_t oemchar;
-
-	if (cpid >= MAX_OEMPAGES)
-		return (0);
-
-	if (unicodestring == 0 || oemstring == 0)
-		return (0);
-
-	if ((unipage = oem_get_unipage(cpid)) == 0)
-		return (0);
-
-	while ((oemchar = unipage->value[*unicodestring]) != 0) {
-		if (oemchar & 0xff00 && nbytes >= MTS_MB_CHAR_MAX) {
-			*oemstring++ = oemchar >> 8;
-			*oemstring++ = (char)oemchar;
-			nbytes -= 2;
-		} else if (nbytes > 1) {
-			*oemstring++ = (char)oemchar;
-			nbytes--;
-		} else
-			break;
-
-		count++;
-		unicodestring++;
-	}
-
-	*oemstring = 0;
-
-	oem_release_page(unipage);
-
-	return (count);
-}
-
-
-
-/*
- * oemstounicodes
- *
- * Convert oem string to unicode string. The function will stop
- * converting the oem string when unicodestring len reaches nwchars - 1.
- * or when there is not enough room to store another oem char.
- * If the function is called when the codepage is not initialized
- * or when the codepage initialize failed, it will return 0.
- * Otherwise, the total # of the converted oem chars is returned.
- * The oem char can be either 1 or 2 bytes.
- */
-size_t
-oemstounicodes(
-    mts_wchar_t *unicodestring,
-    const char *oemstring,
-    size_t nwchars,
-    unsigned int cpid)
-{
-	oempage_t *oempage;
-	size_t count = nwchars;
-	mts_wchar_t oemchar;
-
-	if (cpid >= MAX_OEMPAGES)
-		return (0);
-
-	if (unicodestring == 0 || oemstring == 0)
-		return (0);
-
-	if ((oempage = oem_get_oempage(cpid)) == 0)
-		return (0);
-
-	while ((oemchar = (mts_wchar_t)*oemstring++ & 0xff) != 0) {
+	while ((oemchar = (smb_wchar_t)*oem++ & 0xff) != 0) {
 		/*
-		 * Cannot find one byte oemchar in table. Must be
-		 * a lead byte. Try two bytes.
+		 * Cannot find one byte oemchar in table.
+		 * Must be a lead byte. Try two bytes.
 		 */
-
 		if ((oempage->value[oemchar] == 0) && (oemchar != 0)) {
-			oemchar = oemchar << 8 | (*oemstring++ & 0xff);
+			oemchar = oemchar << 8 | (*oem++ & 0xff);
 			if (oempage->value[oemchar] == 0) {
-				*unicodestring = 0;
+				*ucs = 0;
 				break;
 			}
 		}
 #ifdef _BIG_ENDIAN
-		*unicodestring = LE_IN16(&oempage->value[oemchar]);
+		*ucs = LE_IN16(&oempage->value[oemchar]);
 #else
-		*unicodestring = oempage->value[oemchar];
+		*ucs = oempage->value[oemchar];
 #endif
 		count--;
-		unicodestring++;
+		ucs++;
 	}
 
-	*unicodestring = 0;
-
-	oem_release_page(oempage);
-
+	*ucs = 0;
 	return (nwchars - count);
 }
 
 /*
- * oem_get_lang_table
- *
- * This function returns a pointer to the language table.
+ * Get a pointer to the oem page for the specific codepage id.
  */
-language *
-oem_get_lang_table(void)
+static oempage_t *
+oem_get_oempage(uint32_t cpid)
 {
-	return (lang_table);
+	if (cpid >= MAX_OEMPAGES)
+		return (NULL);
+
+	if (!oemcpg_table[cpid].valid) {
+		oem_codepage_init(cpid);
+
+		if (!oemcpg_table[cpid].valid)
+			return (NULL);
+	}
+
+	return (&oemcpg_table[cpid].oempage);
 }
 
 /*
- * oem_no_of_languages
- *
- * This function returns total languages support in the system.
+ * Get a pointer to the ucs page for the specific codepage id.
  */
-int
-oem_no_of_languages(void)
+static oempage_t *
+oem_get_ucspage(uint32_t cpid)
 {
-	return (sizeof (lang_table)/sizeof (lang_table[0]));
+	if (cpid >= MAX_OEMPAGES)
+		return (NULL);
+
+	if (!oemcpg_table[cpid].valid) {
+		oem_codepage_init(cpid);
+
+		if (!oemcpg_table[cpid].valid)
+			return (NULL);
+	}
+
+	return (&oemcpg_table[cpid].ucspage);
 }
 
-
-#ifndef _KERNEL
-#if 1
 /*
- * TESTING Functions
+ * Initialize the oem page in the oem table.
  */
-void
-oemcp_print(unsigned int cpid)
+static void
+oem_codepage_init(uint32_t cpid)
 {
-	unsigned int bytesperchar, max_index, i;
-	oempage_t *oempage, *unipage;
-	unsigned int counter = 0;
+#ifndef _KERNEL
+	static mutex_t mutex;
+
+	(void) mutex_lock(&mutex);
+	oem_codepage_setup(cpid);
+	(void) mutex_unlock(&mutex);
+#else
+	static kmutex_t mutex;
 
-	if (cpid >= MAX_OEMPAGES) {
-		(void) printf("oemcp cpid %d is invalid\n", cpid);
-		return;
-	}
+	mutex_enter(&mutex);
+	oem_codepage_setup(cpid);
+	mutex_exit(&mutex);
+#endif /* _KERNEL */
+}
 
-	if ((oempage = oem_get_oempage(cpid)) == 0) {
-		(void) printf("oemcp of cpid %d is invalid\n", cpid);
-		return;
-	}
+static void
+oem_codepage_setup(uint32_t cpid)
+{
+	smb_wchar_t	*default_oem_cp;
+	oem_codepage_t	*oemcpg;
+	uint32_t	bytesperchar;
+	uint32_t	max_oem_index;
+	int		i;
 
-	if ((unipage = oem_get_unipage(cpid)) == 0) {
-		(void) printf("unicp of cpid %d is invalid\n", cpid);
-		return;
-	}
-
-	if ((bytesperchar = oem_codepage_bytesperchar(cpid)) == 0) {
-		(void) printf("bytesperchar of cpid %d is not correct\n", cpid);
+	switch (cpid) {
+	case OEM_CPG_850:
+		default_oem_cp = oem_codepage_850;
+		break;
+	case OEM_CPG_1252:
+		default_oem_cp = oem_codepage_1252;
+	default:
 		return;
 	}
 
-	max_index = 1 << bytesperchar * 8;
-
-	(void) printf("OEMPAGE:\n");
-	for (i = 0; i < max_index; i++) {
-		if ((counter + 1) % 4 == 0 &&
-		    (oempage->value[i] != 0 || i == 0)) {
-			(void) printf("%x %x\n", i, oempage->value[i]);
-			counter++;
-		} else if (oempage->value[i] != 0 || i == 0) {
-			(void) printf("%x %x, ", i, oempage->value[i]);
-			counter++;
-		}
-	}
-	counter = 0;
-	(void) printf("\n\nUNIPAGE:\n");
-	for (i = 0; i < 65536; i++) {
-		if ((counter + 1) % 8 == 0 &&
-		    (unipage->value[i] != 0 || i == 0)) {
-			(void) printf("%x %x\n", i, unipage->value[i]);
-			counter++;
-		} else if (unipage->value[i] != 0 || i == 0) {
-			(void) printf("%x %x, ", i, unipage->value[i]);
-			counter++;
-		}
-	}
-	(void) printf("\n");
-	oem_release_page(oempage);
-	oem_release_page(unipage);
-}
-
-
-
-void
-oemstringtest(unsigned int cpid)
-{
-	unsigned char *c, *cbuf;
-	unsigned char cbuf1[100] = {0xfe, 0xfd, 0xf2, 0xe9,
-		0x63, 0xce, 0xdb, 0x8c, 0x9c, 0x21, 0};
-	unsigned char cbuf2[100] = {0xfe, 0xfc, 0x63, 0x81, 0x42,
-		0x91, 0x40, 0x24, 0xff, 0x49};
-	mts_wchar_t buf[100], *wc;
-
-	if (cpid == 1)
-		cbuf = cbuf1;
-	else if (cpid == 2)
-		cbuf = cbuf2;
+	oemcpg = &oemcpg_table[cpid];
+	if (oemcpg->valid)
+		return;
 
 	/*
-	 * Before oem->uni conversion.
-	 */
-	(void) printf("Before oem->uni conversion: ");
-	for (c = cbuf; *c != 0; c++)
-		(void) printf("%x ", *c);
-	(void) printf("\n");
-
-	/*
-	 * oem->uni conversion
-	 */
-	(void) oemstounicodes(buf, (const char *)cbuf, 100, cpid);
-
-	/*
-	 * After oem->uni conversion.
+	 * max_oem_index will be 256 or 65536 dependent
+	 * on the OEM codepage.
 	 */
-	(void) printf("After oem->uni conversion: ");
-	for (wc = buf; *wc != 0; wc++)
-		(void) printf("%x ", *wc);
-	(void) printf("\n");
+	bytesperchar = oemcpg_table[cpid].bytesperchar;
+	max_oem_index = 1 << (bytesperchar * 8);
 
-	/*
-	 * uni->oem conversion
-	 */
-	(void) unicodestooems((char *)cbuf, buf, 100, cpid);
+	oemcpg->oempage.value =
+	    MEM_ZALLOC("oem", max_oem_index * sizeof (smb_wchar_t));
+	if (oemcpg->oempage.value == NULL)
+		return;
 
-	/*
-	 * After uni->oem conversion.
-	 */
-	(void) printf("After uni->oem conversion: ");
-	for (c = cbuf; *c != 0; c++)
-		(void) printf("%x ", *c);
-	(void) printf("\n");
+	oemcpg->ucspage.value =
+	    MEM_ZALLOC("oem", MAX_UNICODE_IDX * sizeof (smb_wchar_t));
+	if (oemcpg->ucspage.value == NULL) {
+		MEM_FREE("oem", oemcpg->oempage.value);
+		oemcpg->oempage.value = NULL;
+		return;
+	}
+
+	for (i = 0; i < max_oem_index; i++) {
+		oemcpg->oempage.value[i] = default_oem_cp[i];
+		oemcpg->ucspage.value[default_oem_cp[i]] = (smb_wchar_t)i;
+	}
+
+	oemcpg->valid = B_TRUE;
 }
-#endif
-#endif /* _KERNEL */
--- a/usr/src/common/smbsrv/smb_opmlang.c	Thu Nov 05 12:17:17 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,127 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-#include <smbsrv/string.h>
-#include <smbsrv/codepage.h>
-#include <smbsrv/oem.h>
-
-static unsigned int smb_cpid = NO_OF_OEM_CP_INDS;
-static unsigned int telnet_cpid = NO_OF_OEM_CP_INDS;
-
-/*
- * oem_get_smb_cpid
- *
- * This function returns the cpid for current smb codepage.
- */
-unsigned int
-oem_get_smb_cpid(void)
-{
-	return (smb_cpid);
-}
-
-/*
- * oem_get_telnet_cpid
- *
- * This function returns the cpid for current telnet codepage.
- */
-unsigned int
-oem_get_telnet_cpid(void)
-{
-	return (telnet_cpid);
-}
-
-/*
- * oem_current_language
- *
- * This function will return the current language setting.
- * The current language is stored in env "codepage.oem.language".
- * If the env does not exist, "None Selected" will be returned.
- */
-char *
-oem_current_language()
-{
-#ifdef PBSHORTCUT
-	char *p = getenv("codepage.oem.language");
-
-	if (p)
-		return (p);
-#endif
-	return ("None Selected");
-}
-
-
-/*
- * oem_language_set
- *
- * This function will set the oem language and correct
- * env variables.
- */
-int
-oem_language_set(char *lang_name)
-{
-	int i;
-	language *lang_table = oem_get_lang_table();
-
-	for (i = 0; i < NO_OF_LANGUAGES; i++) {
-		if (utf8_strcasecmp(lang_name, lang_table[i].language) == 0) {
-			unsigned int oldSmbIndex = smb_cpid;
-			unsigned int oldTelnetIndex = telnet_cpid;
-			if (oem_codepage_init(lang_table[i].smbIndex) < 0 ||
-			    oem_codepage_init(lang_table[i].telnetIndex) < 0) {
-				oem_codepage_free(lang_table[i].smbIndex);
-				oem_codepage_free(lang_table[i].telnetIndex);
-				(void) oem_codepage_init(oem_default_smb_cpid);
-				(void) oem_codepage_init(
-				    oem_default_telnet_cpid);
-				smb_cpid = oem_default_smb_cpid;
-				telnet_cpid = oem_default_telnet_cpid;
-#ifdef PBSHORTCUT
-				setenv("codepage.oem.language",
-				    oem_default_language);
-#endif
-			} else {
-				smb_cpid = lang_table[i].smbIndex;
-				telnet_cpid = lang_table[i].telnetIndex;
-#ifdef PBSHORTCUT
-				setenv("codepage.oem.language",
-				    lang_table[i].language);
-#endif
-			}
-#ifdef PBSHORTCUT
-			saveenv();
-#endif
-
-			if (oldSmbIndex < NO_OF_OEM_CP_INDS)
-				oem_codepage_free(oldSmbIndex);
-			if (oldTelnetIndex < NO_OF_OEM_CP_INDS)
-				oem_codepage_free(oldTelnetIndex);
-			return (0);
-		}
-	}
-
-	return (-1);
-}
--- a/usr/src/common/smbsrv/smb_strcase.c	Thu Nov 05 12:17:17 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,388 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-/*
- * Case conversion functions for strings. Originally this module only
- * dealt with ASCII strings. It has been updated to support European
- * character set characters. The current implementation is based on
- * code page table lookup rather than simple character range checks.
- */
-
-#ifdef _KERNEL
-#include <sys/types.h>
-#include <sys/sunddi.h>
-#else
-#include <stdio.h>
-#include <string.h>
-#endif
-#include <smbsrv/ctype.h>
-#include <smbsrv/codepage.h>
-#include <smbsrv/cp_cyrillic.h>
-#include <smbsrv/cp_latin1.h>
-#include <smbsrv/cp_latin2.h>
-#include <smbsrv/cp_latin3.h>
-#include <smbsrv/cp_latin4.h>
-#include <smbsrv/cp_latin5.h>
-#include <smbsrv/cp_latin6.h>
-#include <smbsrv/cp_usascii.h>
-
-/*
- * Global pointer to the current code page. This is
- * defaulted to a standard ASCII table.
- */
-static codepage_t *current_codepage = usascii_codepage;
-
-/*
- * A flag indicating whether the codepage being used is ASCII
- * When this flag is set, string opeartions can go faster.
- */
-static int is_unicode = 0;
-
-/*
- * codepage_isupper
- *
- * Determine whether or not a character is an uppercase character.
- * This function operates on the current codepage table. Returns
- * non-zero if the character is uppercase. Otherwise returns zero.
- */
-int
-codepage_isupper(int c)
-{
-	unsigned short mask = is_unicode ? 0xffff : 0xff;
-
-	return (current_codepage[c & mask].ctype & CODEPAGE_ISUPPER);
-}
-
-
-/*
- * codepage_islower
- *
- * Determine whether or not a character is an lowercase character.
- * This function operates on the current codepage table. Returns
- * non-zero if the character is lowercase. Otherwise returns zero.
- */
-int
-codepage_islower(int c)
-{
-	unsigned short mask = is_unicode ? 0xffff : 0xff;
-
-	return (current_codepage[c & mask].ctype & CODEPAGE_ISLOWER);
-}
-
-
-/*
- * codepage_toupper
- *
- * Convert individual characters to their uppercase equivalent value.
- * If the specified character is lowercase, the uppercase value will
- * be returned. Otherwise the original value will be returned.
- */
-int
-codepage_toupper(int c)
-{
-	unsigned short mask = is_unicode ? 0xffff : 0xff;
-
-	return (current_codepage[c & mask].upper);
-}
-
-
-/*
- * codepage_tolower
- *
- * Convert individual characters to their lowercase equivalent value.
- * If the specified character is uppercase, the lowercase value will
- * be returned. Otherwise the original value will be returned.
- */
-int
-codepage_tolower(int c)
-{
-	unsigned short mask = is_unicode ? 0xffff : 0xff;
-
-	return (current_codepage[c & mask].lower);
-}
-
-
-/*
- * strupr
- *
- * Convert a string to uppercase using the appropriate codepage. The
- * string is converted in place. A pointer to the string is returned.
- * There is an assumption here that uppercase and lowercase values
- * always result encode to the same length.
- */
-char *
-utf8_strupr(char *s)
-{
-	mts_wchar_t c;
-	char *p = s;
-
-	while (*p) {
-		if (mts_isascii(*p)) {
-			*p = codepage_toupper(*p);
-			p++;
-		} else {
-			if (mts_mbtowc(&c, p, MTS_MB_CHAR_MAX) < 0)
-				return (0);
-
-			if (c == 0)
-				break;
-
-			c = codepage_toupper(c);
-			p += mts_wctomb(p, c);
-		}
-	}
-
-	return (s);
-}
-
-
-/*
- * strlwr
- *
- * Convert a string to lowercase using the appropriate codepage. The
- * string is converted in place. A pointer to the string is returned.
- * There is an assumption here that uppercase and lowercase values
- * always result encode to the same length.
- */
-char *
-utf8_strlwr(char *s)
-{
-	mts_wchar_t c;
-	char *p = s;
-
-	while (*p) {
-		if (mts_isascii(*p)) {
-			*p = codepage_tolower(*p);
-			p++;
-		} else {
-			if (mts_mbtowc(&c, p, MTS_MB_CHAR_MAX) < 0)
-				return (0);
-
-			if (c == 0)
-				break;
-
-			c = codepage_tolower(c);
-			p += mts_wctomb(p, c);
-		}
-	}
-
-	return (s);
-}
-
-
-/*
- * isstrlwr
- *
- * Returns 1 if string contains NO uppercase chars 0 otherwise. However,
- * -1 is returned if "s" is not a valid multi-byte string.
- */
-int
-utf8_isstrlwr(const char *s)
-{
-	mts_wchar_t c;
-	int n;
-	const char *p = s;
-
-	while (*p) {
-		if (mts_isascii(*p) && codepage_isupper(*p))
-			return (0);
-		else {
-			if ((n = mts_mbtowc(&c, p, MTS_MB_CHAR_MAX)) < 0)
-				return (-1);
-
-			if (c == 0)
-				break;
-
-			if (codepage_isupper(c))
-				return (0);
-
-			p += n;
-		}
-	}
-
-	return (1);
-}
-
-
-/*
- * isstrupr
- *
- * Returns 1 if string contains NO lowercase chars 0 otherwise. However,
- * -1 is returned if "s" is not a valid multi-byte string.
- */
-int
-utf8_isstrupr(const char *s)
-{
-	mts_wchar_t c;
-	int n;
-	const char *p = s;
-
-	while (*p) {
-		if (mts_isascii(*p) && codepage_islower(*p))
-			return (0);
-		else {
-			if ((n = mts_mbtowc(&c, p, MTS_MB_CHAR_MAX)) < 0)
-				return (-1);
-
-			if (c == 0)
-				break;
-
-			if (codepage_islower(c))
-				return (0);
-
-			p += n;
-		}
-	}
-
-	return (1);
-}
-
-
-/*
- * strcasecmp
- *
- * Compare the null-terminated strings s1 and s2 and return an integer
- * greater than, equal to, or less than 0, according as s1 is lexico
- * graphically greater than, equal to, or less than s2 after translation
- * of each corresponding character to lowercase. The strings themselves
- * are not modified.
- *
- * Out:    0 if strings are equal
- *       < 0 if first string < second string
- *       > 0 if first string > second string
- */
-int
-utf8_strcasecmp(const char *s1, const char *s2)
-{
-	mts_wchar_t c1, c2;
-	int n1, n2;
-	const char *p1 = s1;
-	const char *p2 = s2;
-
-	for (;;) {
-		if (mts_isascii(*p1))
-			c1 = *p1++;
-		else {
-			if ((n1 = mts_mbtowc(&c1, p1, MTS_MB_CHAR_MAX)) < 0)
-				return (-1);
-			p1 += n1;
-		}
-
-		if (mts_isascii(*p2))
-			c2 = *p2++;
-		else {
-			if ((n2 = mts_mbtowc(&c2, p2, MTS_MB_CHAR_MAX)) < 0)
-				return (1);
-			p2 += n2;
-		}
-
-		if (c1 == 0 || c2 == 0)
-			break;
-
-		if (c1 == c2)
-			continue;
-
-		c1 = codepage_tolower(c1);
-		c2 = codepage_tolower(c2);
-
-		if (c1 != c2)
-			break;
-	}
-
-	return ((int)c1 - (int)c2);
-}
-
-
-/*
- * strncasecmp
- *
- * Compare two null-terminated strings, s1 and s2, of at most len
- * characters and return an int greater than, equal to, or less than 0,
- * dependent on whether s1 is lexicographically greater than, equal to,
- * or less than s2 after translation of each corresponding character to
- * lowercase. The original strings are not modified.
- *
- * Out:    0 if strings are equal
- *       < 0 if first string < second string
- *       > 0 if first string > second string
- */
-int
-utf8_strncasecmp(const char *s1, const char *s2, int len)
-{
-	mts_wchar_t c1, c2;
-	int n1, n2;
-	const char *p1 = s1;
-	const char *p2 = s2;
-
-	if (len <= 0)
-		return (0);
-
-	while (len--) {
-		if (mts_isascii(*p1))
-			c1 = *p1++;
-		else {
-			if ((n1 = mts_mbtowc(&c1, p1, MTS_MB_CHAR_MAX)) < 0)
-				return (-1);
-			p1 += n1;
-		}
-
-		if (mts_isascii(*p2))
-			c2 = *p2++;
-		else {
-			if ((n2 = mts_mbtowc(&c2, p2, MTS_MB_CHAR_MAX)) < 0)
-				return (1);
-			p2 += n2;
-		}
-
-		if (c1 == 0 || c2 == 0)
-			break;
-
-		if (c1 == c2)
-			continue;
-
-		c1 = codepage_tolower(c1);
-		c2 = codepage_tolower(c2);
-
-		if (c1 != c2)
-			break;
-	}
-
-	return ((int)c1 - (int)c2);
-}
-
-
-
-int
-utf8_isstrascii(const char *s)
-{
-	while (*s) {
-		if (mts_isascii(*s) == 0)
-			return (0);
-		s++;
-	}
-	return (1);
-}
--- a/usr/src/common/smbsrv/smb_string.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/common/smbsrv/smb_string.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,27 +19,35 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-/*
- * Implementation of some of the string functions.
- */
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #ifdef _KERNEL
 #include <sys/types.h>
 #include <sys/sunddi.h>
 #else
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <strings.h>
 #endif
+#include <sys/u8_textprep.h>
+#include <smbsrv/alloc.h>
 #include <smbsrv/string.h>
-#include <smbsrv/ctype.h>
+#include <smbsrv/cp_usascii.h>
+#include <smbsrv/cp_unicode.h>
+
+#define	UNICODE_N_ENTRIES	(sizeof (a_unicode) / sizeof (a_unicode[0]))
 
+/*
+ * Global pointer to the current codepage: defaults to ASCII,
+ * and a flag indicating whether the codepage is Unicode or ASCII.
+ */
+static smb_codepage_t *current_codepage = usascii_codepage;
+static boolean_t is_unicode = B_FALSE;
+
+static smb_codepage_t *smb_unicode_init(void);
 
 /*
  * strsubst
@@ -100,3 +108,305 @@
 	*q = '\0';
 	return (buf);
 }
+
+void
+smb_codepage_init(void)
+{
+	smb_codepage_t *cp;
+
+	if (is_unicode)
+		return;
+
+	if ((cp = smb_unicode_init()) != NULL) {
+		current_codepage = cp;
+		is_unicode = B_TRUE;
+	} else {
+		current_codepage = usascii_codepage;
+		is_unicode = B_FALSE;
+	}
+}
+
+/*
+ * Determine whether or not a character is an uppercase character.
+ * This function operates on the current codepage table. Returns
+ * non-zero if the character is uppercase. Otherwise returns zero.
+ */
+int
+smb_isupper(int c)
+{
+	uint16_t mask = is_unicode ? 0xffff : 0xff;
+
+	return (current_codepage[c & mask].ctype & CODEPAGE_ISUPPER);
+}
+
+/*
+ * Determine whether or not a character is an lowercase character.
+ * This function operates on the current codepage table. Returns
+ * non-zero if the character is lowercase. Otherwise returns zero.
+ */
+int
+smb_islower(int c)
+{
+	uint16_t mask = is_unicode ? 0xffff : 0xff;
+
+	return (current_codepage[c & mask].ctype & CODEPAGE_ISLOWER);
+}
+
+/*
+ * Convert individual characters to their uppercase equivalent value.
+ * If the specified character is lowercase, the uppercase value will
+ * be returned. Otherwise the original value will be returned.
+ */
+int
+smb_toupper(int c)
+{
+	uint16_t mask = is_unicode ? 0xffff : 0xff;
+
+	return (current_codepage[c & mask].upper);
+}
+
+/*
+ * Convert individual characters to their lowercase equivalent value.
+ * If the specified character is uppercase, the lowercase value will
+ * be returned. Otherwise the original value will be returned.
+ */
+int
+smb_tolower(int c)
+{
+	uint16_t mask = is_unicode ? 0xffff : 0xff;
+
+	return (current_codepage[c & mask].lower);
+}
+
+/*
+ * Convert a string to uppercase using the appropriate codepage. The
+ * string is converted in place. A pointer to the string is returned.
+ * There is an assumption here that uppercase and lowercase values
+ * always result encode to the same length.
+ */
+char *
+smb_strupr(char *s)
+{
+	smb_wchar_t c;
+	char *p = s;
+
+	while (*p) {
+		if (smb_isascii(*p)) {
+			*p = smb_toupper(*p);
+			p++;
+		} else {
+			if (smb_mbtowc(&c, p, MTS_MB_CHAR_MAX) < 0)
+				return (0);
+
+			if (c == 0)
+				break;
+
+			c = smb_toupper(c);
+			p += smb_wctomb(p, c);
+		}
+	}
+
+	return (s);
+}
+
+/*
+ * Convert a string to lowercase using the appropriate codepage. The
+ * string is converted in place. A pointer to the string is returned.
+ * There is an assumption here that uppercase and lowercase values
+ * always result encode to the same length.
+ */
+char *
+smb_strlwr(char *s)
+{
+	smb_wchar_t c;
+	char *p = s;
+
+	while (*p) {
+		if (smb_isascii(*p)) {
+			*p = smb_tolower(*p);
+			p++;
+		} else {
+			if (smb_mbtowc(&c, p, MTS_MB_CHAR_MAX) < 0)
+				return (0);
+
+			if (c == 0)
+				break;
+
+			c = smb_tolower(c);
+			p += smb_wctomb(p, c);
+		}
+	}
+
+	return (s);
+}
+
+/*
+ * Returns 1 if string contains NO uppercase chars 0 otherwise. However,
+ * -1 is returned if "s" is not a valid multi-byte string.
+ */
+int
+smb_isstrlwr(const char *s)
+{
+	smb_wchar_t c;
+	int n;
+	const char *p = s;
+
+	while (*p) {
+		if (smb_isascii(*p) && smb_isupper(*p))
+			return (0);
+		else {
+			if ((n = smb_mbtowc(&c, p, MTS_MB_CHAR_MAX)) < 0)
+				return (-1);
+
+			if (c == 0)
+				break;
+
+			if (smb_isupper(c))
+				return (0);
+
+			p += n;
+		}
+	}
+
+	return (1);
+}
+
+/*
+ * Returns 1 if string contains NO lowercase chars 0 otherwise. However,
+ * -1 is returned if "s" is not a valid multi-byte string.
+ */
+int
+smb_isstrupr(const char *s)
+{
+	smb_wchar_t c;
+	int n;
+	const char *p = s;
+
+	while (*p) {
+		if (smb_isascii(*p) && smb_islower(*p))
+			return (0);
+		else {
+			if ((n = smb_mbtowc(&c, p, MTS_MB_CHAR_MAX)) < 0)
+				return (-1);
+
+			if (c == 0)
+				break;
+
+			if (smb_islower(c))
+				return (0);
+
+			p += n;
+		}
+	}
+
+	return (1);
+}
+
+/*
+ * Compare the null-terminated strings s1 and s2 and return an integer
+ * greater than, equal to or less than 0 dependent on whether s1 is
+ * lexicographically greater than, equal to or less than s2 after
+ * translation of each character to lowercase.  The original strings
+ * are not modified.
+ *
+ * If n is non-zero, at most n bytes are compared.  Otherwise, the strings
+ * are compared until a null terminator is encountered.
+ *
+ * Out:    0 if strings are equal
+ *       < 0 if first string < second string
+ *       > 0 if first string > second string
+ */
+int
+smb_strcasecmp(const char *s1, const char *s2, size_t n)
+{
+	int	err = 0;
+	int	rc;
+
+	rc = u8_strcmp(s1, s2, n, U8_STRCMP_CI_LOWER, U8_UNICODE_LATEST, &err);
+	if (err != 0)
+		return (-1);
+	return (rc);
+}
+
+/*
+ * First build a codepage based on cp_unicode.h.  Then build the unicode
+ * codepage from this interim codepage by copying the entries over while
+ * fixing them and filling in the gaps.
+ */
+static smb_codepage_t *
+smb_unicode_init(void)
+{
+	smb_codepage_t	*unicode;
+	uint32_t	a = 0;
+	uint32_t	b = 0;
+
+	unicode = MEM_ZALLOC("unicode", sizeof (smb_codepage_t) << 16);
+	if (unicode == NULL)
+		return (NULL);
+
+	while (b != 0xffff) {
+		/*
+		 * If there is a gap in the standard,
+		 * fill in the gap with no-case entries.
+		 */
+		if (UNICODE_N_ENTRIES <= a || a_unicode[a].val > b) {
+			unicode[b].ctype = CODEPAGE_ISNONE;
+			unicode[b].upper = (smb_wchar_t)b;
+			unicode[b].lower = (smb_wchar_t)b;
+			b++;
+			continue;
+		}
+
+		/*
+		 * Copy the entry and fixup as required.
+		 */
+		switch (a_unicode[a].ctype) {
+		case CODEPAGE_ISNONE:
+			/*
+			 * Replace 0xffff in upper/lower fields with its val.
+			 */
+			unicode[b].ctype = CODEPAGE_ISNONE;
+			unicode[b].upper = (smb_wchar_t)b;
+			unicode[b].lower = (smb_wchar_t)b;
+			break;
+		case CODEPAGE_ISUPPER:
+			/*
+			 * Some characters may have case yet not have
+			 * case conversion.  Treat them as no-case.
+			 */
+			if (a_unicode[a].lower == 0xffff) {
+				unicode[b].ctype = CODEPAGE_ISNONE;
+				unicode[b].upper = (smb_wchar_t)b;
+				unicode[b].lower = (smb_wchar_t)b;
+			} else {
+				unicode[b].ctype = CODEPAGE_ISUPPER;
+				unicode[b].upper = (smb_wchar_t)b;
+				unicode[b].lower = a_unicode[a].lower;
+			}
+			break;
+		case CODEPAGE_ISLOWER:
+			/*
+			 * Some characters may have case yet not have
+			 * case conversion.  Treat them as no-case.
+			 */
+			if (a_unicode[a].upper == 0xffff) {
+				unicode[b].ctype = CODEPAGE_ISNONE;
+				unicode[b].upper = (smb_wchar_t)b;
+				unicode[b].lower = (smb_wchar_t)b;
+			} else {
+				unicode[b].ctype = CODEPAGE_ISLOWER;
+				unicode[b].upper = a_unicode[a].upper;
+				unicode[b].lower = (smb_wchar_t)b;
+			}
+			break;
+		default:
+			MEM_FREE("unicode", unicode);
+			return (NULL);
+		}
+
+		a++;
+		b++;
+	};
+
+	return (unicode);
+}
--- a/usr/src/common/smbsrv/smb_utf8.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/common/smbsrv/smb_utf8.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -48,8 +48,6 @@
  * October 1996
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #ifdef _KERNEL
 #include <sys/types.h>
 #include <sys/sunddi.h>
@@ -59,7 +57,6 @@
 #include <assert.h>
 #include <strings.h>
 #endif
-#include <smbsrv/smb_i18n.h>
 #include <smbsrv/string.h>
 
 
@@ -76,13 +73,13 @@
  * multibyte character is encountered.
  */
 size_t
-mts_mbstowcs(mts_wchar_t *wcstring, const char *mbstring, size_t nwchars)
+smb_mbstowcs(smb_wchar_t *wcstring, const char *mbstring, size_t nwchars)
 {
 	int len;
-	mts_wchar_t	*start = wcstring;
+	smb_wchar_t	*start = wcstring;
 
 	while (nwchars--) {
-		len = mts_mbtowc(wcstring, mbstring, MTS_MB_CHAR_MAX);
+		len = smb_mbtowc(wcstring, mbstring, MTS_MB_CHAR_MAX);
 		if (len < 0) {
 			*wcstring = 0;
 			return ((size_t)-1);
@@ -117,10 +114,10 @@
  * mbchar.  If mbchar is invalid, returns -1.
  */
 int /*ARGSUSED*/
-mts_mbtowc(mts_wchar_t *wcharp, const char *mbchar, size_t nbytes)
+smb_mbtowc(smb_wchar_t *wcharp, const char *mbchar, size_t nbytes)
 {
 	unsigned char mbyte;
-	mts_wchar_t wide_char;
+	smb_wchar_t wide_char;
 	int count;
 	int bytes_left;
 
@@ -130,7 +127,7 @@
 	/* 0xxxxxxx -> 1 byte ASCII encoding */
 	if (((mbyte = *mbchar++) & 0x80) == 0) {
 		if (wcharp)
-			*wcharp = (mts_wchar_t)mbyte;
+			*wcharp = (smb_wchar_t)mbyte;
 
 		return (mbyte ? 1 : 0);
 	}
@@ -176,7 +173,7 @@
  * Returns the numberof bytes written to mbchar.
  */
 int
-mts_wctomb(char *mbchar, mts_wchar_t wchar)
+smb_wctomb(char *mbchar, smb_wchar_t wchar)
 {
 	if ((wchar & ~0x7f) == 0) {
 		*mbchar = (char)wchar;
@@ -209,11 +206,11 @@
  * null byte.
  */
 size_t
-mts_wcstombs(char *mbstring, const mts_wchar_t *wcstring, size_t nbytes)
+smb_wcstombs(char *mbstring, const smb_wchar_t *wcstring, size_t nbytes)
 {
 	char *start = mbstring;
-	const mts_wchar_t *wcp = wcstring;
-	mts_wchar_t wide_char;
+	const smb_wchar_t *wcp = wcstring;
+	smb_wchar_t wide_char;
 	char buf[4];
 	size_t len;
 
@@ -222,7 +219,7 @@
 
 	while (nbytes > MTS_MB_CHAR_MAX) {
 		wide_char = *wcp++;
-		len = mts_wctomb(mbstring, wide_char);
+		len = smb_wctomb(mbstring, wide_char);
 
 		if (wide_char == 0)
 			/*LINTED E_PTRDIFF_OVERFLOW*/
@@ -234,7 +231,7 @@
 
 	while (wide_char && nbytes) {
 		wide_char = *wcp++;
-		if ((len = mts_wctomb(buf, wide_char)) > nbytes) {
+		if ((len = smb_wctomb(buf, wide_char)) > nbytes) {
 			*mbstring = 0;
 			break;
 		}
@@ -255,18 +252,18 @@
  * counting the terminating null wide character.
  */
 size_t
-mts_wcequiv_strlen(const char *mbs)
+smb_wcequiv_strlen(const char *mbs)
 {
-	mts_wchar_t	wide_char;
+	smb_wchar_t	wide_char;
 	size_t bytes;
 	size_t len = 0;
 
 	while (*mbs) {
-		bytes = mts_mbtowc(&wide_char, mbs, MTS_MB_CHAR_MAX);
+		bytes = smb_mbtowc(&wide_char, mbs, MTS_MB_CHAR_MAX);
 		if (bytes == ((size_t)-1))
 			return ((size_t)-1);
 
-		len += sizeof (mts_wchar_t);
+		len += sizeof (smb_wchar_t);
 		mbs += bytes;
 	}
 
@@ -280,19 +277,19 @@
  * not counting the terminating null character.
  */
 size_t
-mts_sbequiv_strlen(const char *mbs)
+smb_sbequiv_strlen(const char *mbs)
 {
-	mts_wchar_t	wide_char;
+	smb_wchar_t	wide_char;
 	size_t nbytes;
 	size_t len = 0;
 
 	while (*mbs) {
-		nbytes = mts_mbtowc(&wide_char, mbs, MTS_MB_CHAR_MAX);
+		nbytes = smb_mbtowc(&wide_char, mbs, MTS_MB_CHAR_MAX);
 		if (nbytes == ((size_t)-1))
 			return ((size_t)-1);
 
 		if (wide_char & 0xFF00)
-			len += sizeof (mts_wchar_t);
+			len += sizeof (smb_wchar_t);
 		else
 			++len;
 
@@ -319,13 +316,13 @@
  * If either mbstring or string is a null pointer, -1 is returned.
  */
 int
-mts_stombs(char *mbstring, char *string, int max_mblen)
+smb_stombs(char *mbstring, char *string, int max_mblen)
 {
 	char *start = mbstring;
 	unsigned char *p = (unsigned char *)string;
 	int space_left = max_mblen;
 	int	len;
-	mts_wchar_t	wide_char;
+	smb_wchar_t	wide_char;
 	char buf[4];
 
 	if (!mbstring || !string)
@@ -333,14 +330,14 @@
 
 	while (*p && space_left > 2) {
 		wide_char = *p++;
-		len = mts_wctomb(mbstring, wide_char);
+		len = smb_wctomb(mbstring, wide_char);
 		mbstring += len;
 		space_left -= len;
 	}
 
 	if (*p) {
 		wide_char = *p;
-		if ((len = mts_wctomb(buf, wide_char)) < 2) {
+		if ((len = smb_wctomb(buf, wide_char)) < 2) {
 			*mbstring = *buf;
 			mbstring += len;
 			space_left -= len;
@@ -371,9 +368,9 @@
  * If either mbstring or string is a null pointer, -1 is returned.
  */
 int
-mts_mbstos(char *string, const char *mbstring)
+smb_mbstos(char *string, const char *mbstring)
 {
-	mts_wchar_t wc;
+	smb_wchar_t wc;
 	unsigned char *start = (unsigned char *)string;
 	int len;
 
@@ -381,15 +378,15 @@
 		return (-1);
 
 	while (*mbstring) {
-		if ((len = mts_mbtowc(&wc, mbstring, MTS_MB_CHAR_MAX)) < 0) {
+		if ((len = smb_mbtowc(&wc, mbstring, MTS_MB_CHAR_MAX)) < 0) {
 			*string = 0;
 			return (-1);
 		}
 
 		if (wc & 0xFF00) {
 			/*LINTED E_BAD_PTR_CAST_ALIGN*/
-			*((mts_wchar_t *)string) = wc;
-			string += sizeof (mts_wchar_t);
+			*((smb_wchar_t *)string) = wc;
+			string += sizeof (smb_wchar_t);
 		}
 		else
 		{
--- a/usr/src/lib/libadutils/common/addisc.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/libadutils/common/addisc.c	Thu Nov 05 14:34:36 2009 -0800
@@ -672,7 +672,7 @@
 		char **rrname, uint32_t *ttl)
 {
 	idmap_ad_disc_ds_t *srv;
-	idmap_ad_disc_ds_t *srv_res;
+	idmap_ad_disc_ds_t *srv_res = NULL;
 	union {
 		HEADER hdr;
 		uchar_t buf[NS_MAXMSG];
@@ -748,6 +748,11 @@
 	/* 3. walk through the answer section */
 
 	srv_res = calloc(ancount + 1, sizeof (idmap_ad_disc_ds_t));
+	if (srv_res == NULL) {
+		logger(LOG_ERR, "Out of memory");
+		return (NULL);
+	}
+
 	*ttl = (uint32_t)-1;
 
 	for (srv = srv_res, cnt = ancount;
@@ -757,10 +762,15 @@
 		    sizeof (namebuf));
 		if (len < 0) {
 			logger(LOG_ERR, "DNS query invalid message format");
-			return (NULL);
+			goto err;
 		}
-		if (rrname != NULL && *rrname == NULL)
+		if (rrname != NULL && *rrname == NULL) {
 			*rrname = strdup(namebuf);
+			if (*rrname == NULL) {
+				logger(LOG_ERR, "Out of memory");
+				goto err;
+			}
+		}
 		ptr += len;
 		NS_GET16(type, ptr);
 		NS_GET16(class, ptr);
@@ -768,7 +778,7 @@
 		NS_GET16(size, ptr);
 		if ((end = ptr + size) > eom) {
 			logger(LOG_ERR, "DNS query invalid message format");
-			return (NULL);
+			goto err;
 		}
 
 		if (type != T_SRV) {
@@ -783,7 +793,7 @@
 		    sizeof (srv->host));
 		if (len < 0) {
 			logger(LOG_ERR, "DNS query invalid SRV record");
-			return (NULL);
+			goto err;
 		}
 
 		if (rttl < *ttl)
@@ -803,6 +813,14 @@
 		    (int (*)(const void *, const void *))srvcmp);
 
 	return (srv_res);
+
+err:
+	free(srv_res);
+	if (rrname != NULL) {
+		free(*rrname);
+		*rrname = NULL;
+	}
+	return (NULL);
 }
 
 
@@ -1045,6 +1063,7 @@
 		adutils_sid_t	sid;
 		char		*sid_str;
 		char 		*name;
+		char		*dn;
 
 		sid_ber = ldap_get_values_len(*ld, entry,
 		    "objectSid");
@@ -1062,7 +1081,9 @@
 		strcpy(domains[ndomains].sid, sid_str);
 		free(sid_str);
 
-		name = DN_to_DNS(ldap_get_dn(*ld, entry));
+		dn = ldap_get_dn(*ld, entry);
+		name = DN_to_DNS(dn);
+		free(dn);
 		if (name == NULL)
 			goto err;
 
--- a/usr/src/lib/libidmap/common/idmap_api.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/libidmap/common/idmap_api.c	Thu Nov 05 14:34:36 2009 -0800
@@ -2306,7 +2306,7 @@
 /*
  * This routine is similar to idmap_info_cpy, but the strings
  * are moved from the "from" info to the "to" info.
- * This routine is equivelent of:
+ * This routine is equivalent to:
  *
  *	idmap_info_cpy(to,from);
  *	idmap_info_free(from);
--- a/usr/src/lib/libshare/smb/smb_share_doorclnt.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/libshare/smb/smb_share_doorclnt.c	Thu Nov 05 14:34:36 2009 -0800
@@ -42,7 +42,7 @@
 #include <smbsrv/libsmb.h>
 #include <smbsrv/smb_share.h>
 #include <smbsrv/lmerr.h>
-#include <smbsrv/cifs.h>
+#include <smbsrv/smb.h>
 
 #define	SMB_SHARE_DOOR_CALL_RETRIES		3
 
--- a/usr/src/lib/smbsrv/libmlrpc/common/ndr_heap.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlrpc/common/ndr_heap.c	Thu Nov 05 14:34:36 2009 -0800
@@ -186,8 +186,8 @@
 	if (s == NULL || out == NULL)
 		return (-1);
 
-	out->length = mts_wcequiv_strlen(s);
-	out->allosize = out->length + sizeof (mts_wchar_t);
+	out->length = smb_wcequiv_strlen(s);
+	out->allosize = out->length + sizeof (smb_wchar_t);
 
 	if ((out->str = ndr_heap_strdup(heap, s)) == NULL)
 		return (-1);
@@ -209,17 +209,17 @@
 {
 	int mlen;
 
-	vc->wclen = mts_wcequiv_strlen(s);
+	vc->wclen = smb_wcequiv_strlen(s);
 	vc->wcsize = vc->wclen;
 
-	mlen = sizeof (ndr_vcs_t) + vc->wcsize + sizeof (mts_wchar_t);
+	mlen = sizeof (ndr_vcs_t) + vc->wcsize + sizeof (smb_wchar_t);
 
 	vc->vcs = ndr_heap_malloc(heap, mlen);
 
 	if (vc->vcs) {
 		vc->vcs->vc_first_is = 0;
-		vc->vcs->vc_length_is = vc->wclen / sizeof (mts_wchar_t);
-		(void) mts_mbstowcs((mts_wchar_t *)vc->vcs->buffer, s,
+		vc->vcs->vc_length_is = vc->wclen / sizeof (smb_wchar_t);
+		(void) smb_mbstowcs((smb_wchar_t *)vc->vcs->buffer, s,
 		    vc->vcs->vc_length_is);
 	}
 }
--- a/usr/src/lib/smbsrv/libmlrpc/common/ndr_process.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlrpc/common/ndr_process.c	Thu Nov 05 14:34:36 2009 -0800
@@ -1189,8 +1189,8 @@
 			 * size_is is the number of characters in the
 			 * (multibyte) string, including the null.
 			 */
-			size_is = (mts_wcequiv_strlen(valp) /
-			    sizeof (mts_wchar_t)) + 1;
+			size_is = (smb_wcequiv_strlen(valp) /
+			    sizeof (smb_wchar_t)) + 1;
 
 			if (size_is > NDR_STRING_MAX) {
 				NDR_SET_ERROR(outer_ref, NDR_ERR_STRLEN);
@@ -1919,7 +1919,7 @@
 		(void) sprintf(name, "[%lu]", i);
 
 		if (nds->m_op == NDR_M_OP_MARSHALL) {
-			count = mts_mbtowc((mts_wchar_t *)&wide_char, valp,
+			count = smb_mbtowc((smb_wchar_t *)&wide_char, valp,
 			    MTS_MB_CHAR_MAX);
 			if (count < 0) {
 				return (0);
@@ -1941,7 +1941,7 @@
 			return (0);
 
 		if (nds->m_op == NDR_M_OP_UNMARSHALL) {
-			count = mts_wctomb(valp, wide_char);
+			count = smb_wctomb(valp, wide_char);
 
 			if ((++char_count) == encl_ref->strlen_is) {
 				valp += count;
@@ -1970,10 +1970,10 @@
  * multibyte character is encountered.
  */
 size_t
-ndr_mbstowcs(ndr_stream_t *nds, mts_wchar_t *wcs, const char *mbs,
+ndr_mbstowcs(ndr_stream_t *nds, smb_wchar_t *wcs, const char *mbs,
     size_t nwchars)
 {
-	mts_wchar_t *start = wcs;
+	smb_wchar_t *start = wcs;
 	int nbytes;
 
 	while (nwchars--) {
@@ -1998,16 +1998,16 @@
  * is stored in wcharp.  Up to nbytes bytes are examined.
  *
  * If mbchar is valid, returns the number of bytes processed in mbchar.
- * If mbchar is invalid, returns -1.  See also mts_mbtowc().
+ * If mbchar is invalid, returns -1.  See also smb_mbtowc().
  */
 /*ARGSUSED*/
 int
-ndr_mbtowc(ndr_stream_t *nds, mts_wchar_t *wcharp, const char *mbchar,
+ndr_mbtowc(ndr_stream_t *nds, smb_wchar_t *wcharp, const char *mbchar,
     size_t nbytes)
 {
 	int rc;
 
-	if ((rc = mts_mbtowc(wcharp, mbchar, nbytes)) < 0)
+	if ((rc = smb_mbtowc(wcharp, mbchar, nbytes)) < 0)
 		return (rc);
 
 #ifdef _BIG_ENDIAN
--- a/usr/src/lib/smbsrv/libmlsvc/common/dssetup_svc.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/dssetup_svc.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -184,7 +184,7 @@
 			return (NT_STATUS_CANT_ACCESS_DOMAIN_INFO);
 		}
 
-		(void) utf8_strlwr(dns_domain);
+		(void) smb_strlwr(dns_domain);
 
 		info->flags = 0;
 		info->nt_domain = NDR_STRDUP(mxa, nt_domain);
--- a/usr/src/lib/smbsrv/libmlsvc/common/eventlog_svc.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/eventlog_svc.c	Thu Nov 05 14:34:36 2009 -0800
@@ -43,7 +43,7 @@
 #define	LOGR_RECORD_SIGNATURE	0x654C664C
 
 #define	LOGR_PRI(p)		((p) & LOG_PRIMASK)
-#define	LOGR_WNSTRLEN(S)	((strlen((S)) + 1) * sizeof (mts_wchar_t))
+#define	LOGR_WNSTRLEN(S)	((strlen((S)) + 1) * sizeof (smb_wchar_t))
 
 #define	LOGR_MSG_DWORD_OFFSET	12
 #define	LOGR_MSG_WORD_OFFSET	4
@@ -437,15 +437,15 @@
 {
 	int srcname_len = 0, hostname_len = 0, len;
 	int str_offs, sh_len;
-	mts_wchar_t wcs_hostname[MAXHOSTNAMELEN];
-	mts_wchar_t wcs_srcname[SYS_NMLN * 2];
+	smb_wchar_t wcs_hostname[MAXHOSTNAMELEN];
+	smb_wchar_t wcs_srcname[SYS_NMLN * 2];
 
-	(void) mts_mbstowcs(wcs_srcname, src_name,
+	(void) smb_mbstowcs(wcs_srcname, src_name,
 	    strlen(src_name) + 1);
 	srcname_len = LOGR_WNSTRLEN(src_name);
 
 	/* Because, Solaris allows remote logging, need to get hostname here */
-	(void) mts_mbstowcs(wcs_hostname, le->le_hostname,
+	(void) smb_mbstowcs(wcs_hostname, le->le_hostname,
 	    strlen(le->le_hostname) + 1);
 	hostname_len = LOGR_WNSTRLEN(le->le_hostname);
 
@@ -476,7 +476,7 @@
 	len = strlen(le->le_msg) + 1;
 	if (len > 0)
 		/*LINTED E_BAD_PTR_CAST_ALIGN*/
-		(void) mts_mbstowcs((mts_wchar_t *)(rec->info + sh_len),
+		(void) smb_mbstowcs((smb_wchar_t *)(rec->info + sh_len),
 		    le->le_msg, len);
 
 	rec->Length2 = sizeof (logr_record_t);
--- a/usr/src/lib/smbsrv/libmlsvc/common/libmlsvc.h	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/libmlsvc.h	Thu Nov 05 14:34:36 2009 -0800
@@ -175,7 +175,7 @@
  * Calculate the wide-char equivalent string length required to
  * store a string - including the terminating null wide-char.
  */
-#define	SVCCTL_WNSTRLEN(S)	((strlen((S)) + 1) * sizeof (mts_wchar_t))
+#define	SVCCTL_WNSTRLEN(S)	((strlen((S)) + 1) * sizeof (smb_wchar_t))
 
 /* An AVL-storable node representing each service in the SCM database. */
 typedef struct svcctl_svc_node {
--- a/usr/src/lib/smbsrv/libmlsvc/common/lsalib.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/lsalib.c	Thu Nov 05 14:34:36 2009 -0800
@@ -316,7 +316,7 @@
 	if ((wkadom = smb_wka_get_domain(wka->wka_domidx)) == NULL)
 		return (NT_STATUS_INTERNAL_ERROR);
 
-	if ((domain != NULL) && (utf8_strcasecmp(domain, wkadom) != 0))
+	if ((domain != NULL) && (smb_strcasecmp(domain, wkadom, 0) != 0))
 		return (NT_STATUS_NONE_MAPPED);
 
 	info->a_name = strdup(name);
--- a/usr/src/lib/smbsrv/libmlsvc/common/lsar_lookup.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/lsar_lookup.c	Thu Nov 05 14:34:36 2009 -0800
@@ -239,10 +239,10 @@
 				name = p;
 		}
 
-		length = mts_wcequiv_strlen(name) + sizeof (mts_wchar_t);
+		length = smb_wcequiv_strlen(name) + sizeof (smb_wchar_t);
 		arg.lookup_level = MSLSA_LOOKUP_LEVEL_1;
 	} else {
-		length = mts_wcequiv_strlen(name);
+		length = smb_wcequiv_strlen(name);
 		arg.lookup_level = MSLSA_LOOKUP_LEVEL_1;
 	}
 
@@ -594,9 +594,9 @@
 	bzero(&arg, sizeof (struct mslsa_LookupPrivValue));
 	(void) memcpy(&arg.handle, lsa_handle, sizeof (mslsa_handle_t));
 
-	length = mts_wcequiv_strlen(name);
+	length = smb_wcequiv_strlen(name);
 	if (ndr_rpc_server_os(lsa_handle) == NATIVE_OS_WIN2000)
-		length += sizeof (mts_wchar_t);
+		length += sizeof (smb_wchar_t);
 
 	arg.name.length = length;
 	arg.name.allosize = length;
@@ -682,7 +682,7 @@
 	bzero(&arg, sizeof (struct mslsa_LookupPrivDisplayName));
 	(void) memcpy(&arg.handle, lsa_handle, sizeof (mslsa_handle_t));
 
-	length = mts_wcequiv_strlen(name);
+	length = smb_wcequiv_strlen(name);
 	arg.name.length = length;
 	arg.name.allosize = length;
 	arg.name.str = (unsigned char *)name;
@@ -827,7 +827,7 @@
 	arg.name_table = (struct mslsa_lup_name_table *)&name_table;
 	name_table.n_entry = 1;
 
-	length = mts_wcequiv_strlen(name) + sizeof (mts_wchar_t);
+	length = smb_wcequiv_strlen(name) + sizeof (smb_wchar_t);
 	name_table.name[0].length = length;
 	name_table.name[0].allosize = length;
 	name_table.name[0].str = (unsigned char *)name;
--- a/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_client.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_client.c	Thu Nov 05 14:34:36 2009 -0800
@@ -580,8 +580,8 @@
 ndr_svinfo_match(const char *server, const char *domain,
     const ndr_svinfo_t *svi)
 {
-	if ((utf8_strcasecmp(server, svi->svi_server) == 0) &&
-	    (utf8_strcasecmp(domain, svi->svi_domain) == 0)) {
+	if ((smb_strcasecmp(server, svi->svi_server, 0) == 0) &&
+	    (smb_strcasecmp(domain, svi->svi_domain, 0) == 0)) {
 		return (B_TRUE);
 	}
 
--- a/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_domain.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_domain.c	Thu Nov 05 14:34:36 2009 -0800
@@ -287,7 +287,7 @@
 		return (B_FALSE);
 
 	if ((*dnsdomain != '\0') &&
-	    utf8_strcasecmp(domain, dxi->d_primary.di_nbname))
+	    smb_strcasecmp(domain, dxi->d_primary.di_nbname, 0))
 		return (B_FALSE);
 
 	/*
@@ -335,7 +335,7 @@
 				first_label[15] = '\0';
 		}
 
-		if (utf8_strcasecmp(nb_domain, first_label) == 0) {
+		if (smb_strcasecmp(nb_domain, first_label, 0) == 0) {
 			found = B_TRUE;
 			(void) strlcpy(buf, entry, len);
 			break;
@@ -418,9 +418,9 @@
 	    NULL, NULL, NULL);
 
 	if (SMB_IS_FQDN(domain))
-		use = (utf8_strcasecmp(dinfo->di_fqname, domain) == 0);
+		use = (smb_strcasecmp(dinfo->di_fqname, domain, 0) == 0);
 	else
-		use = (utf8_strcasecmp(dinfo->di_nbname, domain) == 0);
+		use = (smb_strcasecmp(dinfo->di_nbname, domain, 0) == 0);
 
 	if (use)
 		smb_config_getdomaininfo(NULL, NULL, dinfo->di_sid,
--- a/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/mlsvc_util.c	Thu Nov 05 14:34:36 2009 -0800
@@ -172,7 +172,7 @@
 			if (status == NT_STATUS_SUCCESS) {
 				(void) smb_getnetbiosname(machine_passwd,
 				    sizeof (machine_passwd));
-				(void) utf8_strlwr(machine_passwd);
+				(void) smb_strlwr(machine_passwd);
 			}
 		}
 
--- a/usr/src/lib/smbsrv/libmlsvc/common/samlib.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/samlib.c	Thu Nov 05 14:34:36 2009 -0800
@@ -382,7 +382,7 @@
 sam_oem_password(oem_password_t *oem_password, unsigned char *new_password,
     unsigned char *old_password)
 {
-	mts_wchar_t *unicode_password;
+	smb_wchar_t *unicode_password;
 	int length;
 
 #ifdef PBSHORTCUT
@@ -390,7 +390,7 @@
 #endif /* PBSHORTCUT */
 
 	length = strlen((char const *)new_password);
-	unicode_password = alloca((length + 1) * sizeof (mts_wchar_t));
+	unicode_password = alloca((length + 1) * sizeof (smb_wchar_t));
 
 	length = smb_auth_qnd_unicode((unsigned short *)unicode_password,
 	    (char *)new_password, length);
--- a/usr/src/lib/smbsrv/libmlsvc/common/samr_lookup.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/samr_lookup.c	Thu Nov 05 14:34:36 2009 -0800
@@ -71,9 +71,9 @@
 	(void) memcpy(&arg.handle, &samr_handle->handle,
 	    sizeof (samr_handle_t));
 
-	length = mts_wcequiv_strlen(domain_name);
+	length = smb_wcequiv_strlen(domain_name);
 	if (ndr_rpc_server_os(samr_handle) == NATIVE_OS_WIN2000)
-		length += sizeof (mts_wchar_t);
+		length += sizeof (smb_wchar_t);
 
 	arg.domain_name.length = length;
 	arg.domain_name.allosize = length;
@@ -161,9 +161,9 @@
 	arg.index = 0;
 	arg.total = 1;
 
-	length = mts_wcequiv_strlen(name);
+	length = smb_wcequiv_strlen(name);
 	if (ndr_rpc_server_os(domain_handle) == NATIVE_OS_WIN2000)
-		length += sizeof (mts_wchar_t);
+		length += sizeof (smb_wchar_t);
 
 	arg.name.length = length;
 	arg.name.allosize = length;
@@ -511,7 +511,7 @@
 	if (smb_getnetbiosname(hostname, sizeof (hostname)) != 0)
 		return (-1);
 
-	(void) utf8_strlwr(hostname);
+	(void) smb_strlwr(hostname);
 
 	/*
 	 * Generate the OEM password from the hostname and the user session
--- a/usr/src/lib/smbsrv/libmlsvc/common/smb_logon.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/smb_logon.c	Thu Nov 05 14:34:36 2009 -0800
@@ -502,7 +502,7 @@
 	}
 
 	smb_guest_account(guest, SMB_USERNAME_MAXLEN);
-	isguest = (utf8_strcasecmp(guest, clnt->e_username) == 0);
+	isguest = (smb_strcasecmp(guest, clnt->e_username, 0) == 0);
 
 	status = smb_token_auth_local(clnt, token, &smbpw);
 	if (status == NT_STATUS_SUCCESS) {
--- a/usr/src/lib/smbsrv/libmlsvc/common/smb_share.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/smb_share.c	Thu Nov 05 14:34:36 2009 -0800
@@ -47,11 +47,8 @@
 #include <smbsrv/libsmb.h>
 #include <smbsrv/libsmbns.h>
 #include <smbsrv/libmlsvc.h>
-
-#include <smbsrv/lm.h>
 #include <smbsrv/smb_share.h>
-#include <smbsrv/cifs.h>
-#include <smbsrv/nterror.h>
+#include <smbsrv/smb.h>
 #include <mlsvc.h>
 
 #define	SMB_SHR_ERROR_THRESHOLD		3
@@ -800,7 +797,7 @@
 		return (B_FALSE);
 
 	for (i = 0; i < sizeof (restricted)/sizeof (restricted[0]); i++) {
-		if (utf8_strcasecmp(restricted[i], sharename) == 0)
+		if (smb_strcasecmp(restricted[i], sharename, 0) == 0)
 			return (B_TRUE);
 	}
 
@@ -825,7 +822,7 @@
 		return (B_FALSE);
 
 	if (strlen(sharename) == 2 &&
-	    mts_isalpha(sharename[0]) && sharename[1] == '$') {
+	    smb_isalpha(sharename[0]) && sharename[1] == '$') {
 		return (B_TRUE);
 	}
 
@@ -1122,24 +1119,23 @@
 static void
 smb_shr_set_oemname(smb_share_t *si)
 {
-	unsigned int cpid = oem_get_smb_cpid();
-	mts_wchar_t *unibuf;
+	smb_wchar_t *unibuf;
 	char *oem_name;
 	int length;
 
 	length = strlen(si->shr_name) + 1;
 
 	oem_name = malloc(length);
-	unibuf = malloc(length * sizeof (mts_wchar_t));
+	unibuf = malloc(length * sizeof (smb_wchar_t));
 	if ((oem_name == NULL) || (unibuf == NULL)) {
 		free(oem_name);
 		free(unibuf);
 		return;
 	}
 
-	(void) mts_mbstowcs(unibuf, si->shr_name, length);
+	(void) smb_mbstowcs(unibuf, si->shr_name, length);
 
-	if (unicodestooems(oem_name, unibuf, length, cpid) == 0)
+	if (ucstooem(oem_name, unibuf, length, OEM_CPG_850) == 0)
 		(void) strcpy(oem_name, si->shr_name);
 
 	free(unibuf);
@@ -1284,7 +1280,7 @@
 {
 	HT_ITEM *item;
 
-	(void) utf8_strlwr(sharename);
+	(void) smb_strlwr(sharename);
 	item = ht_find_item(smb_shr_cache.sc_cache, sharename);
 	if (item && item->hi_data)
 		return ((smb_share_t *)item->hi_data);
@@ -1333,7 +1329,7 @@
 
 	bcopy(si, cache_ent, sizeof (smb_share_t));
 
-	(void) utf8_strlwr(cache_ent->shr_name);
+	(void) smb_strlwr(cache_ent->shr_name);
 	smb_shr_set_oemname(cache_ent);
 
 	if ((si->shr_type & STYPE_IPC) == 0)
@@ -1363,7 +1359,7 @@
 static void
 smb_shr_cache_delent(char *sharename)
 {
-	(void) utf8_strlwr(sharename);
+	(void) smb_strlwr(sharename);
 	(void) ht_remove_item(smb_shr_cache.sc_cache, sharename);
 }
 
@@ -2192,8 +2188,7 @@
 	char hostname[MAXHOSTNAMELEN];
 	char ip_str[INET6_ADDRSTRLEN];
 	char name[SMB_PI_MAX_HOST];
-	mts_wchar_t wbuf[SMB_PI_MAX_HOST];
-	unsigned int cpid = oem_get_smb_cpid();
+	smb_wchar_t wbuf[SMB_PI_MAX_HOST];
 	int i;
 
 	if (cmd_toks == NULL || *cmd_toks == NULL)
@@ -2236,12 +2231,12 @@
 				if (*subs->e_cli_netbiosname == '\0')
 					unknown = B_TRUE;
 				else {
-					(void) mts_mbstowcs(wbuf,
+					(void) smb_mbstowcs(wbuf,
 					    subs->e_cli_netbiosname,
 					    SMB_PI_MAX_HOST - 1);
 
-					if (unicodestooems(name, wbuf,
-					    SMB_PI_MAX_HOST, cpid) == 0)
+					if (ucstooem(name, wbuf,
+					    SMB_PI_MAX_HOST, OEM_CPG_850) == 0)
 						(void) strlcpy(name,
 						    subs->e_cli_netbiosname,
 						    SMB_PI_MAX_HOST);
--- a/usr/src/lib/smbsrv/libmlsvc/common/srvsvc_svc.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/srvsvc_svc.c	Thu Nov 05 14:34:36 2009 -0800
@@ -32,6 +32,7 @@
  */
 
 #include <sys/errno.h>
+#include <sys/tzfile.h>
 #include <unistd.h>
 #include <netdb.h>
 #include <strings.h>
@@ -49,9 +50,8 @@
 #include <smbsrv/libsmb.h>
 #include <smbsrv/libmlsvc.h>
 #include <smbsrv/lmerr.h>
-#include <smbsrv/nterror.h>
 #include <smbsrv/nmpipes.h>
-#include <smbsrv/cifs.h>
+#include <smbsrv/smb.h>
 #include <smbsrv/netrauth.h>
 #include <smbsrv/ndl/srvsvc.ndl>
 #include <smbsrv/smb_common_door.h>
@@ -1196,7 +1196,7 @@
 	uint32_t nerr;
 
 	if (info->nss_netname != NULL && info->nss_netname[0] != '\0' &&
-	    utf8_strcasecmp(info->nss_netname, si->shr_name) != 0) {
+	    smb_strcasecmp(info->nss_netname, si->shr_name, 0) != 0) {
 		nerr = smb_shr_rename(si->shr_name, info->nss_netname);
 		if (nerr != NERR_Success)
 			return (nerr);
@@ -1790,6 +1790,9 @@
  * positive; for time zones east of Greenwich, the value is negative.
  * A value of -1 indicates that the time zone is undefined.
  *
+ * Determine offset from GMT. If daylight saving time use altzone,
+ * otherwise use timezone.
+ *
  * The clock tick value represents a resolution of one ten-thousandth
  * (0.0001) second.
  */
@@ -1800,6 +1803,8 @@
 	struct mslm_TIME_OF_DAY_INFO *tod;
 	struct timeval		time_val;
 	struct tm		tm;
+	time_t			gmtoff;
+
 
 	(void) gettimeofday(&time_val, 0);
 	(void) gmtime_r(&time_val.tv_sec, &tm);
@@ -1810,6 +1815,8 @@
 		return (ERROR_NOT_ENOUGH_MEMORY);
 	}
 
+	bzero(tod, sizeof (struct mslm_TIME_OF_DAY_INFO));
+
 	tod->tod_elapsedt = time_val.tv_sec;
 	tod->tod_msecs = time_val.tv_usec;
 	tod->tod_hours = tm.tm_hour;
@@ -1823,6 +1830,8 @@
 	tod->tod_weekday = tm.tm_wday;
 
 	(void) localtime_r(&time_val.tv_sec, &tm);
+	gmtoff = (tm.tm_isdst) ? altzone : timezone;
+	tod->tod_timezone = gmtoff / SECSPERMIN;
 
 	param->bufptr = tod;
 	param->status = ERROR_SUCCESS;
@@ -2703,7 +2712,7 @@
 	while ((si = smb_shr_iterate(&iterator)) != NULL) {
 		path = srvsvc_share_mkpath(mxa, si->shr_path);
 
-		if (utf8_strcasecmp(path, (char *)param->path) == 0) {
+		if (smb_strcasecmp(path, (char *)param->path, 0) == 0) {
 			param->stype = (si->shr_type & STYPE_MASK);
 			param->status = NERR_Success;
 			return (NDR_DRC_OK);
@@ -2908,7 +2917,7 @@
 	}
 
 	if (info->nss_netname != NULL && info->nss_netname[0] != '\0' &&
-	    utf8_strcasecmp(info->nss_netname, si->shr_name) != 0) {
+	    smb_strcasecmp(info->nss_netname, si->shr_name, 0) != 0) {
 		(void) sa_set_resource_attr(resource, SHOPT_NAME,
 		    info->nss_netname);
 		renamed = B_TRUE;
--- a/usr/src/lib/smbsrv/libmlsvc/common/svcctl_scm.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/svcctl_scm.c	Thu Nov 05 14:34:36 2009 -0800
@@ -551,7 +551,7 @@
 {
 	svcctl_svc_node_t *node;
 	int base_offset, offset;
-	mts_wchar_t *w_name;
+	smb_wchar_t *w_name;
 	char *a_name;
 	char *node_name;
 	size_t namelen;
@@ -590,8 +590,8 @@
 		if (use_wchar) {
 			offset -= SVCCTL_WNSTRLEN(node_name);
 			/*LINTED E_BAD_PTR_CAST_ALIGN*/
-			w_name = (mts_wchar_t *)&buf[offset];
-			(void) mts_mbstowcs(w_name, node_name, namelen);
+			w_name = (smb_wchar_t *)&buf[offset];
+			(void) smb_mbstowcs(w_name, node_name, namelen);
 		} else {
 			offset -= namelen;
 			a_name = (char *)&buf[offset];
@@ -607,8 +607,8 @@
 		if (use_wchar) {
 			offset -= SVCCTL_WNSTRLEN(node_name);
 			/*LINTED E_BAD_PTR_CAST_ALIGN*/
-			w_name = (mts_wchar_t *)&buf[offset];
-			(void) mts_mbstowcs(w_name, node_name, namelen);
+			w_name = (smb_wchar_t *)&buf[offset];
+			(void) smb_mbstowcs(w_name, node_name, namelen);
 		} else {
 			offset -= namelen;
 			a_name = (char *)&buf[offset];
@@ -654,8 +654,8 @@
 	svcctl_svc_node_t *node = svc_node;
 	int *cnt = byte_cnt;
 
-	*cnt += (strlen(node->sn_fmri) + 1) * sizeof (mts_wchar_t);
-	*cnt += (strlen(node->sn_name) + 1) * sizeof (mts_wchar_t);
+	*cnt += (strlen(node->sn_fmri) + 1) * sizeof (smb_wchar_t);
+	*cnt += (strlen(node->sn_name) + 1) * sizeof (smb_wchar_t);
 
 	return (UU_WALK_NEXT);
 }
--- a/usr/src/lib/smbsrv/libmlsvc/common/svcctl_svc.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/svcctl_svc.c	Thu Nov 05 14:34:36 2009 -0800
@@ -1194,7 +1194,7 @@
 	svcctl_svc_node_t *svc;
 	svc_config_rsp_t svc_rsp;
 	int offset, input_bufsize, bytes_needed = 0;
-	mts_wchar_t *wide_desc;
+	smb_wchar_t *wide_desc;
 	char *desc;
 	DWORD status;
 
@@ -1245,8 +1245,8 @@
 		offset = sizeof (svc_description_t);
 		svc_rsp.svc_desc->desc = offset;
 		/*LINTED E_BAD_PTR_CAST_ALIGN*/
-		wide_desc = (mts_wchar_t *)&param->buffer[offset];
-		(void) mts_mbstowcs(wide_desc, desc, (strlen(desc) + 1));
+		wide_desc = (smb_wchar_t *)&param->buffer[offset];
+		(void) smb_mbstowcs(wide_desc, desc, (strlen(desc) + 1));
 		offset += SVCCTL_WNSTRLEN(desc);
 
 		param->bytes_needed = offset;
--- a/usr/src/lib/smbsrv/libmlsvc/common/winreg_svc.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libmlsvc/common/winreg_svc.c	Thu Nov 05 14:34:36 2009 -0800
@@ -780,7 +780,7 @@
 		return (NDR_DRC_OK);
 	}
 
-	slen = mts_wcequiv_strlen(value) + sizeof (mts_wchar_t);
+	slen = smb_wcequiv_strlen(value) + sizeof (smb_wchar_t);
 	msize = sizeof (struct winreg_value) + slen;
 
 	param->value = (struct winreg_value *)NDR_MALLOC(mxa, msize);
@@ -799,7 +799,7 @@
 	pv->vc_first_is = 0;
 	pv->vc_length_is = slen;
 	/*LINTED E_BAD_PTR_CAST_ALIGN*/
-	(void) ndr_mbstowcs(NULL, (mts_wchar_t *)pv->value, value, slen);
+	(void) ndr_mbstowcs(NULL, (smb_wchar_t *)pv->value, value, slen);
 
 	*param->type = 1;
 	*param->value_size = slen;
--- a/usr/src/lib/smbsrv/libsmb/Makefile.com	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmb/Makefile.com	Thu Nov 05 14:34:36 2009 -0800
@@ -33,11 +33,9 @@
 	smb_msgbuf.o		\
 	smb_native.o		\
 	smb_oem.o		\
-	smb_opmlang.o		\
 	smb_share_door_decode.o	\
 	smb_sid.o		\
 	smb_status_xlat.o	\
-	smb_strcase.o		\
 	smb_string.o 		\
 	smb_token.o		\
 	smb_token_xdr.o		\
--- a/usr/src/lib/smbsrv/libsmb/common/libsmb.h	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmb/common/libsmb.h	Thu Nov 05 14:34:36 2009 -0800
@@ -50,12 +50,8 @@
 #include <smbsrv/ntstatus.h>
 #include <smbsrv/smb_door_svc.h>
 #include <smbsrv/alloc.h>
-#include <smbsrv/codepage.h>
-#include <smbsrv/ctype.h>
 #include <smbsrv/hash_table.h>
 #include <smbsrv/msgbuf.h>
-#include <smbsrv/oem.h>
-#include <smbsrv/smb_i18n.h>
 #include <smbsrv/wintypes.h>
 #include <smbsrv/smb_xdr.h>
 #include <smbsrv/smbinfo.h>
@@ -324,7 +320,7 @@
 typedef struct smb_auth_name_entry {
 	unsigned short nne_type;
 	unsigned short nne_len;
-	mts_wchar_t nne_name[SMB_PI_MAX_DOMAIN * 2];
+	smb_wchar_t nne_name[SMB_PI_MAX_DOMAIN * 2];
 } smb_auth_name_entry_t;
 
 /*
@@ -449,7 +445,7 @@
 extern smb_luser_t *smb_pwd_iterate(smb_pwditer_t *);
 extern void smb_pwd_iterclose(smb_pwditer_t *);
 
-extern int smb_auth_qnd_unicode(mts_wchar_t *, const char *, int);
+extern int smb_auth_qnd_unicode(smb_wchar_t *, const char *, int);
 extern int smb_auth_hmac_md5(unsigned char *, int, unsigned char *, int,
     unsigned char *);
 
--- a/usr/src/lib/smbsrv/libsmb/common/mapfile-vers	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmb/common/mapfile-vers	Thu Nov 05 14:34:36 2009 -0800
@@ -39,10 +39,6 @@
 SUNWprivate {
     global:
 	bintohex;
-	codepage_islower;
-	codepage_isupper;
-	codepage_tolower;
-	codepage_toupper;
 	hexdump;
 	hextobin;
 	ht_add_item;
@@ -74,20 +70,9 @@
 	list_prev;
 	list_remove;
 	list_tail;
-	mts_mbstos;
-	mts_mbstowcs;
-	mts_mbtowc;
-	mts_sbequiv_strlen;
-	mts_stombs;
-	mts_wcequiv_strlen;
-	mts_wcstombs;
-	mts_wctomb;
 	netr_client_mkabsolute;
 	netr_client_xfree;
-	oem_get_smb_cpid;
-	oem_get_telnet_cpid;
-	oem_language_set;
-	oemstounicodes;
+	oemtoucs;
 	rand_hash;
 	randomize;
 	smb_account_free;
@@ -109,6 +94,7 @@
 	smb_auth_validate_lm;
 	smb_auth_validate_nt;
 	smb_chk_hostaccess;
+	smb_codepage_init;
 	smb_config_get;
 	smb_config_get_fg_flag;
 	smb_config_get_localsid;
@@ -226,6 +212,10 @@
 	smb_ipc_rollback;
 	smb_ipc_get_user;
 	smb_ipc_get_passwd;
+	smb_islower;
+	smb_isupper;
+	smb_isstrlwr;
+	smb_isstrupr;
 	smb_kmod_bind;
 	smb_kmod_enum;
 	smb_kmod_enum_init;
@@ -275,6 +265,9 @@
 	smb_match;
 	smb_match_ci;
 	smb_match_netlogon_seqnum;
+	smb_mbstos;
+	smb_mbstowcs;
+	smb_mbtowc;
 	smb_msgbuf_base;
 	smb_msgbuf_decode;
 	smb_msgbuf_dword_align;
@@ -335,6 +328,7 @@
 	smb_sam_grp_cnt;
 	smb_sam_usr_cnt;
 	smb_sam_usr_groups;
+	smb_sbequiv_strlen;
 	smb_sd_get_secinfo;
 	smb_sd_init;
 	smb_sd_len;
@@ -358,12 +352,21 @@
 	smb_sid_type2str;
 	smb_smf_maintenance_mode;
 	smb_smf_restart_service;
+	smb_stombs;
+	smb_strcasecmp;
+	smb_strlwr;
+	smb_strupr;
+	smb_tolower;
+	smb_toupper;
 	smb_token_mkselfrel;
 	smb_token_query_privilege;
 	smb_tonetbiosname;
 	smb_trace;
 	smb_tracef;
 	smb_update_netlogon_seqnum;
+	smb_wcequiv_strlen;
+	smb_wcstombs;
+	smb_wctomb;
 	smb_wka_fini;
 	smb_wka_get_domain;
 	smb_wka_get_sid;
@@ -379,14 +382,7 @@
 	strsubst;
 	strtrim;
 	trim_whitespace;
-	unicodestooems;
-	utf8_isstrascii;
-	utf8_isstrlwr;
-	utf8_isstrupr;
-	utf8_strcasecmp;
-	utf8_strlwr;
-	utf8_strncasecmp;
-	utf8_strupr;
+	ucstooem;
 	xdr_smb_dr_bytes_t;
 	xdr_smb_dr_joininfo_t;
 	xdr_smb_dr_string_t;
--- a/usr/src/lib/smbsrv/libsmb/common/smb_acl.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_acl.c	Thu Nov 05 14:34:36 2009 -0800
@@ -27,11 +27,9 @@
 #include <strings.h>
 #include <assert.h>
 
-#include <smbsrv/ntifs.h>
+#include <smbsrv/smb.h>
 #include <smbsrv/smb_sid.h>
 #include <smbsrv/smb_idmap.h>
-#include <smbsrv/ntstatus.h>
-#include <smbsrv/ntaccess.h>
 
 #define	ACE_ALL_TYPES	0x001F
 
--- a/usr/src/lib/smbsrv/libsmb/common/smb_auth.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_auth.c	Thu Nov 05 14:34:36 2009 -0800
@@ -25,9 +25,7 @@
 
 #include <strings.h>
 #include <stdlib.h>
-#include <smbsrv/codepage.h>
-#include <smbsrv/oem.h>
-#include <smbsrv/ctype.h>
+#include <smbsrv/string.h>
 #include <smbsrv/libsmb.h>
 
 extern void randomize(char *data, unsigned len);
@@ -40,24 +38,22 @@
  * Returns the length of dst in bytes.
  */
 int
-smb_auth_qnd_unicode(mts_wchar_t *dst, const char *src, int length)
+smb_auth_qnd_unicode(smb_wchar_t *dst, const char *src, int length)
 {
 	int i;
+	unsigned int count;
+	smb_wchar_t new_char;
 
-	unsigned int cpid = oem_get_telnet_cpid();
-	unsigned int count;
-	mts_wchar_t new_char;
-
-	if ((count = oemstounicodes(dst, src, length, cpid)) == 0) {
+	if ((count = oemtoucs(dst, src, length, OEM_CPG_1252)) == 0) {
 		for (i = 0; i < length; ++i) {
-			new_char = (mts_wchar_t)src[i] & 0xff;
+			new_char = (smb_wchar_t)src[i] & 0xff;
 			dst[i] = LE_IN16(&new_char);
 		}
 		dst[i] = 0;
 		count = length;
 	}
 
-	return (count * sizeof (mts_wchar_t));
+	return (count * sizeof (smb_wchar_t));
 }
 
 /*
@@ -75,8 +71,8 @@
 	int i;
 
 	for (i = 0; (*p) && (i < SMBAUTH_LM_PWD_SZ); i++) {
-		if (mts_isascii(*p)) {
-			*p = codepage_toupper(*p);
+		if (smb_isascii(*p)) {
+			*p = smb_toupper(*p);
 			p++;
 		}
 	}
@@ -148,7 +144,7 @@
 int
 smb_auth_ntlm_hash(const char *password, unsigned char *hash)
 {
-	mts_wchar_t *unicode_password;
+	smb_wchar_t *unicode_password;
 	int length;
 	int rc;
 
@@ -156,8 +152,8 @@
 		return (SMBAUTH_FAILURE);
 
 	length = strlen(password);
-	unicode_password = (mts_wchar_t *)
-	    malloc((length + 1) * sizeof (mts_wchar_t));
+	unicode_password = (smb_wchar_t *)
+	    malloc((length + 1) * sizeof (smb_wchar_t));
 
 	if (unicode_password == NULL)
 		return (SMBAUTH_FAILURE);
@@ -290,7 +286,7 @@
     char *ntdomain,
     unsigned char *ntlmv2_hash)
 {
-	mts_wchar_t *data;
+	smb_wchar_t *data;
 	int data_len;
 	unsigned char *buf;
 	int rc;
@@ -298,7 +294,7 @@
 	if (username == NULL || ntdomain == NULL)
 		return (SMBAUTH_FAILURE);
 
-	(void) utf8_strupr(username);
+	(void) smb_strupr(username);
 
 	data_len = strlen(username) + strlen(ntdomain);
 	buf = (unsigned char *)malloc((data_len + 1) * sizeof (char));
@@ -306,7 +302,7 @@
 		return (SMBAUTH_FAILURE);
 
 	(void) snprintf((char *)buf, data_len + 1, "%s%s", username, ntdomain);
-	data = (mts_wchar_t *)malloc((data_len + 1) * sizeof (mts_wchar_t));
+	data = (smb_wchar_t *)malloc((data_len + 1) * sizeof (smb_wchar_t));
 	if (data == NULL) {
 		free(buf);
 		return (SMBAUTH_FAILURE);
@@ -423,7 +419,7 @@
 		if ((uppercase_dom = strdup(domain)) == NULL)
 			return (-1);
 
-		(void) utf8_strupr(uppercase_dom);
+		(void) smb_strupr(uppercase_dom);
 
 		if (smb_auth_ntlmv2_hash(auth->hash, username,
 		    uppercase_dom, auth->hash_v2) != SMBAUTH_SUCCESS) {
@@ -570,7 +566,7 @@
 	dest[0] = domain;
 	if ((dest[1] = strdup(domain)) == NULL)
 		return (B_FALSE);
-	(void) utf8_strupr(dest[1]);
+	(void) smb_strupr(dest[1]);
 	dest[2] = "";
 
 	/*
@@ -642,7 +638,7 @@
 	dest[0] = domain;
 	if ((dest[1] = strdup(domain)) == NULL)
 		return (B_FALSE);
-	(void) utf8_strupr(dest[1]);
+	(void) smb_strupr(dest[1]);
 	dest[2] = "";
 
 	/*
--- a/usr/src/lib/smbsrv/libsmb/common/smb_domain.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_domain.c	Thu Nov 05 14:34:36 2009 -0800
@@ -176,8 +176,8 @@
 
 	dcnode = list_head(&smb_dcache.dc_cache);
 	while (dcnode) {
-		found = (utf8_strcasecmp(dcnode->di_nbname, name) == 0) ||
-		    (utf8_strcasecmp(dcnode->di_fqname, name) == 0);
+		found = (smb_strcasecmp(dcnode->di_nbname, name, 0) == 0) ||
+		    (smb_strcasecmp(dcnode->di_fqname, name, 0) == 0);
 
 		if (found) {
 			if (di)
@@ -187,7 +187,8 @@
 
 		if ((p = strchr(dcnode->di_fqname, '.')) != NULL) {
 			*p = '\0';
-			found = (utf8_strcasecmp(dcnode->di_fqname, name) == 0);
+			found = (smb_strcasecmp(dcnode->di_fqname, name,
+			    0) == 0);
 			*p = '.';
 			if (found) {
 				if (di)
@@ -458,7 +459,7 @@
 
 	(void) strlcpy(di->di_sid, sid, SMB_SID_STRSZ);
 	(void) strlcpy(di->di_nbname, nb_domain, NETBIOS_NAME_SZ);
-	(void) utf8_strupr(di->di_nbname);
+	(void) smb_strupr(di->di_nbname);
 	(void) strlcpy(di->di_fqname, fq_domain, MAXHOSTNAMELEN);
 	di->di_binsid = NULL;
 }
--- a/usr/src/lib/smbsrv/libsmb/common/smb_info.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_info.c	Thu Nov 05 14:34:36 2009 -0800
@@ -166,7 +166,7 @@
 		*p = '\0';
 
 	if (upcase)
-		(void) utf8_strupr(buf);
+		(void) smb_strupr(buf);
 
 	return (0);
 }
@@ -517,25 +517,24 @@
 smb_tonetbiosname(char *name, char *nb_name, char suffix)
 {
 	char tmp_name[NETBIOS_NAME_SZ];
-	mts_wchar_t wtmp_name[NETBIOS_NAME_SZ];
-	unsigned int cpid;
+	smb_wchar_t wtmp_name[NETBIOS_NAME_SZ];
 	int len;
 	size_t rc;
 
 	len = 0;
-	rc = mts_mbstowcs(wtmp_name, (const char *)name, NETBIOS_NAME_SZ);
+	rc = smb_mbstowcs(wtmp_name, (const char *)name, NETBIOS_NAME_SZ);
 
 	if (rc != (size_t)-1) {
 		wtmp_name[NETBIOS_NAME_SZ - 1] = 0;
-		cpid = oem_get_smb_cpid();
-		rc = unicodestooems(tmp_name, wtmp_name, NETBIOS_NAME_SZ, cpid);
+		rc = ucstooem(tmp_name, wtmp_name, NETBIOS_NAME_SZ,
+		    OEM_CPG_850);
 		if (rc > 0)
 			len = strlen(tmp_name);
 	}
 
 	(void) memset(nb_name, ' ', NETBIOS_NAME_SZ - 1);
 	if (len) {
-		(void) utf8_strupr(tmp_name);
+		(void) smb_strupr(tmp_name);
 		(void) memcpy(nb_name, tmp_name, len);
 	}
 	nb_name[NETBIOS_NAME_SZ - 1] = suffix;
--- a/usr/src/lib/smbsrv/libsmb/common/smb_lgrp.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_lgrp.c	Thu Nov 05 14:34:36 2009 -0800
@@ -214,7 +214,7 @@
 		return (SMB_LGRP_INVALID_ARG);
 
 	bzero(&grp, sizeof (grp));
-	grp.sg_name = utf8_strlwr(gname);
+	grp.sg_name = smb_strlwr(gname);
 	grp.sg_cmnt = cmnt;
 
 	wka = smb_wka_lookup_name(gname);
@@ -286,7 +286,7 @@
 	if (!smb_lgrp_chkname(gname))
 		return (SMB_LGRP_INVALID_NAME);
 
-	if (utf8_strcasecmp(gname, new_gname) == 0)
+	if (smb_strcasecmp(gname, new_gname, 0) == 0)
 		return (SMB_LGRP_SUCCESS);
 
 	/* Cannot rename well-known groups */
@@ -2161,7 +2161,7 @@
 		if (strchr(invalid_chars, name[i]))
 			return (B_FALSE);
 
-	(void) utf8_strlwr(name);
+	(void) smb_strlwr(name);
 	return (B_TRUE);
 }
 
@@ -2173,12 +2173,12 @@
 static void
 smb_lgrp_set_default_privs(smb_group_t *grp)
 {
-	if (utf8_strcasecmp(grp->sg_name, "Administrators") == 0) {
+	if (smb_strcasecmp(grp->sg_name, "Administrators", 0) == 0) {
 		smb_privset_enable(grp->sg_privs, SE_TAKE_OWNERSHIP_LUID);
 		return;
 	}
 
-	if (utf8_strcasecmp(grp->sg_name, "Backup Operators") == 0) {
+	if (smb_strcasecmp(grp->sg_name, "Backup Operators", 0) == 0) {
 		smb_privset_enable(grp->sg_privs, SE_BACKUP_LUID);
 		smb_privset_enable(grp->sg_privs, SE_RESTORE_LUID);
 		return;
--- a/usr/src/lib/smbsrv/libsmb/common/smb_privilege.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_privilege.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,12 +19,10 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 /*
  * This module provides the interface to the built-in privilege names
  * and id's. NT privileges are known on the network using strings. Each
@@ -157,7 +155,7 @@
 	for (i = SE_MIN_LUID; i <= SE_MAX_LUID; ++i) {
 		entry = &priv_table[i];
 
-		if (utf8_strcasecmp(name, entry->name) == 0)
+		if (smb_strcasecmp(name, entry->name, 0) == 0)
 			return (entry);
 	}
 
--- a/usr/src/lib/smbsrv/libsmb/common/smb_sam.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_sam.c	Thu Nov 05 14:34:36 2009 -0800
@@ -109,14 +109,14 @@
 			return (NT_STATUS_NOT_FOUND);
 
 		/* Only Netbios hostname is accepted */
-		if (utf8_strcasecmp(domain, di.di_nbname) != 0)
+		if (smb_strcasecmp(domain, di.di_nbname, 0) != 0)
 			return (NT_STATUS_NONE_MAPPED);
 	} else {
 		if (!smb_domain_lookup_type(SMB_DOMAIN_LOCAL, &di))
 			return (NT_STATUS_CANT_ACCESS_DOMAIN_INFO);
 	}
 
-	if (utf8_strcasecmp(name, di.di_nbname) == 0) {
+	if (smb_strcasecmp(name, di.di_nbname, 0) == 0) {
 		/* This is the local domain name */
 		account->a_type = SidTypeDomain;
 		account->a_name = strdup("");
@@ -474,7 +474,7 @@
 	int i;
 
 	for (i = 0; i < SMB_LWKA_NUM; i++) {
-		if (utf8_strcasecmp(name, lwka_tbl[i].lwka_name) == 0)
+		if (smb_strcasecmp(name, lwka_tbl[i].lwka_name, 0) == 0)
 			return (&lwka_tbl[i]);
 	}
 
--- a/usr/src/lib/smbsrv/libsmb/common/smb_wksids.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmb/common/smb_wksids.c	Thu Nov 05 14:34:36 2009 -0800
@@ -186,7 +186,7 @@
 	(void) rw_rdlock(&wk_rwlock);
 	for (i = 0; i < SMB_WKA_NUM; ++i) {
 		entry = &wka_tbl[i];
-		if (!utf8_strcasecmp(name, entry->wka_name)) {
+		if (!smb_strcasecmp(name, entry->wka_name, 0)) {
 			(void) rw_unlock(&wk_rwlock);
 			return (entry);
 		}
--- a/usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmbns/common/smbns_ads.c	Thu Nov 05 14:34:36 2009 -0800
@@ -241,7 +241,7 @@
 	(void) smb_config_getstr(SMB_CI_ADS_SITE, new_site, SMB_ADS_SITE_MAX);
 	(void) smb_config_getip(SMB_CI_DOMAIN_SRV, &new_pdc);
 	(void) mutex_lock(&smb_ads_cfg.c_mtx);
-	if (utf8_strcasecmp(smb_ads_cfg.c_site, new_site)) {
+	if (smb_strcasecmp(smb_ads_cfg.c_site, new_site, 0)) {
 		(void) strlcpy(smb_ads_cfg.c_site, new_site, SMB_ADS_SITE_MAX);
 		purge = B_TRUE;
 	}
@@ -380,7 +380,7 @@
 	if ((host == NULL) || (sought_host_name == NULL))
 		return (B_FALSE);
 
-	if (utf8_strcasecmp(host->name, sought_host_name))
+	if (smb_strcasecmp(host->name, sought_host_name, 0))
 		return (B_FALSE);
 
 	return (B_TRUE);
@@ -405,7 +405,7 @@
 		return (B_FALSE);
 
 	++cached_host_domain;
-	if (utf8_strcasecmp(cached_host_domain, current_domain))
+	if (smb_strcasecmp(cached_host_domain, current_domain, 0))
 		return (B_FALSE);
 
 	return (B_TRUE);
@@ -559,7 +559,7 @@
 		for (j = 0; j < ans_cnt; j++) {
 			if ((name = ads_host_list[j].name) == NULL)
 				continue;
-			if (utf8_strcasecmp(name, hostname) == 0) {
+			if (smb_strcasecmp(name, hostname, 0) == 0) {
 				ads_host_list[j].ipaddr = ipaddr;
 			}
 		}
--- a/usr/src/lib/smbsrv/libsmbns/common/smbns_browser.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmbns/common/smbns_browser.c	Thu Nov 05 14:34:36 2009 -0800
@@ -39,7 +39,7 @@
 
 #include <smbsrv/libsmb.h>
 #include <smbsrv/libsmbns.h>
-#include <smbsrv/cifs.h>
+#include <smbsrv/smb.h>
 #include <smbsrv/mailslot.h>
 #include <smbns_browser.h>
 #include <smbns_netbios.h>
@@ -780,7 +780,7 @@
 
 	if (smb_getdomainname(resource_domain, SMB_PI_MAX_DOMAIN) != 0)
 		return;
-	(void) utf8_strupr(resource_domain);
+	(void) smb_strupr(resource_domain);
 
 	if (addr == NULL) {
 		/* Local master Browser */
@@ -1058,7 +1058,7 @@
 
 	if (smb_getdomainname(resource_domain, SMB_PI_MAX_DOMAIN) != 0)
 		return;
-	(void) utf8_strupr(resource_domain);
+	(void) smb_strupr(resource_domain);
 
 	/* domain<00> */
 	smb_init_name_struct((unsigned char *)resource_domain, NBT_WKSTA,
@@ -1156,7 +1156,7 @@
 		/* This is the name used for HostAnnouncement */
 		(void) strlcpy(hinfo->hi_nbname, hinfo->hi_nic.nic_host,
 		    NETBIOS_NAME_SZ);
-		(void) utf8_strupr(hinfo->hi_nbname);
+		(void) smb_strupr(hinfo->hi_nbname);
 		/* 0x20: file server service  */
 		smb_init_name_struct((unsigned char *)hinfo->hi_nbname,
 		    NBT_SERVER, 0, hinfo->hi_nic.nic_ip.a_ipv4,
@@ -1193,7 +1193,7 @@
 	if (smb_getdomainname(resource_domain, SMB_PI_MAX_DOMAIN) != 0)
 		return;
 
-	(void) utf8_strupr(resource_domain);
+	(void) smb_strupr(resource_domain);
 
 	smb_init_name_struct((unsigned char *)resource_domain, NBT_MB,
 	    0, 0, 0, 0, 0, &name);
--- a/usr/src/lib/smbsrv/libsmbns/common/smbns_ksetpwd.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmbns/common/smbns_ksetpwd.c	Thu Nov 05 14:34:36 2009 -0800
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -98,7 +98,7 @@
 	if (!realm)
 		return (NULL);
 
-	(void) utf8_strupr(realm);
+	(void) smb_strupr(realm);
 
 	len = strlen(spn) + 1 + strlen(realm) + 1;
 	upn = (char *)malloc(len);
@@ -133,7 +133,7 @@
 	if ((realm = strdup(++dom)) == NULL)
 		return (NULL);
 
-	(void) utf8_strupr(realm);
+	(void) smb_strupr(realm);
 
 	len = strlen(spn_prefix[SMBKRB5_SPN_IDX_HOST]) + strlen(fqhn) +
 	    + 1 + strlen(realm) + 1;
--- a/usr/src/lib/smbsrv/libsmbns/common/smbns_netbios.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmbns/common/smbns_netbios.c	Thu Nov 05 14:34:36 2009 -0800
@@ -214,7 +214,7 @@
 		    sizeof (dest->scope));
 	}
 
-	(void) utf8_strupr((char *)dest->scope);
+	(void) smb_strupr((char *)dest->scope);
 }
 
 void
--- a/usr/src/lib/smbsrv/libsmbns/common/smbns_netlogon.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmbns/common/smbns_netlogon.c	Thu Nov 05 14:34:36 2009 -0800
@@ -92,7 +92,7 @@
 	(void) mutex_unlock(&ntdomain_mtx);
 
 	smb_config_getdomaininfo(di.di_nbname, NULL, di.di_sid, NULL, NULL);
-	if (utf8_strcasecmp(di.di_nbname, domain) == 0) {
+	if (smb_strcasecmp(di.di_nbname, domain, 0) == 0) {
 		if ((sid = smb_sid_fromstr(di.di_sid)) != NULL)
 			protocol = NETLOGON_PROTO_SAMLOGON;
 	}
@@ -132,8 +132,7 @@
 	smb_msgbuf_t mb;
 	unsigned short opcode;
 	char src_name[SMB_PI_MAX_HOST];
-	mts_wchar_t unicode_src_name[SMB_PI_MAX_HOST];
-	unsigned int cpid = oem_get_smb_cpid();
+	smb_wchar_t unicode_src_name[SMB_PI_MAX_HOST];
 	uint32_t src_ipaddr;
 	char *junk;
 	char *primary;
@@ -149,9 +148,9 @@
 	 * Therefore, we need to convert it to unicode and
 	 * store it in multi-bytes format.
 	 */
-	(void) oemstounicodes(unicode_src_name, (char *)datagram->src.name,
-	    SMB_PI_MAX_HOST, cpid);
-	(void) mts_wcstombs(src_name, unicode_src_name, SMB_PI_MAX_HOST);
+	(void) oemtoucs(unicode_src_name, (char *)datagram->src.name,
+	    SMB_PI_MAX_HOST, OEM_CPG_850);
+	(void) smb_wcstombs(src_name, unicode_src_name, SMB_PI_MAX_HOST);
 
 	(void) trim_whitespace(src_name);
 
@@ -288,7 +287,7 @@
 	 * zero bytes that terminate the wchar string.
 	 */
 	data_length = sizeof (short) + name_lengths + (name_lengths & 1) +
-	    mts_wcequiv_strlen(hostname) + 2 + sizeof (long) + sizeof (short) +
+	    smb_wcequiv_strlen(hostname) + 2 + sizeof (long) + sizeof (short) +
 	    sizeof (short);
 
 	offset = smb_browser_load_transact_header(buffer,
@@ -381,8 +380,8 @@
 
 	data_length = sizeof (short)
 	    + sizeof (short)
-	    + mts_wcequiv_strlen(hostname) + 2
-	    + mts_wcequiv_strlen(username) + 2
+	    + smb_wcequiv_strlen(hostname) + 2
+	    + smb_wcequiv_strlen(username) + 2
 	    + name_length
 	    + sizeof (long)
 	    + sizeof (long)
--- a/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr.h	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr.h	Thu Nov 05 14:34:36 2009 -0800
@@ -34,8 +34,7 @@
 
 #include <smbsrv/libsmb.h>
 #include <smbsrv/libsmbrdr.h>
-
-#include <smbsrv/cifs.h>
+#include <smbsrv/smb.h>
 #include <smbsrv/smbinfo.h>
 #include <smbsrv/smb.h>
 #include <smbsrv/wintypes.h>
@@ -186,6 +185,77 @@
 	struct sdb_netuse *srh_tree;
 } smbrdr_handle_t;
 
+typedef struct smb_nt_negotiate_rsp {
+	uint8_t word_count;
+	uint16_t dialect_index;
+	uint8_t security_mode;
+	uint16_t max_mpx;
+	uint16_t max_vc;
+	uint32_t max_buffer_size;
+	uint32_t max_raw_size;
+	uint32_t session_key;
+	uint32_t capabilities;
+	uint32_t time_low;
+	uint32_t time_high;
+	uint16_t server_tz;
+	uint8_t security_len;
+	uint16_t byte_count;
+	uint8_t *guid;
+	uint8_t *challenge;
+	uint8_t *oem_domain;
+} smb_nt_negotiate_rsp_t;
+
+/*
+ * SMB_COM_TRANSACTION
+ */
+typedef struct smb_transact_rsp {
+	uint8_t WordCount;		/* Count of data bytes */
+					/* value = 10 + SetupCount */
+	uint16_t TotalParamCount;	/* Total parameter bytes being sent */
+	uint16_t TotalDataCount;	/* Total data bytes being sent */
+	uint16_t Reserved;
+	uint16_t ParamCount;		/* Parameter bytes sent this buffer */
+	uint16_t ParamOffset;		/* Offset (from hdr start) to params */
+	uint16_t ParamDisplacement;	/* Displacement of these param bytes */
+	uint16_t DataCount;		/* Data bytes sent this buffer */
+	uint16_t DataOffset;		/* Offset (from hdr start) to data */
+	uint16_t DataDisplacement;	/* Displacement of these data bytes */
+	uint8_t SetupCount;		/* Count of setup words */
+	uint16_t BCC;
+#if 0
+	uint8_t Reserved2;		/* Reserved (pad above to word) */
+	uint8_t Buffer[1];		/* Buffer containing: */
+	uint16_t Setup[];		/*  Setup words (# = SetupWordCount) */
+	uint16_t ByteCount;		/*  Count of data bytes */
+	uint8_t Pad[];			/*  Pad to SHORT or LONG */
+	uint8_t Params[];		/*  Param. bytes (# = ParamCount) */
+	uint8_t Pad1[];			/*  Pad to SHORT or LONG */
+	uint8_t Data[];			/*  Data bytes (# = DataCount) */
+#endif
+} smb_transact_rsp_t;
+
+/*
+ * SMBreadX
+ */
+typedef struct smb_read_andx_rsp {
+	uint8_t WordCount;
+	uint8_t AndXCmd;
+	uint8_t AndXReserved;
+	uint16_t AndXOffset;
+	uint16_t Remaining;
+	uint16_t DataCompactionMode;
+	uint16_t Reserved;
+	uint16_t DataLength;
+	uint16_t DataOffset;
+	uint32_t DataLengthHigh;
+	uint16_t Reserved2[3];
+	uint16_t ByteCount;
+#if 0
+	uint8_t Pad[];
+	uint8_t Data[];
+#endif
+} smb_read_andx_rsp_t;
+
 /*
  * smbrdr_netbios.c
  */
--- a/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_logon.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_logon.c	Thu Nov 05 14:34:36 2009 -0800
@@ -189,7 +189,7 @@
 	/*
 	 * Ensure that the domain name is uppercase.
 	 */
-	(void) utf8_strupr(primary_domain);
+	(void) smb_strupr(primary_domain);
 	return (smbrdr_logon_user(domain_controller, account_name, pwd));
 }
 
@@ -302,8 +302,8 @@
 		return (-1);
 
 	if (session->remote_caps & CAP_UNICODE) {
-		strlen_fn = mts_wcequiv_strlen;
-		null_size = sizeof (mts_wchar_t);
+		strlen_fn = smb_wcequiv_strlen;
+		null_size = sizeof (smb_wchar_t);
 		session->smb_flags2 |= SMB_FLAGS2_UNICODE;
 	} else {
 		strlen_fn = strlen;
--- a/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_netbios.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_netbios.c	Thu Nov 05 14:34:36 2009 -0800
@@ -47,7 +47,7 @@
 #include <stdio.h>
 #include <pthread.h>
 
-#include <smbsrv/cifs.h>
+#include <smbsrv/smb.h>
 
 #define	MAX_NETBIOS_NAME_SIZE	16
 
--- a/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_netuse.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_netuse.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,12 +19,10 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"@(#)smbrdr_netuse.c	1.4	08/07/16 SMI"
-
 /*
  * Tree connect and disconnect functions to support SMB shares.
  * These functions are described in the CIFS draft 1.0 Protocol
@@ -124,7 +122,7 @@
 	bzero(path, path_len);
 	(void) snprintf(path, path_len, "\\\\%s\\%s", hostname, sharename);
 	if (session->remote_caps & CAP_UNICODE)
-		path_len = mts_wcequiv_strlen(path);
+		path_len = smb_wcequiv_strlen(path);
 	else
 		path_len = strlen(path);
 
--- a/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_rpcpipe.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_rpcpipe.c	Thu Nov 05 14:34:36 2009 -0800
@@ -454,8 +454,8 @@
 		(void) strcpy(path, ofile->path);
 
 	if (sess->remote_caps & CAP_UNICODE) {
-		path_len = mts_wcequiv_strlen(path);
-		null_size = sizeof (mts_wchar_t);
+		path_len = smb_wcequiv_strlen(path);
+		null_size = sizeof (smb_wchar_t);
 	} else {
 		path_len = strlen(path);
 		null_size = sizeof (char);
--- a/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_session.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/lib/smbsrv/libsmbrdr/common/smbrdr_session.c	Thu Nov 05 14:34:36 2009 -0800
@@ -44,8 +44,6 @@
 
 #include <smbsrv/libsmbrdr.h>
 #include <smbsrv/netbios.h>
-#include <smbsrv/cifs.h>
-#include <smbsrv/ntstatus.h>
 #include <smbrdr.h>
 
 #define	SMBRDR_DOMAIN_MAX		32
@@ -219,9 +217,8 @@
 	struct sockaddr_in sin;
 	struct sockaddr_in6 sin6;
 	int sock, rc;
-	mts_wchar_t unicode_server_name[SMB_PI_MAX_DOMAIN];
+	smb_wchar_t unicode_server_name[SMB_PI_MAX_DOMAIN];
 	char server_name[SMB_PI_MAX_DOMAIN];
-	unsigned int cpid = oem_get_smb_cpid();
 	char ipstr[INET6_ADDRSTRLEN];
 
 	if ((sock = socket(sess->srv_ipaddr.a_family, SOCK_STREAM, 0)) <= 0) {
@@ -253,10 +250,10 @@
 		return (-1);
 	}
 
-	(void) mts_mbstowcs(unicode_server_name, sess->srv_name,
+	(void) smb_mbstowcs(unicode_server_name, sess->srv_name,
 	    SMB_PI_MAX_DOMAIN);
-	rc = unicodestooems(server_name, unicode_server_name,
-	    SMB_PI_MAX_DOMAIN, cpid);
+	rc = ucstooem(server_name, unicode_server_name, SMB_PI_MAX_DOMAIN,
+	    OEM_CPG_850);
 	if (rc == 0) {
 		syslog(LOG_DEBUG, "smbrdr: unicode conversion failed");
 		if (sock != 0)
@@ -417,11 +414,11 @@
 			smbrdr_session_clear(session);
 			(void) strlcpy(session->srv_name, domain_controller,
 			    MAXHOSTNAMELEN);
-			(void) utf8_strupr(session->srv_name);
+			(void) smb_strupr(session->srv_name);
 
 			session->srv_ipaddr = ipaddr;
 			(void) strlcpy(session->domain, domain, MAXHOSTNAMELEN);
-			(void) utf8_strupr(session->domain);
+			(void) smb_strupr(session->domain);
 
 			(void) smb_config_getstr(SMB_CI_NBSCOPE, session->scope,
 			    sizeof (session->scope));
--- a/usr/src/pkgdefs/etc/exception_list_i386	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/pkgdefs/etc/exception_list_i386	Thu Nov 05 14:34:36 2009 -0800
@@ -987,18 +987,8 @@
 #
 usr/include/smbsrv			i386
 usr/include/smbsrv/alloc.h		i386
-usr/include/smbsrv/cifs.h		i386
-usr/include/smbsrv/codepage.h		i386
-usr/include/smbsrv/cp_cyrillic.h	i386
-usr/include/smbsrv/cp_latin1.h		i386
-usr/include/smbsrv/cp_latin2.h		i386
-usr/include/smbsrv/cp_latin3.h		i386
-usr/include/smbsrv/cp_latin4.h		i386
-usr/include/smbsrv/cp_latin5.h		i386
-usr/include/smbsrv/cp_latin6.h		i386
 usr/include/smbsrv/cp_unicode.h		i386
 usr/include/smbsrv/cp_usascii.h		i386
-usr/include/smbsrv/ctype.h		i386
 usr/include/smbsrv/doserror.h		i386
 usr/include/smbsrv/hash_table.h		i386
 usr/include/smbsrv/libmlrpc.h		i386
@@ -1006,7 +996,6 @@
 usr/include/smbsrv/libsmb.h		i386
 usr/include/smbsrv/libsmbns.h		i386
 usr/include/smbsrv/libsmbrdr.h		i386
-usr/include/smbsrv/lm.h			i386
 usr/include/smbsrv/lmdfs.h		i386
 usr/include/smbsrv/lmerr.h		i386
 usr/include/smbsrv/mac_cifs.h		i386
@@ -1022,14 +1011,11 @@
 usr/include/smbsrv/ntifs.h		i386
 usr/include/smbsrv/ntlocale.h		i386
 usr/include/smbsrv/ntstatus.h		i386
-usr/include/smbsrv/oem.h		i386
 usr/include/smbsrv/smb.h		i386
 usr/include/smbsrv/smb_common_door.h	i386
 usr/include/smbsrv/smb_door_svc.h	i386
 usr/include/smbsrv/smb_fsops.h		i386
-usr/include/smbsrv/smb_i18n.h		i386
 usr/include/smbsrv/smb_idmap.h		i386
-usr/include/smbsrv/smb_incl.h		i386
 usr/include/smbsrv/smb_inet.h		i386
 usr/include/smbsrv/smb_ioctl.h		i386
 usr/include/smbsrv/smb_kproto.h		i386
@@ -1041,7 +1027,6 @@
 usr/include/smbsrv/smb_token.h		i386
 usr/include/smbsrv/smb_vops.h		i386
 usr/include/smbsrv/smb_xdr.h		i386
-usr/include/smbsrv/smbfmt.h		i386
 usr/include/smbsrv/smbinfo.h		i386
 usr/include/smbsrv/string.h		i386
 usr/include/smbsrv/svrapi.h		i386
--- a/usr/src/pkgdefs/etc/exception_list_sparc	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/pkgdefs/etc/exception_list_sparc	Thu Nov 05 14:34:36 2009 -0800
@@ -1061,18 +1061,8 @@
 #
 usr/include/smbsrv			sparc
 usr/include/smbsrv/alloc.h		sparc
-usr/include/smbsrv/cifs.h		sparc
-usr/include/smbsrv/codepage.h		sparc
-usr/include/smbsrv/cp_cyrillic.h	sparc
-usr/include/smbsrv/cp_latin1.h		sparc
-usr/include/smbsrv/cp_latin2.h		sparc
-usr/include/smbsrv/cp_latin3.h		sparc
-usr/include/smbsrv/cp_latin4.h		sparc
-usr/include/smbsrv/cp_latin5.h		sparc
-usr/include/smbsrv/cp_latin6.h		sparc
 usr/include/smbsrv/cp_unicode.h		sparc
 usr/include/smbsrv/cp_usascii.h		sparc
-usr/include/smbsrv/ctype.h		sparc
 usr/include/smbsrv/doserror.h		sparc
 usr/include/smbsrv/hash_table.h		sparc
 usr/include/smbsrv/libmlrpc.h		sparc
@@ -1080,7 +1070,6 @@
 usr/include/smbsrv/libsmb.h		sparc
 usr/include/smbsrv/libsmbns.h		sparc
 usr/include/smbsrv/libsmbrdr.h		sparc
-usr/include/smbsrv/lm.h			sparc
 usr/include/smbsrv/lmdfs.h		sparc
 usr/include/smbsrv/lmerr.h		sparc
 usr/include/smbsrv/mac_cifs.h		sparc
@@ -1096,14 +1085,11 @@
 usr/include/smbsrv/ntifs.h		sparc
 usr/include/smbsrv/ntlocale.h		sparc
 usr/include/smbsrv/ntstatus.h		sparc
-usr/include/smbsrv/oem.h		sparc
 usr/include/smbsrv/smb.h		sparc
 usr/include/smbsrv/smb_common_door.h	sparc
 usr/include/smbsrv/smb_door_svc.h	sparc
 usr/include/smbsrv/smb_fsops.h		sparc
-usr/include/smbsrv/smb_i18n.h		sparc
 usr/include/smbsrv/smb_idmap.h		sparc
-usr/include/smbsrv/smb_incl.h		sparc
 usr/include/smbsrv/smb_inet.h		sparc
 usr/include/smbsrv/smb_ioctl.h		sparc
 usr/include/smbsrv/smb_kproto.h		sparc
@@ -1115,7 +1101,6 @@
 usr/include/smbsrv/smb_token.h		sparc
 usr/include/smbsrv/smb_vops.h		sparc
 usr/include/smbsrv/smb_xdr.h		sparc
-usr/include/smbsrv/smbfmt.h		sparc
 usr/include/smbsrv/smbinfo.h		sparc
 usr/include/smbsrv/string.h		sparc
 usr/include/smbsrv/svrapi.h		sparc
--- a/usr/src/uts/common/Makefile.files	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/Makefile.files	Thu Nov 05 14:34:36 2009 -0800
@@ -1137,8 +1137,6 @@
 		smb_match.o \
 		smb_msgbuf.o \
 		smb_oem.o \
-		smb_opmlang.o \
-		smb_strcase.o \
 		smb_string.o \
 		smb_utf8.o \
 		smb_common_door_decode.o \
@@ -1176,7 +1174,6 @@
 		smb_logoff_andx.o			\
 		smb_mangle_name.o			\
 		smb_mbuf_marshaling.o			\
-		smb_memory_manager.o			\
 		smb_mbuf_util.o				\
 		smb_negotiate.o				\
 		smb_net.o				\
--- a/usr/src/uts/common/fs/smbsrv/smb_acl.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_acl.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,20 +19,16 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"@(#)smb_acl.c	1.5	08/07/28 SMI"
-
 #include <sys/acl.h>
 #include <acl/acl_common.h>
 #include <smbsrv/smb_sid.h>
 #include <smbsrv/smb_fsops.h>
 #include <smbsrv/smb_idmap.h>
 #include <smbsrv/smb_kproto.h>
-#include <smbsrv/ntstatus.h>
-#include <smbsrv/ntaccess.h>
 
 #define	ACE_FD_INHERIT_ACE (ACE_FILE_INHERIT_ACE | ACE_DIRECTORY_INHERIT_ACE)
 
--- a/usr/src/uts/common/fs/smbsrv/smb_alloc.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_alloc.c	Thu Nov 05 14:34:36 2009 -0800
@@ -27,53 +27,43 @@
 #include <sys/sunddi.h>
 #include <sys/kmem.h>
 #include <sys/sysmacros.h>
-#include <sys/types.h>
-
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/alloc.h>
 
 #define	MEM_HDR_SIZE	8
-static uint32_t mem_get_size(void *ptr);
+static uint32_t smb_memsize(void *);
 
 void *
-mem_malloc(uint32_t size)
+smb_malloc(uint32_t size)
 {
-	uint8_t *p;
+	uint32_t	*hdr;
+	uint8_t		*p;
 
 	size += MEM_HDR_SIZE;
-	p = kmem_alloc(size, KM_SLEEP);
-	/*LINTED E_BAD_PTR_CAST_ALIGN*/
-	*(uint32_t *)p = size;
-	p += MEM_HDR_SIZE;
-
-	return (p);
-}
+	hdr = kmem_zalloc(size, KM_SLEEP);
+	*hdr = size;
 
-void *
-mem_zalloc(uint32_t size)
-{
-	uint8_t *p;
-
-	p = mem_malloc(size);
-	(void) memset(p, 0, size);
+	p = (uint8_t *)hdr;
+	p += MEM_HDR_SIZE;
 	return (p);
 }
 
 char *
-mem_strdup(const char *ptr)
+smb_strdup(const char *ptr)
 {
-	char *p;
-	size_t size;
+	char	*p;
+	size_t	size;
 
 	size = strlen(ptr) + 1;
-	p = mem_malloc(size);
+	p = smb_malloc(size);
 	(void) memcpy(p, ptr, size);
 	return (p);
 }
 
 static uint32_t
-mem_get_size(void *ptr)
+smb_memsize(void *ptr)
 {
-	uint32_t *p;
+	uint32_t	*p;
 
 	/*LINTED E_BAD_PTR_CAST_ALIGN*/
 	p = (uint32_t *)((uint8_t *)ptr - MEM_HDR_SIZE);
@@ -82,40 +72,120 @@
 }
 
 void *
-mem_realloc(void *ptr, uint32_t size)
+smb_realloc(void *ptr, uint32_t size)
 {
-	void *new_ptr;
-	uint32_t current_size;
+	void		*new_ptr;
+	uint32_t	current_size;
 
 
 	if (ptr == NULL)
-		return (mem_malloc(size));
+		return (smb_malloc(size));
 
 	if (size == 0) {
-		smb_mem_free(ptr);
+		smb_mfree(ptr);
 		return (NULL);
 	}
 
-	current_size = mem_get_size(ptr) - MEM_HDR_SIZE;
+	current_size = smb_memsize(ptr) - MEM_HDR_SIZE;
 	if (size <= current_size)
 		return (ptr);
 
-	new_ptr = mem_malloc(size);
+	new_ptr = smb_malloc(size);
 	(void) memcpy(new_ptr, ptr, current_size);
-	smb_mem_free(ptr);
+	smb_mfree(ptr);
 
 	return (new_ptr);
 }
 
 void
-smb_mem_free(void *ptr)
+smb_mfree(void *ptr)
 {
-	uint8_t *p;
+	uint8_t	*p;
 
-	if (ptr == 0)
+	if (ptr == NULL)
 		return;
 
 	p = (uint8_t *)ptr - MEM_HDR_SIZE;
 	/*LINTED E_BAD_PTR_CAST_ALIGN*/
 	kmem_free(p, *(uint32_t *)p);
 }
+
+/*
+ * Initialize the list for request-specific temporary storage.
+ */
+void
+smb_srm_init(smb_request_t *sr)
+{
+	list_create(&sr->sr_storage, sizeof (smb_srm_t),
+	    offsetof(smb_srm_t, srm_lnd));
+}
+
+/*
+ * Free everything on the request-specific temporary storage list
+ * and destroy the list.
+ */
+void
+smb_srm_fini(smb_request_t *sr)
+{
+	smb_srm_t	*srm;
+
+	while ((srm = list_head(&sr->sr_storage)) != NULL) {
+		list_remove(&sr->sr_storage, srm);
+		smb_mfree(srm);
+	}
+
+	list_destroy(&sr->sr_storage);
+}
+
+/*
+ * Allocate memory and associate it with the specified request.
+ * Memory allocated here can only be used for the duration of
+ * this request; it will be freed automatically on completion
+ * of the request
+ */
+void *
+smb_srm_alloc(smb_request_t *sr, size_t size)
+{
+	smb_srm_t	*srm;
+
+	size += sizeof (smb_srm_t);
+	srm = smb_malloc(size);
+	srm->srm_size = size;
+	srm->srm_sr = sr;
+	list_insert_tail(&sr->sr_storage, srm);
+
+	/*
+	 * The memory allocated for use be the caller is
+	 * immediately after our storage context area.
+	 */
+	return (void *)(srm + 1);
+}
+
+/*
+ * Allocate or resize memory previously allocated for the specified
+ * request.
+ */
+void *
+smb_srm_realloc(smb_request_t *sr, void *p, size_t size)
+{
+	smb_srm_t 	*old_srm = (smb_srm_t *)p;
+	smb_srm_t 	*new_srm;
+
+	if (old_srm == NULL)
+		return (smb_srm_alloc(sr, size));
+
+	old_srm--;
+	list_remove(&sr->sr_storage, old_srm);
+
+	size += sizeof (smb_srm_t);
+	new_srm = smb_realloc(old_srm, size);
+	new_srm->srm_size = smb_memsize(new_srm);
+	new_srm->srm_sr = sr;
+	list_insert_tail(&sr->sr_storage, new_srm);
+
+	/*
+	 * The memory allocated for use be the caller is
+	 * immediately after our storage context area.
+	 */
+	return (void *)(new_srm + 1);
+}
--- a/usr/src/uts/common/fs/smbsrv/smb_close.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_close.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,8 +23,7 @@
  * Use is subject to license terms.
  */
 
-#include <smbsrv/smb_incl.h>
-
+#include <smbsrv/smb_kproto.h>
 
 /*
  * Close a file by fid.  All locks or other resources held by the
--- a/usr/src/uts/common/fs/smbsrv/smb_common_open.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_common_open.c	Thu Nov 05 14:34:36 2009 -0800
@@ -28,13 +28,14 @@
  * open and create SMB interface functions.
  */
 
-#include <smbsrv/smb_incl.h>
-#include <smbsrv/smb_fsops.h>
-#include <smbsrv/nterror.h>
-#include <smbsrv/ntstatus.h>
-#include <smbsrv/smbinfo.h>
+#include <sys/types.h>
+#include <sys/cmn_err.h>
 #include <sys/fcntl.h>
 #include <sys/nbmlock.h>
+#include <smbsrv/string.h>
+#include <smbsrv/smb_kproto.h>
+#include <smbsrv/smb_fsops.h>
+#include <smbsrv/smbinfo.h>
 
 volatile uint32_t smb_fids = 0;
 
@@ -44,7 +45,7 @@
 static int smb_set_open_timestamps(smb_request_t *, smb_ofile_t *, boolean_t);
 
 static char *smb_pathname_strdup(smb_request_t *, const char *);
-static char *smb_pathname_strcat(char *, const char *);
+static char *smb_pathname_strcat(smb_request_t *, char *, const char *);
 
 /*
  * smb_access_generic_to_file
@@ -177,16 +178,22 @@
 uint32_t
 smb_common_open(smb_request_t *sr)
 {
-	uint32_t status = NT_STATUS_SUCCESS;
-	int count;
+	open_param_t	*parg;
+	uint32_t	status = NT_STATUS_SUCCESS;
+	int		count;
+
+	parg = kmem_alloc(sizeof (*parg), KM_SLEEP);
+	bcopy(&sr->arg.open, parg, sizeof (*parg));
 
 	for (count = 0; count <= 4; count++) {
-		if (count)
+		if (count != 0)
 			delay(MSEC_TO_TICK(400));
 
 		status = smb_open_subr(sr);
 		if (status != NT_STATUS_SHARING_VIOLATION)
 			break;
+
+		bcopy(parg, &sr->arg.open, sizeof (*parg));
 	}
 
 	if (status == NT_STATUS_SHARING_VIOLATION) {
@@ -199,6 +206,8 @@
 		    ERRDOS, ERROR_FILE_NOT_FOUND);
 	}
 
+	kmem_free(parg, sizeof (*parg));
+
 	return (status);
 }
 
@@ -951,7 +960,7 @@
 {
 	if (pn->pn_fname &&
 	    strlen(pn->pn_fname) == 5 &&
-	    mts_isdigit(pn->pn_fname[3]) &&
+	    smb_isdigit(pn->pn_fname[3]) &&
 	    pn->pn_fname[4] == ':') {
 		return (NT_STATUS_OBJECT_NAME_INVALID);
 	}
@@ -991,8 +1000,8 @@
  * smb_pathname_setup
  * Parse path: pname/fname:sname:stype
  *
- * Elements of the smb_pathname_t structure are allocated using
- * smbsr_malloc and will thus be free'd when the sr is destroyed.
+ * Elements of the smb_pathname_t structure are allocated using request
+ * specific storage and will be free'd when the sr is destroyed.
  *
  * Eliminate duplicate slashes in pn->pn_path.
  * Populate pn structure elements with the individual elements
@@ -1048,10 +1057,10 @@
 	pn->pn_sname = smb_pathname_strdup(sr, sname);
 	pn->pn_stype = strchr(pn->pn_sname + 1, ':');
 	if (pn->pn_stype) {
-		(void) utf8_strupr(pn->pn_stype);
+		(void) smb_strupr(pn->pn_stype);
 	} else {
 		len = strlen(pn->pn_sname);
-		pn->pn_sname = smb_pathname_strcat(pn->pn_sname, ":$DATA");
+		pn->pn_sname = smb_pathname_strcat(sr, pn->pn_sname, ":$DATA");
 		pn->pn_stype = pn->pn_sname + len;
 	}
 	++pn->pn_stype;
@@ -1061,8 +1070,9 @@
  * smb_pathname_strdup
  *
  * Duplicate NULL terminated string s.
- * The new string buffer is allocated using smbsr_malloc and
- * will thus be free'd when the sr is destroyed.
+ *
+ * The new string is allocated using request specific storage and will
+ * be free'd when the sr is destroyed.
  */
 static char *
 smb_pathname_strdup(smb_request_t *sr, const char *s)
@@ -1071,7 +1081,7 @@
 	size_t n;
 
 	n = strlen(s) + 1;
-	s2 = (char *)smbsr_malloc(&sr->request_storage, n);
+	s2 = smb_srm_alloc(sr, n);
 	(void) strlcpy(s2, s, n);
 	return (s2);
 }
@@ -1083,16 +1093,16 @@
  * concatenating  NULL terminated string s2.
  * Append s2 and return resulting NULL terminated string.
  *
- * The string buffer is reallocated using smbsr_realloc
- * and will thus be free'd when the sr is destroyed.
+ * The string buffer is reallocated using request specific
+ * storage and will be free'd when the sr is destroyed.
  */
 static char *
-smb_pathname_strcat(char *s1, const char *s2)
+smb_pathname_strcat(smb_request_t *sr, char *s1, const char *s2)
 {
 	size_t n;
 
 	n = strlen(s1) + strlen(s2) + 1;
-	s1 = smbsr_realloc(s1, n);
+	s1 = smb_srm_realloc(sr, s1, n);
 	(void) strlcat(s1, s2, n);
 	return (s1);
 }
--- a/usr/src/uts/common/fs/smbsrv/smb_common_transact.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_common_transact.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,14 +23,13 @@
  * Use is subject to license terms.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <smbsrv/smb_share.h>
-#include <smbsrv/oem.h>
+#include <smbsrv/string.h>
 #include <smbsrv/nmpipes.h>
 #include <smbsrv/mailslot.h>
 #include <smbsrv/lmerr.h>
-#include <smbsrv/nterror.h>
 
 #define	SMB_QUOTA_UNLIMITED	0xFFFFFFFFFFFFFFFF;
 
@@ -105,8 +104,8 @@
 		smb_xa_rele(sr->session, xa);
 		return (SDRC_ERROR);
 	}
-	xa->xa_smb_trans_name = MEM_STRDUP("smb", stn);
 
+	xa->xa_pipe_name = smb_strdup(stn);
 	xa->smb_flags  = flags;
 	xa->smb_timeout = timeo;
 	xa->req_disp_param = pscnt;
@@ -460,6 +459,10 @@
 		smbsr_error(sr, 0, ERRSRV, ERRaccess);
 		return (SDRC_ERROR);
 
+	case NT_TRANSACT_RENAME:
+		rc = smb_nt_transact_rename(sr, xa);
+		break;
+
 	default:
 		smbsr_error(sr, 0, ERRSRV, ERRsmbcmd);
 		return (SDRC_ERROR);
@@ -1014,7 +1017,7 @@
 	    &share, &level, &max_bytes) != 0)
 		return (SDRC_NOT_IMPLEMENTED);
 
-	(void) utf8_strlwr(share);
+	(void) smb_strlwr(share);
 	rc = smb_kshare_getinfo(sr->sr_server->sv_lmshrd, share, &si, NULL);
 	if ((rc != NERR_Success) || (si.shr_flags & SMB_SHRF_LONGNAME)) {
 		(void) smb_mbc_encodef(&xa->rep_param_mb, "www",
@@ -1377,7 +1380,7 @@
 
 	si = sr->sr_cfg;
 
-	if (utf8_strcasecmp(si->skc_nbdomain, (char *)domain) != 0) {
+	if (smb_strcasecmp(si->skc_nbdomain, (char *)domain, 0) != 0) {
 		(void) smb_mbc_encodef(&xa->rep_param_mb, "wwww", 0, 0, 0, 0);
 		return (SDRC_SUCCESS);
 	}
@@ -1405,19 +1408,36 @@
 	return (SDRC_SUCCESS);
 }
 
+static boolean_t
+is_supported_mailslot(const char *mailslot)
+{
+	static char *mailslots[] = {
+		PIPE_LANMAN,
+		MAILSLOT_LANMAN,
+		MAILSLOT_BROWSE,
+		MAILSLOT_MSBROWSE
+	};
+
+	int i;
+
+	for (i = 0; i < sizeof (mailslots)/sizeof (mailslots[0]); ++i)
+		if (smb_strcasecmp(mailslot, mailslots[i], 0) == 0)
+			return (B_TRUE);
+
+	return (B_FALSE);
+}
+
 /*
- * is_supported_pipe
- *
- * Currently, just return 0 if the pipe is \\PIPE\repl otherwise
- * return 1.
+ * Currently, just return false if the pipe is \\PIPE\repl.
+ * Otherwise, return true.
  */
-int
-is_supported_pipe(char *pname)
+static boolean_t
+is_supported_pipe(const char *pname)
 {
-	if (utf8_strcasecmp(pname, PIPE_REPL) == 0)
-		return (0);
+	if (smb_strcasecmp(pname, PIPE_REPL, 0) == 0)
+		return (B_FALSE);
 
-	return (1);
+	return (B_TRUE);
 }
 
 static smb_sdrc_t
@@ -1476,7 +1496,7 @@
 			break;
 
 		case TRANS_WAIT_NMPIPE:
-			if (is_supported_pipe(xa->xa_smb_trans_name) == 0) {
+			if (!is_supported_pipe(xa->xa_pipe_name)) {
 				smbsr_error(sr, 0, ERRDOS, ERRbadfile);
 				return (SDRC_ERROR);
 			}
@@ -1487,14 +1507,7 @@
 			goto trans_err_not_supported;
 		}
 	} else {
-		if ((utf8_strcasecmp(xa->xa_smb_trans_name,
-		    PIPE_LANMAN) != 0) &&
-		    (utf8_strcasecmp(
-		    xa->xa_smb_trans_name, MAILSLOT_LANMAN) != 0) &&
-		    (utf8_strcasecmp(
-		    xa->xa_smb_trans_name, MAILSLOT_BROWSE) != 0) &&
-		    (utf8_strcasecmp(
-		    xa->xa_smb_trans_name, MAILSLOT_MSBROWSE) != 0))
+		if (!is_supported_mailslot(xa->xa_pipe_name))
 			goto trans_err_not_supported;
 
 		if ((rc = smb_mbc_decodef(&xa->req_param_mb, "%wss", sr,
@@ -1839,7 +1852,7 @@
 	smb_xa_t	*xa, *nxa;
 	smb_llist_t	*xlist;
 
-	xa = MEM_ZALLOC("xa", sizeof (smb_xa_t));
+	xa = kmem_zalloc(sizeof (smb_xa_t), KM_SLEEP);
 	xa->xa_refcnt = 1;
 	xa->smb_com = sr->smb_com;
 	xa->smb_flg = sr->smb_flg;
@@ -1872,7 +1885,7 @@
 		    !SMB_XA_CLOSED(nxa) &&
 		    !(nxa->xa_flags & SMB_XA_FLAG_COMPLETE)) {
 			smb_llist_exit(xlist);
-			MEM_FREE("xa", xa);
+			kmem_free(xa, sizeof (smb_xa_t));
 			return (NULL);
 		}
 		nxa = smb_llist_next(xlist, nxa);
@@ -1888,8 +1901,8 @@
 	ASSERT(xa->xa_refcnt == 0);
 	ASSERT(SMB_XA_CLOSED(xa));
 
-	if (xa->xa_smb_trans_name)
-		MEM_FREE("smb", xa->xa_smb_trans_name);
+	if (xa->xa_pipe_name)
+		smb_mfree(xa->xa_pipe_name);
 
 	if (xa->rep_setup_mb.chain != NULL)
 		m_freem(xa->rep_setup_mb.chain);
@@ -1899,7 +1912,7 @@
 		m_freem(xa->rep_data_mb.chain);
 
 	xa->xa_magic = (uint32_t)~SMB_XA_MAGIC;
-	MEM_FREE("xa", xa);
+	kmem_free(xa, sizeof (smb_xa_t));
 }
 
 smb_xa_t *
--- a/usr/src/uts/common/fs/smbsrv/smb_create.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_create.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,7 +23,7 @@
  * Use is subject to license terms.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 #define	SMB_CREATE_NAMEBUF_SZ	16
 
@@ -159,7 +159,7 @@
 	bcc = 1; /* null terminator */
 	bcc += snprintf(name, SMB_CREATE_NAMEBUF_SZ, "tt%05d.tmp", tmp_id);
 
-	buf = smbsr_malloc(&sr->request_storage, MAXPATHLEN);
+	buf = smb_srm_alloc(sr, MAXPATHLEN);
 	(void) snprintf(buf, MAXPATHLEN, "%s\\%s",
 	    op->fqi.fq_path.pn_path, name);
 	op->fqi.fq_path.pn_path = buf;
--- a/usr/src/uts/common/fs/smbsrv/smb_delete.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_delete.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,7 +23,7 @@
  * Use is subject to license terms.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <smbsrv/smbinfo.h>
 #include <sys/nbmlock.h>
--- a/usr/src/uts/common/fs/smbsrv/smb_directory.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_directory.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,10 +23,8 @@
  * Use is subject to license terms.
  */
 
-#include <smbsrv/nterror.h>
-#include <smbsrv/ntstatus.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smbinfo.h>
-#include <smbsrv/smb_incl.h>
 #include <smbsrv/smb_fsops.h>
 
 typedef struct smb_dirpath {
@@ -259,13 +257,12 @@
 	char *xpath;
 	smb_dirpath_t *spp;
 
-	/* Malloc from the request storage area. This is freed automatically */
-	/* so we don't need to worry about freeing it later */
-	spp = smbsr_malloc(&sr->request_storage, sizeof (smb_dirpath_t));
+	/* Allocate using request specific memory. */
+	spp = smb_srm_alloc(sr, sizeof (smb_dirpath_t));
 	spp->sp_path = sr->arg.dirop.fqi.fq_path.pn_path;
 	pathLen = strlen(spp->sp_path);
 	spp->sp_curp = spp->sp_path;
-	xpath = smbsr_malloc(&sr->request_storage, pathLen + 1);
+	xpath = smb_srm_alloc(sr, pathLen + 1);
 	sr->arg.dirop.fqi.fq_path.pn_path = xpath;
 	spp->sp_sr = sr;
 
@@ -589,7 +586,7 @@
 	if (*path == '\0')
 		return (B_TRUE);
 
-	cp = smb_kstrdup(path, MAXPATHLEN);
+	cp = smb_strdup(path);
 	p = strcanon(cp, "\\");
 	p += strspn(p, "\\");
 
@@ -597,11 +594,11 @@
 		bad = &bad_paths[i];
 
 		if (strncmp(p, bad->name, bad->len) == 0) {
-			kmem_free(cp, MAXPATHLEN);
+			smb_mfree(cp);
 			return (B_FALSE);
 		}
 	}
 
-	kmem_free(cp, MAXPATHLEN);
+	smb_mfree(cp);
 	return (B_TRUE);
 }
--- a/usr/src/uts/common/fs/smbsrv/smb_dispatch.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_dispatch.c	Thu Nov 05 14:34:36 2009 -0800
@@ -135,7 +135,7 @@
  *			empty if an error.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_kstat.h>
 #include <sys/sdt.h>
 
--- a/usr/src/uts/common/fs/smbsrv/smb_echo.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_echo.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,13 +19,11 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 /*
  * The echo request is used to test the connection to the server,
@@ -62,7 +60,7 @@
 		return (SDRC_ERROR);
 
 	nbytes = sr->smb_bcc;
-	data = smbsr_malloc(&sr->request_storage, nbytes);
+	data = smb_srm_alloc(sr, nbytes);
 
 	if (smb_mbc_decodef(&sr->smb_data, "#c", nbytes, data))
 		return (SDRC_ERROR);
--- a/usr/src/uts/common/fs/smbsrv/smb_fem.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_fem.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,7 +23,7 @@
  * Use is subject to license terms.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <sys/sdt.h>
 #include <sys/fcntl.h>
--- a/usr/src/uts/common/fs/smbsrv/smb_find.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_find.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,6 +23,7 @@
  * Use is subject to license terms.
  */
 
+#include <smbsrv/smb_kproto.h>
 
 /*
  * smb_com_search
@@ -194,8 +195,6 @@
  * circuit to the consumer.
  */
 
-#include <smbsrv/smb_incl.h>
-
 /* *** smb_com_search *** */
 
 smb_sdrc_t
@@ -329,7 +328,7 @@
 			(void) strlcpy(name, fileinfo.fi_name,
 			    SMB_SHORTNAMELEN - 1);
 			if (to_upper)
-				(void) utf8_strupr(name);
+				(void) smb_strupr(name);
 		} else {
 			(void) strlcpy(name, fileinfo.fi_shortname,
 			    SMB_SHORTNAMELEN - 1);
--- a/usr/src/uts/common/fs/smbsrv/smb_flush.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_flush.c	Thu Nov 05 14:34:36 2009 -0800
@@ -36,7 +36,7 @@
  * draft-heizer-cifs-v1-spec-00.txt
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 
 
--- a/usr/src/uts/common/fs/smbsrv/smb_fsops.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_fsops.c	Thu Nov 05 14:34:36 2009 -0800
@@ -27,9 +27,6 @@
 #include <sys/nbmlock.h>
 #include <smbsrv/smb_fsops.h>
 #include <smbsrv/smb_kproto.h>
-#include <smbsrv/ntstatus.h>
-#include <smbsrv/ntaccess.h>
-#include <smbsrv/smb_incl.h>
 #include <acl/acl_common.h>
 #include <sys/fcntl.h>
 #include <sys/flock.h>
@@ -972,8 +969,8 @@
  * into this routine.
  */
 int
-smb_fsop_link(smb_request_t *sr, cred_t *cr, smb_node_t *to_dnode,
-    smb_node_t *from_fnode, char *to_name)
+smb_fsop_link(smb_request_t *sr, cred_t *cr, smb_node_t *from_fnode,
+    smb_node_t *to_dnode, char *to_name)
 {
 	char	*longname = NULL;
 	int	flags = 0;
@@ -1102,6 +1099,28 @@
 	    (ACE_DELETE | ACE_ADD_FILE)))
 		return (EACCES);
 
+	/*
+	 * SMB checks access on open and retains an access granted
+	 * mask for use while the file is open.  ACL changes should
+	 * not affect access to an open file.
+	 *
+	 * If the rename is being performed on an ofile:
+	 * - Check the ofile's access granted mask to see if the
+	 *   rename is permitted - requires DELETE access.
+	 * - If the file system does access checking, set the
+	 *   ATTR_NOACLCHECK flag to ensure that the file system
+	 *   does not check permissions on subsequent calls.
+	 */
+	if (sr && sr->fid_ofile) {
+		rc = smb_ofile_access(sr->fid_ofile, cr, DELETE);
+		if (rc != NT_STATUS_SUCCESS)
+			return (EACCES);
+
+		if (smb_tree_has_feature(sr->tid_tree,
+		    SMB_TREE_ACEMASKONACCESS))
+			flags = ATTR_NOACLCHECK;
+	}
+
 	rc = smb_vop_rename(from_dnode->vp, from_name, to_dnode->vp,
 	    to_name, flags, cr);
 
@@ -1648,6 +1667,13 @@
  *
  * Other smb_fsop_* routines will call SMB_TREE_CONTAINS_NODE() to prevent
  * operations on files not in the parent mount.
+ *
+ * Case sensitivity flags (SMB_IGNORE_CASE, SMB_CASE_SENSITIVE):
+ * if SMB_CASE_SENSITIVE is set, the SMB_IGNORE_CASE flag will NOT be set
+ * based on the tree's case sensitivity. However, if the SMB_IGNORE_CASE
+ * flag is set in the flags value passed as a parameter, a case insensitive
+ * lookup WILL be done (regardless of whether SMB_CASE_SENSITIVE is set
+ * or not).
  */
 int
 smb_fsop_lookup(
@@ -1678,8 +1704,10 @@
 	if (SMB_TREE_CONTAINS_NODE(sr, dnode) == 0)
 		return (EACCES);
 
-	if (SMB_TREE_IS_CASEINSENSITIVE(sr))
-		flags |= SMB_IGNORE_CASE;
+	if (!(flags & SMB_CASE_SENSITIVE)) {
+		if (SMB_TREE_IS_CASEINSENSITIVE(sr))
+			flags |= SMB_IGNORE_CASE;
+	}
 	if (SMB_TREE_SUPPORTS_CATIA(sr))
 		flags |= SMB_CATIA;
 	if (SMB_TREE_SUPPORTS_ABE(sr))
--- a/usr/src/uts/common/fs/smbsrv/smb_init.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_init.c	Thu Nov 05 14:34:36 2009 -0800
@@ -30,10 +30,9 @@
 #include <sys/ioccom.h>
 #include <sys/policy.h>
 #include <sys/cmn_err.h>
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_door_svc.h>
 #include <smbsrv/smb_ioctl.h>
-#include <smbsrv/smb_kproto.h>
 
 static int smb_drv_open(dev_t *, int, int, cred_t *);
 static int smb_drv_close(dev_t, int, int, cred_t *);
--- a/usr/src/uts/common/fs/smbsrv/smb_lock.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_lock.c	Thu Nov 05 14:34:36 2009 -0800
@@ -31,7 +31,7 @@
  * error code.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <sys/nbmlock.h>
 #include <sys/param.h>
--- a/usr/src/uts/common/fs/smbsrv/smb_lock_byte_range.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_lock_byte_range.c	Thu Nov 05 14:34:36 2009 -0800
@@ -57,7 +57,7 @@
  * should return failure to the client
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 smb_sdrc_t
 smb_pre_lock_byte_range(smb_request_t *sr)
--- a/usr/src/uts/common/fs/smbsrv/smb_locking_andx.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_locking_andx.c	Thu Nov 05 14:34:36 2009 -0800
@@ -208,7 +208,7 @@
  * ERRSRV/ERRbaduid
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 smb_sdrc_t
 smb_pre_locking_andx(smb_request_t *sr)
--- a/usr/src/uts/common/fs/smbsrv/smb_logoff_andx.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_logoff_andx.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,13 +19,11 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 
 /*
--- a/usr/src/uts/common/fs/smbsrv/smb_mangle_name.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_mangle_name.c	Thu Nov 05 14:34:36 2009 -0800
@@ -28,15 +28,10 @@
 #include <sys/sunddi.h>
 #include <sys/errno.h>
 #include <smbsrv/string.h>
-#include <smbsrv/ctype.h>
-#include <smbsrv/smb_i18n.h>
 #include <smbsrv/smb_vops.h>
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 
-#define	SMB_NAME83_BASELEN	8
-#define	SMB_NAME83_LEN		12
-
 /*
  * Characters we don't allow in DOS file names.
  * If a filename contains any of these chars, it should get mangled.
@@ -138,7 +133,7 @@
 	char *np, *pp;
 
 	rc = 0;
-	if (utf8_isstrupr(pattern) <= 0)
+	if (smb_isstrupr(pattern) <= 0)
 		return (rc);
 
 	np = name;
@@ -149,7 +144,7 @@
 		if (nc == ' ')
 			continue;
 
-		nc = mts_toupper(nc);
+		nc = smb_toupper(nc);
 		if ((pc = *pp++) != nc)
 			break;
 	}
@@ -157,7 +152,7 @@
 	if ((pc == '~') &&
 	    (pp != (pattern + 1)) &&
 	    ((pc = *pp++) != 0)) {
-		while (mts_isdigit(pc))
+		while (smb_isdigit(pc))
 			pc = *pp++;
 
 		if (pc == '.') {
@@ -167,7 +162,7 @@
 			}
 
 			while ((nc = *np++) != 0) {
-				nc = mts_toupper(nc);
+				nc = smb_toupper(nc);
 				if ((pc = *pp++) != nc)
 					break;
 			}
@@ -222,7 +217,7 @@
 	int	len;
 	int	i;
 
-	ch = mts_toupper(*name);
+	ch = smb_toupper(*name);
 
 	switch (ch) {
 	case 'A':
@@ -246,7 +241,7 @@
 	for (i  = 0; i < n_reserved; ++i) {
 		len = strlen(reserved[i]);
 
-		if (utf8_strncasecmp(reserved[i], name, len) == 0) {
+		if (smb_strcasecmp(reserved[i], name, len) == 0) {
 			ch = *(name + len);
 			if ((ch == '\0') || (ch == '.'))
 				return (B_TRUE);
@@ -329,7 +324,7 @@
 	}
 
 	for (namep = name; *namep; namep++) {
-		if (!mts_isascii(*namep) ||
+		if (!smb_isascii(*namep) ||
 		    strchr(special_chars, *namep) ||
 		    strchr(invalid_dos_chars, *namep))
 			return (1);
@@ -391,7 +386,7 @@
 	if (len) {
 		(void) snprintf(buf, len + 1, "%s", name);
 		/* if the name contains both lower and upper cases */
-		if (utf8_isstrupr(buf) == 0 && utf8_isstrlwr(buf) == 0) {
+		if (smb_isstrupr(buf) == 0 && smb_isstrlwr(buf) == 0) {
 			/* create shortname */
 			create = 1;
 		} else 	if (dot_pos) {
@@ -401,7 +396,7 @@
 			 * if the extension contains both lower and upper
 			 * cases
 			 */
-			if (utf8_isstrupr(buf) == 0 && utf8_isstrlwr(buf) == 0)
+			if (smb_isstrupr(buf) == 0 && smb_isstrlwr(buf) == 0)
 				/* create shortname */
 				create = 1;
 		}
@@ -430,7 +425,7 @@
 	if (strchr(special_chars, ch))
 		return ('_');
 
-	return (mts_toupper(ch));
+	return (smb_toupper(ch));
 }
 
 /*
@@ -565,21 +560,21 @@
 		if (smb_needs_shortname(name)) {
 			namep = (unsigned char *)name;
 			while (*namep)
-				*out_short++ = mts_toupper(*namep++);
+				*out_short++ = smb_toupper(*namep++);
 			*out_short = '\0';
 		}
 
 		out_83 = (unsigned char *)name83;
 		(void) strcpy((char *)out_83, "        .   ");
 		while (*name && *name != '.')
-			*out_83++ = mts_toupper(*name++);
+			*out_83++ = smb_toupper(*name++);
 
 		if (*name == '.') {
 			/* copy extension */
 			name++;
 			out_83 = (unsigned char *)name83 + 9;
 			while (*name)
-				*out_83++ = mts_toupper(*name++);
+				*out_83++ = smb_toupper(*name++);
 		}
 		return (1);
 	}
@@ -723,10 +718,15 @@
 				namep = dp->d_name;
 			}
 
+			/* skip non utf8 filename */
+			if (u8_validate(namep, strlen(namep), NULL,
+			    U8_VALIDATE_ENTIRE, &err) < 0)
+				continue;
+
 			(void) smb_mangle_name(ino, namep,
 			    shortname, name83, 1);
 
-			if (utf8_strcasecmp(name, shortname) == 0) {
+			if (smb_strcasecmp(name, shortname, 0) == 0) {
 				(void) strlcpy(namebuf, namep, buflen);
 				kmem_free(buf, SMB_UNMANGLE_BUFSIZE);
 				return (0);
--- a/usr/src/uts/common/fs/smbsrv/smb_mbuf_marshaling.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_mbuf_marshaling.c	Thu Nov 05 14:34:36 2009 -0800
@@ -27,9 +27,7 @@
  * SMB mbuf marshaling encode/decode.
  */
 
-#include <smbsrv/smb_incl.h>
-
-#include <sys/sunddi.h>
+#include <smbsrv/smb_kproto.h>
 
 
 #define	MALLOC_QUANTUM	80
@@ -58,10 +56,10 @@
 static uint64_t qswap(uint64_t ll);
 static int mbc_marshal_get_odd_long_long(mbuf_chain_t *mbc, uint64_t *data);
 static int mbc_marshal_get_long_long(mbuf_chain_t *mbc, uint64_t *data);
-static int mbc_marshal_get_ascii_string(struct smb_malloc_list *,
-    mbuf_chain_t *, uint8_t **ascii, int);
-static int mbc_marshal_get_unicode_string(struct smb_malloc_list *,
-    mbuf_chain_t *, uint8_t **, int);
+static int mbc_marshal_get_ascii_string(smb_request_t *, mbuf_chain_t *,
+    uint8_t **ascii, int);
+static int mbc_marshal_get_unicode_string(smb_request_t *, mbuf_chain_t *,
+    uint8_t **, int);
 static int mbc_marshal_get_mbufs(mbuf_chain_t *, int32_t, mbuf_t **);
 static int mbc_marshal_get_mbuf_chain(mbuf_chain_t *, int32_t, mbuf_chain_t *);
 static int mbc_marshal_get_uio(mbuf_chain_t *, struct uio *);
@@ -298,7 +296,7 @@
 			cvalpp = va_arg(ap, uint8_t **);
 			if (repc <= 1)
 				repc = 0;
-			if (mbc_marshal_get_ascii_string(&sr->request_storage,
+			if (mbc_marshal_get_ascii_string(sr,
 			    mbc, cvalpp, repc) != 0)
 				return (-1);
 			break;
@@ -311,7 +309,7 @@
 				repc = 0;
 			if (mbc->chain_offset & 1)
 				mbc->chain_offset++;
-			if (mbc_marshal_get_unicode_string(&sr->request_storage,
+			if (mbc_marshal_get_unicode_string(sr,
 			    mbc, cvalpp, repc) != 0)
 				return (-1);
 			break;
@@ -909,11 +907,11 @@
 static int
 mbc_marshal_put_ascii_string(mbuf_chain_t *mbc, char *mbs, int repc)
 {
-	mts_wchar_t	wide_char;
+	smb_wchar_t	wide_char;
 	int		nbytes;
 	int		length;
 
-	if ((length = mts_sbequiv_strlen(mbs)) == -1)
+	if ((length = smb_sbequiv_strlen(mbs)) == -1)
 		return (DECODE_NO_MORE_DATA);
 
 	length += sizeof (char);
@@ -927,7 +925,7 @@
 		/*
 		 * We should restore oem chars here.
 		 */
-		nbytes = mts_mbtowc(&wide_char, mbs, MTS_MB_CHAR_MAX);
+		nbytes = smb_mbtowc(&wide_char, mbs, MTS_MB_CHAR_MAX);
 		if (nbytes == -1)
 			return (DECODE_NO_MORE_DATA);
 
@@ -946,14 +944,14 @@
 static int
 mbc_marshal_put_unicode_string(mbuf_chain_t *mbc, char *ascii, int repc)
 {
-	mts_wchar_t	wchar;
+	smb_wchar_t	wchar;
 	int		consumed;
 	int		length;
 
-	if ((length = mts_wcequiv_strlen(ascii)) == -1)
+	if ((length = smb_wcequiv_strlen(ascii)) == -1)
 		return (DECODE_NO_MORE_DATA);
 
-	length += sizeof (mts_wchar_t);
+	length += sizeof (smb_wchar_t);
 
 	if ((repc > 1) && (repc < length))
 		length = repc;
@@ -961,7 +959,7 @@
 	if (mbc_marshal_make_room(mbc, length))
 		return (DECODE_NO_MORE_DATA);
 	while (length > 0) {
-		consumed = mts_mbtowc(&wchar, ascii, MTS_MB_CHAR_MAX);
+		consumed = smb_mbtowc(&wchar, ascii, MTS_MB_CHAR_MAX);
 		if (consumed == -1)
 			break;	/* Invalid sequence */
 		/*
@@ -973,7 +971,7 @@
 		ascii += consumed;
 		mbc_marshal_store_byte(mbc, wchar);
 		mbc_marshal_store_byte(mbc, wchar >> 8);
-		length -= sizeof (mts_wchar_t);
+		length -= sizeof (smb_wchar_t);
 	}
 	return (0);
 }
@@ -1215,10 +1213,10 @@
  */
 static int
 mbc_marshal_get_ascii_string(
-    struct smb_malloc_list	*ml,
-    mbuf_chain_t		*mbc,
+    smb_request_t	*sr,
+    mbuf_chain_t	*mbc,
     uint8_t		**ascii,
-    int				max_ascii)
+    int			max_ascii)
 {
 	char		*rcvbuf;
 	char		*ch;
@@ -1226,7 +1224,7 @@
 	int		length = 0;
 
 	max = MALLOC_QUANTUM;
-	rcvbuf = smbsr_malloc(ml, max);
+	rcvbuf = smb_srm_alloc(sr, max);
 
 	if (max_ascii == 0)
 		max_ascii = 0xffff;
@@ -1247,7 +1245,7 @@
 			length++;
 		}
 		max += MALLOC_QUANTUM;
-		rcvbuf = smbsr_realloc(rcvbuf, max);
+		rcvbuf = smb_srm_realloc(sr, rcvbuf, max);
 		ch = rcvbuf + length;
 	}
 
@@ -1256,13 +1254,13 @@
 	 * UTF-8 encode the string for internal system use.
 	 */
 	length = strlen(rcvbuf) + 1;
-	*ascii = smbsr_malloc(ml, length * MTS_MB_CHAR_MAX);
+	*ascii = smb_srm_alloc(sr, length * MTS_MB_CHAR_MAX);
 	return (mbc_marshal_cstou8("CP850", (char *)*ascii,
 	    (size_t)length * MTS_MB_CHAR_MAX, rcvbuf, (size_t)length));
 }
 
 static int
-mbc_marshal_get_unicode_string(struct smb_malloc_list *ml,
+mbc_marshal_get_unicode_string(smb_request_t *sr,
     mbuf_chain_t *mbc, uint8_t **ascii, int max_unicode)
 {
 	int		max;
@@ -1275,7 +1273,7 @@
 		max_unicode = 0xffff;
 
 	max = MALLOC_QUANTUM;
-	*ascii = smbsr_malloc(ml, max);
+	*ascii = smb_srm_alloc(sr, max);
 
 	ch = (char *)*ascii;
 	for (;;) {
@@ -1289,12 +1287,12 @@
 
 			if (wchar == 0)	goto done;
 
-			emitted = mts_wctomb(ch, wchar);
+			emitted = smb_wctomb(ch, wchar);
 			length += emitted;
 			ch += emitted;
 		}
 		max += MALLOC_QUANTUM;
-		*ascii = smbsr_realloc(*ascii, max);
+		*ascii = smb_srm_realloc(sr, *ascii, max);
 		ch = (char *)*ascii + length;
 	}
 done:	*ch = 0;
--- a/usr/src/uts/common/fs/smbsrv/smb_mbuf_util.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_mbuf_util.c	Thu Nov 05 14:34:36 2009 -0800
@@ -57,8 +57,7 @@
  *
  */
 
-#include <smbsrv/smb_incl.h>
-#include <smbsrv/mbuf.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_kstat.h>
 
 static kmem_cache_t	*smb_mbc_cache = NULL;
--- a/usr/src/uts/common/fs/smbsrv/smb_memory_manager.c	Thu Nov 05 12:17:17 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-/*
- * Memory management functions.
- */
-
-#include <smbsrv/smb_incl.h>
-
-/*
- * smbsr_malloc
- *
- * allocate a block of memory with the given size and
- * add it to the given linked list. This function is
- * used to allocate temporary memories which are needed
- * during processing of a SMB request. These memories
- * get freed when request processing is finished.
- */
-void *
-smbsr_malloc(smb_malloc_list *list, size_t size)
-{
-	smb_malloc_list *element;
-
-	size += sizeof (smb_malloc_list);
-	element = MEM_MALLOC("smb", size);
-	element->forw = list->forw;
-	element->back = list;
-	list->forw->back = element;
-	list->forw = element;
-	return (void *)(element + 1); /* return address of data */
-}
-
-/*
- * smbsr_realloc
- *
- * This function is used in conjunction with smbsr_malloc to
- * resize an already allocated entity.
- */
-void *
-smbsr_realloc(void *mem, size_t size)
-{
-	smb_malloc_list 	*element = (smb_malloc_list *)mem;
-	smb_malloc_list 	*new_entry;
-	smb_malloc_list 	*list;
-
-	element--;
-	list = element->back;
-	QUEUE_CLIP(element);
-	size += sizeof (smb_malloc_list);
-
-	new_entry = MEM_REALLOC("smb", element, size);
-	new_entry->forw = list->forw;
-	new_entry->back = list;
-	list->forw->back = new_entry;
-	list->forw = new_entry;
-	return (void *)(new_entry + 1); /* return address of new data */
-}
-
-/*
- * smbsr_free_malloc_list
- *
- * Frees all memory block in the given linked list.
- */
-void
-smbsr_free_malloc_list(smb_malloc_list *root)
-{
-	smb_malloc_list	*element;
-
-	/*
-	 * we initialize smb_request structure in smb_nt_notify_change
-	 * function, so we should check root->forw to make sure it's
-	 * not NULL.
-	 */
-	while (root->forw && root->forw != root) {
-		element = root->forw;
-
-		element->forw->back = element->back;
-		element->back->forw = element->forw;
-
-		/* and release it... */
-		MEM_FREE("smb", element);
-	}
-}
--- a/usr/src/uts/common/fs/smbsrv/smb_negotiate.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_negotiate.c	Thu Nov 05 14:34:36 2009 -0800
@@ -175,7 +175,7 @@
  * Connectionless clients must set Sid to 0 in the SMB request header.
  *
  * Capabilities allows the server to tell the client what it supports.
- * The bit definitions defined in cifs.h. Bit 0x2000 used to be set in
+ * The bit definitions defined in smb.h. Bit 0x2000 used to be set in
  * the negotiate response capabilities but it caused problems with
  * Windows 2000. It is probably not valid, it doesn't appear in the
  * CIFS spec.
@@ -191,9 +191,8 @@
 #include <sys/socket.h>
 #include <sys/random.h>
 #include <netinet/in.h>
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smbinfo.h>
-#include <smbsrv/smb_i18n.h>
 
 /*
  * Maximum buffer size for DOS: chosen to be the same as NT.
@@ -400,8 +399,8 @@
 		 * skc_nbdomain is not expected to be aligned.
 		 * Use temporary buffer to avoid alignment padding
 		 */
-		buflen = mts_wcequiv_strlen(sr->sr_cfg->skc_nbdomain) +
-		    sizeof (mts_wchar_t);
+		buflen = smb_wcequiv_strlen(sr->sr_cfg->skc_nbdomain) +
+		    sizeof (smb_wchar_t);
 		tmpbuf = kmem_zalloc(buflen, KM_SLEEP);
 		smb_msgbuf_init(&mb, (uint8_t *)tmpbuf, buflen,
 		    SMB_MSGBUF_UNICODE);
--- a/usr/src/uts/common/fs/smbsrv/smb_node.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_node.c	Thu Nov 05 14:34:36 2009 -0800
@@ -128,7 +128,7 @@
  *    course the state of the node should be tested/updated under the
  *    protection of the mutex).
  */
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <smbsrv/smb_kstat.h>
 #include <sys/pathname.h>
@@ -1283,6 +1283,7 @@
 	if (node->vp->v_type == VDIR) {
 		attr->sa_vattr.va_size = 0;
 		attr->sa_allocsz = 0;
+		attr->sa_vattr.va_nlink = 1;
 	}
 
 	if (node->readonly_creator)
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_cancel.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_cancel.c	Thu Nov 05 14:34:36 2009 -0800
@@ -41,7 +41,7 @@
  * the original request.  No other response is generated for this SMB.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 smb_sdrc_t
 smb_pre_nt_cancel(smb_request_t *sr)
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_create_andx.c	Thu Nov 05 14:34:36 2009 -0800
@@ -28,7 +28,7 @@
  */
 
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <smbsrv/smb_vops.h>
 
@@ -220,6 +220,11 @@
 smb_post_nt_create_andx(smb_request_t *sr)
 {
 	DTRACE_SMB_1(op__NtCreateX__done, smb_request_t *, sr);
+
+	if (sr->arg.open.dir != NULL) {
+		smb_ofile_release(sr->arg.open.dir);
+		sr->arg.open.dir = NULL;
+	}
 }
 
 smb_sdrc_t
@@ -260,16 +265,14 @@
 	if (op->rootdirfid == 0) {
 		op->fqi.fq_dnode = sr->tid_tree->t_snode;
 	} else {
-		sr->smb_fid = (ushort_t)op->rootdirfid;
-		smbsr_lookup_file(sr);
-		if (sr->fid_ofile == NULL) {
+		op->dir = smb_ofile_lookup_by_fid(sr->tid_tree,
+		    (uint16_t)op->rootdirfid);
+		if (op->dir == NULL) {
 			smbsr_error(sr, NT_STATUS_INVALID_HANDLE,
 			    ERRDOS, ERRbadfid);
 			return (SDRC_ERROR);
 		}
-
-		op->fqi.fq_dnode = sr->fid_ofile->f_node;
-		smbsr_release_file(sr);
+		op->fqi.fq_dnode = op->dir->f_node;
 	}
 
 	if (smb_common_open(sr) != NT_STATUS_SUCCESS)
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_transact_create.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_transact_create.c	Thu Nov 05 14:34:36 2009 -0800
@@ -35,11 +35,6 @@
 
 #include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
-#include <smbsrv/ntstatus.h>
-#include <smbsrv/ntaccess.h>
-#include <smbsrv/nterror.h>
-#include <smbsrv/cifs.h>
-#include <smbsrv/doserror.h>
 
 /*
  * smb_nt_transact_create
@@ -136,6 +131,9 @@
 		smb_sd_term(sd);
 		kmem_free(sd, sizeof (smb_sd_t));
 	}
+
+	if (sr->arg.open.dir != NULL)
+		smb_ofile_release(sr->arg.open.dir);
 }
 
 smb_sdrc_t
@@ -176,16 +174,14 @@
 	if (op->rootdirfid == 0) {
 		op->fqi.fq_dnode = sr->tid_tree->t_snode;
 	} else {
-		sr->smb_fid = (ushort_t)op->rootdirfid;
-		smbsr_lookup_file(sr);
-		if (sr->fid_ofile == NULL) {
+		op->dir = smb_ofile_lookup_by_fid(sr->tid_tree,
+		    (uint16_t)op->rootdirfid);
+		if (op->dir == NULL) {
 			smbsr_error(sr, NT_STATUS_INVALID_HANDLE,
 			    ERRDOS, ERRbadfid);
 			return (SDRC_ERROR);
 		}
-
-		op->fqi.fq_dnode = sr->fid_ofile->f_node;
-		smbsr_release_file(sr);
+		op->fqi.fq_dnode = op->dir->f_node;
 	}
 
 	status = smb_common_open(sr);
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_transact_ioctl.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_transact_ioctl.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,9 +23,8 @@
  * Use is subject to license terms.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/winioctl.h>
-#include <smbsrv/ntstatus.h>
 
 
 static uint32_t smb_nt_trans_ioctl_noop(smb_request_t *, smb_xa_t *);
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_transact_notify_change.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_transact_notify_change.c	Thu Nov 05 14:34:36 2009 -0800
@@ -109,7 +109,7 @@
  * FILE_ACTION_MODIFIED_STREAM  0x00000008
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <sys/sdt.h>
 
 static void smb_notify_change_daemon(smb_thread_t *, void *);
--- a/usr/src/uts/common/fs/smbsrv/smb_nt_transact_security.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_nt_transact_security.c	Thu Nov 05 14:34:36 2009 -0800
@@ -24,10 +24,6 @@
  */
 
 #include <smbsrv/smb_kproto.h>
-#include <smbsrv/ntstatus.h>
-#include <smbsrv/nterror.h>
-#include <smbsrv/doserror.h>
-#include <smbsrv/cifs.h>
 
 static void smb_encode_sd(struct smb_xa *, smb_sd_t *, uint32_t);
 static void smb_encode_sacl(struct smb_xa *, smb_acl_t *);
--- a/usr/src/uts/common/fs/smbsrv/smb_odir.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_odir.c	Thu Nov 05 14:34:36 2009 -0800
@@ -243,7 +243,6 @@
  * See smb_search, smb_find, smb_find_unique, and smb_trans2_find for details
  */
 
-#include <smbsrv/smb_incl.h>
 #include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <smbsrv/smb_share.h>
@@ -573,7 +572,7 @@
 smb_odir_read_fileinfo(smb_request_t *sr, smb_odir_t *od,
     smb_fileinfo_t *fileinfo, boolean_t *eof)
 {
-	int		rc;
+	int		rc, errnum;
 	smb_odirent_t	*odirent;
 	boolean_t	ignore_case;
 
@@ -612,6 +611,12 @@
 			if ((rc = smb_odir_next_odirent(od, odirent)) != 0)
 				break;
 
+			/* skip non utf8 filename */
+			if (u8_validate(odirent->od_name,
+			    strlen(odirent->od_name), NULL,
+			    U8_VALIDATE_ENTIRE, &errnum) < 0)
+				continue;
+
 			if (!smb_match_name(odirent->od_ino, odirent->od_name,
 			    od->d_pattern, ignore_case))
 				continue;
--- a/usr/src/uts/common/fs/smbsrv/smb_ofile.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_ofile.c	Thu Nov 05 14:34:36 2009 -0800
@@ -160,7 +160,6 @@
  *       being queued in that list is NOT registered by incrementing the
  *       reference count.
  */
-#include <smbsrv/smb_incl.h>
 #include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 
@@ -616,7 +615,7 @@
 
 	case SMB_FTYPE_MESG_PIPE:
 		ASSERT(of->f_pipe);
-		if (utf8_strcasecmp(of->f_pipe->p_name, "SRVSVC") == 0)
+		if (smb_strcasecmp(of->f_pipe->p_name, "SRVSVC", 0) == 0)
 			return (B_TRUE);
 		break;
 	default:
@@ -1282,7 +1281,7 @@
 	fi->fi_fid = of->f_fid;
 	fi->fi_uniqid = of->f_uniqid;
 	fi->fi_pathlen = strlen(buf) + 1;
-	fi->fi_path = smb_kstrdup(buf, fi->fi_pathlen);
+	fi->fi_path = smb_strdup(buf);
 	kmem_free(buf, MAXPATHLEN);
 
 	fi->fi_namelen = user->u_domain_len + user->u_name_len + 2;
@@ -1299,7 +1298,7 @@
 		return;
 
 	if (fi->fi_path)
-		kmem_free(fi->fi_path, fi->fi_pathlen);
+		smb_mfree(fi->fi_path);
 	if (fi->fi_username)
 		kmem_free(fi->fi_username, fi->fi_namelen);
 
--- a/usr/src/uts/common/fs/smbsrv/smb_open_andx.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_open_andx.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,8 +23,8 @@
  * Use is subject to license terms.
  */
 
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_vops.h>
-#include <smbsrv/smb_incl.h>
 
 int smb_open_dsize_check = 0;
 
--- a/usr/src/uts/common/fs/smbsrv/smb_opipe.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_opipe.c	Thu Nov 05 14:34:36 2009 -0800
@@ -32,7 +32,7 @@
 #include <sys/door_data.h>
 #include <sys/uio.h>
 #include <sys/ksynch.h>
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_xdr.h>
 
 #define	SMB_OPIPE_ISOPEN(OPIPE)	\
@@ -170,13 +170,13 @@
 
 	name = path;
 	name += strspn(name, "\\");
-	if (utf8_strncasecmp(name, "PIPE", 4) == 0) {
+	if (smb_strcasecmp(name, "PIPE", 4) == 0) {
 		path += 4;
 		name += strspn(name, "\\");
 	}
 
 	for (i = 0; i < sizeof (named_pipes) / sizeof (named_pipes[0]); ++i) {
-		if (utf8_strcasecmp(name, named_pipes[i]) == 0)
+		if (smb_strcasecmp(name, named_pipes[i], 0) == 0)
 			return (named_pipes[i]);
 	}
 
--- a/usr/src/uts/common/fs/smbsrv/smb_oplock.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_oplock.c	Thu Nov 05 14:34:36 2009 -0800
@@ -37,7 +37,7 @@
  * that is not the case anymore.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <inet/tcp.h>
 
--- a/usr/src/uts/common/fs/smbsrv/smb_path_name_reduction.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_path_name_reduction.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,7 +23,7 @@
  * Use is subject to license terms.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <sys/pathname.h>
 #include <sys/sdt.h>
@@ -41,7 +41,7 @@
 
 	if ((len >= 4) && (path[len - 4] == '.')) {
 		(void) strcpy(extension, &path[len - 3]);
-		(void) utf8_strupr(extension);
+		(void) smb_strupr(extension);
 
 		if (strcmp(extension, "EXE") == 0)
 			return (NODE_FLAGS_EXECUTABLE);
--- a/usr/src/uts/common/fs/smbsrv/smb_print.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_print.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,17 +19,15 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 /*
  * SMB print interface.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 
 /*
--- a/usr/src/uts/common/fs/smbsrv/smb_process_exit.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_process_exit.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -51,7 +51,7 @@
  * send this message at all.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 smb_sdrc_t
 smb_pre_process_exit(smb_request_t *sr)
--- a/usr/src/uts/common/fs/smbsrv/smb_query_fileinfo.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_query_fileinfo.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,8 +23,8 @@
  * Use is subject to license terms.
  */
 
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_vops.h>
-#include <smbsrv/smb_incl.h>
 #include <smbsrv/smb_fsops.h>
 
 /*
@@ -91,7 +91,8 @@
     uint16_t, smb_queryinfo_t *);
 static void smb_encode_stream_info(smb_request_t *, smb_xa_t *,
     smb_queryinfo_t *);
-static int smb_all_info_filename(smb_tree_t *, smb_node_t *, char *, size_t);
+static int smb_query_pathname(smb_tree_t *, smb_node_t *, boolean_t,
+    char *, size_t);
 uint32_t smb_pad_align(uint32_t offset, uint32_t align);
 
 
@@ -500,7 +501,7 @@
 	case SMB_FILE_ALT_NAME_INFORMATION:
 		(void) smb_mbc_encodef(&xa->rep_param_mb, "w", 0);
 		(void) smb_mbc_encodef(&xa->rep_data_mb, "%lU", sr,
-		    mts_wcequiv_strlen(qinfo->qi_shortname),
+		    smb_wcequiv_strlen(qinfo->qi_shortname),
 		    qinfo->qi_shortname);
 		break;
 
@@ -688,19 +689,22 @@
 }
 
 /*
- * smb_all_info_filename
- *
- * This format of filename is only used by the ALL_INFO levels.
+ * smb_query_pathname
  *
  * Determine the absolute pathname of 'node' within the share.
+ * For some levels (e.g. ALL_INFO) the pathname should include the
+ * sharename for others (e.g. NAME_INFO) the pathname should be
+ * relative to the share.
  * For example if the node represents file "test1.txt" in directory
- * "dir1" on share "share1", the path would be: \share1\dir1\test1.txt
+ * "dir1" on share "share1"
+ * - if include_share is TRUE the pathname would be: \share1\dir1\test1.txt
+ * - if include_share is FALSE the pathname would be: \dir1\test1.txt
  *
  * If node represents a named stream, construct the pathname for the
  * associated unnamed stream then append the stream name.
  */
 static int
-smb_all_info_filename(smb_tree_t *tree, smb_node_t *node,
+smb_query_pathname(smb_tree_t *tree, smb_node_t *node, boolean_t include_share,
     char *buf, size_t buflen)
 {
 	char *sharename = tree->t_sharename;
@@ -708,12 +712,14 @@
 	size_t len;
 	vnode_t *vp;
 
-	len = snprintf(buf, buflen, "\\%s", sharename);
-	if (len == (buflen - 1))
-		return (ENAMETOOLONG);
+	if (include_share) {
+		len = snprintf(buf, buflen, "\\%s", sharename);
+		if (len == (buflen - 1))
+			return (ENAMETOOLONG);
 
-	buf += len;
-	buflen -= len;
+		buf += len;
+		buflen -= len;
+	}
 
 	if (SMB_IS_STREAM(node))
 		vp = node->n_unode->vp;
@@ -741,8 +747,8 @@
 smb_query_fileinfo(smb_request_t *sr, smb_node_t *node, uint16_t infolev,
     smb_queryinfo_t *qinfo)
 {
-	char *namep = node->od_name;
 	int rc;
+	boolean_t include_sharename = B_FALSE;
 
 	(void) bzero(qinfo, sizeof (smb_queryinfo_t));
 
@@ -768,31 +774,18 @@
 
 	/* populate name, namelen and shortname */
 
-	/* ALL_INFO levels are a special case for name field */
+	/* ALL_INFO levels include the sharename in the name field */
 	if ((infolev == SMB_QUERY_FILE_ALL_INFO) ||
 	    (infolev == SMB_FILE_ALL_INFORMATION)) {
-		rc = smb_all_info_filename(sr->tid_tree, node,
-		    qinfo->qi_name, MAXPATHLEN);
-		if (rc != 0) {
-			smbsr_errno(sr, rc);
-			return (-1);
-		}
-		qinfo->qi_namelen =
-		    smb_ascii_or_unicode_strlen(sr, qinfo->qi_name);
-		return (0);
+		include_sharename = B_TRUE;
 	}
 
-	/*
-	 * It looks like NT doesn't know what to do with the name "."
-	 * so we convert it to "\\" to indicate the root directory.
-	 * If the leading \ is missing, add it.
-	 */
-	if (strcmp(namep, ".") == 0)
-		(void) strlcpy(qinfo->qi_name, "\\", MAXNAMELEN);
-	else if (*namep != '\\')
-		(void) snprintf(qinfo->qi_name, MAXNAMELEN, "\\%s", namep);
-	else
-		(void) strlcpy(qinfo->qi_name, namep, MAXNAMELEN);
+	rc = smb_query_pathname(sr->tid_tree, node, include_sharename,
+	    qinfo->qi_name, MAXPATHLEN);
+	if (rc != 0) {
+		smbsr_errno(sr, rc);
+		return (-1);
+	}
 
 	qinfo->qi_namelen = smb_ascii_or_unicode_strlen(sr, qinfo->qi_name);
 
@@ -809,14 +802,15 @@
 	/*
 	 * If the shortname is generated by smb_mangle_name()
 	 * it will be returned as the alternative name.
-	 * Otherwise, convert the original name to  upper-case
+	 * Otherwise, convert the original name to upper-case
 	 * and return it as the alternative name.
 	 */
 	(void) smb_mangle_name(qinfo->qi_attr.sa_vattr.va_nodeid,
-	    namep, qinfo->qi_shortname, qinfo->qi_name83, 0);
+	    node->od_name, qinfo->qi_shortname, qinfo->qi_name83, 0);
 	if (*qinfo->qi_shortname == 0) {
-		(void) strlcpy(qinfo->qi_shortname, namep, SMB_SHORTNAMELEN);
-		(void) utf8_strupr(qinfo->qi_shortname);
+		(void) strlcpy(qinfo->qi_shortname, node->od_name,
+		    SMB_SHORTNAMELEN);
+		(void) smb_strupr(qinfo->qi_shortname);
 	}
 
 	return (0);
--- a/usr/src/uts/common/fs/smbsrv/smb_query_information_disk.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_query_information_disk.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,12 +19,10 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 /*
  * SMB: query_information_disk
  *
@@ -64,7 +62,7 @@
  * TotalUnit or FreeUnits (i.e. 0xFFFF) should be returned.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 
 smb_sdrc_t
--- a/usr/src/uts/common/fs/smbsrv/smb_read.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_read.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,7 +23,7 @@
  * Use is subject to license terms.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 
 
--- a/usr/src/uts/common/fs/smbsrv/smb_rename.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_rename.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,9 +23,8 @@
  * Use is subject to license terms.
  */
 
-#include <smbsrv/nterror.h>
 #include <sys/synch.h>
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <sys/nbmlock.h>
 
@@ -42,11 +41,20 @@
 #define	SMB_NT_RENAME_RENAME_FILE	0x0104
 #define	SMB_NT_RENAME_MOVE_FILE		0x0105
 
-static int smb_do_rename(smb_request_t *, smb_fqi_t *, smb_fqi_t *);
+/*
+ * SMB_TRANS2_SET_FILE/PATH_INFO (RENAME_INFORMATION level) flag
+ */
+#define	SMB_RENAME_FLAG_OVERWRITE	0x001
+
+static int smb_common_rename(smb_request_t *, smb_fqi_t *, smb_fqi_t *);
 static int smb_make_link(smb_request_t *, smb_fqi_t *, smb_fqi_t *);
+static int smb_rename_check_stream(smb_fqi_t *, smb_fqi_t *);
 static int smb_rename_check_attr(smb_request_t *, smb_node_t *, uint16_t);
 static void smb_rename_set_error(smb_request_t *, int);
 
+static int smb_rename_lookup_src(smb_request_t *);
+static void smb_rename_release_src(smb_request_t *);
+
 /*
  * smb_com_rename
  *
@@ -62,8 +70,7 @@
  * have. If SearchAttributes is zero then only normal files are renamed.
  * If the system file or hidden attributes are specified then the rename
  * is inclusive - both the specified type(s) of files and normal files are
- * renamed. The encoding of SearchAttributes is described in section 3.10
- * - File Attribute Encoding.
+ * renamed.
  */
 smb_sdrc_t
 smb_pre_rename(smb_request_t *sr)
@@ -104,7 +111,7 @@
 		return (SDRC_ERROR);
 	}
 
-	rc = smb_do_rename(sr, src_fqi, dst_fqi);
+	rc = smb_common_rename(sr, src_fqi, dst_fqi);
 
 	if (rc != 0) {
 		smb_rename_set_error(sr, rc);
@@ -116,208 +123,17 @@
 }
 
 /*
- * smb_do_rename
- *
- * Common code for renaming a file.
- *
- * If the source and destination are identical, we go through all
- * the checks but we don't actually do the rename.  If the source
- * and destination files differ only in case, we do a case-sensitive
- * rename.  Otherwise, we do a full case-insensitive rename.
- *
- * Returns errno values.
- */
-static int
-smb_do_rename(smb_request_t *sr, smb_fqi_t *src_fqi, smb_fqi_t *dst_fqi)
-{
-	smb_node_t *src_node, *tnode;
-	char *dstname;
-	DWORD status;
-	int rc;
-	int count;
-	char *path;
-
-	tnode = sr->tid_tree->t_snode;
-
-	/* Lookup the source node. It MUST exist. */
-	path = src_fqi->fq_path.pn_path;
-	rc = smb_pathname_reduce(sr, sr->user_cr, path, tnode, tnode,
-	    &src_fqi->fq_dnode, src_fqi->fq_last_comp);
-	if (rc != 0)
-		return (rc);
-
-	rc = smb_fsop_lookup(sr, sr->user_cr, SMB_FOLLOW_LINKS, tnode,
-	    src_fqi->fq_dnode, src_fqi->fq_last_comp, &src_fqi->fq_fnode);
-	if (rc != 0) {
-		smb_node_release(src_fqi->fq_dnode);
-		return (rc);
-	}
-
-	src_node = src_fqi->fq_fnode;
-	rc = smb_rename_check_attr(sr, src_node, src_fqi->fq_sattr);
-	if (rc != 0) {
-		smb_node_release(src_fqi->fq_fnode);
-		smb_node_release(src_fqi->fq_dnode);
-		return (rc);
-	}
-
-	/*
-	 * Break the oplock before access checks. If a client
-	 * has a file open, this will force a flush or close,
-	 * which may affect the outcome of any share checking.
-	 */
-	(void) smb_oplock_break(src_node, sr->session, B_FALSE);
-
-	for (count = 0; count <= 3; count++) {
-		if (count) {
-			smb_node_end_crit(src_node);
-			delay(MSEC_TO_TICK(400));
-		}
-
-		smb_node_start_crit(src_node, RW_READER);
-
-		status = smb_node_rename_check(src_node);
-
-		if (status != NT_STATUS_SHARING_VIOLATION)
-			break;
-	}
-
-	if (status == NT_STATUS_SHARING_VIOLATION) {
-		smb_node_end_crit(src_node);
-		smb_node_release(src_fqi->fq_fnode);
-		smb_node_release(src_fqi->fq_dnode);
-		return (EPIPE); /* = ERRbadshare */
-	}
-
-	status = smb_range_check(sr, src_node, 0, UINT64_MAX, B_TRUE);
-
-	if (status != NT_STATUS_SUCCESS) {
-		smb_node_end_crit(src_node);
-		smb_node_release(src_fqi->fq_fnode);
-		smb_node_release(src_fqi->fq_dnode);
-		return (EACCES);
-	}
-
-	/* Lookup destination node. */
-	path = dst_fqi->fq_path.pn_path;
-	rc = smb_pathname_reduce(sr, sr->user_cr, path, tnode, tnode,
-	    &dst_fqi->fq_dnode, dst_fqi->fq_last_comp);
-	if (rc != 0) {
-		smb_node_end_crit(src_node);
-		smb_node_release(src_fqi->fq_fnode);
-		smb_node_release(src_fqi->fq_dnode);
-		return (rc);
-	}
-
-	rc = smb_fsop_lookup(sr, sr->user_cr, SMB_FOLLOW_LINKS, tnode,
-	    dst_fqi->fq_dnode, dst_fqi->fq_last_comp, &dst_fqi->fq_fnode);
-	if ((rc != 0) && (rc != ENOENT)) {
-		smb_node_end_crit(src_node);
-		smb_node_release(src_fqi->fq_fnode);
-		smb_node_release(src_fqi->fq_dnode);
-		smb_node_release(dst_fqi->fq_dnode);
-		return (rc);
-	}
-
-	if (utf8_strcasecmp(src_fqi->fq_path.pn_path,
-	    dst_fqi->fq_path.pn_path) == 0) {
-
-		if (dst_fqi->fq_fnode)
-			smb_node_release(dst_fqi->fq_fnode);
-
-		rc = strcmp(src_fqi->fq_fnode->od_name, dst_fqi->fq_last_comp);
-		if (rc == 0) {
-			smb_node_end_crit(src_node);
-			smb_node_release(src_fqi->fq_fnode);
-			smb_node_release(src_fqi->fq_dnode);
-			smb_node_release(dst_fqi->fq_dnode);
-			return (0);
-		}
-
-		rc = smb_fsop_rename(sr, sr->user_cr,
-		    src_fqi->fq_dnode, src_fqi->fq_fnode->od_name,
-		    dst_fqi->fq_dnode, dst_fqi->fq_last_comp);
-
-		smb_node_end_crit(src_node);
-		if (rc == 0)
-			smb_node_notify_change(dst_fqi->fq_dnode);
-		smb_node_release(src_fqi->fq_fnode);
-		smb_node_release(src_fqi->fq_dnode);
-		smb_node_release(dst_fqi->fq_dnode);
-		return (rc);
-	}
-
-	/* dst node must not exist */
-	if (dst_fqi->fq_fnode) {
-		smb_node_end_crit(src_node);
-		smb_node_release(src_fqi->fq_fnode);
-		smb_node_release(src_fqi->fq_dnode);
-		smb_node_release(dst_fqi->fq_fnode);
-		smb_node_release(dst_fqi->fq_dnode);
-		return (EEXIST);
-	}
-
-	/*
-	 * If the source name is mangled but the source and destination
-	 * on-disk names are identical, we'll use the on-disk name.
-	 */
-	if ((smb_maybe_mangled_name(src_fqi->fq_last_comp)) &&
-	    (strcmp(src_fqi->fq_last_comp, dst_fqi->fq_last_comp) == 0)) {
-		dstname = src_fqi->fq_fnode->od_name;
-	} else {
-		dstname = dst_fqi->fq_last_comp;
-	}
-
-	rc = smb_fsop_rename(sr, sr->user_cr,
-	    src_fqi->fq_dnode, src_fqi->fq_fnode->od_name,
-	    dst_fqi->fq_dnode, dstname);
-
-	smb_node_end_crit(src_node);
-	if (rc == 0)
-		smb_node_notify_change(dst_fqi->fq_dnode);
-	smb_node_release(src_fqi->fq_fnode);
-	smb_node_release(src_fqi->fq_dnode);
-	smb_node_release(dst_fqi->fq_dnode);
-	return (rc);
-}
-
-/*
  * smb_com_nt_rename
  *
  * Rename a file. Files OldFileName must exist and NewFileName must not.
  * Both pathnames must be relative to the Tid specified in the request.
  * Open files may be renamed.
  *
- * Multiple files may be renamed in response to a single request as Rename
- * File supports wildcards in the file name (last component of the path).
- * NOTE: we don't support rename with wildcards.
- *
  * SearchAttributes indicates the attributes that the target file(s) must
  * have. If SearchAttributes is zero then only normal files are renamed.
  * If the system file or hidden attributes are specified then the rename
  * is inclusive - both the specified type(s) of files and normal files are
- * renamed. The encoding of SearchAttributes is described in section 3.10
- * - File Attribute Encoding.
- *
- *  Client Request                     Description
- *  =================================  ==================================
- *  UCHAR WordCount;                   Count of parameter words = 4
- *  USHORT SearchAttributes;
- *  USHORT InformationLevel;           0x0103 Create a hard link
- *                                     0x0104 In-place rename
- *                                     0x0105 Move (rename) a file
- *  ULONG ClusterCount                 Servers should ignore this value
- *  USHORT ByteCount;                  Count of data bytes; min = 4
- *  UCHAR Buffer[];                    Buffer containing:
- *                                     UCHAR BufferFormat1 0x04
- *                                     UCHAR OldFileName[] OldFileName
- *                                     UCHAR BufferFormat1 0x04
- *                                     UCHAR OldFileName[] NewFileName
- *
- *  Server Response                    Description
- *  =================================  ==================================
- *  UCHAR WordCount;                   Count of parameter words = 0
- *  UCHAR ByteCount;                   Count of data bytes = 0
+ * renamed.
  */
 smb_sdrc_t
 smb_pre_nt_rename(smb_request_t *sr)
@@ -373,7 +189,7 @@
 		break;
 	case SMB_NT_RENAME_RENAME_FILE:
 	case SMB_NT_RENAME_MOVE_FILE:
-		rc = smb_do_rename(sr, src_fqi, dst_fqi);
+		rc = smb_common_rename(sr, src_fqi, dst_fqi);
 		break;
 	case SMB_NT_RENAME_MOVE_CLUSTER_INFO:
 		rc = EINVAL;
@@ -393,43 +209,423 @@
 }
 
 /*
+ * smb_nt_transact_rename
+ *
+ * Windows servers return SUCCESS without renaming file.
+ * The only check required is to check that the handle (fid) is valid.
+ */
+smb_sdrc_t
+smb_nt_transact_rename(smb_request_t *sr, smb_xa_t *xa)
+{
+	if (smb_mbc_decodef(&xa->req_param_mb, "w", &sr->smb_fid) != 0)
+		return (SDRC_ERROR);
+
+	smbsr_lookup_file(sr);
+	if (sr->fid_ofile == NULL) {
+		smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRbadfid);
+		return (SDRC_ERROR);
+	}
+	smbsr_release_file(sr);
+
+	return (SDRC_SUCCESS);
+}
+
+/*
+ * smb_trans2_rename
+ *
+ * Implements SMB_FILE_RENAME_INFORMATION level of Trans2_Set_FileInfo
+ * and Trans2_Set_PathInfo.
+ * If the new filename (dst_fqi) already exists it may be overwritten
+ * if flags == 1.
+ */
+int
+smb_trans2_rename(smb_request_t *sr, smb_node_t *node, char *fname, int flags)
+{
+	int rc;
+	smb_fqi_t *src_fqi = &sr->arg.dirop.fqi;
+	smb_fqi_t *dst_fqi = &sr->arg.dirop.dst_fqi;
+
+	sr->arg.dirop.flags = flags ? SMB_RENAME_FLAG_OVERWRITE : 0;
+	sr->arg.dirop.info_level = SMB_NT_RENAME_RENAME_FILE;
+
+	src_fqi->fq_sattr = SMB_SEARCH_ATTRIBUTES;
+	src_fqi->fq_fnode = node;
+	src_fqi->fq_dnode = node->n_dnode;
+
+	dst_fqi->fq_path.pn_path = fname;
+	dst_fqi->fq_dnode = node->n_dnode;
+	(void) strlcpy(dst_fqi->fq_last_comp, fname, MAXNAMELEN);
+
+	rc = smb_common_rename(sr, src_fqi, dst_fqi);
+	if (rc != 0) {
+		smb_rename_set_error(sr, rc);
+		return (-1);
+	}
+
+	return (0);
+}
+
+/*
+ * smb_common_rename
+ *
+ * Common code for renaming a file.
+ *
+ * If the source and destination are identical, we go through all
+ * the checks but we don't actually do the rename.  If the source
+ * and destination files differ only in case, we do a case-sensitive
+ * rename.  Otherwise, we do a full case-insensitive rename.
+ *
+ * Returns errno values.
+ */
+static int
+smb_common_rename(smb_request_t *sr, smb_fqi_t *src_fqi, smb_fqi_t *dst_fqi)
+{
+	smb_node_t *src_fnode, *src_dnode, *dst_fnode, *dst_dnode;
+	smb_node_t *tnode;
+	int rc, count;
+	DWORD status;
+	char *new_name, *path;
+
+	path = dst_fqi->fq_path.pn_path;
+
+	/* Check if attempting to rename a stream - not yet supported */
+	rc = smb_rename_check_stream(src_fqi, dst_fqi);
+	if (rc != 0)
+		return (rc);
+
+	/* The source node may already have been provided */
+	if (src_fqi->fq_fnode) {
+		smb_node_start_crit(src_fqi->fq_fnode, RW_READER);
+		smb_node_ref(src_fqi->fq_fnode);
+		smb_node_ref(src_fqi->fq_dnode);
+	} else {
+		/* lookup and validate src node */
+		rc = smb_rename_lookup_src(sr);
+		if (rc != 0)
+			return (rc);
+	}
+
+	src_fnode = src_fqi->fq_fnode;
+	src_dnode = src_fqi->fq_dnode;
+
+	/* Find destination dnode and last_comp */
+	if (dst_fqi->fq_dnode) {
+		smb_node_ref(dst_fqi->fq_dnode);
+	} else {
+		tnode = sr->tid_tree->t_snode;
+		rc = smb_pathname_reduce(sr, sr->user_cr, path, tnode, tnode,
+		    &dst_fqi->fq_dnode, dst_fqi->fq_last_comp);
+		if (rc != 0) {
+			smb_rename_release_src(sr);
+			return (rc);
+		}
+	}
+
+	dst_dnode = dst_fqi->fq_dnode;
+	new_name = dst_fqi->fq_last_comp;
+
+	/* If exact name match in same directory, we're done */
+	if ((src_dnode == dst_dnode) &&
+	    (strcmp(src_fnode->od_name, new_name) == 0)) {
+		smb_rename_release_src(sr);
+		smb_node_release(dst_dnode);
+		return (0);
+	}
+
+	/* Lookup destination node */
+	rc = smb_fsop_lookup(sr, sr->user_cr, 0, tnode,
+	    dst_dnode, new_name, &dst_fqi->fq_fnode);
+
+	/*
+	 * Handle case where changing case of the same directory entry.
+	 *
+	 * If we found the dst node in the same directory as the src node,
+	 * and their names differ only in case:
+	 *
+	 * If the tree is case sensitive (or mixed):
+	 *  Do case sensitive lookup to see if exact match exists.
+	 *  If the exact match is the same node as src_node we're done.
+	 *
+	 * If the tree is case insensitive:
+	 *  There is currently no way to tell if the case is different
+	 *  or not, so do the rename (unless the specified new name was
+	 *  mangled).
+	 */
+	if ((rc == 0) &&
+	    (src_dnode == dst_dnode) &&
+	    (smb_strcasecmp(src_fnode->od_name,
+	    dst_fqi->fq_fnode->od_name, 0) == 0)) {
+		smb_node_release(dst_fqi->fq_fnode);
+		dst_fqi->fq_fnode = NULL;
+
+		if (smb_tree_has_feature(sr->tid_tree,
+		    SMB_TREE_NO_CASESENSITIVE)) {
+			if (smb_strcasecmp(src_fnode->od_name,
+			    dst_fqi->fq_last_comp, 0) != 0) {
+				smb_rename_release_src(sr);
+				smb_node_release(dst_dnode);
+				return (0);
+			}
+		} else {
+			rc = smb_fsop_lookup(sr, sr->user_cr,
+			    SMB_CASE_SENSITIVE, tnode, dst_dnode, new_name,
+			    &dst_fqi->fq_fnode);
+
+			if ((rc == 0) &&
+			    (dst_fqi->fq_fnode == src_fnode)) {
+				smb_rename_release_src(sr);
+				smb_node_release(dst_fqi->fq_fnode);
+				smb_node_release(dst_dnode);
+				return (0);
+			}
+		}
+	}
+
+	if ((rc != 0) && (rc != ENOENT)) {
+		smb_rename_release_src(sr);
+		smb_node_release(dst_fqi->fq_dnode);
+		return (rc);
+	}
+
+	if (dst_fqi->fq_fnode) {
+		dst_fnode = dst_fqi->fq_fnode;
+
+		if (!(sr->arg.dirop.flags && SMB_RENAME_FLAG_OVERWRITE)) {
+			smb_rename_release_src(sr);
+			smb_node_release(dst_fnode);
+			smb_node_release(dst_dnode);
+			return (EEXIST);
+		}
+
+		(void) smb_oplock_break(dst_fnode, sr->session, B_FALSE);
+
+		for (count = 0; count <= 3; count++) {
+			if (count) {
+				smb_node_end_crit(dst_fnode);
+				delay(MSEC_TO_TICK(400));
+			}
+
+			smb_node_start_crit(dst_fnode, RW_READER);
+			status = smb_node_delete_check(dst_fnode);
+
+			if (status != NT_STATUS_SHARING_VIOLATION)
+				break;
+		}
+
+		if (status != NT_STATUS_SHARING_VIOLATION)
+			status = smb_range_check(sr, dst_fnode,
+			    0, UINT64_MAX, B_TRUE);
+
+		if (status != NT_STATUS_SUCCESS) {
+			smb_rename_release_src(sr);
+			smb_node_end_crit(dst_fnode);
+			smb_node_release(dst_fnode);
+			smb_node_release(dst_dnode);
+			return (EACCES);
+		}
+
+		if (smb_maybe_mangled_name(new_name)) {
+			(void) strlcpy(new_name, dst_fnode->od_name,
+			    MAXNAMELEN);
+		}
+	}
+
+	rc = smb_fsop_rename(sr, sr->user_cr,
+	    src_dnode, src_fnode->od_name,
+	    dst_dnode, new_name);
+
+	smb_rename_release_src(sr);
+
+	if (rc == 0)
+		smb_node_notify_change(dst_dnode);
+
+	if (dst_fqi->fq_fnode) {
+		smb_node_end_crit(dst_fnode);
+		smb_node_release(dst_fnode);
+	}
+	smb_node_release(dst_dnode);
+
+	return (rc);
+}
+
+/*
+ * smb_rename_check_stream
+ *
+ * For a stream rename the dst path must begin with ':', or "\\:".
+ * We don't yet support stream rename, Return EACCES.
+ *
+ * If not a stream rename, in accordance with the above rule,
+ * it is not valid for either the src or dst to be a stream.
+ * Return EINVAL.
+ */
+static int
+smb_rename_check_stream(smb_fqi_t *src_fqi, smb_fqi_t *dst_fqi)
+{
+	smb_node_t *src_fnode = src_fqi->fq_fnode;
+	char *src_path = src_fqi->fq_path.pn_path;
+	char *dst_path = dst_fqi->fq_path.pn_path;
+
+	/* We do not yet support named stream rename - ACCESS DENIED */
+	if ((dst_path[0] == ':') ||
+	    ((dst_path[0] == '\\') && (dst_path[1] == ':'))) {
+		return (EACCES);
+	}
+
+	/*
+	 * If not stream rename (above) neither src or dst can be
+	 * a named stream.
+	 */
+
+	if (smb_is_stream_name(dst_path))
+		return (EINVAL);
+
+	if (src_fqi->fq_fnode) {
+		if (SMB_IS_STREAM(src_fnode))
+			return (EINVAL);
+	} else {
+		if (smb_is_stream_name(src_path))
+			return (EINVAL);
+	}
+
+	return (0);
+}
+
+
+/*
  * smb_make_link
  *
- * Common code for creating a hard link (adding an additional name
- * for a file.
+ * Creating a hard link (adding an additional name) for a file.
  *
  * If the source and destination are identical, we go through all
  * the checks but we don't create a link.
  *
+ * If the file is a symlink we create the hardlink on the target
+ * of the symlink (i.e. use SMB_FOLLOW_LINKS when looking up src).
+ * If the target of the symlink does not exist we fail with ENOENT.
+ *
  * Returns errno values.
  */
 static int
 smb_make_link(smb_request_t *sr, smb_fqi_t *src_fqi, smb_fqi_t *dst_fqi)
 {
-	smb_node_t *src_fnode, *tnode;
+	smb_node_t *tnode;
+	char *path;
+	int rc;
+
+	/* Cannnot create link on named stream */
+	if (smb_is_stream_name(src_fqi->fq_path.pn_path) ||
+	    smb_is_stream_name(dst_fqi->fq_path.pn_path)) {
+		return (EINVAL);
+	}
+
+	/* lookup and validate src node */
+	rc = smb_rename_lookup_src(sr);
+	if (rc != 0)
+		return (rc);
+
+	/* if src and dest paths match we're done */
+	if (smb_strcasecmp(src_fqi->fq_path.pn_path,
+	    dst_fqi->fq_path.pn_path, 0) == 0) {
+		smb_rename_release_src(sr);
+		return (0);
+	}
+
+	/* find the destination dnode and last_comp */
+	tnode = sr->tid_tree->t_snode;
+	path = dst_fqi->fq_path.pn_path;
+	rc = smb_pathname_reduce(sr, sr->user_cr, path, tnode, tnode,
+	    &dst_fqi->fq_dnode, dst_fqi->fq_last_comp);
+	if (rc != 0) {
+		smb_rename_release_src(sr);
+		return (rc);
+	}
+
+	/* If name match in same directory, we're done */
+	if ((src_fqi->fq_dnode == dst_fqi->fq_dnode) &&
+	    (smb_strcasecmp(src_fqi->fq_fnode->od_name,
+	    dst_fqi->fq_last_comp, 0) == 0)) {
+		smb_rename_release_src(sr);
+		smb_node_release(dst_fqi->fq_dnode);
+		return (0);
+	}
+
+	/* Lookup the destination node. It MUST NOT exist. */
+	rc = smb_fsop_lookup(sr, sr->user_cr, 0, tnode,
+	    dst_fqi->fq_dnode, dst_fqi->fq_last_comp, &dst_fqi->fq_fnode);
+	if (rc == 0) {
+		smb_node_release(dst_fqi->fq_fnode);
+		rc = EEXIST;
+	}
+	if (rc != ENOENT) {
+		smb_rename_release_src(sr);
+		smb_node_release(dst_fqi->fq_dnode);
+		return (rc);
+	}
+
+	rc = smb_fsop_link(sr, sr->user_cr, src_fqi->fq_fnode,
+	    dst_fqi->fq_dnode, dst_fqi->fq_last_comp);
+
+	smb_rename_release_src(sr);
+	if (rc == 0)
+		smb_node_notify_change(dst_fqi->fq_dnode);
+	smb_node_release(dst_fqi->fq_dnode);
+	return (rc);
+}
+
+/*
+ * smb_rename_lookup_src
+ *
+ * Lookup the src node, checking for sharing violations and
+ * breaking any existing oplock.
+ * Populate sr->arg.dirop.fqi
+ *
+ * Upon success, the dnode and fnode will have holds and the
+ * fnode will be in a critical section. These should be
+ * released using smb_rename_release_src().
+ *
+ * Returns errno values.
+ */
+static int
+smb_rename_lookup_src(smb_request_t *sr)
+{
+	smb_node_t *src_node, *tnode;
 	DWORD status;
 	int rc;
 	int count;
 	char *path;
 
-	tnode = sr->tid_tree->t_snode;
+	struct dirop *dirop = &sr->arg.dirop;
+	smb_fqi_t *src_fqi = &sr->arg.dirop.fqi;
 
-	/* Lookup the source node. It MUST exist. */
+	if (smb_is_stream_name(src_fqi->fq_path.pn_path))
+		return (EINVAL);
+
+	/* Lookup the source node */
+	tnode = sr->tid_tree->t_snode;
 	path = src_fqi->fq_path.pn_path;
 	rc = smb_pathname_reduce(sr, sr->user_cr, path, tnode, tnode,
 	    &src_fqi->fq_dnode, src_fqi->fq_last_comp);
 	if (rc != 0)
 		return (rc);
 
-	rc = smb_fsop_lookup(sr, sr->user_cr, SMB_FOLLOW_LINKS, tnode,
+	rc = smb_fsop_lookup(sr, sr->user_cr, 0, tnode,
 	    src_fqi->fq_dnode, src_fqi->fq_last_comp, &src_fqi->fq_fnode);
 	if (rc != 0) {
 		smb_node_release(src_fqi->fq_dnode);
 		return (rc);
 	}
 
-	src_fnode = src_fqi->fq_fnode;
-	rc = smb_rename_check_attr(sr, src_fnode, src_fqi->fq_sattr);
+	/* Not valid to create hardlink for directory */
+	if ((dirop->info_level == SMB_NT_RENAME_SET_LINK_INFO) &&
+	    (smb_node_is_dir(src_fqi->fq_fnode))) {
+		smb_node_release(src_fqi->fq_fnode);
+		smb_node_release(src_fqi->fq_dnode);
+		return (EISDIR);
+	}
+
+	src_node = src_fqi->fq_fnode;
+
+	rc = smb_rename_check_attr(sr, src_node, src_fqi->fq_sattr);
 	if (rc != 0) {
 		smb_node_release(src_fqi->fq_fnode);
 		smb_node_release(src_fqi->fq_dnode);
@@ -441,81 +637,53 @@
 	 * has a file open, this will force a flush or close,
 	 * which may affect the outcome of any share checking.
 	 */
-	(void) smb_oplock_break(src_fnode, sr->session, B_FALSE);
+	(void) smb_oplock_break(src_node, sr->session, B_FALSE);
 
 	for (count = 0; count <= 3; count++) {
 		if (count) {
-			smb_node_end_crit(src_fnode);
+			smb_node_end_crit(src_node);
 			delay(MSEC_TO_TICK(400));
 		}
 
-		smb_node_start_crit(src_fnode, RW_READER);
-		status = smb_node_rename_check(src_fnode);
+		smb_node_start_crit(src_node, RW_READER);
 
+		status = smb_node_rename_check(src_node);
 		if (status != NT_STATUS_SHARING_VIOLATION)
 			break;
 	}
 
 	if (status == NT_STATUS_SHARING_VIOLATION) {
-		smb_node_end_crit(src_fnode);
+		smb_node_end_crit(src_node);
 		smb_node_release(src_fqi->fq_fnode);
 		smb_node_release(src_fqi->fq_dnode);
 		return (EPIPE); /* = ERRbadshare */
 	}
 
-	status = smb_range_check(sr, src_fnode, 0, UINT64_MAX, B_TRUE);
+	status = smb_range_check(sr, src_node, 0, UINT64_MAX, B_TRUE);
 	if (status != NT_STATUS_SUCCESS) {
-		smb_node_end_crit(src_fnode);
+		smb_node_end_crit(src_node);
 		smb_node_release(src_fqi->fq_fnode);
 		smb_node_release(src_fqi->fq_dnode);
 		return (EACCES);
 	}
 
-	if (utf8_strcasecmp(src_fqi->fq_path.pn_path,
-	    dst_fqi->fq_path.pn_path) == 0) {
-		smb_node_end_crit(src_fnode);
-		smb_node_release(src_fqi->fq_fnode);
-		smb_node_release(src_fqi->fq_dnode);
-		return (0);
-	}
-
-	/* Lookup the destination node. It MUST NOT exist. */
-	path = dst_fqi->fq_path.pn_path;
-	rc = smb_pathname_reduce(sr, sr->user_cr, path, tnode, tnode,
-	    &dst_fqi->fq_dnode, dst_fqi->fq_last_comp);
-	if (rc != 0) {
-		smb_node_end_crit(src_fnode);
-		smb_node_release(src_fqi->fq_fnode);
-		smb_node_release(src_fqi->fq_dnode);
-		return (rc);
-	}
+	return (0);
+}
 
-	rc = smb_fsop_lookup(sr, sr->user_cr, SMB_FOLLOW_LINKS, tnode,
-	    dst_fqi->fq_dnode, dst_fqi->fq_last_comp, &dst_fqi->fq_fnode);
-	if (rc == 0) {
-		smb_node_release(dst_fqi->fq_fnode);
-		rc = EEXIST;
-	}
-	if (rc != ENOENT) {
-		smb_node_end_crit(src_fnode);
-		smb_node_release(src_fqi->fq_fnode);
-		smb_node_release(src_fqi->fq_dnode);
-		smb_node_release(dst_fqi->fq_dnode);
-		return (rc);
-	}
+/*
+ * smb_rename_release_src
+ */
+static void
+smb_rename_release_src(smb_request_t *sr)
+{
+	smb_fqi_t *src_fqi = &sr->arg.dirop.fqi;
 
-	rc = smb_fsop_link(sr, sr->user_cr, dst_fqi->fq_dnode, src_fnode,
-	    dst_fqi->fq_last_comp);
-
-	smb_node_end_crit(src_fnode);
-	if (rc == 0)
-		smb_node_notify_change(dst_fqi->fq_dnode);
+	smb_node_end_crit(src_fqi->fq_fnode);
 	smb_node_release(src_fqi->fq_fnode);
 	smb_node_release(src_fqi->fq_dnode);
-	smb_node_release(dst_fqi->fq_dnode);
-	return (rc);
 }
 
+
 static int
 smb_rename_check_attr(smb_request_t *sr, smb_node_t *node, uint16_t sattr)
 {
@@ -558,6 +726,7 @@
 	{ ESRCH,  ERROR_FILE_NOT_FOUND,	NT_STATUS_NO_SUCH_FILE },
 	{ EINVAL, ERROR_INVALID_PARAMETER, NT_STATUS_INVALID_PARAMETER },
 	{ EACCES, ERROR_ACCESS_DENIED,	NT_STATUS_ACCESS_DENIED },
+	{ EISDIR, ERROR_ACCESS_DENIED,	NT_STATUS_FILE_IS_A_DIRECTORY },
 	{ EIO,    ERROR_INTERNAL_ERROR,	NT_STATUS_INTERNAL_ERROR }
 	};
 
--- a/usr/src/uts/common/fs/smbsrv/smb_sd.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_sd.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -30,7 +30,6 @@
 #include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <smbsrv/smb_idmap.h>
-#include <smbsrv/ntstatus.h>
 
 static void smb_sd_set_sacl(smb_sd_t *, smb_acl_t *, boolean_t, int);
 static void smb_sd_set_dacl(smb_sd_t *, smb_acl_t *, boolean_t, int);
--- a/usr/src/uts/common/fs/smbsrv/smb_seek.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_seek.c	Thu Nov 05 14:34:36 2009 -0800
@@ -41,7 +41,7 @@
  * file offset is beyond the 32-bit limit.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 
 /*
--- a/usr/src/uts/common/fs/smbsrv/smb_server.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_server.c	Thu Nov 05 14:34:36 2009 -0800
@@ -215,10 +215,15 @@
 #include <sys/priv.h>
 #include <sys/socketvar.h>
 #include <sys/zone.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/ip_icmp.h>
+#include <netinet/ip_var.h>
+#include <netinet/tcp.h>
 #include <smbsrv/smb_kproto.h>
+#include <smbsrv/string.h>
 #include <smbsrv/netbios.h>
-#include <smbsrv/smb_incl.h>
-#include <smbsrv/cifs.h>
 #include <smbsrv/smb_fsops.h>
 #include <smbsrv/smb_share.h>
 #include <smbsrv/smb_door_svc.h>
@@ -559,6 +564,7 @@
 	mutex_enter(&sv->sv_mutex);
 	switch (sv->sv_state) {
 	case SMB_SERVER_STATE_CONFIGURED:
+		smb_codepage_init();
 
 		sv->sv_thread_pool = taskq_create("smb_workers",
 		    sv->sv_cfg.skc_maxworkers, SMB_WORKER_PRIORITY,
@@ -589,8 +595,6 @@
 			break;
 		}
 
-		(void) oem_language_set("english");
-
 		sv->sv_state = SMB_SERVER_STATE_RUNNING;
 		mutex_exit(&sv->sv_mutex);
 		smb_server_release(sv);
--- a/usr/src/uts/common/fs/smbsrv/smb_session.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_session.c	Thu Nov 05 14:34:36 2009 -0800
@@ -30,8 +30,8 @@
 #include <sys/socketvar.h>
 #include <sys/sdt.h>
 #include <smbsrv/netbios.h>
-#include <smbsrv/smb_incl.h>
-#include <smbsrv/smb_i18n.h>
+#include <smbsrv/smb_kproto.h>
+#include <smbsrv/string.h>
 #include <inet/tcp.h>
 
 static volatile uint64_t smb_kids;
@@ -219,10 +219,9 @@
 	char 			client_name[NETBIOS_NAME_SZ];
 	struct mbuf_chain 	mbc;
 	char 			*names = NULL;
-	mts_wchar_t		*wbuf = NULL;
+	smb_wchar_t		*wbuf = NULL;
 	smb_xprt_t		hdr;
 	char *p;
-	unsigned int cpid = oem_get_smb_cpid();
 	int rc1, rc2;
 
 	session->keep_alive = smb_keep_alive;
@@ -283,10 +282,10 @@
 	 * multi-byte format.  We also need to strip off any
 	 * spaces added as part of the NetBIOS name encoding.
 	 */
-	wbuf = kmem_alloc((SMB_PI_MAX_HOST * sizeof (mts_wchar_t)), KM_SLEEP);
-	(void) oemstounicodes(wbuf, client_name, SMB_PI_MAX_HOST, cpid);
-	(void) mts_wcstombs(session->workstation, wbuf, SMB_PI_MAX_HOST);
-	kmem_free(wbuf, (SMB_PI_MAX_HOST * sizeof (mts_wchar_t)));
+	wbuf = kmem_alloc((SMB_PI_MAX_HOST * sizeof (smb_wchar_t)), KM_SLEEP);
+	(void) oemtoucs(wbuf, client_name, SMB_PI_MAX_HOST, OEM_CPG_850);
+	(void) smb_wcstombs(session->workstation, wbuf, SMB_PI_MAX_HOST);
+	kmem_free(wbuf, (SMB_PI_MAX_HOST * sizeof (smb_wchar_t)));
 
 	if ((p = strchr(session->workstation, ' ')) != 0)
 		*p = '\0';
@@ -1039,8 +1038,8 @@
 	user = smb_llist_head(ulist);
 	while (user) {
 		ASSERT(user->u_magic == SMB_USER_MAGIC);
-		if (!utf8_strcasecmp(user->u_name, name) &&
-		    !utf8_strcasecmp(user->u_domain, domain)) {
+		if (!smb_strcasecmp(user->u_name, name, 0) &&
+		    !smb_strcasecmp(user->u_domain, domain, 0)) {
 			if (smb_user_hold(user))
 				break;
 		}
@@ -1123,14 +1122,14 @@
 
 	client += strspn(client, "\\");
 
-	if (utf8_strcasecmp(client, sn->workstation) == 0)
+	if (smb_strcasecmp(client, sn->workstation, 0) == 0)
 		return (B_TRUE);
 
 	ipaddr = &sn->ipaddr;
 	if (smb_inet_ntop(ipaddr, buf, SMB_IPSTRLEN(ipaddr->a_family)) == NULL)
 		return (B_FALSE);
 
-	if (utf8_strcasecmp(client, buf) == 0)
+	if (smb_strcasecmp(client, buf, 0) == 0)
 		return (B_TRUE);
 
 	return (B_FALSE);
@@ -1161,13 +1160,12 @@
 	bzero(sr, sizeof (smb_request_t));
 
 	mutex_init(&sr->sr_mutex, NULL, MUTEX_DEFAULT, NULL);
+	smb_srm_init(sr);
 	sr->session = session;
 	sr->sr_server = session->s_server;
 	sr->sr_gmtoff = session->s_server->si_gmtoff;
 	sr->sr_cache = session->s_server->si_cache_request;
 	sr->sr_cfg = &session->s_cfg;
-	sr->request_storage.forw = &sr->request_storage;
-	sr->request_storage.back = &sr->request_storage;
 	sr->command.max_bytes = req_length;
 	sr->reply.max_bytes = smb_maxbufsize;
 	sr->sr_req_length = req_length;
@@ -1204,8 +1202,7 @@
 
 	sr->session = NULL;
 
-	/* Release any temp storage */
-	smbsr_free_malloc_list(&sr->request_storage);
+	smb_srm_fini(sr);
 
 	if (sr->sr_request_buf)
 		kmem_free(sr->sr_request_buf, sr->sr_req_length);
--- a/usr/src/uts/common/fs/smbsrv/smb_session_setup_andx.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_session_setup_andx.c	Thu Nov 05 14:34:36 2009 -0800
@@ -222,7 +222,7 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_token.h>
 #include <smbsrv/smb_door_svc.h>
 
@@ -477,8 +477,7 @@
 	boolean_t need_lookup = B_FALSE;
 	uint32_t privileges;
 	cred_t *cr;
-	char *buf;
-	size_t buflen = 0;
+	char *buf = NULL;
 	char *p;
 
 	bzero(&clnt_info, sizeof (netr_client_t));
@@ -500,8 +499,7 @@
 	 * for some forms of authentication.
 	 */
 	if (*sinfo->ssi_domain == '\0') {
-		buflen = strlen(sinfo->ssi_user) + 1;
-		buf = smb_kstrdup(sinfo->ssi_user, buflen);
+		buf = smb_strdup(sinfo->ssi_user);
 		if ((p = strchr(buf, '@')) != NULL) {
 			*p = '\0';
 			clnt_info.e_username = buf;
@@ -531,8 +529,7 @@
 		sr->smb_uid = user->u_uid;
 		sr->uid_user = user;
 
-		if (buflen != 0)
-			kmem_free(buf, buflen);
+		smb_mfree(buf);
 
 		return ((user->u_flags & SMB_USER_FLAG_GUEST)
 		    ? SMB_AUTH_GUEST : SMB_AUTH_USER);
@@ -561,8 +558,7 @@
 
 	usr_token = smb_get_token(&clnt_info);
 
-	if (buflen != 0)
-		kmem_free(buf, buflen);
+	smb_mfree(buf);
 
 	if (usr_token == NULL) {
 		smbsr_error(sr, 0, ERRSRV, ERRbadpw);
--- a/usr/src/uts/common/fs/smbsrv/smb_set_fileinfo.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_set_fileinfo.c	Thu Nov 05 14:34:36 2009 -0800
@@ -33,8 +33,10 @@
  * SMB_SET_FILE_END_OF_FILE_INFO
  * SMB_SET_FILE_ALLOCATION_INFO
  *
- * Supported Passthrough levels:
+ * Handled Passthrough levels:
  * SMB_FILE_BASIC_INFORMATION
+ * SMB_FILE_RENAME_INFORMATION
+ * SMB_FILE_LINK_INFORMATION
  * SMB_FILE_DISPOSITION_INFORMATION
  * SMB_FILE_END_OF_FILE_INFORMATION
  * SMB_FILE_ALLOCATION_INFORMATION
@@ -61,7 +63,7 @@
  *   attributes.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 
 typedef struct smb_setinfo {
@@ -84,6 +86,7 @@
 static int smb_set_disposition_info(smb_request_t *, smb_setinfo_t *);
 static int smb_set_eof_info(smb_request_t *sr, smb_setinfo_t *);
 static int smb_set_alloc_info(smb_request_t *sr, smb_setinfo_t *);
+static int smb_set_rename_info(smb_request_t *sr, smb_setinfo_t *);
 
 /*
  * smb_com_trans2_set_file_information
@@ -285,7 +288,12 @@
 	kmem_free(name, MAXNAMELEN);
 
 	if (rc != 0) {
-		smbsr_errno(sr, rc);
+		if (rc == ENOENT) {
+			smbsr_error(sr, NT_STATUS_OBJECT_NAME_NOT_FOUND,
+			    ERRDOS, ERROR_FILE_NOT_FOUND);
+		} else {
+			smbsr_errno(sr, rc);
+		}
 		return (-1);
 	}
 
@@ -305,6 +313,9 @@
 
 /*
  * smb_set_fileinfo
+ *
+ * For compatibility with windows servers, SMB_FILE_LINK_INFORMATION
+ * is handled by returning NT_STATUS_NOT_SUPPORTED.
  */
 static int
 smb_set_fileinfo(smb_request_t *sr, smb_setinfo_t *sinfo)
@@ -339,6 +350,13 @@
 	case SMB_FILE_ALLOCATION_INFORMATION:
 		return (smb_set_alloc_info(sr, sinfo));
 
+	case SMB_FILE_RENAME_INFORMATION:
+		return (smb_set_rename_info(sr, sinfo));
+
+	case SMB_FILE_LINK_INFORMATION:
+		smbsr_error(sr, NT_STATUS_NOT_SUPPORTED,
+		    ERRDOS, ERROR_NOT_SUPPORTED);
+		return (-1);
 	default:
 		break;
 	}
@@ -681,3 +699,44 @@
 	}
 	return (0);
 }
+
+/*
+ * smb_set_rename_info
+ *
+ * Explicity specified parameter validation rules:
+ * - If rootdir is not NULL respond with NT_STATUS_INVALID_PARAMETER.
+ * - If the filename contains a separator character respond with
+ *   NT_STATUS_INVALID_PARAMETER.
+ */
+static int
+smb_set_rename_info(smb_request_t *sr, smb_setinfo_t *sinfo)
+{
+	int rc;
+	uint32_t flags, rootdir, namelen;
+	char *fname;
+
+	rc = smb_mbc_decodef(&sinfo->si_xa->req_data_mb, "lll",
+	    &flags, &rootdir, &namelen);
+	if (rc == 0) {
+		rc = smb_mbc_decodef(&sinfo->si_xa->req_data_mb, "%#U",
+		    sr, namelen, &fname);
+	}
+	if (rc != 0)
+		return (-1);
+
+	if ((rootdir != 0) || (namelen == 0) || (namelen >= MAXNAMELEN)) {
+		smbsr_error(sr, NT_STATUS_INVALID_PARAMETER,
+		    ERRDOS, ERROR_INVALID_PARAMETER);
+		return (-1);
+	}
+
+	if (strchr(fname, '\\') != NULL) {
+		smbsr_error(sr, NT_STATUS_NOT_SUPPORTED,
+		    ERRDOS, ERROR_NOT_SUPPORTED);
+		return (-1);
+	}
+
+	rc = smb_trans2_rename(sr, sinfo->si_node, fname, flags);
+
+	return ((rc == 0) ? 0 : -1);
+}
--- a/usr/src/uts/common/fs/smbsrv/smb_signing.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_signing.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,12 +19,10 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"@(#)smb_signing.c	1.4	08/07/08 SMI"
-
 /*
  * These routines provide the SMB MAC signing for the SMB server.
  * The routines calculate the signature of a SMB message in an mbuf chain.
@@ -42,10 +40,9 @@
  */
 
 #include <sys/uio.h>
-#include <smbsrv/mbuf.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/msgbuf.h>
 #include <sys/crypto/api.h>
-#include <smbsrv/smb_incl.h>
 
 #define	SMBAUTH_SESSION_KEY_SZ 16
 #define	SMB_SIG_SIZE	8
--- a/usr/src/uts/common/fs/smbsrv/smb_trans2_create_directory.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_trans2_create_directory.c	Thu Nov 05 14:34:36 2009 -0800
@@ -51,9 +51,7 @@
  *                             occurred while setting EAs
  */
 
-#include <smbsrv/nterror.h>
-#include <smbsrv/ntstatus.h>
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 
 /*
--- a/usr/src/uts/common/fs/smbsrv/smb_trans2_dfs.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_trans2_dfs.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,13 +19,11 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 
 /*
--- a/usr/src/uts/common/fs/smbsrv/smb_trans2_find.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_trans2_find.c	Thu Nov 05 14:34:36 2009 -0800
@@ -202,7 +202,7 @@
  *  STRING FileName;                   Files full length name
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/msgbuf.h>
 #include <smbsrv/smb_fsops.h>
 
@@ -686,7 +686,7 @@
 		 * Regardless of whether unicode or ascii, a single
 		 * termination byte is used.
 		 */
-		buflen = namelen + sizeof (mts_wchar_t);
+		buflen = namelen + sizeof (smb_wchar_t);
 		tmpbuf = kmem_zalloc(buflen, KM_SLEEP);
 		smb_msgbuf_init(&mb, (uint8_t *)tmpbuf, buflen, mb_flags);
 		if (smb_msgbuf_encode(&mb, "u", fileinfo->fi_name) < 0) {
@@ -768,7 +768,7 @@
 			smb_msgbuf_term(&mb);
 			return (-1);
 		}
-		shortlen = mts_wcequiv_strlen(fileinfo->fi_shortname);
+		shortlen = smb_wcequiv_strlen(fileinfo->fi_shortname);
 
 		(void) smb_mbc_encodef(&xa->rep_data_mb, "%llTTTTqqlllb.24cu",
 		    sr,
--- a/usr/src/uts/common/fs/smbsrv/smb_trans2_query_fs_information.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_trans2_query_fs_information.c	Thu Nov 05 14:34:36 2009 -0800
@@ -230,7 +230,7 @@
  * ERRSRV/ERRinvdevice - resource identified by TID is not a file system
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
 #include <smbsrv/smbinfo.h>
 
@@ -315,7 +315,7 @@
 	case SMB_QUERY_FS_VOLUME_INFO:
 		if ((sr->smb_flg2 & SMB_FLAGS2_UNICODE) ||
 		    (sr->session->native_os == NATIVE_OS_WIN95)) {
-			length = mts_wcequiv_strlen(tree->t_volume);
+			length = smb_wcequiv_strlen(tree->t_volume);
 			encode_str = "%qllb.U";
 		} else {
 			length = strlen(tree->t_volume);
@@ -364,7 +364,7 @@
 		    (sr->session->native_os == NATIVE_OS_WIN2000) ||
 		    (sr->session->native_os == NATIVE_OS_WIN95) ||
 		    (sr->session->native_os == NATIVE_OS_MACOS)) {
-			length = mts_wcequiv_strlen(fsname);
+			length = smb_wcequiv_strlen(fsname);
 			encode_str = "%lllU";
 			sr->smb_flg2 |= SMB_FLAGS2_UNICODE;
 		} else {
--- a/usr/src/uts/common/fs/smbsrv/smb_tree.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_tree.c	Thu Nov 05 14:34:36 2009 -0800
@@ -170,7 +170,7 @@
 #include <sys/stat.h>
 #include <sys/varargs.h>
 #include <sys/cred_impl.h>
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/lmerr.h>
 #include <smbsrv/smb_fsops.h>
 #include <smbsrv/smb_door_svc.h>
@@ -215,7 +215,7 @@
 	const char *name;
 	int32_t stype;
 
-	(void) utf8_strlwr(unc_path);
+	(void) smb_strlwr(unc_path);
 
 	if ((name = smb_tree_get_sharename(unc_path)) == NULL) {
 		smbsr_error(sr, 0, ERRSRV, ERRinvnetname);
@@ -1048,7 +1048,7 @@
 	}
 
 	(void) strlcpy(tree->t_typename, name, SMB_TYPENAMELEN);
-	(void) utf8_strupr((char *)tree->t_typename);
+	(void) smb_strupr((char *)tree->t_typename);
 
 	if (vfs_has_feature(vfsp, VFSFT_XVATTR))
 		flags |= SMB_TREE_XVATTR;
@@ -1339,7 +1339,7 @@
 	info->ci_time = gethrestime_sec() - tree->t_connect_time;
 
 	info->ci_sharelen = strlen(tree->t_sharename) + 1;
-	info->ci_share = smb_kstrdup(tree->t_sharename, info->ci_sharelen);
+	info->ci_share = smb_strdup(tree->t_sharename);
 
 	user = tree->t_user;
 	ASSERT(user);
@@ -1359,7 +1359,7 @@
 	if (info->ci_username)
 		kmem_free(info->ci_username, info->ci_namelen);
 	if (info->ci_share)
-		kmem_free(info->ci_share, info->ci_sharelen);
+		smb_mfree(info->ci_share);
 
 	bzero(info, sizeof (smb_netconnectinfo_t));
 }
--- a/usr/src/uts/common/fs/smbsrv/smb_tree_connect.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_tree_connect.c	Thu Nov 05 14:34:36 2009 -0800
@@ -23,7 +23,7 @@
  * Use is subject to license terms.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 
 /*
@@ -251,8 +251,7 @@
 	    &sr->arg.tcon.flags, &pwlen);
 	if (rc == 0) {
 		if (pwlen != 0) {
-			pwbuf = (uint8_t *)smbsr_malloc(&sr->request_storage,
-			    pwlen);
+			pwbuf = smb_srm_alloc(sr, pwlen);
 			bzero(pwbuf, pwlen);
 		}
 
--- a/usr/src/uts/common/fs/smbsrv/smb_unlock_byte_range.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_unlock_byte_range.c	Thu Nov 05 14:34:36 2009 -0800
@@ -51,7 +51,7 @@
  * USHORT ByteCount;                  Count of data bytes = 0
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 smb_sdrc_t
 smb_pre_unlock_byte_range(smb_request_t *sr)
--- a/usr/src/uts/common/fs/smbsrv/smb_user.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_user.c	Thu Nov 05 14:34:36 2009 -0800
@@ -163,7 +163,7 @@
  *       being queued in that list is NOT registered by incrementing the
  *       reference count.
  */
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_door_svc.h>
 
 
@@ -230,8 +230,8 @@
 	user->u_privileges = privileges;
 	user->u_name_len = strlen(account_name) + 1;
 	user->u_domain_len = strlen(domain_name) + 1;
-	user->u_name = smb_kstrdup(account_name, user->u_name_len);
-	user->u_domain = smb_kstrdup(domain_name, user->u_domain_len);
+	user->u_name = smb_strdup(account_name);
+	user->u_domain = smb_strdup(domain_name);
 	user->u_cred = cr;
 	user->u_privcred = smb_cred_create_privs(cr, privileges);
 	user->u_audit_sid = audit_sid;
@@ -254,8 +254,8 @@
 		}
 		smb_idpool_free(&session->s_uid_pool, user->u_uid);
 	}
-	kmem_free(user->u_name, (size_t)user->u_name_len);
-	kmem_free(user->u_domain, (size_t)user->u_domain_len);
+	smb_mfree(user->u_name);
+	smb_mfree(user->u_domain);
 	kmem_cache_free(session->s_server->si_cache_user, user);
 	return (NULL);
 }
@@ -582,7 +582,7 @@
 	while (tree) {
 		ASSERT(tree->t_magic == SMB_TREE_MAGIC);
 		ASSERT(tree->t_user == user);
-		if (utf8_strcasecmp(tree->t_sharename, sharename) == 0) {
+		if (smb_strcasecmp(tree->t_sharename, sharename, 0) == 0) {
 			if (smb_tree_hold(tree)) {
 				smb_llist_exit(&user->u_tree_list);
 				return (tree);
@@ -625,7 +625,7 @@
 		ASSERT(tree->t_magic == SMB_TREE_MAGIC);
 		ASSERT(tree->t_user == user);
 
-		if (utf8_strcasecmp(tree->t_volume, name) == 0) {
+		if (smb_strcasecmp(tree->t_volume, name, 0) == 0) {
 			if (smb_tree_hold(tree)) {
 				smb_llist_exit(&user->u_tree_list);
 				return (tree);
@@ -776,7 +776,7 @@
 	char		*fq_name;
 	boolean_t	match;
 
-	if (utf8_strcasecmp(name, user->u_name) == 0)
+	if (smb_strcasecmp(name, user->u_name, 0) == 0)
 		return (B_TRUE);
 
 	fq_name = kmem_alloc(MAXNAMELEN, KM_SLEEP);
@@ -784,12 +784,12 @@
 	(void) snprintf(fq_name, MAXNAMELEN, "%s\\%s",
 	    user->u_domain, user->u_name);
 
-	match = (utf8_strcasecmp(name, fq_name) == 0);
+	match = (smb_strcasecmp(name, fq_name, 0) == 0);
 	if (!match) {
 		(void) snprintf(fq_name, MAXNAMELEN, "%s@%s",
 		    user->u_name, user->u_domain);
 
-		match = (utf8_strcasecmp(name, fq_name) == 0);
+		match = (smb_strcasecmp(name, fq_name, 0) == 0);
 	}
 
 	kmem_free(fq_name, MAXNAMELEN);
@@ -891,8 +891,8 @@
 	crfree(user->u_cred);
 	if (user->u_privcred)
 		crfree(user->u_privcred);
-	kmem_free(user->u_name, (size_t)user->u_name_len);
-	kmem_free(user->u_domain, (size_t)user->u_domain_len);
+	smb_mfree(user->u_name);
+	smb_mfree(user->u_domain);
 	kmem_cache_free(user->u_server->si_cache_user, user);
 }
 
@@ -1018,15 +1018,15 @@
 	info->ui_flags = user->u_flags;
 
 	info->ui_domain_len = user->u_domain_len;
-	info->ui_domain = smb_kstrdup(user->u_domain, info->ui_domain_len);
+	info->ui_domain = smb_strdup(user->u_domain);
 
 	info->ui_account_len = user->u_name_len;
-	info->ui_account = smb_kstrdup(user->u_name, info->ui_account_len);
+	info->ui_account = smb_strdup(user->u_name);
 
 	buf = kmem_alloc(MAXNAMELEN, KM_SLEEP);
 	smb_session_getclient(session, buf, MAXNAMELEN);
 	info->ui_workstation_len = strlen(buf) + 1;
-	info->ui_workstation = smb_kstrdup(buf, info->ui_workstation_len);
+	info->ui_workstation = smb_strdup(buf);
 	kmem_free(buf, MAXNAMELEN);
 }
 
@@ -1037,11 +1037,11 @@
 		return;
 
 	if (info->ui_domain)
-		kmem_free(info->ui_domain, info->ui_domain_len);
+		smb_mfree(info->ui_domain);
 	if (info->ui_account)
-		kmem_free(info->ui_account, info->ui_account_len);
+		smb_mfree(info->ui_account);
 	if (info->ui_workstation)
-		kmem_free(info->ui_workstation, info->ui_workstation_len);
+		smb_mfree(info->ui_workstation);
 
 	bzero(info, sizeof (smb_netuserinfo_t));
 }
--- a/usr/src/uts/common/fs/smbsrv/smb_util.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_util.c	Thu Nov 05 14:34:36 2009 -0800
@@ -29,10 +29,9 @@
 #include <sys/atomic.h>
 #include <sys/kidmap.h>
 #include <sys/time.h>
-#include <smbsrv/smb_incl.h>
+#include <sys/cpuvar.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
-#include <smbsrv/string.h>
-#include <smbsrv/mbuf.h>
 #include <smbsrv/smbinfo.h>
 #include <smbsrv/smb_xdr.h>
 #include <smbsrv/smb_vops.h>
@@ -41,9 +40,6 @@
 #include <sys/sid.h>
 #include <sys/priv_names.h>
 
-#define	SMB_NAME83_BASELEN		8
-#define	SMB_NAME83_EXTLEN		3
-
 static void smb_replace_wildcards(char *);
 
 static boolean_t
@@ -77,7 +73,7 @@
 smb_ascii_or_unicode_strlen(struct smb_request *sr, char *str)
 {
 	if (sr->smb_flg2 & SMB_FLAGS2_UNICODE)
-		return (mts_wcequiv_strlen(str));
+		return (smb_wcequiv_strlen(str));
 	return (strlen(str));
 }
 
@@ -85,7 +81,7 @@
 smb_ascii_or_unicode_strlen_null(struct smb_request *sr, char *str)
 {
 	if (sr->smb_flg2 & SMB_FLAGS2_UNICODE)
-		return (mts_wcequiv_strlen(str) + 2);
+		return (smb_wcequiv_strlen(str) + 2);
 	return (strlen(str) + 1);
 }
 
@@ -310,7 +306,7 @@
 	if (stype == NULL)
 		(void) strlcat(stream, ":$DATA", MAXNAMELEN);
 	else
-		(void) utf8_strupr(stype);
+		(void) smb_strupr(stype);
 }
 
 /*
@@ -1440,7 +1436,7 @@
 		for (i = 0; i < sib->sib_nmap; i++) {
 			domsid = sib->sib_maps[i].sim_domsid;
 			if (domsid)
-				kmem_free(domsid, strlen(domsid) + 1);
+				smb_mfree(domsid);
 		}
 	}
 
@@ -1474,7 +1470,7 @@
 	smb_sid_tostr(sid, strsid);
 	if (smb_sid_splitstr(strsid, &sim->sim_rid) != 0)
 		return (IDMAP_ERR_SID);
-	sim->sim_domsid = smb_kstrdup(strsid, strlen(strsid) + 1);
+	sim->sim_domsid = smb_strdup(strsid);
 
 	switch (idtype) {
 	case SMB_IDMAP_USER:
@@ -2036,23 +2032,6 @@
 }
 
 /*
- * smb_kstrdup
- *
- * Duplicate the given string s.
- */
-char *
-smb_kstrdup(const char *s, size_t n)
-{
-	char *s2;
-
-	ASSERT(s);
-	ASSERT(n);
-	s2 = kmem_alloc(n, KM_SLEEP);
-	(void) strlcpy(s2, s, n);
-	return (s2);
-}
-
-/*
  * smb_cred_create_privs
  *
  * Creates a duplicate credential that contains system privileges for
--- a/usr/src/uts/common/fs/smbsrv/smb_vfs.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_vfs.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,19 +19,16 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"@(#)smb_vfs.c	1.3	08/08/07 SMI"
-
 #include <sys/types.h>
 #include <sys/fsid.h>
 #include <sys/vfs.h>
 #include <sys/stat.h>
 #include <smbsrv/smb_ktypes.h>
 #include <smbsrv/smb_kproto.h>
-#include <smbsrv/string.h>
 
 static smb_vfs_t *smb_vfs_lookup(smb_server_t *, vnode_t *);
 
--- a/usr/src/uts/common/fs/smbsrv/smb_vops.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_vops.c	Thu Nov 05 14:34:36 2009 -0800
@@ -37,12 +37,10 @@
 #include <sys/fcntl.h>
 #include <nfs/lm.h>
 
-#include <smbsrv/smb_vops.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/string.h>
-
+#include <smbsrv/smb_vops.h>
 #include <smbsrv/smb_fsops.h>
-#include <smbsrv/smb_kproto.h>
-#include <smbsrv/smb_incl.h>
 
 /*
  * CATIA support
@@ -110,7 +108,7 @@
 typedef struct smb_catia_map
 {
 	unsigned char unixchar;	/* v4 */
-	mts_wchar_t winchar;	/* v5 */
+	smb_wchar_t winchar;	/* v5 */
 } smb_catia_map_t;
 
 smb_catia_map_t catia_maps[SMB_CATIA_NUM_MAPS] =
@@ -126,8 +124,8 @@
 	{'|',  SMB_CATIA_WIN_BROKEN_BAR}
 };
 
-static mts_wchar_t smb_catia_v5_lookup[SMB_CATIA_V5_LOOKUP_MAX];
-static mts_wchar_t smb_catia_v4_lookup[SMB_CATIA_V4_LOOKUP_MAX];
+static smb_wchar_t smb_catia_v5_lookup[SMB_CATIA_V5_LOOKUP_MAX];
+static smb_wchar_t smb_catia_v4_lookup[SMB_CATIA_V4_LOOKUP_MAX];
 
 static void smb_vop_setup_xvattr(smb_attr_t *smb_attr, xvattr_t *xvattr);
 static void smb_sa_to_va_mask(uint_t sa_mask, uint_t *va_maskp);
@@ -1400,11 +1398,11 @@
 	int i, idx, offset = SMB_CATIA_V4_LOOKUP_LOW;
 
 	for (i = 0; i < SMB_CATIA_V4_LOOKUP_MAX; i++)
-		smb_catia_v4_lookup[i] = (mts_wchar_t)(i + offset);
+		smb_catia_v4_lookup[i] = (smb_wchar_t)(i + offset);
 
 	for (i = 0; i < SMB_CATIA_NUM_MAPS; i++) {
 		idx = (int)catia_maps[i].winchar - offset;
-		smb_catia_v4_lookup[idx] = (mts_wchar_t)catia_maps[i].unixchar;
+		smb_catia_v4_lookup[idx] = (smb_wchar_t)catia_maps[i].unixchar;
 	}
 }
 
@@ -1420,7 +1418,7 @@
 	int i, idx;
 
 	for (i = 0; i < SMB_CATIA_V5_LOOKUP_MAX; i++)
-		smb_catia_v5_lookup[i] = (mts_wchar_t)i;
+		smb_catia_v5_lookup[i] = (smb_wchar_t)i;
 
 	for (i = 0; i < SMB_CATIA_NUM_MAPS; i++) {
 		idx = (int)catia_maps[i].unixchar;
@@ -1452,7 +1450,7 @@
 {
 	int v4_idx, numbytes, inc;
 	int space_left = buflen - 1; /* one byte reserved for null */
-	mts_wchar_t wc;
+	smb_wchar_t wc;
 	char mbstring[MTS_MB_CHAR_MAX];
 	char *p, *src = name, *dst = buf;
 
@@ -1465,7 +1463,7 @@
 	bzero(buf, buflen);
 
 	while (*src) {
-		if ((numbytes = mts_mbtowc(&wc, src, MTS_MB_CHAR_MAX)) < 0)
+		if ((numbytes = smb_mbtowc(&wc, src, MTS_MB_CHAR_MAX)) < 0)
 			return (name);
 
 		if (wc < SMB_CATIA_V4_LOOKUP_LOW ||
@@ -1475,7 +1473,7 @@
 		} else {
 			/* Lookup required. */
 			v4_idx = (int)wc - SMB_CATIA_V4_LOOKUP_LOW;
-			inc = mts_wctomb(mbstring, smb_catia_v4_lookup[v4_idx]);
+			inc = smb_wctomb(mbstring, smb_catia_v4_lookup[v4_idx]);
 			p = mbstring;
 		}
 
@@ -1509,7 +1507,7 @@
 {
 	int v5_idx, numbytes;
 	int space_left = buflen - 1; /* one byte reserved for null */
-	mts_wchar_t wc;
+	smb_wchar_t wc;
 	char mbstring[MTS_MB_CHAR_MAX];
 	char *src = name, *dst = buf;
 
@@ -1521,16 +1519,16 @@
 
 	(void) bzero(buf, buflen);
 	while (*src) {
-		if (mts_isascii(*src)) {
+		if (smb_isascii(*src)) {
 			/* Lookup required */
 			v5_idx = (int)*src++;
-			numbytes = mts_wctomb(mbstring,
+			numbytes = smb_wctomb(mbstring,
 			    smb_catia_v5_lookup[v5_idx]);
 			if (space_left < numbytes)
 				break;
 			(void) strncpy(dst, mbstring, numbytes);
 		} else {
-			if ((numbytes = mts_mbtowc(&wc, src,
+			if ((numbytes = smb_mbtowc(&wc, src,
 			    MTS_MB_CHAR_MAX)) < 0)
 				break;
 			if (space_left < numbytes)
--- a/usr/src/uts/common/fs/smbsrv/smb_vss.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_vss.c	Thu Nov 05 14:34:36 2009 -0800
@@ -39,9 +39,9 @@
  * in the snapshot.
  */
 
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
+#include <smbsrv/string.h>
 #include <smbsrv/winioctl.h>
-#include <smbsrv/ntstatus.h>
 #include <smbsrv/smb_door_svc.h>
 
 /* Size of the token on the wire due to encoding */
@@ -249,7 +249,7 @@
 
 	while (*template) {
 		if (*template == 'N') {
-			if (!mts_isdigit(*str))
+			if (!smb_isdigit(*str))
 				return (B_FALSE);
 		} else if (*template != *str) {
 			return (B_FALSE);
--- a/usr/src/uts/common/fs/smbsrv/smb_write.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_write.c	Thu Nov 05 14:34:36 2009 -0800
@@ -24,9 +24,8 @@
  */
 
 #include <sys/sdt.h>
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
-#include <smbsrv/mbuf.h>
 #include <smbsrv/netbios.h>
 
 
--- a/usr/src/uts/common/fs/smbsrv/smb_write_raw.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_write_raw.c	Thu Nov 05 14:34:36 2009 -0800
@@ -182,9 +182,8 @@
  */
 
 #include <sys/sdt.h>
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 #include <smbsrv/smb_fsops.h>
-#include <smbsrv/mbuf.h>
 #include <smbsrv/netbios.h>
 
 extern uint32_t smb_keep_alive;
--- a/usr/src/uts/common/fs/smbsrv/smb_xlate.c	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/fs/smbsrv/smb_xlate.c	Thu Nov 05 14:34:36 2009 -0800
@@ -19,13 +19,11 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-#include <smbsrv/smb_incl.h>
+#include <smbsrv/smb_kproto.h>
 
 struct xlate_table {
 	int		code;
--- a/usr/src/uts/common/smbsrv/Makefile	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/smbsrv/Makefile	Thu Nov 05 14:34:36 2009 -0800
@@ -25,21 +25,10 @@
 include ../../../Makefile.master
 
 HDRS=	alloc.h			\
-	cifs.h			\
-	codepage.h		\
-	cp_cyrillic.h		\
-	cp_latin1.h		\
-	cp_latin2.h		\
-	cp_latin3.h		\
-	cp_latin4.h		\
-	cp_latin5.h		\
-	cp_latin6.h		\
 	cp_unicode.h		\
 	cp_usascii.h		\
-	ctype.h			\
 	doserror.h		\
 	hash_table.h		\
-	lm.h			\
 	lmdfs.h			\
 	lmerr.h			\
 	mac_cifs.h		\
@@ -56,14 +45,11 @@
 	ntlocale.h		\
 	smb_sid.h		\
 	ntstatus.h		\
-	oem.h			\
 	smb.h			\
 	smb_common_door.h	\
 	smb_door_svc.h		\
 	smb_fsops.h		\
-	smb_i18n.h		\
 	smb_idmap.h		\
-	smb_incl.h		\
 	smb_inet.h		\
 	smb_ioctl.h		\
 	smb_kproto.h		\
@@ -74,7 +60,6 @@
 	smb_token.h		\
 	smb_vops.h		\
 	smb_xdr.h		\
-	smbfmt.h		\
 	smbinfo.h		\
 	string.h		\
 	svrapi.h		\
--- a/usr/src/uts/common/smbsrv/alloc.h	Thu Nov 05 12:17:17 2009 -0800
+++ b/usr/src/uts/common/smbsrv/alloc.h	Thu Nov 05 14:34:36 2009 -0800
@@ -19,15 +19,13 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #ifndef	_SMBSRV_ALLOC_H
 #define	_SMBSRV_ALLOC_H
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -68,17 +66,16 @@
 
 #else /* _KERNEL */
 
-void *mem_malloc(uint32_t size);
-void *mem_zalloc(uint32_t size);
-char *mem_strdup(const char *ptr);
-void *mem_realloc(void *ptr, uint32_t size);
-void smb_mem_free(void *ptr);
+void *smb_malloc(uint32_t);
+char *smb_strdup(const char *);
+void *smb_realloc(void *, uint32_t);
+void smb_mfree(void *);
 
-#define	MEM_MALLOC(AREA, SIZE) mem_malloc(SIZE)
-#define	MEM_ZALLOC(AREA, SIZE) mem_zalloc(SIZE)
-#define	MEM_STRDUP(AREA, PTR) mem_strdup(PTR)
-#define	MEM_REALLOC(AREA, PTR, SIZE) mem_realloc((PTR), (SIZE))
-#define	MEM_FREE(AREA, PTR) smb_mem_free(PTR)
+#define	MEM_MALLOC(AREA, SIZE) smb_malloc(SIZE)
+#define	MEM_ZALLOC(AREA, SIZE) smb_malloc(SIZE)
+#define	MEM_STRDUP(AREA, PTR) smb_strdup(PTR)
+#define	MEM_REALLOC(AREA, PTR, SIZE) smb_realloc((PTR), (SIZE))
+#define	MEM_FREE(AREA, PTR) smb_mfree(PTR)
 
 #endif /* _KERNEL */
 
--- a/usr/src/uts/common/smbsrv/cifs.h	Thu Nov 05 12:17:17 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1217 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SMBSRV_CIFS_H
-#define	_SMBSRV_CIFS_H
-
-
-/*
- * This file provides definitions for the CIFS interface. The Macintosh
- * Extensions for CIFS are defined in mac_cifs.h.
- */
-
-/*
- * Macintosh Extensions for CIFS
- */
-#include <smbsrv/mac_cifs.h>
-
-/*
- * NT Installable File System (IFS) interface.
- */
-#include <smbsrv/ntifs.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Share types */
-#ifndef _SHARE_TYPES_DEFINED_
-#define	_SHARE_TYPES_DEFINED_
-#define	STYPE_DISKTREE			0x00000000
-#define	STYPE_PRINTQ			0x00000001
-#define	STYPE_DEVICE			0x00000002
-#define	STYPE_IPC			0x00000003
-#define	STYPE_MASK			0x0000000F
-#define	STYPE_DFS			0x00000064
-#define	STYPE_HIDDEN			0x80000000
-#define	STYPE_SPECIAL			0x80000000
-#endif /* _SHARE_TYPES_DEFINED_ */
-
-#define	STYPE_ISDSK(S)	(((S) & STYPE_MASK) == STYPE_DISKTREE)
-#define	STYPE_ISPRN(S)	(((S) & STYPE_MASK) == STYPE_PRINTQ)
-#define	STYPE_ISDEV(S)	(((S) & STYPE_MASK) == STYPE_DEVICE)
-#define	STYPE_ISIPC(S)	(((S) & STYPE_MASK) == STYPE_IPC)
-
-/*
- * NtCreateAndX and NtTransactCreate creation flags: defined in CIFS
- * section 4.2.2
- *
- * Creation Flag Name         Value  Description
- * ========================== ====== ==================================
- * NT_CREATE_REQUEST_OPLOCK   0x02   Level I oplock requested
- * NT_CREATE_REQUEST_OPBATCH  0x04   Batch oplock requested
- * NT_CREATE_OPEN_TARGET_DIR  0x08   Target for open is a directory
- */
-#define	NT_CREATE_FLAG_REQUEST_OPLOCK		0x02
-#define	NT_CREATE_FLAG_REQUEST_OPBATCH		0x04
-#define	NT_CREATE_FLAG_OPEN_TARGET_DIR		0x08
-
-
-/*
- * Define the filter flags for NtNotifyChangeDirectoryFile
- */
-#define	FILE_NOTIFY_CHANGE_FILE_NAME	0x00000001
-#define	FILE_NOTIFY_CHANGE_DIR_NAME	0x00000002
-#define	FILE_NOTIFY_CHANGE_NAME		0x00000003
-#define	FILE_NOTIFY_CHANGE_ATTRIBUTES	0x00000004
-#define	FILE_NOTIFY_CHANGE_SIZE		0x00000008
-#define	FILE_NOTIFY_CHANGE_LAST_WRITE	0x00000010
-#define	FILE_NOTIFY_CHANGE_LAST_ACCESS	0x00000020
-#define	FILE_NOTIFY_CHANGE_CREATION	0x00000040
-#define	FILE_NOTIFY_CHANGE_EA		0x00000080
-#define	FILE_NOTIFY_CHANGE_SECURITY	0x00000100
-#define	FILE_NOTIFY_CHANGE_STREAM_NAME	0x00000200
-#define	FILE_NOTIFY_CHANGE_STREAM_SIZE	0x00000400
-#define	FILE_NOTIFY_CHANGE_STREAM_WRITE	0x00000800
-#define	FILE_NOTIFY_VALID_MASK		0x00000fff
-
-
-/*
- * Define the file action type codes for NtNotifyChangeDirectoryFile
- */
-#define	FILE_ACTION_ADDED		0x00000001
-#define	FILE_ACTION_REMOVED		0x00000002
-#define	FILE_ACTION_MODIFIED		0x00000003
-#define	FILE_ACTION_RENAMED_OLD_NAME	0x00000004
-#define	FILE_ACTION_RENAMED_NEW_NAME	0x00000005
-#define	FILE_ACTION_ADDED_STREAM	0x00000006
-#define	FILE_ACTION_REMOVED_STREAM	0x00000007
-#define	FILE_ACTION_MODIFIED_STREAM	0x00000008
-
-
-/* Lock type flags */
-#define	LOCKING_ANDX_NORMAL_LOCK	0x00
-#define	LOCKING_ANDX_SHARED_LOCK	0x01
-#define	LOCKING_ANDX_OPLOCK_RELEASE	0x02
-#define	LOCKING_ANDX_CHANGE_LOCK_TYPE	0x04
-#define	LOCKING_ANDX_CANCEL_LOCK	0x08
-#define	LOCKING_ANDX_LARGE_FILES	0x10
-
-#define	SMB_COM_CREATE_DIRECTORY	0x00
-#define	SMB_COM_DELETE_DIRECTORY	0x01
-#define	SMB_COM_OPEN			0x02
-#define	SMB_COM_CREATE			0x03
-#define	SMB_COM_CLOSE			0x04
-#define	SMB_COM_FLUSH			0x05
-#define	SMB_COM_DELETE			0x06
-#define	SMB_COM_RENAME			0x07
-#define	SMB_COM_QUERY_INFORMATION	0x08
-#define	SMB_COM_SET_INFORMATION		0x09
-#define	SMB_COM_READ			0x0A
-#define	SMB_COM_WRITE			0x0B
-#define	SMB_COM_LOCK_BYTE_RANGE		0x0C
-#define	SMB_COM_UNLOCK_BYTE_RANGE	0x0D
-#define	SMB_COM_CREATE_TEMPORARY	0x0E
-#define	SMB_COM_CREATE_NEW		0x0F
-#define	SMB_COM_CHECK_DIRECTORY		0x10
-#define	SMB_COM_PROCESS_EXIT		0x11
-#define	SMB_COM_SEEK			0x12
-#define	SMB_COM_LOCK_AND_READ		0x13
-#define	SMB_COM_WRITE_AND_UNLOCK	0x14
-
-#define	SMB_COM_READ_RAW		0x1A
-#define	SMB_COM_READ_MPX		0x1B
-#define	SMB_COM_READ_MPX_SECONDARY	0x1C
-#define	SMB_COM_WRITE_RAW		0x1D
-#define	SMB_COM_WRITE_MPX		0x1E
-#define	SMB_COM_WRITE_MPX_SECONDARY	0x1F
-#define	SMB_COM_WRITE_COMPLETE		0x20
-
-#define	SMB_COM_SET_INFORMATION2	0x22
-#define	SMB_COM_QUERY_INFORMATION2	0x23
-#define	SMB_COM_LOCKING_ANDX		0x24
-#define	SMB_COM_TRANSACTION		0x25
-#define	SMB_COM_TRANSACTION_SECONDARY	0x26
-#define	SMB_COM_IOCTL			0x27
-#define	SMB_COM_IOCTL_SECONDARY		0x28
-#define	SMB_COM_COPY			0x29
-#define	SMB_COM_MOVE			0x2A
-#define	SMB_COM_ECHO			0x2B
-#define	SMB_COM_WRITE_AND_CLOSE		0x2C
-#define	SMB_COM_OPEN_ANDX		0x2D
-#define	SMB_COM_READ_ANDX		0x2E
-#define	SMB_COM_WRITE_ANDX		0x2F
-
-#define	SMB_COM_CLOSE_AND_TREE_DISC	0x31
-#define	SMB_COM_TRANSACTION2		0x32
-#define	SMB_COM_TRANSACTION2_SECONDARY	0x33
-#define	SMB_COM_FIND_CLOSE2		0x34
-#define	SMB_COM_FIND_NOTIFY_CLOSE	0x35
-
-#define	SMB_COM_TREE_CONNECT		0x70
-#define	SMB_COM_TREE_DISCONNECT		0x71
-#define	SMB_COM_NEGOTIATE		0x72
-#define	SMB_COM_SESSION_SETUP_ANDX	0x73
-#define	SMB_COM_LOGOFF_ANDX		0x74
-#define	SMB_COM_TREE_CONNECT_ANDX	0x75
-
-#define	SMB_COM_QUERY_INFORMATION_DISK	0x80
-#define	SMB_COM_SEARCH			0x81
-#define	SMB_COM_FIND			0x82
-#define	SMB_COM_FIND_UNIQUE		0x83
-#define	SMB_COM_FIND_CLOSE		0x84
-
-#define	SMB_COM_NT_TRANSACT		0xA0
-#define	SMB_COM_NT_TRANSACT_SECONDARY	0xA1
-#define	SMB_COM_NT_CREATE_ANDX		0xA2
-#define	SMB_COM_NT_CANCEL		0xA4
-
-#define	SMB_COM_OPEN_PRINT_FILE		0xC0
-#define	SMB_COM_WRITE_PRINT_FILE	0xC1
-#define	SMB_COM_CLOSE_PRINT_FILE	0xC2
-#define	SMB_COM_GET_PRINT_QUEUE		0xC3
-
-
-/*
- * Flags field of the SMB header. The names in parenthesis represent
- * alternative names for the flags.
- *
- * SMB_FLAGS_LOCK_AND_READ_OK     If the server supports LockAndRead and
- * (SMB_FLAGS_LOCKS_SUBDIALECT)   WriteAndUnlock, it sets this bit in the
- *                                Negotiate response.
- *
- * SMB_FLAGS_SEND_NO_ACK          When on, the client guarantees that there
- * (SMB_FLAGS_RCV_BUF_POSTED)     is a receive buffer posted such that a
- *                                "Send-No-Ack" can be used by the server
- *                                to respond to the client's request.
- *
- * SMB_FLAGS_CASE_INSENSITIVE     This is part of the Flags field of every
- *                                SMB header. If this bit is set, then all
- *                                pathnames in the SMB should be treated as
- *                                case-insensitive. Otherwise pathnames are
- *                                case-sensitive.
- *
- * SMB_FLAGS_CANONICALIZED_PATHS  When on in SessionSetupX, this indicates
- *                                that all paths sent to the server are
- *                                already in OS/2 canonicalized format.
- *
- * OS/2 canonical format means that file/directory names are in upper case,
- * are valid characters, . and .. have been removed and single backslashes
- * are used as separators.
- *
- * SMB_FLAGS_OPLOCK               When set in an open file request SMBs
- *                                (Open, Create, OpenX, etc.) this bit
- *                                indicates a request for an oplock on the
- *                                file. When set in the response, this bit
- *                                indicates that the oplock was granted.
- *
- * SMB_FLAGS_OPLOCK_NOTIFY_ANY    When on, this bit indicates that the server
- *                                should notify the client on any request
- *                                that could cause the file to be changed.
- *                                If not set, the server only notifies the
- *                                client on other open requests on the file.
- *                                This bit is only relevant when
- *                                SMB_FLAGS_OPLOCK is set.
- *
- * SMB_FLAGS_SERVER_TO_REDIR      This bit indicates that the SMB is being
- * (SMB_FLAGS_REPLY)              sent from server to (client) redirector.
- */
-#define	SMB_FLAGS_LOCK_AND_READ_OK	0x01
-#define	SMB_FLAGS_SEND_NO_ACK		0x02
-#define	SMB_FLAGS_RESERVED		0x04
-#define	SMB_FLAGS_CASE_INSENSITIVE	0x08
-#define	SMB_FLAGS_CANONICALIZED_PATHS	0x10
-#define	SMB_FLAGS_OPLOCK		0x20
-#define	SMB_FLAGS_OPLOCK_NOTIFY_ANY	0x40
-#define	SMB_FLAGS_REPLY			0x80
-
-
-/*
- * Flags2 field of the SMB header.
- */
-#define	SMB_FLAGS2_KNOWS_LONG_NAMES		0x0001
-#define	SMB_FLAGS2_KNOWS_EAS			0x0002
-#define	SMB_FLAGS2_SMB_SECURITY_SIGNATURE	0x0004
-#define	SMB_FLAGS2_IS_LONG_NAME			0x0040
-#define	SMB_FLAGS2_REPARSE_PATH			0x0400
-#define	SMB_FLAGS2_EXT_SEC			0x0800
-#define	SMB_FLAGS2_DFS				0x1000
-#define	SMB_FLAGS2_PAGING_IO			0x2000
-#define	SMB_FLAGS2_NT_STATUS			0x4000
-#define	SMB_FLAGS2_UNICODE			0x8000
-
-#define	DIALECT_UNKNOWN		 0
-#define	PC_NETWORK_PROGRAM_1_0	 1  /* The original MSNET SMB protocol */
-#define	PCLAN1_0		 2  /* Some versions of the original MSNET */
-#define	MICROSOFT_NETWORKS_1_03	 3  /* This is used for the MS-NET 1.03 */
-#define	MICROSOFT_NETWORKS_3_0	 4  /* This is the  DOS LANMAN 1.0 specific */
-#define	LANMAN1_0		 5  /* This is the first version of the full */
-#define	LM1_2X002		 6  /* This is the first version of the full */
-#define	DOS_LM1_2X002		 7  /* This is the dos equivalent of the */
-#define	DOS_LANMAN2_1		 8  /* DOS LANMAN2.1 */
-#define	LANMAN2_1		 9  /* OS/2 LANMAN2.1 */
-#define	Windows_for_Workgroups_3_1a 10 /* Windows for Workgroups Version 1.0 */
-#define	NT_LM_0_12		11  /* The SMB protocol designed for NT */
-
-/*
- * SMB_TREE_CONNECT_ANDX OptionalSupport flags
- *
- * SMB_SUPPORT_SEARCH_BITS    The server supports SearchAttributes.
- * SMB_SHARE_IS_IN_DFS        The share is managed by DFS.
- * SMB_CSC_MASK               Offline-caching mask - see CSC values.
- * SMB_UNIQUE_FILE_NAME       The server uses long names and does not support
- *                            short names.  This indicates to clients that
- *                            they may perform directory name-space caching.
- * SMB_EXTENDED_SIGNATURES    The server will use signing key protection.
- *
- * SMB_CSC_CACHE_MANUAL_REINT Clients are allowed to cache files for offline
- *                            use as requested by users but automatic
- *                            file-by-file reintegration is not allowed.
- * SMB_CSC_CACHE_AUTO_REINT   Clients are allowed to automatically cache
- *                            files for offline use and file-by-file
- *                            reintegration is allowed.
- * SMB_CSC_CACHE_VDO          Clients are allowed to automatically cache files
- *                            for offline use, file-by-file reintegration is
- *                            allowed and clients are permitted to work from
- *                            their local cache even while offline.
- * SMB_CSC_CACHE_NONE         Client-side caching is disabled for this share.
- *
- * SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM
- *			      The server will filter directory entries based
- *			      on the access permissions of the client.
- */
-#define	SMB_SUPPORT_SEARCH_BITS		0x0001
-#define	SMB_SHARE_IS_IN_DFS		0x0002
-#define	SMB_CSC_MASK			0x000C
-#define	SMB_UNIQUE_FILE_NAME		0x0010
-#define	SMB_EXTENDED_SIGNATURES		0x0020
-
-#define	SMB_CSC_CACHE_MANUAL_REINT	0x0000
-#define	SMB_CSC_CACHE_AUTO_REINT	0x0004
-#define	SMB_CSC_CACHE_VDO		0x0008
-#define	SMB_CSC_CACHE_NONE		0x000C
-
-#define	SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM	0x0800
-
-/*
- * The subcommand codes, placed in SETUP[0], for named pipe operations are:
- * SubCommand Code	Value Description
- * ===================	===== =========================================
- */
-
-#define	CallNamedPipe	0x54	/* open/write/read/close pipe */
-#define	WaitNamedPipe	0x53	/* wait for pipe to be nonbusy */
-#define	PeekNmPipe	0x23	/* read but don't remove data */
-#define	QNmPHandState	0x21	/* query pipe handle modes */
-#define	SetNmPHandState	0x01	/* set pipe handle modes */
-#define	QNmPipeInfo	0x22	/* query pipe attributes */
-#define	TransactNmPipe	0x26	/* write/read operation on pipe */
-#define	RawReadNmPipe	0x11	/* read pipe in "raw" (non message mode) */
-#define	RawWriteNmPipe	0x31	/* write pipe "raw" (non message mode) */
-
-
-
-/*
- * Setup[0] Transaction2       Value  Description
- * Subcommand Code
- * ==========================  =====  =============================
- */
-
-#define	TRANS2_OPEN2		0x00	/* Create file, extended attributes */
-#define	TRANS2_FIND_FIRST2	0x01	/* Begin search for files */
-#define	TRANS2_FIND_NEXT2	0x02	/* Resume search for files */
-#define	TRANS2_QUERY_FS_INFORMATION 0x03 /* Get file system information */
-#define	_TRANS2_RESV_0x04	0x04	/* Reserved */
-#define	TRANS2_QUERY_PATH_INFORMATION 0x05 /* Get info, named file or dir */
-#define	TRANS2_SET_PATH_INFORMATION 0x06 /* Set info, named file or dir */
-#define	TRANS2_QUERY_FILE_INFORMATION 0x07 /* Get info, handle */
-#define	TRANS2_SET_FILE_INFORMATION 0x08 /* Set info, handle */
-#define	TRANS2_FSCTL		0x09	/* Not implemented by NT server */
-#define	TRANS2_IOCTL2		0x0A	/* Not implemented by NT server */
-#define	TRANS2_FIND_NOTIFY_FIRST 0x0B	/* Not implemented by NT server */
-#define	TRANS2_FIND_NOTIFY_NEXT 0x0C	/* Not implemented by NT server */
-#define	TRANS2_CREATE_DIRECTORY 0x0D	/* Create dir, extended attributes */
-#define	TRANS2_SESSION_SETUP	0x0E	/* Session setup, extended security */
-#define	TRANS2_GET_DFS_REFERRAL	0x10	/* Get a Dfs referral */
-#define	TRANS2_REPORT_DFS_INCONSISTENCY 0x11 /* Report a Dfs inconsistency */
-
-/*
- * Access Mode Encoding (CIFS/1.0 1996 Section 3.8).
- *
- * The desired access mode passed in SmbOpen and SmbOpenAndX has the following
- * mapping:
- *
- *    1111 11
- *    5432 1098 7654 3210
- *    rWrC rLLL rSSS rAAA
- *
- * where:
- *
- *    W - Write through mode.  No read ahead or write behind allowed on
- *        this file or device.  When protocol is returned, data is expected
- *        to be on the disk or device.
- *
- *    S - Sharing mode:
- *        0 - Compatibility mode (as in core open)
- *        1 - Deny read/write/execute (exclusive)
- *        2 - Deny write
- *        3 - Deny read/execute
- *        4 - Deny none
- *
- *    A - Access mode
- *        0 - Open for reading
- *        1 - Open for writing
- *        2 - Open for reading and writing
- *        3 - Open for execute
- *
- *    rSSSrAAA = 11111111 (hex FF) indicates FCB open (as in core protocol)
- *
- *    C - Cache mode
- *        0 - Normal file
- *        1 - Do not cache this file
- *
- *    L - Locality of reference
- *        0 - Locality of reference is unknown
- *        1 - Mainly sequential access
- *        2 - Mainly random access
- *        3 - Random access with some locality
- *        4 to 7 - Currently undefined
- */
-
-
-#define	SMB_DA_SHARE_MASK		0x70
-#define	SMB_DA_ACCESS_MASK		0x07
-#define	SMB_DA_FCB_MASK			(UCHAR)0xFF
-
-#define	SMB_DA_ACCESS_READ		0x00
-#define	SMB_DA_ACCESS_WRITE		0x01
-#define	SMB_DA_ACCESS_READ_WRITE	0x02
-#define	SMB_DA_ACCESS_EXECUTE		0x03
-
-#define	SMB_DA_SHARE_COMPATIBILITY	0x00
-#define	SMB_DA_SHARE_EXCLUSIVE		0x10
-#define	SMB_DA_SHARE_DENY_WRITE		0x20
-#define	SMB_DA_SHARE_DENY_READ		0x30
-#define	SMB_DA_SHARE_DENY_NONE		0x40
-
-#define	SMB_DA_FCB			(UCHAR)0xFF
-
-#define	SMB_CACHE_NORMAL		0x0000
-#define	SMB_DO_NOT_CACHE		0x1000
-
-#define	SMB_LR_UNKNOWN			0x0000
-#define	SMB_LR_SEQUENTIAL		0x0100
-#define	SMB_LR_RANDOM			0x0200
-#define	SMB_LR_RANDOM_WITH_LOCALITY	0x0300
-#define	SMB_LR_MASK			0x0F00
-
-#define	SMB_DA_WRITE_THROUGH		0x4000
-
-/*
- * Macros used for share reservation rule checking
- */
-
-#define	SMB_DENY_READ(share_access) ((share_access & FILE_SHARE_READ) == 0)
-
-#define	SMB_DENY_WRITE(share_access) ((share_access & FILE_SHARE_WRITE) == 0)
-
-#define	SMB_DENY_DELETE(share_access) ((share_access & FILE_SHARE_DELETE) == 0)
-
-#define	SMB_DENY_RW(share_access) \
-	((share_access & (FILE_SHARE_READ | FILE_SHARE_WRITE)) == 0)
-
-#define	SMB_DENY_ALL(share_access) (share_access == 0)
-
-#define	SMB_DENY_NONE(share_access) (share_access == FILE_SHARE_ALL)
-
-/*
- * The SMB open function determines what action should be taken depending
- * on the existence or lack thereof of files used in the operation.  It
- * has the following mapping:
- *
- *    1111 1
- *    5432 1098 7654 3210
- *    rrrr rrrr rrrC rrOO
- *
- * where:
- *
- *    O - Open (action to be taken if the target file exists)
- *        0 - Fail
- *        1 - Open or Append file
- *        2 - Truncate file
- *
- *    C - Create (action to be taken if the target file does not exist)
- *        0 - Fail
- *        1 - Create file
- */
-
-#define	SMB_OFUN_OPEN_MASK		0x3
-#define	SMB_OFUN_CREATE_MASK		0x10
-
-#define	SMB_OFUN_OPEN_FAIL		0
-#define	SMB_OFUN_OPEN_APPEND		1
-#define	SMB_OFUN_OPEN_OPEN		1
-#define	SMB_OFUN_OPEN_TRUNCATE		2
-
-#define	SMB_OFUN_CREATE_FAIL		0x00
-#define	SMB_OFUN_CREATE_CREATE		0x10
-
-/*
- * The Action field of OpenAndX has the following format:
- *
- *    1111 11
- *    5432 1098 7654 3210
- *    Lrrr rrrr rrrr rrOO
- *
- * where:
- *
- *    L - Opportunistic lock.  1 if lock granted, else 0.
- *
- *    O - Open action:
- *        1 - The file existed and was opened
- *        2 - The file did not exist but was created
- *        3 - The file existed and was truncated
- */
-
-#define	SMB_OACT_LOCK			0x8000
-#define	SMB_OACT_OPENED			0x01
-#define	SMB_OACT_CREATED		0x02
-#define	SMB_OACT_TRUNCATED		0x03
-
-#define	SMB_OACT_OPLOCK			0x8000
-
-#define	SMB_FTYPE_DISK			0
-#define	SMB_FTYPE_BYTE_PIPE		1
-#define	SMB_FTYPE_MESG_PIPE		2
-#define	SMB_FTYPE_PRINTER		3
-#define	SMB_FTYPE_UNKNOWN		0xFFFF
-
-#define	SMB_DEVST_BLOCKING		0x8000
-#define	SMB_DEVST_ENDPOINT		0x4000
-#define	SMB_DEVST_TYPE_MASK		0x0C00
-#define	SMB_DEVST_TYPE_BYTE_PIPE	0x0000
-#define	SMB_DEVST_TYPE_MESG_PIPE	0x0400
-#define	SMB_DEVST_RMODE_MASK		0x0300
-#define	SMB_DEVST_RMODE_BYTES		0x0000
-#define	SMB_DEVST_RMODE_MESGS		0x0100
-#define	SMB_DEVST_ICOUNT_MASK		0x00FF		/* not used */
-
-#define	SMB_FTYPE_IS_DISK(F)		((F) == SMB_FTYPE_DISK)
-#define	SMB_FTYPE_IS_PIPE(F) \
-	(((F) == SMB_FTYPE_BYTE_PIPE) || ((F) == SMB_FTYPE_MESG_PIPE))
-#define	SMB_FTYPE_IS_PRINTER(F)		((F) == SMB_FTYPE_PRINTER)
-
-/*
- * TRANS2_FIND
- */
-#define	SMB_FIND_FILE_DIRECTORY_INFO		0x101
-#define	SMB_FIND_FILE_FULL_DIRECTORY_INFO	0x102
-#define	SMB_FIND_FILE_NAMES_INFO		0x103
-#define	SMB_FIND_FILE_BOTH_DIRECTORY_INFO	0x104
-#define	SMB_FIND_FILE_ID_FULL_DIRECTORY_INFO	0x105
-#define	SMB_FIND_FILE_ID_BOTH_DIRECTORY_INFO	0x106
-#define	SMB_MAC_FIND_BOTH_HFS_INFO		MAC_FIND_BOTH_HFS_INFO
-
-
-/*
- * Flags for TRANS2_FIND_FIRST2 and TRANS2_FIND_NEXT2
- * (NTDDK cifs.h).
- *
- * If SMB_FIND_RETURN_RESUME_KEYS was set in the request parameters,
- * each entry is preceded by a four-byte resume key.
- */
-#define	SMB_FIND_CLOSE_AFTER_REQUEST	0x01
-#define	SMB_FIND_CLOSE_AT_EOS		0x02
-#define	SMB_FIND_RETURN_RESUME_KEYS	0x04
-#define	SMB_FIND_CONTINUE_FROM_LAST	0x08
-#define	SMB_FIND_WITH_BACKUP_INTENT	0x10
-
-
-/*
- * TRANS2_QUERY_FS_INFORMATION
- */
-#define	SMB_INFO_ALLOCATION		1
-#define	SMB_INFO_VOLUME			2
-#define	SMB_QUERY_FS_LABEL_INFO		0x101
-#define	SMB_QUERY_FS_VOLUME_INFO	0x102
-#define	SMB_QUERY_FS_SIZE_INFO		0x103
-#define	SMB_QUERY_FS_DEVICE_INFO	0x104
-#define	SMB_QUERY_FS_ATTRIBUTE_INFO	0x105
-#define	SMB_QUERY_FS_QUOTA_INFO		0x106	/* unused? */
-#define	SMB_QUERY_FS_CONTROL_INFO	0x107
-#define	SMB_MAC_QUERY_FS_INFO		MAC_QUERY_FS_INFO
-
-
-/*
- * Internal use only.
- * Define information levels to represent the following requests:
- *    smb_query_information
- *    smb_query_information2
- *    smb_set_information
- *    smb_set_information2
- */
-#define	SMB_QUERY_INFORMATION	0x3001
-#define	SMB_QUERY_INFORMATION2	0x3002
-#define	SMB_SET_INFORMATION	0x3001
-#define	SMB_SET_INFORMATION2	0x3002
-
-/* TRANS2_QUERY_{PATH,FILE}_INFORMATION */
-#define	SMB_INFO_STANDARD		 1	/* query, set */
-#define	SMB_INFO_QUERY_EA_SIZE		 2	/* query */
-#define	SMB_INFO_SET_EAS		 2	/* set */
-#define	SMB_INFO_QUERY_EAS_FROM_LIST	 3	/* query */
-#define	SMB_INFO_QUERY_ALL_EAS		 4	/* query */
-#define	SMB_INFO_QUERY_FULL_NAME	 5	/* unused */
-#define	SMB_INFO_IS_NAME_VALID		 6	/* query */
-
-#define	SMB_QUERY_FILE_BASIC_INFO	 0x101
-#define	SMB_QUERY_FILE_STANDARD_INFO	 0x102
-#define	SMB_QUERY_FILE_EA_INFO		 0x103
-#define	SMB_QUERY_FILE_NAME_INFO	 0x104
-#define	SMB_QUERY_FILE_ALLOCATION_INFO	 0x105	/* unused */
-#define	SMB_QUERY_FILE_END_OF_FILE_INFO	 0x106	/* unused */
-#define	SMB_QUERY_FILE_ALL_INFO		 0x107
-#define	SMB_QUERY_FILE_ALT_NAME_INFO	 0x108
-#define	SMB_QUERY_FILE_STREAM_INFO	 0x109
-#define	SMB_QUERY_FILE_COMPRESSION_INFO	 0x10B
-
-#define	SMB_MAC_SET_FINDER_INFO		MAC_SET_FINDER_INFO
-#define	SMB_MAC_DT_ADD_APPL		MAC_DT_ADD_APPL
-#define	SMB_MAC_DT_REMOVE_APPL		MAC_DT_REMOVE_APPL
-#define	SMB_MAC_DT_GET_APPL		MAC_DT_GET_APPL
-#define	SMB_MAC_DT_GET_ICON		MAC_DT_GET_ICON
-#define	SMB_MAC_DT_GET_ICON_INFO	MAC_DT_GET_ICON_INFO
-#define	SMB_MAC_DT_ADD_ICON		MAC_DT_ADD_ICON
-
-#define	SMB_SET_FILE_BASIC_INFO		0x101
-#define	SMB_SET_FILE_DISPOSITION_INFO	0x102
-#define	SMB_SET_FILE_ALLOCATION_INFO	0x103
-#define	SMB_SET_FILE_END_OF_FILE_INFO	0x104
-
-
-/* NT passthrough levels - see ntifs.h FILE_INFORMATION_CLASS */
-#define	SMB_FILE_BASIC_INFORMATION		1004
-#define	SMB_FILE_STANDARD_INFORMATION		1005
-#define	SMB_FILE_INTERNAL_INFORMATION		1006
-#define	SMB_FILE_EA_INFORMATION			1007
-#define	SMB_FILE_ACCESS_INFORMATION		1008
-#define	SMB_FILE_NAME_INFORMATION		1009
-#define	SMB_FILE_DISPOSITION_INFORMATION	1013
-#define	SMB_FILE_ALL_INFORMATION		1018
-#define	SMB_FILE_ALLOCATION_INFORMATION		1019
-#define	SMB_FILE_END_OF_FILE_INFORMATION	1020
-#define	SMB_FILE_ALT_NAME_INFORMATION		1021
-#define	SMB_FILE_STREAM_INFORMATION		1022
-#define	SMB_FILE_COMPRESSION_INFORMATION	1028
-#define	SMB_FILE_ATTR_TAG_INFORMATION		1035
-
-/*
- * The following bits may be set in the SecurityMode field of the
- * SMB_COM_NEGOTIATE response.
- *
- * Notes:
- * NEGOTIATE_SECURITY_SHARE_LEVEL is a montana2 invention.
- *
- * The NTDDK cifs.h definitions are:
- * #define	NEGOTIATE_USER_SECURITY			    0x01
- * #define	NEGOTIATE_ENCRYPT_PASSWORDS		    0x02
- * #define	NEGOTIATE_SECURITY_SIGNATURES_ENABLED	    0x04
- * #define	NEGOTIATE_SECURITY_SIGNATURES_REQUIRED	    0x08
- */
-#define	NEGOTIATE_SECURITY_SHARE_LEVEL		    0x00
-#define	NEGOTIATE_SECURITY_USER_LEVEL		    0x01
-#define	NEGOTIATE_SECURITY_CHALLENGE_RESPONSE	    0x02
-#define	NEGOTIATE_SECURITY_SIGNATURES_ENABLED	    0x04
-#define	NEGOTIATE_SECURITY_SIGNATURES_REQUIRED	    0x08
-
-
-/*
- * Negotiated Capabilities (CIFS/1.0 section 4.1.1)
- *
- * Capabilities allow the server to tell the client what it supports.
- * Undefined bits MUST be set to zero by servers, and MUST be ignored
- * by clients. The bit definitions are:
- *
- * Capability Name	 Encoding   Meaning
- * ====================	 ========   ==================================
- * CAP_RAW_MODE		 0x0001	    The server supports SMB_COM_READ_RAW and
- *				    SMB_COM_WRITE_RAW (obsolescent)
- * CAP_MPX_MODE		 0x0002	    The server supports SMB_COM_READ_MPX and
- *				    SMB_COM_WRITE_MPX (obsolescent)
- * CAP_UNICODE		 0x0004	    The server supports Unicode strings
- * CAP_LARGE_FILES	 0x0008	    The server supports large files with 64
- *				    bit offsets
- * CAP_NT_SMBS		 0x0010	    The server supports the SMBs particular
- *				    to the NT LM 0.12 dialect.
- *				    Implies CAP_NT_FIND.
- * CAP_RPC_REMOTE_APIS	 0x0020	    The server supports remote admin API
- *				    requests via DCE RPC
- * CAP_STATUS32		 0x0040	    The server can respond with 32 bit
- *				    status codes in Status.Status
- * CAP_LEVEL_II_OPLOCKS	 0x0080	    The server supports level 2 oplocks
- * CAP_LOCK_AND_READ	 0x0100	    The server supports the
- *				    SMB_COM_LOCK_AND_READ SMB
- * CAP_NT_FIND		 0x0200
- * CAP_BULK_TRANSFER	 0x0400
- * CAP_COMPRESSED_BULK	 0x0800
- * CAP_DFS		 0x1000	    The server is DFS aware
- * CAP_LARGE_READX	 0x4000	    The server supports large
- *				    SMB_COM_READ_ANDX
- * CAP_LARGE_WRITEX	 0x8000	    The server supports large
- *				    SMB_COM_WRITE_ANDX
- * CAP_RESERVED		 0x02000000 Reserved for future use.
- * CAP_EXTENDED_SECURITY 0x80000000 The server supports extended security
- *				    exchanges.
- *
- * Extended security exchanges provides a means of supporting arbitrary
- * authentication protocols within CIFS. Security blobs are opaque to the
- * CIFS protocol; they are messages in some authentication protocol that
- * has been agreed upon by client and server by some out of band mechanism,
- * for which CIFS merely functions as a transport. When
- * CAP_EXTENDED_SECURITY is negotiated, the server includes a first
- * security blob in its response; subsequent security blobs are exchanged
- * in SMB_COM_SESSION_SETUP_ANDX requests and responses until the
- * authentication protocol terminates.
- */
-#define	CAP_RAW_MODE			0x0001
-#define	CAP_MPX_MODE			0x0002
-#define	CAP_UNICODE				0x0004
-#define	CAP_LARGE_FILES			0x0008
-#define	CAP_NT_SMBS				0x0010
-#define	CAP_RPC_REMOTE_APIS		0x0020
-#define	CAP_STATUS32			0x0040
-#define	CAP_LEVEL_II_OPLOCKS	0x0080
-#define	CAP_LOCK_AND_READ		0x0100
-#define	CAP_NT_FIND				0x0200
-#define	CAP_BULK_TRANSFER		0x0400
-#define	CAP_COMPRESSED_BULK		0x0800
-#define	CAP_DFS					0x1000
-#define	CAP_LARGE_READX			0x4000
-#define	CAP_LARGE_WRITEX		0x8000
-#define	CAP_RESERVED			0x02000000
-#define	CAP_EXTENDED_SECURITY	0x80000000
-
-
-/*
- * Different device types according to NT
- */
-#define	FILE_DEVICE_BEEP		0x00000001
-#define	FILE_DEVICE_CD_ROM		0x00000002
-#define	FILE_DEVICE_CD_ROM_FILE_SYSTEM	0x00000003
-#define	FILE_DEVICE_CONTROLLER		0x00000004
-#define	FILE_DEVICE_DATALINK		0x00000005
-#define	FILE_DEVICE_DFS			0x00000006
-#define	FILE_DEVICE_DISK		0x00000007
-#define	FILE_DEVICE_DISK_FILE_SYSTEM	0x00000008
-#define	FILE_DEVICE_FILE_SYSTEM		0x00000009
-#define	FILE_DEVICE_INPORT_PORT		0x0000000a
-#define	FILE_DEVICE_KEYBOARD		0x0000000b
-#define	FILE_DEVICE_MAILSLOT		0x0000000c
-#define	FILE_DEVICE_MIDI_IN		0x0000000d
-#define	FILE_DEVICE_MIDI_OUT		0x0000000e
-#define	FILE_DEVICE_MOUSE		0x0000000f
-#define	FILE_DEVICE_MULTI_UNC_PROVIDER	0x00000010
-#define	FILE_DEVICE_NAMED_PIPE		0x00000011
-#define	FILE_DEVICE_NETWORK		0x00000012
-#define	FILE_DEVICE_NETWORK_BROWSER	0x00000013
-#define	FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
-#define	FILE_DEVICE_NULL		0x00000015
-#define	FILE_DEVICE_PARALLEL_PORT	0x00000016
-#define	FILE_DEVICE_PHYSICAL_NETCARD	0x00000017
-#define	FILE_DEVICE_PRINTER		0x00000018
-#define	FILE_DEVICE_SCANNER		0x00000019
-#define	FILE_DEVICE_SERIAL_MOUSE_PORT	0x0000001a
-#define	FILE_DEVICE_SERIAL_PORT		0x0000001b
-#define	FILE_DEVICE_SCREEN		0x0000001c
-#define	FILE_DEVICE_SOUND		0x0000001d
-#define	FILE_DEVICE_STREAMS		0x0000001e
-#define	FILE_DEVICE_TAPE		0x0000001f
-#define	FILE_DEVICE_TAPE_FILE_SYSTEM	0x00000020
-#define	FILE_DEVICE_TRANSPORT		0x00000021
-#define	FILE_DEVICE_UNKNOWN		0x00000022
-#define	FILE_DEVICE_VIDEO		0x00000023
-#define	FILE_DEVICE_VIRTUAL_DISK	0x00000024
-#define	FILE_DEVICE_WAVE_IN		0x00000025
-#define	FILE_DEVICE_WAVE_OUT		0x00000026
-#define	FILE_DEVICE_8042_PORT		0x00000027
-#define	FILE_DEVICE_NETWORK_REDIRECTOR	0x00000028
-#define	FILE_DEVICE_BATTERY		0x00000029
-#define	FILE_DEVICE_BUS_EXTENDER	0x0000002a
-#define	FILE_DEVICE_MODEM		0x0000002b
-#define	FILE_DEVICE_VDM			0x0000002c
-
-/*
- * Some of these device types are not currently accessible over the network
- * and may never be accessible over the network. Some may change to be
- *
- * accessible over the network. The values for device types that may never
- * be accessible over the network may be redefined to be just reserved at
- * some date in the future.
- *
- * Characteristics is the sum of any of the following:
- */
-
-#define	FILE_REMOVABLE_MEDIA		0x00000001
-#define	FILE_READ_ONLY_DEVICE		0x00000002
-#define	FILE_FLOPPY_DISKETTE		0x00000004
-#define	FILE_WRITE_ONE_MEDIA		0x00000008
-#define	FILE_REMOTE_DEVICE		0x00000010
-#define	FILE_DEVICE_IS_MOUNTED		0x00000020
-#define	FILE_VIRTUAL_VOLUME		0x00000040
-
-/*
- * CREATE_ANDX ShareAccess Flags
- */
-
-#define	FILE_SHARE_NONE			0x00000000
-#define	FILE_SHARE_READ			0x00000001
-#define	FILE_SHARE_WRITE		0x00000002
-#define	FILE_SHARE_DELETE		0x00000004
-#define	FILE_SHARE_ALL			0x00000007
-#define	FILE_SHARE_VALID_FLAGS		0x00000007
-
-
-/*
- * CREATE_ANDX CreateDisposition flags
- *
- * FILE_SUPERSEDE     If the file already exists it should be superseded
- *		      by the specified file. If the file does not already
- *		      exist then it should be created.
- *
- * FILE_CREATE	      If the file already exists the operation should fail.
- *		      If the file does not already exist then it should be
- *		      created. (aka CREATE_NEW)
- *
- * FILE_OPEN	      If the file already exists then it should be opened.
- *		      If the file does not already exist then the operation
- *		      should fail. (aka OPEN_EXISTING)
- *
- * FILE_OPEN_IF	      If the file already exists then it should be opened.
- *		      If the file does not already exist then it should be
- *		      created. (aka OPEN_ALWAYS)
- *
- * FILE_OVERWRITE     If the file already exists, it should be opened and
- *		      overwritten. If the file does not already exist then
- *		      the operation should fail. (aka TRUNCATE_EXISTING)
- *
- * FILE_OVERWRITE_IF  If the file already exists, it should be opened and
- *		      overwritten. If the file does not already exist then
- *		      it should be created. (aka CREATE_ALWAYS)
- */
-#define	FILE_SUPERSEDE			0x00000000
-#define	FILE_OPEN			0x00000001
-#define	FILE_CREATE			0x00000002
-#define	FILE_OPEN_IF			0x00000003
-#define	FILE_OVERWRITE			0x00000004
-#define	FILE_OVERWRITE_IF		0x00000005
-#define	FILE_MAXIMUM_DISPOSITION	0x00000005
-
-/*
- * CREATE_ANDX Impersonation levels
- */
-
-#define	SECURITY_ANONYMOUS	0x00000001
-#define	SECURITY_IDENTIFICATION	0x00000002
-#define	SECURITY_IMPERSONATION	0x00000003
-#define	SECURITY_DELEGATION	0x00000004
-
-/*
- * CREATE_ANDX SecurityFlags
- */
-
-#define	SECURITY_CONTEXT_TRACKING	0x00000001
-#define	SECURITY_EFFECTIVE_ONLY		0x00000002
-
-/*
- * Server types
- */
-#define	SV_WORKSTATION		0x00000001	/* All workstations */
-#define	SV_SERVER		0x00000002	/* All servers */
-#define	SV_SQLSERVER		0x00000004	/* running with SQL server */
-#define	SV_DOMAIN_CTRL		0x00000008	/* Primary domain controller */
-#define	SV_DOMAIN_BAKCTRL	0x00000010	/* Backup domain controller */
-#define	SV_TIME_SOURCE		0x00000020	/* running timesource service */
-#define	SV_AFP			0x00000040	/* Apple File Protocol */
-#define	SV_NOVELL		0x00000080	/* Novell servers */
-#define	SV_DOMAIN_MEMBER	0x00000100	/* Domain Member */
-#define	SV_PRINTQ_SERVER	0x00000200	/* Server sharing print queue */
-#define	SV_DIALIN_SERVER	0x00000400	/* Server running dialin */
-#define	SV_XENIX_SERVER		0x00000800	/* Xenix server */
-#define	SV_NT			0x00001000	/* NT server */
-#define	SV_WFW			0x00002000	/* Server running Windows for */
-#define	SV_SERVER_NT		0x00008000	/* Windows NT non DC server */
-#define	SV_POTENTIAL_BROWSER	0x00010000	/* can run browser service */
-#define	SV_BACKUP_BROWSER	0x00020000	/* Backup browser server */
-#define	SV_MASTER_BROWSER	0x00040000	/* Master browser server */
-#define	SV_DOMAIN_MASTER	0x00080000	/* Domain Master Browser */
-#define	SV_OSF			0x00100000	/* OSF operating system */
-#define	SV_VMS			0x00200000	/* VMS operating system */
-#define	SV_WINDOWS_95_PLUS	0x00400000	/* Windows 95 or better */
-
-#define	SV_LOCAL_LIST_ONLY	0x40000000	/* Enumerate only "local" */
-#define	SV_TYPE_DOMAIN_ENUM	0x80000000	/*  Enumerate Domains */
-
-#define	MY_SERVER_TYPE	(SV_SERVER | SV_NT | SV_SERVER_NT)
-
-
-#define	PRQ_ACTIVE	0	/* Active */
-#define	PRQ_PAUSE	1	/* Paused */
-#define	PRQ_ERROR	2	/* Error Occurred */
-#define	PRQ_PENDING	3	/* Deletion pending */
-
-#define	PRJ_QS_QUEUED	0	/* Active */
-#define	PRJ_QS_PAUSED	1	/* Paused */
-#define	PRJ_QS_SPOOLING	2	/* Paused */
-#define	PRJ_QS_PRINTING	3	/* Paused */
-
-
-#define	SHARE_ACCESS_READ	0x01	/* read & execute from resource	*/
-#define	SHARE_ACCESS_WRITE	0x02	/* write data to resource	*/
-#define	SHARE_ACCESS_CREATE	0x04	/* create an instance of	*/
-#define	SHARE_ACCESS_EXEC	0x08	/* execute from resource	*/
-#define	SHARE_ACCESS_DELETE	0x10	/* Permission to delete the resource */
-#define	SHARE_ACCESS_ATTRIB	0x20	/* Permission to modify the resource */
-#define	SHARE_ACCESS_PERM	0x40	/* Permission to change permissions */
-#define	SHARE_ACCESS_ALL	0x7F	/* All of the above permissions	*/
-
-
-/*
- * SMB_COM_NT_TRANSACTION sub-command codes (CIFS/1.0 section 5.3)
- *
- * SubCommand Code		   Value Description
- * =============================== ===== =================================
- * NT_TRANSACT_CREATE		   1	 File open/create
- * NT_TRANSACT_IOCTL		   2	 Device IOCTL
- * NT_TRANSACT_SET_SECURITY_DESC   3	 Set security descriptor
- * NT_TRANSACT_NOTIFY_CHANGE	   4	 Start directory watch
- * NT_TRANSACT_RENAME		   5	 Reserved (handle-based rename)
- * NT_TRANSACT_QUERY_SECURITY_DESC 6	 Retrieve security descriptor
- * NT_TRANSACT_QUERY_QUOTA	   7	 Retrieve quota information
- * NT_TRANSACT_SET_QUOTA	   8	 Set quota information
- */
-#define	NT_TRANSACT_MIN_FUNCTION	1
-
-#define	NT_TRANSACT_CREATE		1
-#define	NT_TRANSACT_IOCTL		2
-#define	NT_TRANSACT_SET_SECURITY_DESC	3
-#define	NT_TRANSACT_NOTIFY_CHANGE	4
-#define	NT_TRANSACT_RENAME		5
-#define	NT_TRANSACT_QUERY_SECURITY_DESC 6
-#define	NT_TRANSACT_QUERY_QUOTA		7
-#define	NT_TRANSACT_SET_QUOTA		8
-
-#define	NT_TRANSACT_MAX_FUNCTION	8
-
-
-/*
- * Pipe states
- */
-#define	SMB_PIPE_READMODE_BYTE		0x0000
-#define	SMB_PIPE_READMODE_MESSAGE	0x0100
-#define	SMB_PIPE_TYPE_BYTE		0x0000
-#define	SMB_PIPE_TYPE_MESSAGE		0x0400
-#define	SMB_PIPE_END_CLIENT		0x0000
-#define	SMB_PIPE_END_SERVER		0x4000
-#define	SMB_PIPE_WAIT			0x0000
-#define	SMB_PIPE_NOWAIT			0x8000
-#define	SMB_PIPE_UNLIMITED_INSTANCES	0x00FF
-
-/*
- * smb_com_seek request
- */
-#define	SMB_SEEK_SET	0 /* set file offset to specified offset */
-#define	SMB_SEEK_CUR	1 /* set file offset to current plus specified offset */
-#define	SMB_SEEK_END	2 /* set file offset to EOF plus specified offset */
-
-/*
- * API Numbers for Transact based RAP (Remote Administration Protocol) calls
- */
-#define	API_WshareEnum			0
-#define	API_WshareGetInfo		1
-#define	API_WshareSetInfo		2
-#define	API_WshareAdd			3
-#define	API_WshareDel			4
-#define	API_NetShareCheck		5
-#define	API_WsessionEnum		6
-#define	API_WsessionGetInfo		7
-#define	API_WsessionDel			8
-#define	API_WconnectionEnum		9
-#define	API_WfileEnum			10
-#define	API_WfileGetInfo		11
-#define	API_WfileClose			12
-#define	API_WserverGetInfo		13
-#define	API_WserverSetInfo		14
-#define	API_WserverDiskEnum		15
-#define	API_WserverAdminCommand		16
-#define	API_NetAuditOpen		17
-#define	API_WauditClear			18
-#define	API_NetErrorLogOpen		19
-#define	API_WerrorLogClear		20
-#define	API_NetCharDevEnum		21
-#define	API_NetCharDevGetInfo		22
-#define	API_WCharDevControl		23
-#define	API_NetCharDevQEnum		24
-#define	API_NetCharDevQGetInfo		25
-#define	API_WCharDevQSetInfo		26
-#define	API_WCharDevQPurge		27
-#define	API_WCharDevQPurgeSelf		28
-#define	API_WMessageNameEnum		29
-#define	API_WMessageNameGetInfo		30
-#define	API_WMessageNameAdd		31
-#define	API_WMessageNameDel		32
-#define	API_WMessageNameFwd		33
-#define	API_WMessageNameUnFwd		34
-#define	API_WMessageBufferSend		35
-#define	API_WMessageFileSend		36
-#define	API_WMessageLogFileSet		37
-#define	API_WMessageLogFileGet		38
-#define	API_WServiceEnum		39
-#define	API_WServiceInstall		40
-#define	API_WServiceControl		41
-#define	API_WAccessEnum			42
-#define	API_WAccessGetInfo		43
-#define	API_WAccessSetInfo		44
-#define	API_WAccessAdd			45
-#define	API_WAccessDel			46
-#define	API_WGroupEnum			47
-#define	API_WGroupAdd			48
-#define	API_WGroupDel			49
-#define	API_WGroupAddUser		50
-#define	API_WGroupDelUser		51
-#define	API_WGroupGetUsers		52
-#define	API_WUserEnum			53
-#define	API_WUserAdd			54
-#define	API_WUserDel			55
-#define	API_WUserGetInfo		56
-#define	API_WUserSetInfo		57
-#define	API_WUserPasswordSet		58
-#define	API_WUserGetGroups		59
-#define	API_DeadTableEntry		60
-#define	API_WWkstaSetUID		62
-#define	API_WWkstaGetInfo		63
-#define	API_WWkstaSetInfo		64
-#define	API_WUseEnum			65
-#define	API_WUseAdd			66
-#define	API_WUseDel			67
-#define	API_WUseGetInfo			68
-#define	API_WPrintQEnum			69
-#define	API_WPrintQGetInfo		70
-#define	API_WPrintQSetInfo		71
-#define	API_WPrintQAdd			72
-#define	API_WPrintQDel			73
-#define	API_WPrintQPause		74
-#define	API_WPrintQContinue		75
-#define	API_WPrintJobEnum		76
-#define	API_WPrintJobGetInfo		77
-#define	API_WPrintJobSetInfo_OLD	78
-#define	API_WPrintJobDel		81
-#define	API_WPrintJobPause		82
-#define	API_WPrintJobContinue		83
-#define	API_WPrintDestEnum		84
-#define	API_WPrintDestGetInfo		85
-#define	API_WPrintDestControl		86
-#define	API_WProfileSave		87
-#define	API_WProfileLoad		88
-#define	API_WStatisticsGet		89
-#define	API_WStatisticsClear		90
-#define	API_NetRemoteTOD		91
-#define	API_WNetBiosEnum		92
-#define	API_WNetBiosGetInfo		93
-#define	API_NetServerEnum		94
-#define	API_I_NetServerEnum		95
-#define	API_WServiceGetInfo		96
-#define	API_WPrintQPurge		103
-#define	API_NetServerEnum2		104
-#define	API_WAccessGetUserPerms		105
-#define	API_WGroupGetInfo		106
-#define	API_WGroupSetInfo		107
-#define	API_WGroupSetUsers		108
-#define	API_WUserSetGroups		109
-#define	API_WUserModalsGet		110
-#define	API_WUserModalsSet		111
-#define	API_WFileEnum2			112
-#define	API_WUserAdd2			113
-#define	API_WUserSetInfo2		114
-#define	API_WUserPasswordSet2		115
-#define	API_I_NetServerEnum2		116
-#define	API_WConfigGet2			117
-#define	API_WConfigGetAll2		118
-#define	API_WGetDCName			119
-#define	API_NetHandleGetInfo		120
-#define	API_NetHandleSetInfo		121
-#define	API_WStatisticsGet2		122
-#define	API_WBuildGetInfo		123
-#define	API_WFileGetInfo2		124
-#define	API_WFileClose2			125
-#define	API_WNetServerReqChallenge	126
-#define	API_WNetServerAuthenticate	127
-#define	API_WNetServerPasswordSet	128
-#define	API_WNetAccountDeltas		129
-#define	API_WNetAccountSync		130
-#define	API_WUserEnum2			131
-#define	API_WWkstaUserLogon		132
-#define	API_WWkstaUserLogoff		133
-#define	API_WLogonEnum			134
-#define	API_WErrorLogRead		135
-#define	API_WI_NetPathType		136
-#define	API_WI_NetPathCanonicalize	137
-#define	API_WI_NetPathCompare		138
-#define	API_WI_NetNameValidate		139
-#define	API_WI_NetNameCanonicalize	140
-#define	API_WI_NetNameCompare		141
-#define	API_WAuditRead			142
-#define	API_WPrintDestAdd		143
-#define	API_WPrintDestSetInfo		144
-#define	API_WPrintDestDel		145
-#define	API_WUserValidate2		146
-#define	API_WPrintJobSetInfo		147
-#define	API_TI_NetServerDiskEnum	148
-#define	API_TI_NetServerDiskGetInfo	149
-#define	API_TI_FTVerifyMirror		150
-#define	API_TI_FTAbortVerify		151
-#define	API_TI_FTGetInfo		152
-#define	API_TI_FTSetInfo		153
-#define	API_TI_FTLockDisk		154
-#define	API_TI_FTFixError		155
-#define	API_TI_FTAbortFix		156
-#define	API_TI_FTDiagnoseError		157
-#define	API_TI_FTGetDriveStats		158
-#define	API_TI_FTErrorGetInfo		160
-#define	API_NetAccessCheck		163
-#define	API_NetAlertRaise		164
-#define	API_NetAlertStart		165
-#define	API_NetAlertStop		166
-#define	API_NetAuditWrite		167
-#define	API_NetIRemoteAPI		168
-#define	API_NetServiceStatus		169
-#define	API_I_NetServerRegister		170
-#define	API_I_NetServerDeregister	171
-#define	API_I_NetSessionEntryMake	172
-#define	API_I_NetSessionEntryClear	173
-#define	API_I_NetSessionEntryGetInfo	174
-#define	API_I_NetSessionEntrySetInfo	175
-#define	API_I_NetConnectionEntryMake	176
-#define	API_I_NetConnectionEntryClear	177
-#define	API_I_NetConnectionEntrySetInfo	178
-#define	API_I_NetConnectionEntryGetInfo	179
-#define	API_I_NetFileEntryMake		180
-#define	API_I_NetFileEntryClear		181
-#define	API_I_NetFileEntrySetInfo	182
-#define	API_I_NetFileEntryGetInfo	183
-#define	API_AltSrvMessageBufferSend	184
-#define	API_AltSrvMessageFileSend	185
-#define	API_wI_NetRplWkstaEnum		186
-#define	API_wI_NetRplWkstaGetInfo	187
-#define	API_wI_NetRplWkstaSetInfo	188
-#define	API_wI_NetRplWkstaAdd		189
-#define	API_wI_NetRplWkstaDel		190
-#define	API_wI_NetRplProfileEnum	191
-#define	API_wI_NetRplProfileGetInfo	192
-#define	API_wI_NetRplProfileSetInfo	193
-#define	API_wI_NetRplProfileAdd		194
-#define	API_wI_NetRplProfileDel		195
-#define	API_wI_NetRplProfileClone	196
-#define	API_wI_NetRplBaseProfileEnum	197
-#define	API_WIServerSetInfo		201
-#define	API_WPrintDriverEnum		205
-#define	API_WPrintQProcessorEnum	206
-#define	API_WPrintPortEnum		207
-#define	API_WNetWriteUpdateLog		208
-#define	API_WNetAccountUpdate		209
-#define	API_WNetAccountConfirmUpdate	210
-#define	API_WConfigSet			211
-#define	API_WAccountsReplicate		212
-#define	API_SamOEMChgPasswordUser2_P	214
-#define	API_NetServerEnum3		215
-#define	API_WprintDriverGetInfo		250
-#define	API_WprintDriverSetInfo		251
-#define	API_WaliasAdd			252
-#define	API_WaliasDel			253
-#define	API_WaliasGetInfo		254
-#define	API_WaliasSetInfo		255
-#define	API_WaliasEnum			256
-#define	API_WuserGetLogonAsn		257
-#define	API_WuserSetLogonAsn		258
-#define	API_WuserGetAppSel		259
-#define	API_WuserSetAppSel		260
-#define	API_WappAdd			261
-#define	API_WappDel			262
-#define	API_WappGetInfo			263
-#define	API_WappSetInfo			264
-#define	API_WappEnum			265
-#define	API_WUserDCDBInit		266
-#define	API_WDASDAdd			267
-#define	API_WDASDDel			268
-#define	API_WDASDGetInfo		269
-#define	API_WDASDSetInfo		270
-#define	API_WDASDEnum			271
-#define	API_WDASDCheck			272
-#define	API_WDASDCtl			273
-#define	API_WuserRemoteLogonCheck	274
-#define	API_WUserPasswordSet3		275
-#define	API_WCreateRIPLMachine		276
-#define	API_WDeleteRIPLMachine		277
-#define	API_WGetRIPLMachineInfo		278
-#define	API_WSetRIPLMachineInfo		279
-#define	API_WEnumRIPLMachine		280
-#define	API_WI_ShareAdd			281
-#define	API_WI_AliasEnum		282
-#define	API_WaccessApply		283
-#define	API_WPrt16Query			284
-#define	API_WPrt16Set			285
-#define	API_WUserDel100			286
-#define	API_WUserRemoteLogonCheck2	287
-#define	API_WRemoteTODSet		294
-#define	API_WprintJobMoveAll		295
-#define	API_W16AppParmAdd		296
-#define	API_W16AppParmDel		297
-#define	API_W16AppParmGet		298
-#define	API_W16AppParmSet		299
-#define	API_W16RIPLMachineCreate	300
-#define	API_W16RIPLMachineGetInfo	301
-#define	API_W16RIPLMachineSetInfo	302
-#define	API_W16RIPLMachineEnum		303
-#define	API_W16RIPLMachineListParmEnum	304
-#define	API_W16RIPLMachClassGetInfo	305
-#define	API_W16RIPLMachClassEnum	306
-#define	API_W16RIPLMachClassCreate	307
-#define	API_W16RIPLMachClassSetInfo	308
-#define	API_W16RIPLMachClassDelete	309
-#define	API_W16RIPLMachClassLPEnum	310
-#define	API_W16RIPLMachineDelete	311
-#define	API_W16WSLevelGetInfo		312
-#define	API_WserverNameAdd		313
-#define	API_WserverNameDel		314
-#define	API_WserverNameEnum		315
-#define	API_I_WDASDEnum			316
-#define	API_I_WDASDEnumTerminate	317
-#define	API_I_WDASDSetInfo2		318
-#define	MAX_RAP_API			318
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SMBSRV_CIFS_H */
--- a/usr/src/uts/common/smbsrv/codepage.h	Thu Nov 05 12:17:17 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef	_SMBSRV_CODEPAGE_H
-#define	_SMBSRV_CODEPAGE_H
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-#include <smbsrv/string.h>
-#include <smbsrv/smb_i18n.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Labels to define whether a code page table entry is an uppercase
- * character, a lowercase character or neither. One of these values
- * should appear in the ctype field of the code page tables.
- */
-#define	CODEPAGE_ISNONE		0x00
-#define	CODEPAGE_ISUPPER	0x01
-#define	CODEPAGE_ISLOWER	0x02
-
-/*
- * The structure of a code page entry. Each code page table will
- * consist of an array of 256 codepage entries.
- *
- * ctype indicates case of the value.
- * upper indicates the uppercase equivalent value.
- * lower indicates the lowercase equivalent value.
- */
-typedef struct codepage {
-	unsigned char ctype;
-	mts_wchar_t upper;
-	mts_wchar_t lower;
-} codepage_t;
-
-/*
- * Global pointer to the current code page. This is
- * defaulted to a standard ASCII table.
- */
-extern codepage_t usascii_codepage[];
-
-/*
- * This buffer is used to store the language string for display.
- */
-#define	CODEPAGE_BUFSIZ		48
-
-extern int oem_language_set(char *language);
-extern unsigned int oem_get_smb_cpid(void);
-extern unsigned int oem_get_telnet_cpid(void);
-
-extern int codepage_isupper(int c);
-extern int codepage_islower(int c);
-extern int codepage_toupper(int c);
-extern int codepage_tolower(int c);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif	/* _SMBSRV_CODEPAGE_H */
--- a/usr/src/uts/common/smbsrv/cp_cyrillic.h	Thu Nov 05 12:17:17 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,312 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SMBSRV_CP_CYRILLIC_H
-#define	_SMBSRV_CP_CYRILLIC_H
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-/*
- * This file specifies a codepage mapping for a given character set as
- * specified below:
- *
- * This is the codepage for Cyrillic Character Set
- * This codepage defines values for the special
- * characters needed for the written alphabets of the
- * following languages:  Bulgarian, Byelorussian,
- * Macedonian, Russian, Serbian, and pre-1990 Ukrainian
- * The cyrillic character set is also known as iso-8859-5
- */
-
-#include <smbsrv/codepage.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-codepage_t cyrillic_codepage[256] = {
-	{ CODEPAGE_ISNONE,  0x0000, 0x0000 },    /* 0x0000 */
-	{ CODEPAGE_ISNONE,  0x0001, 0x0001 },    /* 0x0001 */
-	{ CODEPAGE_ISNONE,  0x0002, 0x0002 },    /* 0x0002 */
-	{ CODEPAGE_ISNONE,  0x0003, 0x0003 },    /* 0x0003 */
-	{ CODEPAGE_ISNONE,  0x0004, 0x0004 },    /* 0x0004 */
-	{ CODEPAGE_ISNONE,  0x0005, 0x0005 },    /* 0x0005 */
-	{ CODEPAGE_ISNONE,  0x0006, 0x0006 },    /* 0x0006 */
-	{ CODEPAGE_ISNONE,  0x0007, 0x0007 },    /* 0x0007 */
-	{ CODEPAGE_ISNONE,  0x0008, 0x0008 },    /* 0x0008 */
-	{ CODEPAGE_ISNONE,  0x0009, 0x0009 },    /* 0x0009 */
-	{ CODEPAGE_ISNONE,  0x000a, 0x000a },    /* 0x000a */
-	{ CODEPAGE_ISNONE,  0x000b, 0x000b },    /* 0x000b */
-	{ CODEPAGE_ISNONE,  0x000c, 0x000c },    /* 0x000c */
-	{ CODEPAGE_ISNONE,  0x000d, 0x000d },    /* 0x000d */
-	{ CODEPAGE_ISNONE,  0x000e, 0x000e },    /* 0x000e */
-	{ CODEPAGE_ISNONE,  0x000f, 0x000f },    /* 0x000f */
-	{ CODEPAGE_ISNONE,  0x0010, 0x0010 },    /* 0x0010 */
-	{ CODEPAGE_ISNONE,  0x0011, 0x0011 },    /* 0x0011 */
-	{ CODEPAGE_ISNONE,  0x0012, 0x0012 },    /* 0x0012 */
-	{ CODEPAGE_ISNONE,  0x0013, 0x0013 },    /* 0x0013 */
-	{ CODEPAGE_ISNONE,  0x0014, 0x0014 },    /* 0x0014 */
-	{ CODEPAGE_ISNONE,  0x0015, 0x0015 },    /* 0x0015 */
-	{ CODEPAGE_ISNONE,  0x0016, 0x0016 },    /* 0x0016 */
-	{ CODEPAGE_ISNONE,  0x0017, 0x0017 },    /* 0x0017 */
-	{ CODEPAGE_ISNONE,  0x0018, 0x0018 },    /* 0x0018 */
-	{ CODEPAGE_ISNONE,  0x0019, 0x0019 },    /* 0x0019 */
-	{ CODEPAGE_ISNONE,  0x001a, 0x001a },    /* 0x001a */
-	{ CODEPAGE_ISNONE,  0x001b, 0x001b },    /* 0x001b */
-	{ CODEPAGE_ISNONE,  0x001c, 0x001c },    /* 0x001c */
-	{ CODEPAGE_ISNONE,  0x001d, 0x001d },    /* 0x001d */
-	{ CODEPAGE_ISNONE,  0x001e, 0x001e },    /* 0x001e */
-	{ CODEPAGE_ISNONE,  0x001f, 0x001f },    /* 0x001f */
-	{ CODEPAGE_ISNONE,  0x0020, 0x0020 },    /* 0x0020 */
-	{ CODEPAGE_ISNONE,  0x0021, 0x0021 },    /* 0x0021 */
-	{ CODEPAGE_ISNONE,  0x0022, 0x0022 },    /* 0x0022 */
-	{ CODEPAGE_ISNONE,  0x0023, 0x0023 },    /* 0x0023 */
-	{ CODEPAGE_ISNONE,  0x0024, 0x0024 },    /* 0x0024 */
-	{ CODEPAGE_ISNONE,  0x0025, 0x0025 },    /* 0x0025 */
-	{ CODEPAGE_ISNONE,  0x0026, 0x0026 },    /* 0x0026 */
-	{ CODEPAGE_ISNONE,  0x0027, 0x0027 },    /* 0x0027 */
-	{ CODEPAGE_ISNONE,  0x0028, 0x0028 },    /* 0x0028 */
-	{ CODEPAGE_ISNONE,  0x0029, 0x0029 },    /* 0x0029 */
-	{ CODEPAGE_ISNONE,  0x002a, 0x002a },    /* 0x002a */
-	{ CODEPAGE_ISNONE,  0x002b, 0x002b },    /* 0x002b */
-	{ CODEPAGE_ISNONE,  0x002c, 0x002c },    /* 0x002c */
-	{ CODEPAGE_ISNONE,  0x002d, 0x002d },    /* 0x002d */
-	{ CODEPAGE_ISNONE,  0x002e, 0x002e },    /* 0x002e */
-	{ CODEPAGE_ISNONE,  0x002f, 0x002f },    /* 0x002f */
-	{ CODEPAGE_ISNONE,  0x0030, 0x0030 },    /* 0x0030 */
-	{ CODEPAGE_ISNONE,  0x0031, 0x0031 },    /* 0x0031 */
-	{ CODEPAGE_ISNONE,  0x0032, 0x0032 },    /* 0x0032 */
-	{ CODEPAGE_ISNONE,  0x0033, 0x0033 },    /* 0x0033 */
-	{ CODEPAGE_ISNONE,  0x0034, 0x0034 },    /* 0x0034 */
-	{ CODEPAGE_ISNONE,  0x0035, 0x0035 },    /* 0x0035 */
-	{ CODEPAGE_ISNONE,  0x0036, 0x0036 },    /* 0x0036 */
-	{ CODEPAGE_ISNONE,  0x0037, 0x0037 },    /* 0x0037 */
-	{ CODEPAGE_ISNONE,  0x0038, 0x0038 },    /* 0x0038 */
-	{ CODEPAGE_ISNONE,  0x0039, 0x0039 },    /* 0x0039 */
-	{ CODEPAGE_ISNONE,  0x003a, 0x003a },    /* 0x003a */
-	{ CODEPAGE_ISNONE,  0x003b, 0x003b },    /* 0x003b */
-	{ CODEPAGE_ISNONE,  0x003c, 0x003c },    /* 0x003c */
-	{ CODEPAGE_ISNONE,  0x003d, 0x003d },    /* 0x003d */
-	{ CODEPAGE_ISNONE,  0x003e, 0x003e },    /* 0x003e */
-	{ CODEPAGE_ISNONE,  0x003f, 0x003f },    /* 0x003f */
-	{ CODEPAGE_ISNONE,  0x0040, 0x0040 },    /* 0x0040 */
-	{ CODEPAGE_ISUPPER, 0x0041, 0x0061 },    /* 0x0041 */
-	{ CODEPAGE_ISUPPER, 0x0042, 0x0062 },    /* 0x0042 */
-	{ CODEPAGE_ISUPPER, 0x0043, 0x0063 },    /* 0x0043 */
-	{ CODEPAGE_ISUPPER, 0x0044, 0x0064 },    /* 0x0044 */
-	{ CODEPAGE_ISUPPER, 0x0045, 0x0065 },    /* 0x0045 */
-	{ CODEPAGE_ISUPPER, 0x0046, 0x0066 },    /* 0x0046 */
-	{ CODEPAGE_ISUPPER, 0x0047, 0x0067 },    /* 0x0047 */
-	{ CODEPAGE_ISUPPER, 0x0048, 0x0068 },    /* 0x0048 */
-	{ CODEPAGE_ISUPPER, 0x0049, 0x0069 },    /* 0x0049 */
-	{ CODEPAGE_ISUPPER, 0x004a, 0x006a },    /* 0x004a */
-	{ CODEPAGE_ISUPPER, 0x004b, 0x006b },    /* 0x004b */
-	{ CODEPAGE_ISUPPER, 0x004c, 0x006c },    /* 0x004c */
-	{ CODEPAGE_ISUPPER, 0x004d, 0x006d },    /* 0x004d */
-	{ CODEPAGE_ISUPPER, 0x004e, 0x006e },    /* 0x004e */
-	{ CODEPAGE_ISUPPER, 0x004f, 0x006f },    /* 0x004f */
-	{ CODEPAGE_ISUPPER, 0x0050, 0x0070 },    /* 0x0050 */
-	{ CODEPAGE_ISUPPER, 0x0051, 0x0071 },    /* 0x0051 */
-	{ CODEPAGE_ISUPPER, 0x0052, 0x0072 },    /* 0x0052 */
-	{ CODEPAGE_ISUPPER, 0x0053, 0x0073 },    /* 0x0053 */
-	{ CODEPAGE_ISUPPER, 0x0054, 0x0074 },    /* 0x0054 */
-	{ CODEPAGE_ISUPPER, 0x0055, 0x0075 },    /* 0x0055 */
-	{ CODEPAGE_ISUPPER, 0x0056, 0x0076 },    /* 0x0056 */
-	{ CODEPAGE_ISUPPER, 0x0057, 0x0077 },    /* 0x0057 */
-	{ CODEPAGE_ISUPPER, 0x0058, 0x0078 },    /* 0x0058 */
-	{ CODEPAGE_ISUPPER, 0x0059, 0x0079 },    /* 0x0059 */
-	{ CODEPAGE_ISUPPER, 0x005a, 0x007a },    /* 0x005a */
-	{ CODEPAGE_ISNONE,  0x005b, 0x005b },    /* 0x005b */
-	{ CODEPAGE_ISNONE,  0x005c, 0x005c },    /* 0x005c */
-	{ CODEPAGE_ISNONE,  0x005d, 0x005d },    /* 0x005d */
-	{ CODEPAGE_ISNONE,  0x005e, 0x005e },    /* 0x005e */
-	{ CODEPAGE_ISNONE,  0x005f, 0x005f },    /* 0x005f */
-	{ CODEPAGE_ISNONE,  0x0060, 0x0060 },    /* 0x0060 */
-	{ CODEPAGE_ISLOWER, 0x0041, 0x0061 },    /* 0x0061 */
-	{ CODEPAGE_ISLOWER, 0x0042, 0x0062 },    /* 0x0062 */
-	{ CODEPAGE_ISLOWER, 0x0043, 0x0063 },    /* 0x0063 */
-	{ CODEPAGE_ISLOWER, 0x0044, 0x0064 },    /* 0x0064 */
-	{ CODEPAGE_ISLOWER, 0x0045, 0x0065 },    /* 0x0065 */
-	{ CODEPAGE_ISLOWER, 0x0046, 0x0066 },    /* 0x0066 */
-	{ CODEPAGE_ISLOWER, 0x0047, 0x0067 },    /* 0x0067 */
-	{ CODEPAGE_ISLOWER, 0x0048, 0x0068 },    /* 0x0068 */
-	{ CODEPAGE_ISLOWER, 0x0049, 0x0069 },    /* 0x0069 */
-	{ CODEPAGE_ISLOWER, 0x004a, 0x006a },    /* 0x006a */
-	{ CODEPAGE_ISLOWER, 0x004b, 0x006b },    /* 0x006b */
-	{ CODEPAGE_ISLOWER, 0x004c, 0x006c },    /* 0x006c */
-	{ CODEPAGE_ISLOWER, 0x004d, 0x006d },    /* 0x006d */
-	{ CODEPAGE_ISLOWER, 0x004e, 0x006e },    /* 0x006e */
-	{ CODEPAGE_ISLOWER, 0x004f, 0x006f },    /* 0x006f */
-	{ CODEPAGE_ISLOWER, 0x0050, 0x0070 },    /* 0x0070 */
-	{ CODEPAGE_ISLOWER, 0x0051, 0x0071 },    /* 0x0071 */
-	{ CODEPAGE_ISLOWER, 0x0052, 0x0072 },    /* 0x0072 */
-	{ CODEPAGE_ISLOWER, 0x0053, 0x0073 },    /* 0x0073 */
-	{ CODEPAGE_ISLOWER, 0x0054, 0x0074 },    /* 0x0074 */
-	{ CODEPAGE_ISLOWER, 0x0055, 0x0075 },    /* 0x0075 */
-	{ CODEPAGE_ISLOWER, 0x0056, 0x0076 },    /* 0x0076 */
-	{ CODEPAGE_ISLOWER, 0x0057, 0x0077 },    /* 0x0077 */
-	{ CODEPAGE_ISLOWER, 0x0058, 0x0078 },    /* 0x0078 */
-	{ CODEPAGE_ISLOWER, 0x0059, 0x0079 },    /* 0x0079 */
-	{ CODEPAGE_ISLOWER, 0x005a, 0x007a },    /* 0x007a */
-	{ CODEPAGE_ISNONE,  0x007b, 0x007b },    /* 0x007b */
-	{ CODEPAGE_ISNONE,  0x007c, 0x007c },    /* 0x007c */
-	{ CODEPAGE_ISNONE,  0x007d, 0x007d },    /* 0x007d */
-	{ CODEPAGE_ISNONE,  0x007e, 0x007e },    /* 0x007e */
-	{ CODEPAGE_ISNONE,  0x007f, 0x007f },    /* 0x007f */
-	{ CODEPAGE_ISNONE,  0x0080, 0x0080 },    /* 0x0080 */
-	{ CODEPAGE_ISNONE,  0x0081, 0x0081 },    /* 0x0081 */
-	{ CODEPAGE_ISNONE,  0x0082, 0x0082 },    /* 0x0082 */
-	{ CODEPAGE_ISNONE,  0x0083, 0x0083 },    /* 0x0083 */
-	{ CODEPAGE_ISNONE,  0x0084, 0x0084 },    /* 0x0084 */
-	{ CODEPAGE_ISNONE,  0x0085, 0x0085 },    /* 0x0085 */
-	{ CODEPAGE_ISNONE,  0x0086, 0x0086 },    /* 0x0086 */
-	{ CODEPAGE_ISNONE,  0x0087, 0x0087 },    /* 0x0087 */
-	{ CODEPAGE_ISNONE,  0x0088, 0x0088 },    /* 0x0088 */
-	{ CODEPAGE_ISNONE,  0x0089, 0x0089 },    /* 0x0089 */
-	{ CODEPAGE_ISNONE,  0x008a, 0x008a },    /* 0x008a */
-	{ CODEPAGE_ISNONE,  0x008b, 0x008b },    /* 0x008b */
-	{ CODEPAGE_ISNONE,  0x008c, 0x008c },    /* 0x008c */
-	{ CODEPAGE_ISNONE,  0x008d, 0x008d },    /* 0x008d */
-	{ CODEPAGE_ISNONE,  0x008e, 0x008e },    /* 0x008e */
-	{ CODEPAGE_ISNONE,  0x008f, 0x008f },    /* 0x008f */
-	{ CODEPAGE_ISNONE,  0x0090, 0x0090 },    /* 0x0090 */
-	{ CODEPAGE_ISNONE,  0x0091, 0x0091 },    /* 0x0091 */
-	{ CODEPAGE_ISNONE,  0x0092, 0x0092 },    /* 0x0092 */
-	{ CODEPAGE_ISNONE,  0x0093, 0x0093 },    /* 0x0093 */
-	{ CODEPAGE_ISNONE,  0x0094, 0x0094 },    /* 0x0094 */
-	{ CODEPAGE_ISNONE,  0x0095, 0x0095 },    /* 0x0095 */
-	{ CODEPAGE_ISNONE,  0x0096, 0x0096 },    /* 0x0096 */
-	{ CODEPAGE_ISNONE,  0x0097, 0x0097 },    /* 0x0097 */
-	{ CODEPAGE_ISNONE,  0x0098, 0x0098 },    /* 0x0098 */
-	{ CODEPAGE_ISNONE,  0x0099, 0x0099 },    /* 0x0099 */
-	{ CODEPAGE_ISNONE,  0x009a, 0x009a },    /* 0x009a */
-	{ CODEPAGE_ISNONE,  0x009b, 0x009b },    /* 0x009b */
-	{ CODEPAGE_ISNONE,  0x009c, 0x009c },    /* 0x009c */
-	{ CODEPAGE_ISNONE,  0x009d, 0x009d },    /* 0x009d */
-	{ CODEPAGE_ISNONE,  0x009e, 0x009e },    /* 0x009e */
-	{ CODEPAGE_ISNONE,  0x009f, 0x009f },    /* 0x009f */
-	{ CODEPAGE_ISNONE,  0x00a0, 0x00a0 },    /* 0x00a0 */
-	{ CODEPAGE_ISUPPER, 0x00a1, 0x00f1 },    /* 0x00a1 */
-	{ CODEPAGE_ISUPPER, 0x00a2, 0x00f2 },    /* 0x00a2 */
-	{ CODEPAGE_ISUPPER, 0x00a3, 0x00f3 },    /* 0x00a3 */
-	{ CODEPAGE_ISUPPER, 0x00a4, 0x00f4 },    /* 0x00a4 */
-	{ CODEPAGE_ISUPPER, 0x00a5, 0x00f5 },    /* 0x00a5 */
-	{ CODEPAGE_ISUPPER, 0x00a6, 0x00f6 },    /* 0x00a6 */
-	{ CODEPAGE_ISUPPER, 0x00a7, 0x00f7 },    /* 0x00a7 */
-	{ CODEPAGE_ISUPPER, 0x00a8, 0x00f8 },    /* 0x00a8 */
-	{ CODEPAGE_ISUPPER, 0x00a9, 0x00f9 },    /* 0x00a9 */
-	{ CODEPAGE_ISUPPER, 0x00aa, 0x00fa },    /* 0x00aa */
-	{ CODEPAGE_ISUPPER, 0x00ab, 0x00fb },    /* 0x00ab */
-	{ CODEPAGE_ISUPPER, 0x00ac, 0x00fc },    /* 0x00ac */
-	{ CODEPAGE_ISUPPER, 0x00ad, 0x00fd },    /* 0x00ad */
-	{ CODEPAGE_ISUPPER, 0x00ae, 0x00fe },    /* 0x00ae */
-	{ CODEPAGE_ISUPPER, 0x00af, 0x00ff },    /* 0x00af */
-	{ CODEPAGE_ISNONE,  0x00b0, 0x00b0 },    /* 0x00b0 */
-	{ CODEPAGE_ISNONE,  0x00b1, 0x00b1 },    /* 0x00b1 */
-	{ CODEPAGE_ISNONE,  0x00b2, 0x00b2 },    /* 0x00b2 */
-	{ CODEPAGE_ISNONE,  0x00b3, 0x00b3 },    /* 0x00b3 */
-	{ CODEPAGE_ISNONE,  0x00b4, 0x00b4 },    /* 0x00b4 */
-	{ CODEPAGE_ISNONE,  0x00b5, 0x00b5 },    /* 0x00b5 */
-	{ CODEPAGE_ISNONE,  0x00b6, 0x00b6 },    /* 0x00b6 */
-	{ CODEPAGE_ISNONE,  0x00b7, 0x00b7 },    /* 0x00b7 */
-	{ CODEPAGE_ISNONE,  0x00b8, 0x00b8 },    /* 0x00b8 */
-	{ CODEPAGE_ISNONE,  0x00b9, 0x00b9 },    /* 0x00b9 */
-	{ CODEPAGE_ISNONE,  0x00ba, 0x00ba },    /* 0x00ba */
-	{ CODEPAGE_ISNONE,  0x00bb, 0x00bb },    /* 0x00bb */
-	{ CODEPAGE_ISNONE,  0x00bc, 0x00bc },    /* 0x00bc */
-	{ CODEPAGE_ISNONE,  0x00bd, 0x00bd },    /* 0x00bd */
-	{ CODEPAGE_ISNONE,  0x00be, 0x00be },    /* 0x00be */
-	{ CODEPAGE_ISNONE,  0x00bf, 0x00bf },    /* 0x00bf */
-	{ CODEPAGE_ISUPPER, 0x00c0, 0x00e0 },    /* 0x00c0 */
-	{ CODEPAGE_ISUPPER, 0x00c1, 0x00e1 },    /* 0x00c1 */
-	{ CODEPAGE_ISUPPER, 0x00c2, 0x00e2 },    /* 0x00c2 */
-	{ CODEPAGE_ISUPPER, 0x00c3, 0x00e3 },    /* 0x00c3 */
-	{ CODEPAGE_ISUPPER, 0x00c4, 0x00e4 },    /* 0x00c4 */
-	{ CODEPAGE_ISUPPER, 0x00c5, 0x00e5 },    /* 0x00c5 */
-	{ CODEPAGE_ISUPPER, 0x00c6, 0x00e6 },    /* 0x00c6 */
-	{ CODEPAGE_ISUPPER, 0x00c7, 0x00e7 },    /* 0x00c7 */
-	{ CODEPAGE_ISUPPER, 0x00c8, 0x00e8 },    /* 0x00c8 */
-	{ CODEPAGE_ISUPPER, 0x00c9, 0x00e9 },    /* 0x00c9 */
-	{ CODEPAGE_ISUPPER, 0x00ca, 0x00ea },    /* 0x00ca */
-	{ CODEPAGE_ISUPPER, 0x00cb, 0x00eb },    /* 0x00cb */
-	{ CODEPAGE_ISUPPER, 0x00cc, 0x00ec },    /* 0x00cc */
-	{ CODEPAGE_ISUPPER, 0x00cd, 0x00ed },    /* 0x00cd */
-	{ CODEPAGE_ISUPPER, 0x00ce, 0x00ee },    /* 0x00ce */
-	{ CODEPAGE_ISUPPER, 0x00cf, 0x00ef },    /* 0x00cf */
-	{ CODEPAGE_ISNONE,  0x00d0, 0x00d0 },    /* 0x00d0 */
-	{ CODEPAGE_ISNONE,  0x00d1, 0x00d1 },    /* 0x00d1 */
-	{ CODEPAGE_ISNONE,  0x00d2, 0x00d2 },    /* 0x00d2 */
-	{ CODEPAGE_ISNONE,  0x00d3, 0x00d3 },    /* 0x00d3 */
-	{ CODEPAGE_ISNONE,  0x00d4, 0x00d4 },    /* 0x00d4 */
-	{ CODEPAGE_ISNONE,  0x00d5, 0x00d5 },    /* 0x00d5 */
-	{ CODEPAGE_ISNONE,  0x00d6, 0x00d6 },    /* 0x00d6 */
-	{ CODEPAGE_ISNONE,  0x00d7, 0x00d7 },    /* 0x00d7 */
-	{ CODEPAGE_ISNONE,  0x00d8, 0x00d8 },    /* 0x00d8 */
-	{ CODEPAGE_ISNONE,  0x00d9, 0x00d9 },    /* 0x00d9 */
-	{ CODEPAGE_ISNONE,  0x00da, 0x00da },    /* 0x00da */
-	{ CODEPAGE_ISNONE,  0x00db, 0x00db },    /* 0x00db */
-	{ CODEPAGE_ISNONE,  0x00dc, 0x00dc },    /* 0x00dc */
-	{ CODEPAGE_ISNONE,  0x00dd, 0x00dd },    /* 0x00dd */
-	{ CODEPAGE_ISNONE,  0x00de, 0x00de },    /* 0x00de */
-	{ CODEPAGE_ISNONE,  0x00df, 0x00df },    /* 0x00df */
-	{ CODEPAGE_ISLOWER, 0x00c0, 0x00e0 },    /* 0x00e0 */
-	{ CODEPAGE_ISLOWER, 0x00c1, 0x00e1 },    /* 0x00e1 */
-	{ CODEPAGE_ISLOWER, 0x00c2, 0x00e2 },    /* 0x00e2 */
-	{ CODEPAGE_ISLOWER, 0x00c3, 0x00e3 },    /* 0x00e3 */
-	{ CODEPAGE_ISLOWER, 0x00c4, 0x00e4 },    /* 0x00e4 */
-	{ CODEPAGE_ISLOWER, 0x00c5, 0x00e5 },    /* 0x00e5 */
-	{ CODEPAGE_ISLOWER, 0x00c6, 0x00e6 },    /* 0x00e6 */
-	{ CODEPAGE_ISLOWER, 0x00c7, 0x00e7 },    /* 0x00e7 */
-	{ CODEPAGE_ISLOWER, 0x00c8, 0x00e8 },    /* 0x00e8 */
-	{ CODEPAGE_ISLOWER, 0x00c9, 0x00e9 },    /* 0x00e9 */
-	{ CODEPAGE_ISLOWER, 0x00ca, 0x00ea },    /* 0x00ea */
-	{ CODEPAGE_ISLOWER, 0x00cb, 0x00eb },    /* 0x00eb */
-	{ CODEPAGE_ISLOWER, 0x00cc, 0x00ec },    /* 0x00ec */
-	{ CODEPAGE_ISLOWER, 0x00cd, 0x00ed },    /* 0x00ed */
-	{ CODEPAGE_ISLOWER, 0x00ce, 0x00ee },    /* 0x00ee */
-	{ CODEPAGE_ISLOWER, 0x00cf, 0x00ef },    /* 0x00ef */
-	{ CODEPAGE_ISNONE,  0x00f0, 0x00f0 },    /* 0x00f0 */
-	{ CODEPAGE_ISLOWER, 0x00a1, 0x00f1 },    /* 0x00f1 */
-	{ CODEPAGE_ISLOWER, 0x00a2, 0x00f2 },    /* 0x00f2 */
-	{ CODEPAGE_ISLOWER, 0x00a3, 0x00f3 },    /* 0x00f3 */
-	{ CODEPAGE_ISLOWER, 0x00a4, 0x00f4 },    /* 0x00f4 */
-	{ CODEPAGE_ISLOWER, 0x00a5, 0x00f5 },    /* 0x00f5 */
-	{ CODEPAGE_ISLOWER, 0x00a6, 0x00f6 },    /* 0x00f6 */
-	{ CODEPAGE_ISLOWER, 0x00a7, 0x00f7 },    /* 0x00f7 */
-	{ CODEPAGE_ISLOWER, 0x00a8, 0x00f8 },    /* 0x00f8 */
-	{ CODEPAGE_ISLOWER, 0x00a9, 0x00f9 },    /* 0x00f9 */
-	{ CODEPAGE_ISLOWER, 0x00aa, 0x00fa },    /* 0x00fa */
-	{ CODEPAGE_ISLOWER, 0x00ab, 0x00fb },    /* 0x00fb */
-	{ CODEPAGE_ISLOWER, 0x00ac, 0x00fc },    /* 0x00fc */
-	{ CODEPAGE_ISLOWER, 0x00ad, 0x00fd },    /* 0x00fd */
-	{ CODEPAGE_ISLOWER, 0x00ae, 0x00fe },    /* 0x00fe */
-	{ CODEPAGE_ISLOWER, 0x00af, 0x00ff }	 /* 0x00ff */
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SMBSRV_CP_CYRILLIC_H */
--- a/usr/src/uts/common/smbsrv/cp_latin1.h	Thu Nov 05 12:17:17 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,317 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SMBSRV_CP_LATIN1_H
-#define	_SMBSRV_CP_LATIN1_H
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-/*
- * This file specifies a codepage mapping for a given character set as
- * specified below:
- *
- * This is the codepage for the Latin-1 Character Set
- * (Western Europe).  This codepage defines values for
- * the special characters needed for the written alphabets
- * of the following Languages:  French, Spanish, Catalan,
- * Basque, Portuguese, Italian, Albanian, Rhaeto-Romanic,
- * Dutch, German, Danish, Swedish, Norwegian, Finnish,
- * Faroese, Icelandic, Irish, Scottish, English, Afrikaans
- * and Swahili.
- * This codepage is also used in North & South America,
- * Canada, Australia, and much of Africa
- * The Latin-1 character set is also Known as iso-8859-1.
- */
-
-#include <smbsrv/codepage.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-codepage_t Latin1_codepage[256] = {
-	{ CODEPAGE_ISNONE,  0x0000, 0x0000 },    /* 0x0000 */
-	{ CODEPAGE_ISNONE,  0x0001, 0x0001 },    /* 0x0001 */
-	{ CODEPAGE_ISNONE,  0x0002, 0x0002 },    /* 0x0002 */
-	{ CODEPAGE_ISNONE,  0x0003, 0x0003 },    /* 0x0003 */
-	{ CODEPAGE_ISNONE,  0x0004, 0x0004 },    /* 0x0004 */
-	{ CODEPAGE_ISNONE,  0x0005, 0x0005 },    /* 0x0005 */
-	{ CODEPAGE_ISNONE,  0x0006, 0x0006 },    /* 0x0006 */
-	{ CODEPAGE_ISNONE,  0x0007, 0x0007 },    /* 0x0007 */
-	{ CODEPAGE_ISNONE,  0x0008, 0x0008 },    /* 0x0008 */
-	{ CODEPAGE_ISNONE,  0x0009, 0x0009 },    /* 0x0009 */
-	{ CODEPAGE_ISNONE,  0x000a, 0x000a },    /* 0x000a */
-	{ CODEPAGE_ISNONE,  0x000b, 0x000b },    /* 0x000b */
-	{ CODEPAGE_ISNONE,  0x000c, 0x000c },    /* 0x000c */
-	{ CODEPAGE_ISNONE,  0x000d, 0x000d },    /* 0x000d */
-	{ CODEPAGE_ISNONE,  0x000e, 0x000e },    /* 0x000e */
-	{ CODEPAGE_ISNONE,  0x000f, 0x000f },    /* 0x000f */
-	{ CODEPAGE_ISNONE,  0x0010, 0x0010 },    /* 0x0010 */
-	{ CODEPAGE_ISNONE,  0x0011, 0x0011 },    /* 0x0011 */
-	{ CODEPAGE_ISNONE,  0x0012, 0x0012 },    /* 0x0012 */
-	{ CODEPAGE_ISNONE,  0x0013, 0x0013 },    /* 0x0013 */
-	{ CODEPAGE_ISNONE,  0x0014, 0x0014 },    /* 0x0014 */
-	{ CODEPAGE_ISNONE,  0x0015, 0x0015 },    /* 0x0015 */
-	{ CODEPAGE_ISNONE,  0x0016, 0x0016 },    /* 0x0016 */
-	{ CODEPAGE_ISNONE,  0x0017, 0x0017 },    /* 0x0017 */
-	{ CODEPAGE_ISNONE,  0x0018, 0x0018 },    /* 0x0018 */
-	{ CODEPAGE_ISNONE,  0x0019, 0x0019 },    /* 0x0019 */
-	{ CODEPAGE_ISNONE,  0x001a, 0x001a },    /* 0x001a */
-	{ CODEPAGE_ISNONE,  0x001b, 0x001b },    /* 0x001b */
-	{ CODEPAGE_ISNONE,  0x001c, 0x001c },    /* 0x001c */
-	{ CODEPAGE_ISNONE,  0x001d, 0x001d },    /* 0x001d */
-	{ CODEPAGE_ISNONE,  0x001e, 0x001e },    /* 0x001e */
-	{ CODEPAGE_ISNONE,  0x001f, 0x001f },    /* 0x001f */
-	{ CODEPAGE_ISNONE,  0x0020, 0x0020 },    /* 0x0020 */
-	{ CODEPAGE_ISNONE,  0x0021, 0x0021 },    /* 0x0021 */
-	{ CODEPAGE_ISNONE,  0x0022, 0x0022 },    /* 0x0022 */
-	{ CODEPAGE_ISNONE,  0x0023, 0x0023 },    /* 0x0023 */
-	{ CODEPAGE_ISNONE,  0x0024, 0x0024 },    /* 0x0024 */
-	{ CODEPAGE_ISNONE,  0x0025, 0x0025 },    /* 0x0025 */
-	{ CODEPAGE_ISNONE,  0x0026, 0x0026 },    /* 0x0026 */
-	{ CODEPAGE_ISNONE,  0x0027, 0x0027 },    /* 0x0027 */
-	{ CODEPAGE_ISNONE,  0x0028, 0x0028 },    /* 0x0028 */
-	{ CODEPAGE_ISNONE,  0x0029, 0x0029 },    /* 0x0029 */
-	{ CODEPAGE_ISNONE,  0x002a, 0x002a },    /* 0x002a */
-	{ CODEPAGE_ISNONE,  0x002b, 0x002b },    /* 0x002b */
-	{ CODEPAGE_ISNONE,  0x002c, 0x002c },    /* 0x002c */
-	{ CODEPAGE_ISNONE,  0x002d, 0x002d },    /* 0x002d */
-	{ CODEPAGE_ISNONE,  0x002e, 0x002e },    /* 0x002e */
-	{ CODEPAGE_ISNONE,  0x002f, 0x002f },    /* 0x002f */
-	{ CODEPAGE_ISNONE,  0x0030, 0x0030 },    /* 0x0030 */
-	{ CODEPAGE_ISNONE,  0x0031, 0x0031 },    /* 0x0031 */
-	{ CODEPAGE_ISNONE,  0x0032, 0x0032 },    /* 0x0032 */
-	{ CODEPAGE_ISNONE,  0x0033, 0x0033 },    /* 0x0033 */
-	{ CODEPAGE_ISNONE,  0x0034, 0x0034 },    /* 0x0034 */
-	{ CODEPAGE_ISNONE,  0x0035, 0x0035 },    /* 0x0035 */
-	{ CODEPAGE_ISNONE,  0x0036, 0x0036 },    /* 0x0036 */
-	{ CODEPAGE_ISNONE,  0x0037, 0x0037 },    /* 0x0037 */
-	{ CODEPAGE_ISNONE,  0x0038, 0x0038 },    /* 0x0038 */
-	{ CODEPAGE_ISNONE,  0x0039, 0x0039 },    /* 0x0039 */
-	{ CODEPAGE_ISNONE,  0x003a, 0x003a },    /* 0x003a */
-	{ CODEPAGE_ISNONE,  0x003b, 0x003b },    /* 0x003b */
-	{ CODEPAGE_ISNONE,  0x003c, 0x003c },    /* 0x003c */
-	{ CODEPAGE_ISNONE,  0x003d, 0x003d },    /* 0x003d */
-	{ CODEPAGE_ISNONE,  0x003e, 0x003e },    /* 0x003e */
-	{ CODEPAGE_ISNONE,  0x003f, 0x003f },    /* 0x003f */
-	{ CODEPAGE_ISNONE,  0x0040, 0x0040 },    /* 0x0040 */
-	{ CODEPAGE_ISUPPER, 0x0041, 0x0061 },    /* 0x0041 */
-	{ CODEPAGE_ISUPPER, 0x0042, 0x0062 },    /* 0x0042 */
-	{ CODEPAGE_ISUPPER, 0x0043, 0x0063 },    /* 0x0043 */
-	{ CODEPAGE_ISUPPER, 0x0044, 0x0064 },    /* 0x0044 */
-	{ CODEPAGE_ISUPPER, 0x0045, 0x0065 },    /* 0x0045 */
-	{ CODEPAGE_ISUPPER, 0x0046, 0x0066 },    /* 0x0046 */
-	{ CODEPAGE_ISUPPER, 0x0047, 0x0067 },    /* 0x0047 */
-	{ CODEPAGE_ISUPPER, 0x0048, 0x0068 },    /* 0x0048 */
-	{ CODEPAGE_ISUPPER, 0x0049, 0x0069 },    /* 0x0049 */
-	{ CODEPAGE_ISUPPER, 0x004a, 0x006a },    /* 0x004a */
-	{ CODEPAGE_ISUPPER, 0x004b, 0x006b },    /* 0x004b */
-	{ CODEPAGE_ISUPPER, 0x004c, 0x006c },    /* 0x004c */
-	{ CODEPAGE_ISUPPER, 0x004d, 0x006d },    /* 0x004d */
-	{ CODEPAGE_ISUPPER, 0x004e, 0x006e },    /* 0x004e */
-	{ CODEPAGE_ISUPPER, 0x004f, 0x006f },    /* 0x004f */
-	{ CODEPAGE_ISUPPER, 0x0050, 0x0070 },    /* 0x0050 */
-	{ CODEPAGE_ISUPPER, 0x0051, 0x0071 },    /* 0x0051 */
-	{ CODEPAGE_ISUPPER, 0x0052, 0x0072 },    /* 0x0052 */
-	{ CODEPAGE_ISUPPER, 0x0053, 0x0073 },    /* 0x0053 */
-	{ CODEPAGE_ISUPPER, 0x0054, 0x0074 },    /* 0x0054 */
-	{ CODEPAGE_ISUPPER, 0x0055, 0x0075 },    /* 0x0055 */
-	{ CODEPAGE_ISUPPER, 0x0056, 0x0076 },    /* 0x0056 */
-	{ CODEPAGE_ISUPPER, 0x0057, 0x0077 },    /* 0x0057 */
-	{ CODEPAGE_ISUPPER, 0x0058, 0x0078 },    /* 0x0058 */
-	{ CODEPAGE_ISUPPER, 0x0059, 0x0079 },    /* 0x0059 */
-	{ CODEPAGE_ISUPPER, 0x005a, 0x007a },    /* 0x005a */
-	{ CODEPAGE_ISNONE,  0x005b, 0x005b },    /* 0x005b */
-	{ CODEPAGE_ISNONE,  0x005c, 0x005c },    /* 0x005c */
-	{ CODEPAGE_ISNONE,  0x005d, 0x005d },    /* 0x005d */
-	{ CODEPAGE_ISNONE,  0x005e, 0x005e },    /* 0x005e */
-	{ CODEPAGE_ISNONE,  0x005f, 0x005f },    /* 0x005f */
-	{ CODEPAGE_ISNONE,  0x0060, 0x0060 },    /* 0x0060 */
-	{ CODEPAGE_ISLOWER, 0x0041, 0x0061 },    /* 0x0061 */
-	{ CODEPAGE_ISLOWER, 0x0042, 0x0062 },    /* 0x0062 */
-	{ CODEPAGE_ISLOWER, 0x0043, 0x0063 },    /* 0x0063 */
-	{ CODEPAGE_ISLOWER, 0x0044, 0x0064 },    /* 0x0064 */
-	{ CODEPAGE_ISLOWER, 0x0045, 0x0065 },    /* 0x0065 */
-	{ CODEPAGE_ISLOWER, 0x0046, 0x0066 },    /* 0x0066 */
-	{ CODEPAGE_ISLOWER, 0x0047, 0x0067 },    /* 0x0067 */
-	{ CODEPAGE_ISLOWER, 0x0048, 0x0068 },    /* 0x0068 */
-	{ CODEPAGE_ISLOWER, 0x0049, 0x0069 },    /* 0x0069 */
-	{ CODEPAGE_ISLOWER, 0x004a, 0x006a },    /* 0x006a */
-	{ CODEPAGE_ISLOWER, 0x004b, 0x006b },    /* 0x006b */
-	{ CODEPAGE_ISLOWER, 0x004c, 0x006c },    /* 0x006c */
-	{ CODEPAGE_ISLOWER, 0x004d, 0x006d },    /* 0x006d */
-	{ CODEPAGE_ISLOWER, 0x004e, 0x006e },    /* 0x006e */
-	{ CODEPAGE_ISLOWER, 0x004f, 0x006f },    /* 0x006f */
-	{ CODEPAGE_ISLOWER, 0x0050, 0x0070 },    /* 0x0070 */
-	{ CODEPAGE_ISLOWER, 0x0051, 0x0071 },    /* 0x0071 */
-	{ CODEPAGE_ISLOWER, 0x0052, 0x0072 },    /* 0x0072 */
-	{ CODEPAGE_ISLOWER, 0x0053, 0x0073 },    /* 0x0073 */
-	{ CODEPAGE_ISLOWER, 0x0054, 0x0074 },    /* 0x0074 */
-	{ CODEPAGE_ISLOWER, 0x0055, 0x0075 },    /* 0x0075 */
-	{ CODEPAGE_ISLOWER, 0x0056, 0x0076 },    /* 0x0076 */
-	{ CODEPAGE_ISLOWER, 0x0057, 0x0077 },    /* 0x0077 */
-	{ CODEPAGE_ISLOWER, 0x0058, 0x0078 },    /* 0x0078 */
-	{ CODEPAGE_ISLOWER, 0x0059, 0x0079 },    /* 0x0079 */
-	{ CODEPAGE_ISLOWER, 0x005a, 0x007a },    /* 0x007a */
-	{ CODEPAGE_ISNONE,  0x007b, 0x007b },    /* 0x007b */
-	{ CODEPAGE_ISNONE,  0x007c, 0x007c },    /* 0x007c */
-	{ CODEPAGE_ISNONE,  0x007d, 0x007d },    /* 0x007d */
-	{ CODEPAGE_ISNONE,  0x007e, 0x007e },    /* 0x007e */
-	{ CODEPAGE_ISNONE,  0x007f, 0x007f },    /* 0x007f */
-	{ CODEPAGE_ISNONE,  0x0080, 0x0080 },    /* 0x0080 */
-	{ CODEPAGE_ISNONE,  0x0081, 0x0081 },    /* 0x0081 */
-	{ CODEPAGE_ISNONE,  0x0082, 0x0082 },    /* 0x0082 */
-	{ CODEPAGE_ISNONE,  0x0083, 0x0083 },    /* 0x0083 */
-	{ CODEPAGE_ISNONE,  0x0084, 0x0084 },    /* 0x0084 */
-	{ CODEPAGE_ISNONE,  0x0085, 0x0085 },    /* 0x0085 */
-	{ CODEPAGE_ISNONE,  0x0086, 0x0086 },    /* 0x0086 */
-	{ CODEPAGE_ISNONE,  0x0087, 0x0087 },    /* 0x0087 */
-	{ CODEPAGE_ISNONE,  0x0088, 0x0088 },    /* 0x0088 */
-	{ CODEPAGE_ISNONE,  0x0089, 0x0089 },    /* 0x0089 */
-	{ CODEPAGE_ISNONE,  0x008a, 0x008a },    /* 0x008a */
-	{ CODEPAGE_ISNONE,  0x008b, 0x008b },    /* 0x008b */
-	{ CODEPAGE_ISNONE,  0x008c, 0x008c },    /* 0x008c */
-	{ CODEPAGE_ISNONE,  0x008d, 0x008d },    /* 0x008d */
-	{ CODEPAGE_ISNONE,  0x008e, 0x008e },    /* 0x008e */
-	{ CODEPAGE_ISNONE,  0x008f, 0x008f },    /* 0x008f */
-	{ CODEPAGE_ISNONE,  0x0090, 0x0090 },    /* 0x0090 */
-	{ CODEPAGE_ISNONE,  0x0091, 0x0091 },    /* 0x0091 */
-	{ CODEPAGE_ISNONE,  0x0092, 0x0092 },    /* 0x0092 */
-	{ CODEPAGE_ISNONE,  0x0093, 0x0093 },    /* 0x0093 */
-	{ CODEPAGE_ISNONE,  0x0094, 0x0094 },    /* 0x0094 */
-	{ CODEPAGE_ISNONE,  0x0095, 0x0095 },    /* 0x0095 */
-	{ CODEPAGE_ISNONE,  0x0096, 0x0096 },    /* 0x0096 */
-	{ CODEPAGE_ISNONE,  0x0097, 0x0097 },    /* 0x0097 */
-	{ CODEPAGE_ISNONE,  0x0098, 0x0098 },    /* 0x0098 */
-	{ CODEPAGE_ISNONE,  0x0099, 0x0099 },    /* 0x0099 */
-	{ CODEPAGE_ISNONE,  0x009a, 0x009a },    /* 0x009a */
-	{ CODEPAGE_ISNONE,  0x009b, 0x009b },    /* 0x009b */
-	{ CODEPAGE_ISNONE,  0x009c, 0x009c },    /* 0x009c */
-	{ CODEPAGE_ISNONE,  0x009d, 0x009d },    /* 0x009d */
-	{ CODEPAGE_ISNONE,  0x009e, 0x009e },    /* 0x009e */
-	{ CODEPAGE_ISNONE,  0x009f, 0x009f },    /* 0x009f */
-	{ CODEPAGE_ISNONE,  0x00a0, 0x00a0 },    /* 0x00a0 */
-	{ CODEPAGE_ISNONE,  0x00a1, 0x00a1 },    /* 0x00a1 */
-	{ CODEPAGE_ISNONE,  0x00a2, 0x00a2 },    /* 0x00a2 */
-	{ CODEPAGE_ISNONE,  0x00a3, 0x00a3 },    /* 0x00a3 */
-	{ CODEPAGE_ISNONE,  0x00a4, 0x00a4 },    /* 0x00a4 */
-	{ CODEPAGE_ISNONE,  0x00a5, 0x00a5 },    /* 0x00a5 */
-	{ CODEPAGE_ISNONE,  0x00a6, 0x00a6 },    /* 0x00a6 */
-	{ CODEPAGE_ISNONE,  0x00a7, 0x00a7 },    /* 0x00a7 */
-	{ CODEPAGE_ISNONE,  0x00a8, 0x00a8 },    /* 0x00a8 */
-	{ CODEPAGE_ISNONE,  0x00a9, 0x00a9 },    /* 0x00a9 */
-	{ CODEPAGE_ISNONE,  0x00aa, 0x00aa },    /* 0x00aa */
-	{ CODEPAGE_ISNONE,  0x00ab, 0x00ab },    /* 0x00ab */
-	{ CODEPAGE_ISNONE,  0x00ac, 0x00ac },    /* 0x00ac */
-	{ CODEPAGE_ISNONE,  0x00ad, 0x00ad },    /* 0x00ad */
-	{ CODEPAGE_ISNONE,  0x00ae, 0x00ae },    /* 0x00ae */
-	{ CODEPAGE_ISNONE,  0x00af, 0x00af },    /* 0x00af */
-	{ CODEPAGE_ISNONE,  0x00b0, 0x00b0 },    /* 0x00b0 */
-	{ CODEPAGE_ISNONE,  0x00b1, 0x00b1 },    /* 0x00b1 */
-	{ CODEPAGE_ISNONE,  0x00b2, 0x00b2 },    /* 0x00b2 */
-	{ CODEPAGE_ISNONE,  0x00b3, 0x00b3 },    /* 0x00b3 */
-	{ CODEPAGE_ISNONE,  0x00b4, 0x00b4 },    /* 0x00b4 */
-	{ CODEPAGE_ISNONE,  0x00b5, 0x00b5 },    /* 0x00b5 */
-	{ CODEPAGE_ISNONE,  0x00b6, 0x00b6 },    /* 0x00b6 */
-	{ CODEPAGE_ISNONE,  0x00b7, 0x00b7 },    /* 0x00b7 */
-	{ CODEPAGE_ISNONE,  0x00b8, 0x00b8 },    /* 0x00b8 */
-	{ CODEPAGE_ISNONE,  0x00b9, 0x00b9 },    /* 0x00b9 */
-	{ CODEPAGE_ISNONE,  0x00ba, 0x00ba },    /* 0x00ba */
-	{ CODEPAGE_ISNONE,  0x00bb, 0x00bb },    /* 0x00bb */
-	{ CODEPAGE_ISNONE,  0x00bc, 0x00bc },    /* 0x00bc */
-	{ CODEPAGE_ISNONE,  0x00bd, 0x00bd },    /* 0x00bd */
-	{ CODEPAGE_ISNONE,  0x00be, 0x00be },    /* 0x00be */
-	{ CODEPAGE_ISNONE,  0x00bf, 0x00bf },    /* 0x00bf */
-	{ CODEPAGE_ISUPPER, 0x00c0, 0x00e0 },    /* 0x00c0 */
-	{ CODEPAGE_ISUPPER, 0x00c1, 0x00e1 },    /* 0x00c1 */
-	{ CODEPAGE_ISUPPER, 0x00c2, 0x00e2 },    /* 0x00c2 */
-	{ CODEPAGE_ISUPPER, 0x00c3, 0x00e3 },    /* 0x00c3 */
-	{ CODEPAGE_ISUPPER, 0x00c4, 0x00e4 },    /* 0x00c4 */
-	{ CODEPAGE_ISUPPER, 0x00c5, 0x00e5 },    /* 0x00c5 */
-	{ CODEPAGE_ISUPPER, 0x00c6, 0x00e6 },    /* 0x00c6 */
-	{ CODEPAGE_ISUPPER, 0x00c7, 0x00e7 },    /* 0x00c7 */
-	{ CODEPAGE_ISUPPER, 0x00c8, 0x00e8 },    /* 0x00c8 */
-	{ CODEPAGE_ISUPPER, 0x00c9, 0x00e9 },    /* 0x00c9 */
-	{ CODEPAGE_ISUPPER, 0x00ca, 0x00ea },    /* 0x00ca */
-	{ CODEPAGE_ISUPPER, 0x00cb, 0x00eb },    /* 0x00cb */
-	{ CODEPAGE_ISUPPER, 0x00cc, 0x00ec },    /* 0x00cc */
-	{ CODEPAGE_ISUPPER, 0x00cd, 0x00ed },    /* 0x00cd */
-	{ CODEPAGE_ISUPPER, 0x00ce, 0x00ee },    /* 0x00ce */
-	{ CODEPAGE_ISUPPER, 0x00cf, 0x00ef },    /* 0x00cf */
-	{ CODEPAGE_ISUPPER, 0x00d0, 0x00f0 },    /* 0x00d0 */
-	{ CODEPAGE_ISUPPER, 0x00d1, 0x00f1 },    /* 0x00d1 */
-	{ CODEPAGE_ISUPPER, 0x00d2, 0x00f2 },    /* 0x00d2 */
-	{ CODEPAGE_ISUPPER, 0x00d3, 0x00f3 },    /* 0x00d3 */
-	{ CODEPAGE_ISUPPER, 0x00d4, 0x00f4 },    /* 0x00d4 */
-	{ CODEPAGE_ISUPPER, 0x00d5, 0x00f5 },    /* 0x00d5 */
-	{ CODEPAGE_ISUPPER, 0x00d6, 0x00f6 },    /* 0x00d6 */
-	{ CODEPAGE_ISNONE,  0x00d7, 0x00d7 },    /* 0x00d7 */
-	{ CODEPAGE_ISUPPER, 0x00d8, 0x00f8 },    /* 0x00d8 */
-	{ CODEPAGE_ISUPPER, 0x00d9, 0x00f9 },    /* 0x00d9 */
-	{ CODEPAGE_ISUPPER, 0x00da, 0x00fa },    /* 0x00da */
-	{ CODEPAGE_ISUPPER, 0x00db, 0x00fb },    /* 0x00db */
-	{ CODEPAGE_ISUPPER, 0x00dc, 0x00fc },    /* 0x00dc */
-	{ CODEPAGE_ISUPPER, 0x00dd, 0x00fd },    /* 0x00dd */
-	{ CODEPAGE_ISUPPER, 0x00de, 0x00fe },    /* 0x00de */
-	{ CODEPAGE_ISNONE,  0x00df, 0x00df },    /* 0x00df */
-	{ CODEPAGE_ISLOWER, 0x00c0, 0x00e0 },    /* 0x00e0 */
-	{ CODEPAGE_ISLOWER, 0x00c1, 0x00e1 },    /* 0x00e1 */
-	{ CODEPAGE_ISLOWER, 0x00c2, 0x00e2 },    /* 0x00e2 */
-	{ CODEPAGE_ISLOWER, 0x00c3, 0x00e3 },    /* 0x00e3 */
-	{ CODEPAGE_ISLOWER, 0x00c4, 0x00e4 },    /* 0x00e4 */
-	{ CODEPAGE_ISLOWER, 0x00c5, 0x00e5 },    /* 0x00e5 */
-	{ CODEPAGE_ISLOWER, 0x00c6, 0x00e6 },    /* 0x00e6 */
-	{ CODEPAGE_ISLOWER, 0x00c7, 0x00e7 },    /* 0x00e7 */
-	{ CODEPAGE_ISLOWER, 0x00c8, 0x00e8 },    /* 0x00e8 */
-	{ CODEPAGE_ISLOWER, 0x00c9, 0x00e9 },    /* 0x00e9 */
-	{ CODEPAGE_ISLOWER, 0x00ca, 0x00ea },    /* 0x00ea */
-	{ CODEPAGE_ISLOWER, 0x00cb, 0x00eb },    /* 0x00eb */
-	{ CODEPAGE_ISLOWER, 0x00cc, 0x00ec },    /* 0x00ec */
-	{ CODEPAGE_ISLOWER, 0x00cd, 0x00ed },    /* 0x00ed */
-	{ CODEPAGE_ISLOWER, 0x00ce, 0x00ee },    /* 0x00ee */
-	{ CODEPAGE_ISLOWER, 0x00cf, 0x00ef },    /* 0x00ef */
-	{ CODEPAGE_ISLOWER, 0x00d0, 0x00f0 },    /* 0x00f0 */
-	{ CODEPAGE_ISLOWER, 0x00d1, 0x00f1 },    /* 0x00f1 */
-	{ CODEPAGE_ISLOWER, 0x00d2, 0x00f2 },    /* 0x00f2 */
-	{ CODEPAGE_ISLOWER, 0x00d3, 0x00f3 },    /* 0x00f3 */
-	{ CODEPAGE_ISLOWER, 0x00d4, 0x00f4 },    /* 0x00f4 */
-	{ CODEPAGE_ISLOWER, 0x00d5, 0x00f5 },    /* 0x00f5 */
-	{ CODEPAGE_ISLOWER, 0x00d6, 0x00f6 },    /* 0x00f6 */
-	{ CODEPAGE_ISNONE,  0x00f7, 0x00f7 },    /* 0x00f7 */
-	{ CODEPAGE_ISLOWER, 0x00d8, 0x00f8 },    /* 0x00f8 */
-	{ CODEPAGE_ISLOWER, 0x00d9, 0x00f9 },    /* 0x00f9 */
-	{ CODEPAGE_ISLOWER, 0x00da, 0x00fa },    /* 0x00fa */
-	{ CODEPAGE_ISLOWER, 0x00db, 0x00fb },    /* 0x00fb */
-	{ CODEPAGE_ISLOWER, 0x00dc, 0x00fc },    /* 0x00fc */
-	{ CODEPAGE_ISLOWER, 0x00dd, 0x00fd },    /* 0x00fd */
-	{ CODEPAGE_ISLOWER, 0x00de, 0x00fe },    /* 0x00fe */
-	{ CODEPAGE_ISNONE,  0x00ff, 0x00ff }	 /* 0x00ff */
-};
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _SMBSRV_CP_LATIN1_H */
--- a/usr/src/uts/common/smbsrv/cp_latin2.h	Thu Nov 05 12:17:17 2009 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,314 +0,0 @@
-/*
- * CDDL HEADER START
- *
- * The contents of this file are subject to the terms of the
- * Common Development and Distribution License (the "License").
- * You may not use this file except in compliance with the License.
- *
- * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
- * or http://www.opensolaris.org/os/licensing.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- *
- * When distributing Covered Code, include this CDDL HEADER in each
- * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
- * If applicable, add the following below this CDDL HEADER, with the
- * fields enclosed by brackets "[]" replaced with your own identifying
- * information: Portions Copyright [yyyy] [name of copyright owner]
- *
- * CDDL HEADER END
- */
-/*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
- * Use is subject to license terms.
- */
-
-#ifndef _SMBSRV_CP_LATIN2_H
-#define	_SMBSRV_CP_LATIN2_H
-
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
-/*
- * This file specifies a codepage mapping for a given character set as
- * specified below:
- *
- * This is the codepage for the Latin-2 Character Set
- * (Central & Eastern Europe).  This codepage defines
- * values for the special characters needed
- * for the written alphabets of the following languages:  Czech,
- * Hungarian, Polish, Romanian, Croatian, Slovak,
- * Slovenian, and Sorbian
- * The Latin-2 character set is also known as iso-8859-2
- *
- */
-
-#include <smbsrv/codepage.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-codepage_t Latin2_codepage[256] = {
-	{ CODEPAGE_ISNONE,  0x0000, 0x0000 },    /* 0x0000 */
-	{ CODEPAGE_ISNONE,  0x0001, 0x0001 },    /* 0x0001 */
-	{ CODEPAGE_ISNONE,  0x0002, 0x0002 },    /* 0x0002 */
-	{ CODEPAGE_ISNONE,  0x0003, 0x0003 },    /* 0x0003 */
-	{ CODEPAGE_ISNONE,  0x0004, 0x0004 },    /* 0x0004 */
-	{ CODEPAGE_ISNONE,  0x0005, 0x0005 },    /* 0x0005 */
-	{ CODEPAGE_ISNONE,  0x0006, 0x0006 },    /* 0x0006 */
-	{ CODEPAGE_ISNONE,  0x0007, 0x0007 },    /* 0x0007 */
-	{ CODEPAGE_ISNONE,  0x0008, 0x0008 },    /* 0x0008 */
-	{ CODEPAGE_ISNONE,  0x0009, 0x0009 },    /* 0x0009 */
-	{ CODEPAGE_ISNONE,  0x000a, 0x000a },    /* 0x000a */
-	{ CODEPAGE_ISNONE,  0x000b, 0x000b },    /* 0x000b */
-	{ CODEPAGE_ISNONE,  0x000c, 0x000c },    /* 0x000c */
-	{ CODEPAGE_ISNONE,  0x000d, 0x000d },    /* 0x000d */
-	{ CODEPAGE_ISNONE,  0x000e, 0x000e },    /* 0x000e */
-	{ CODEPAGE_ISNONE,  0x000f, 0x000f },    /* 0x000f */
-	{ CODEPAGE_ISNONE,  0x0010, 0x0010 },    /* 0x0010 */
-	{ CODEPAGE_ISNONE,  0x0011, 0x0011 },    /* 0x0011 */
-	{ CODEPAGE_ISNONE,  0x0012, 0x0012 },    /* 0x0012 */
-	{ CODEPAGE_ISNONE,  0x0013, 0x0013 },    /* 0x0013 */
-	{ CODEPAGE_ISNONE,  0x0014, 0x0014 },    /* 0x0014 */
-	{ CODEPAGE_ISNONE,  0x0015, 0x0015 },    /* 0x0015 */
-	{ CODEPAGE_ISNONE,  0x0016, 0x0016 },    /* 0x0016 */
-	{ CODEPAGE_ISNONE,  0x0017, 0x0017 },    /* 0x0017 */
-	{ CODEPAGE_ISNONE,  0x0018, 0x0018 },    /* 0x0018 */
-	{ CODEPAGE_ISNONE,  0x0019, 0x0019 },    /* 0x0019 */
-	{ CODEPAGE_ISNONE,  0x001a, 0x001a },    /* 0x001a */
-	{ CODEPAGE_ISNONE,  0x001b, 0x001b },    /* 0x001b */
-	{ CODEPAGE_ISNONE,  0x001c, 0x001c },    /* 0x001c */
-	{ CODEPAGE_ISNONE,  0x001d, 0x001d },    /* 0x001d */
-	{ CODEPAGE_ISNONE,  0x001e, 0x001e },    /* 0x001e */
-	{ CODEPAGE_ISNONE,  0x001f, 0x001f },    /* 0x001f */
-	{ CODEPAGE_ISNONE,  0x0020, 0x0020 },    /* 0x0020 */
-	{ CODEPAGE_ISNONE,  0x0021, 0x0021 },    /* 0x0021 */
-	{ CODEPAGE_ISNONE,  0x0022, 0x0022 },    /* 0x0022 */
-	{ CODEPAGE_ISNONE,  0x0023, 0x0023 },    /* 0x0023 */
-	{ CODEPAGE_ISNONE,  0x0024, 0x0024 },    /* 0x0024 */
-	{ CODEPAGE_ISNONE,  0x0025, 0x0025 },    /* 0x0025 */
-	{ CODEPAGE_ISNONE,  0x0026, 0x0026 },    /* 0x0026 */
-	{ CODEPAGE_ISNONE,  0x0027, 0x0027 },    /* 0x0027 */
-	{ CODEPAGE_ISNONE,  0x0028, 0x0028 },    /* 0x0028 */
-	{ CODEPAGE_ISNONE,  0x0029, 0x0029 },    /* 0x0029 */
-	{ CODEPAGE_ISNONE,  0x002a, 0x002a },    /* 0x002a */
-	{ CODEPAGE_ISNONE,  0x002b, 0x002b },    /* 0x002b */
-	{ CODEPAGE_ISNONE,  0x002c, 0x002c },    /* 0x002c */
-	{ CODEPAGE_ISNONE,  0x002d, 0x002d },    /* 0x002d */
-	{ CODEPAGE_ISNONE,  0x002e, 0x002e },    /* 0x002e */
-	{ CODEPAGE_ISNONE,  0x002f, 0x002f },    /* 0x002f */
-	{ CODEPAGE_ISNONE,  0x0030, 0x0030 },    /* 0x0030 */
-	{ CODEPAGE_ISNONE,  0x0031, 0x0031 },    /* 0x0031 */
-	{ CODEPAGE_ISNONE,  0x0032, 0x0032 },    /* 0x0032 */
-	{ CODEPAGE_ISNONE,  0x0033, 0x0033 },    /* 0x0033 */
-	{ CODEPAGE_ISNONE,  0x0034, 0x0034 },    /* 0x0034 */
-	{ CODEPAGE_ISNONE,  0x0035, 0x0035 },    /* 0x0035 */
-	{ CODEPAGE_ISNONE,  0x0036, 0x0036 },    /* 0x0036 */
-	{ CODEPAGE_ISNONE,  0x0037, 0x0037 },    /* 0x0037 */
-	{ CODEPAGE_ISNONE,  0x0038, 0x0038 },    /* 0x0038 */
-	{ CODEPAGE_ISNONE,  0x0039, 0x0039 },    /* 0x0039 */
-	{ CODEPAGE_ISNONE,  0x003a, 0x003a },    /* 0x003a */
-	{ CODEPAGE_ISNONE,  0x003b, 0x003b },    /* 0x003b */
-	{ CODEPAGE_ISNONE,  0x003c, 0x003c },    /* 0x003c */
-	{ CODEPAGE_ISNONE,  0x003d, 0x003d },    /* 0x003d */
-	{ CODEPAGE_ISNONE,  0x003e, 0x003e },    /* 0x003e */
-	{ CODEPAGE_ISNONE,  0x003f, 0x003f },    /* 0x003f */
-	{ CODEPAGE_ISNONE,  0x0040, 0x0040 },    /* 0x0040 */
-	{ CODEPAGE_ISUPPER, 0x0041, 0x0061 },    /* 0x0041 */
-	{ CODEPAGE_ISUPPER, 0x0042, 0x0062 },    /* 0x0042 */
-	{ CODEPAGE_ISUPPER, 0x0043, 0x0063 },    /* 0x0043 */
-	{ CODEPAGE_ISUPPER, 0x0044, 0x0064 },    /* 0x0044 */
-	{ CODEPAGE_ISUPPER, 0x0045, 0x0065 },    /* 0x0045 */
-	{ CODEPAGE_ISUPPER, 0x0046, 0x0066 },    /* 0x0046 */
-	{ CODEPAGE_ISUPPER, 0x0047, 0x0067 },    /* 0x0047 */
-	{ CODEPAGE_ISUPPER, 0x0048, 0x0068 },    /* 0x0048 */
-	{ CODEPAGE_ISUPPER, 0x0049, 0x0069 },    /* 0x0049 */
-	{ CODEPAGE_ISUPPER, 0x004a, 0x006a },    /* 0x004a */
-	{ CODEPAGE_ISUPPER, 0x004b, 0x006b },    /* 0x004b */
-	{ CODEPAGE_ISUPPER, 0x004c, 0x006c },    /* 0x004c */
-	{ CODEPAGE_ISUPPER, 0x004d, 0x006d },    /* 0x004d */
-	{ CODEPAGE_ISUPPER, 0x004e, 0x006e },    /* 0x004e */
-	{ CODEPAGE_ISUPPER, 0x004f, 0x006f },    /* 0x004f */
-	{ CODEPAGE_ISUPPER, 0x0050, 0x0070 },    /* 0x0050 */
-	{ CODEPAGE_ISUPPER, 0x0051, 0x0071 },    /* 0x0051 */
-	{ CODEPAGE_ISUPPER, 0x0052, 0x0072 },    /* 0x0052 */
-	{ CODEPAGE_ISUPPER, 0x0053, 0x0073 },    /* 0x0053 */
-	{ CODEPAGE_ISUPPER, 0x0054, 0x0074 },    /* 0x0054 */
-	{ CODEPAGE_ISUPPER, 0x0055, 0x0075 },    /* 0x0055 */
-	{ CODEPAGE_ISUPPER, 0x0056, 0x0076 },    /* 0x0056 */
-	{ CODEPAGE_ISUPPER, 0x0057, 0x0077 },    /* 0x0057 */
-	{ CODEPAGE_ISUPPER, 0x0058, 0x0078 },    /* 0x0058 */
-	{ CODEPAGE_ISUPPER, 0x0059, 0x0079 },    /* 0x0059 */
-	{ CODEPAGE_ISUPPER, 0x005a, 0x007a },    /* 0x005a */
-	{ CODEPAGE_ISNONE,  0x005b, 0x005b },    /* 0x005b */
-	{ CODEPAGE_ISNONE,  0x005c, 0x005c },    /* 0x005c */
-	{ CODEPAGE_ISNONE,  0x005d, 0x005d },    /* 0x005d */
-	{ CODEPAGE_ISNONE,  0x005e, 0x005e },    /* 0x005e */
-	{ CODEPAGE_ISNONE,  0x005f, 0x005f },    /* 0x005f */
-	{ CODEPAGE_ISNONE,  0x0060, 0x0060 },    /* 0x0060 */
-	{ CODEPAGE_ISLOWER, 0x0041, 0x0061 },    /* 0x0061 */
-	{ CODEPAGE_ISLOWER, 0x0042, 0x0062 },    /* 0x0062 */
-	{ CODEPAGE_ISLOWER, 0x0043, 0x0063 },    /* 0x0063 */
-	{ CODEPAGE_ISLOWER, 0x0044, 0x0064 },    /* 0x0064 */
-	{ CODEPAGE_ISLOWER, 0x0045, 0x0065 },    /* 0x0065 */
-	{ CODEPAGE_ISLOWER, 0x0046, 0x0066 },    /* 0x0066 */
-	{ CODEPAGE_ISLOWER, 0x0047, 0x0067 },    /* 0x0067 */
-	{ CODEPAGE_ISLOWER, 0x0048, 0x0068 },    /* 0x0068 */
-	{ CODEPAGE_ISLOWER, 0x0049, 0x0069 },    /* 0x0069 */
-	{ CODEPAGE_ISLOWER, 0x004a, 0x006a },    /* 0x006a */
-	{ CODEPAGE_ISLOWER, 0x004b, 0x006b },    /* 0x006b */
-	{ CODEPAGE_ISLOWER, 0x004c, 0x006c },    /* 0x006c */
-	{ CODEPAGE_ISLOWER, 0x004d, 0x006d },    /* 0x006d */
-	{ CODEPAGE_ISLOWER, 0x004e, 0x006e },    /* 0x006e */
-	{ CODEPAGE_ISLOWER, 0x004f, 0x006f },    /* 0x006f */
-	{ CODEPAGE_ISLOWER, 0x0050, 0x0070 },    /* 0x0070 */
-	{ CODEPAGE_ISLOWER, 0x0051, 0x0071 },    /* 0x0071 */
-	{ CODEPAGE_ISLOWER, 0x0052, 0x0072 },    /* 0x0072 */
-	{ CODEPAGE_ISLOWER, 0x0053, 0x0073 },    /* 0x0073 */
-	{ CODEPAGE_ISLOWER, 0x0054, 0x0074 },    /* 0x0074 */
-	{ CODEPAGE_ISLOWER, 0x0055, 0x0075 },    /* 0x0075 */
-	{ CODEPAGE_ISLOWER, 0x0056, 0x0076 },    /* 0x0076 */
-	{ CODEPAGE_ISLOWER, 0x0057, 0x0077 },    /* 0x0077 */
-	{ CODEPAGE_ISLOWER, 0x0058, 0x0078 },    /* 0x0078 */
-	{ CODEPAGE_ISLOWER, 0x0059, 0x0079 },    /* 0x0079 */
-	{ CODEPAGE_ISLOWER, 0x005a, 0x007a },    /* 0x007a */
-	{ CODEPAGE_ISNONE,  0x007b, 0x007b },    /* 0x007b */
-	{ CODEPAGE_ISNONE,  0x007c, 0x007c },    /* 0x007c */
-	{ CODEPAGE_ISNONE,  0x007d, 0x007d },    /* 0x007d */
-	{ CODEPAGE_ISNONE,  0x007e, 0x007e },    /* 0x007e */
-	{ CODEPAGE_ISNONE,  0x007f, 0x007f },    /* 0x007f */
-	{ CODEPAGE_ISNONE,  0x0080, 0x0080 },    /* 0x0080 */
-	{ CODEPAGE_ISNONE,  0x0081, 0x0081 },    /* 0x0081 */
-	{ CODEPAGE_ISNONE,  0x0082, 0x0082 },    /* 0x0082 */
-	{ CODEPAGE_ISNONE,  0x0083, 0x0083 },    /* 0x0083 */
-	{ CODEPAGE_ISNONE,  0x0084, 0x0084 },    /* 0x0084 */
-	{ CODEPAGE_ISNONE,  0x0085, 0x0085 },    /* 0x0085 */
-	{ CODEPAGE_ISNONE,  0x0086, 0x0086 },    /* 0x0086 */
-	{ CODEPAGE_ISNONE,  0x0087, 0x0087 },    /* 0x0087 */
-	{ CODEPAGE_ISNONE,  0x0088, 0x0088 },    /* 0x0088 */
-	{ CODEPAGE_ISNONE,  0x0089, 0x0089 },    /* 0x0089 */
-	{ CODEPAGE_ISNONE,  0x008a, 0x008a },    /* 0x008a */
-	{ CODEPAGE_ISNONE,  0x008b, 0x008b },    /* 0x008b */
-	{ CODEPAGE_ISNONE,  0x008c, 0x008c },    /* 0x008c */
-	{ CODEPAGE_ISNONE,  0x008d, 0x008d },    /* 0x008d */
-	{ CODEPAGE_ISNONE,  0x008e, 0x008e },    /* 0x008e */
-	{ CODEPAGE_ISNONE,  0x008f, 0x008f },    /* 0x008f */
-	{ CODEPAGE_ISNONE,  0x0090, 0x0090 },    /* 0x0090 */
-	{ CODEPAGE_ISNONE,  0x0091, 0x0091 },    /* 0x0091 */
-	{ CODEPAGE_ISNONE,  0x0092, 0x0092 },    /* 0x0092 */
-	{ CODEPAGE_ISNONE,  0x0093, 0x0093 },    /* 0x0093 */
-	{ CODEPAGE_ISNONE,  0x0094, 0x0094 },    /* 0x0094 */
-	{ CODEPAGE_ISNONE,  0x0095, 0x0095 },    /* 0x0095 */
-	{ CODEPAGE_ISNONE,  0x0096, 0x0096 },    /* 0x0096 */
-	{ CODEPAGE_ISNONE,  0x0097, 0x0097 },    /* 0x0097 */
-	{ CODEPAGE_ISNONE,  0x0098, 0x0098 },    /* 0x0098 */
-	{ CODEPAGE_ISNONE,  0x0099, 0x0099 },    /* 0x0099 */
-	{ CODEPAGE_ISNONE,  0x009a, 0x009a },    /* 0x009a */
-	{ CODEPAGE_ISNONE,  0x009b, 0x009b },    /* 0x009b */
-	{ CODEPAGE_ISNONE,  0x009c, 0x009c },    /* 0x009c */
-	{ CODEPAGE_ISNONE,  0x009d, 0x009d },    /* 0x009d */
-	{ CODEPAGE_ISNONE,  0x009e, 0x009e },    /* 0x009e */
-	{ CODEPAGE_ISNONE,  0x009f, 0x009f },    /* 0x009f */
-	{ CODEPAGE_ISNONE,  0x00a0, 0x00a0 },    /* 0x00a0 */
-	{ CODEPAGE_ISUPPER, 0x00a1, 0x00b1 },    /* 0x00a1 */
-	{ CODEPAGE_ISNONE,  0x00a2, 0x00a2 },    /* 0x00a2 */
-	{ CODEPAGE_ISUPPER, 0x00a3, 0x00b3 },    /* 0x00a3 */
-	{ CODEPAGE_ISNONE,  0x00a4, 0x00a4 },    /* 0x00a4 */
-	{ CODEPAGE_ISUPPER, 0x00a5, 0x00b5 },    /* 0x00a5 */
-	{ CODEPAGE_ISUPPER, 0x00a6, 0x00b6 },    /* 0x00a6 */
-	{ CODEPAGE_ISNONE,  0x00a7, 0x00a7 },    /* 0x00a7 */
-	{ CODEPAGE_ISNONE,  0x00a8, 0x00a8 },    /* 0x00a8 */
-	{ CODEPAGE_ISUPPER, 0x00a9, 0x00b9 },    /* 0x00a9 */
-	{ CODEPAGE_ISUPPER, 0x00aa, 0x00ba },    /* 0x00aa */
-	{ CODEPAGE_ISUPPER, 0x00ab, 0x00bb },    /* 0x00ab */
-	{ CODEPAGE_ISUPPER, 0x00ac, 0x00bc },    /* 0x00ac */
-	{ CODEPAGE_ISNONE,  0x00ad, 0x00ad },    /* 0x00ad */
-	{ CODEPAGE_ISUPPER, 0x00ae, 0x00be },    /* 0x00ae */
-	{ CODEPAGE_ISUPPER, 0x00af, 0x00bf },    /* 0x00af */
-	{ CODEPAGE_ISNONE,  0x00b0, 0x00b0 },    /* 0x00b0 */
-	{ CODEPAGE_ISLOWER, 0x00a1, 0x00b1 },    /* 0x00b1 */
-	{ CODEPAGE_ISNONE,  0x00b2, 0x00b2 },    /* 0x00b2 */
-	{ CODEPAGE_ISLOWER, 0x00a3, 0x00b3 },    /* 0x00b3 */
-	{ CODEPAGE_ISNONE,  0x00b4, 0x00b4 },    /* 0x00b4 */
-	{ CODEPAGE_ISLOWER, 0x00a5, 0x00b5 },    /* 0x00b5 */
-	{ CODEPAGE_ISLOWER, 0x00a6, 0x00b6 },    /* 0x00b6 */
-	{ CODEPAGE_ISNONE,  0x00b7, 0x00b7 },    /* 0x00b7 */
-	{ CODEPAGE_ISNONE,  0x00b8, 0x00b8 },    /* 0x00b8 */
-	{ CODEPAGE_ISLOWER, 0x00a9, 0x00b9 },    /* 0x00b9 */
-	{ CODEPAGE_ISLOWER, 0x00aa, 0x00ba },    /* 0x00ba */
-	{ CODEPAGE_ISLOWER, 0x00ab, 0x00bb },    /* 0x00bb */
-	{ CODEPAGE_ISLOWER, 0x00ac, 0x00bc },    /* 0x00bc */
-	{ CODEPAGE_ISNONE,  0x00bd, 0x00bd },    /* 0x00bd */
-	{ CODEPAGE_ISLOWER, 0x00ae, 0x00be },    /* 0x00be */
-	{ CODEPAGE_ISLOWER, 0x00af, 0x00bf },    /* 0x00bf */
-	{ CODEPAGE_ISUPPER, 0x00c0, 0x00e0 },    /* 0x00c0 */
-	{ CODEPAGE_ISUPPER, 0x00c1, 0x00e1 },    /* 0x00c1 */
-	{ CODEPAGE_ISUPPER, 0x00c2, 0x00e2 },    /* 0x00c2 */
-	{ CODEPAGE_ISUPPER, 0x00c3, 0x00e3 },    /* 0x00c3 */
-	{ CODEPAGE_ISUPPER, 0x00c4, 0x00e4 },    /* 0x00c4 */
-	{ CODEPAGE_ISUPPER, 0x00c5, 0x00e5 },    /* 0x00c5 */
-	{ CODEPAGE_ISUPPER, 0x00c6, 0x00e6 },    /* 0x00c6 */
-	{ CODEPAGE_ISUPPER, 0x00c7, 0x00e7 },    /* 0x00c7 */
-	{ CODEPAGE_ISUPPER, 0x00c8, 0x00e8 },    /* 0x00c8 */
-	{ CODEPAGE_ISUPPER, 0x00c9, 0x00e9 },    /* 0x00c9 */
-	{ CODEPAGE_ISUPPER, 0x00ca, 0x00ea },    /* 0x00ca */
-	{ CODEPAGE_ISUPPER, 0x00cb, 0x00eb },    /* 0x00cb */
-	{ CODEPAGE_ISUPPER, 0x00cc, 0x00ec },    /* 0x00cc */
-	{ CODEPAGE_ISUPPER, 0x00cd, 0x00ed },    /* 0x00cd */
-	{ CODEPAGE_ISUPPER, 0x00ce, 0x00ee },    /* 0x00ce */
-	{ CODEPAGE_ISUPPER, 0x00cf, 0x00ef },    /* 0x00cf */
-	{ CODEPAGE_ISUPPER, 0x00d0, 0x00f0 },    /* 0x00d0 */
-	{ CODEPAGE_ISUPPER, 0x00d1, 0x00f1 },    /* 0x00d1 */
-	{ CODEPAGE_ISUPPER, 0x00d2, 0x00f2 },    /* 0x00d2 */
-	{ CODEPAGE_ISUPPER, 0x00d3, 0x00f3 },    /* 0x00d3 */
-	{ CODEPAGE_ISUPPER, 0x00d4, 0x00f4 },    /* 0x00d4 */
-	{ CODEPAGE_ISUPPER, 0x00d5, 0x00f5 },    /* 0x00d5 */
-	{ CODEPAGE_ISUPPER, 0x00d6, 0x00f6 },    /* 0x00d6 */
-	{ CODEPAGE_ISNONE,  0x00d7, 0x00d7 },    /* 0x00d7 */
-	{ CODEPAGE_ISUPPER, 0x00d8, 0x00f8 },    /* 0x00d8 */
-	{ CODEPAGE_ISUPPER, 0x00d9, 0x00f9 },    /* 0x00d9 */
-	{ CODEPAGE_ISUPPER, 0x00da, 0x00fa },    /* 0x00da */
-	{ CODEPAGE_ISUPPER, 0x00db, 0x00fb },    /* 0x00db */
-	{ CODEPAGE_ISUPPER, 0x00dc, 0x00fc },    /* 0x00dc */
-	{ CODEPAGE_ISUPPER, 0x00dd, 0x00fd },    /* 0x00dd */
-	{ CODEPAGE_ISUPPER, 0x00de, 0x00fe },    /* 0x00de */
-	{ CODEPAGE_ISNONE,  0x00df, 0x00df },    /* 0x00df */
-	{ CODEPAGE_ISLOWER, 0x00c0, 0x00e0 },    /* 0x00e0 */
-	{ CODEPAGE_ISLOWER, 0x00c1, 0x00e1 },    /* 0x00e1 */
-	{ CODEPAGE_ISLOWER, 0x00c2, 0x00e2 },    /* 0x00e2 */
-	{ CODEPAGE_ISLOWER, 0x00c3, 0x00e3 },    /* 0x00e3 */
-	{ CODEPAGE_ISLOWER, 0x00c4, 0x00e4 },    /* 0x00e4 */
-	{ CODEPAGE_ISLOWER, 0x00c5, 0x00e5 },    /* 0x00e5 */
-	{ CODEPAGE_ISLOWER, 0x00c6, 0x00e6 },    /* 0x00e6 */
-	{ CODEPAGE_ISLOWER, 0x00c7, 0x00e7 },    /* 0x00e7 */
-	{ CODEPAGE_ISLOWER, 0x00c8, 0x00e8 },    /* 0x00e8 */
-	{ CODEPAGE_ISLOWER, 0x00c9, 0x00e9 },    /* 0x00e9 */
-	{ CODEPAGE_ISLOWER, 0x00ca, 0x00ea },    /* 0x00ea */
-	{ CODEPAGE_ISLOWER, 0x00cb, 0x00eb },    /* 0x00eb */
-	{ CODEPAGE_ISLOWER, 0x00cc, 0x00ec },    /* 0x00ec */
-	{ CODEPAGE_ISLOWER, 0x00cd, 0x00ed },    /* 0x00ed */
-	{ CODEPAGE_ISLOWER, 0x00ce, 0x00ee },    /* 0x00ee */
-	{ CODEPAGE_ISLOWER, 0x00cf, 0x00ef },    /* 0x00ef */
-	{ CODEPAGE_ISLOWER, 0x00d0, 0x00f0 },    /* 0x00f0 */
-	{ CODEPAGE_ISLOWER, 0x00d1, 0x00f1 },    /* 0x00f1 */
-	{ CODEPAGE_ISLOWER, 0x00d2, 0x00f2 },    /* 0x00f2 */
-	{ CODEPAGE_ISLOWER, 0x00d3, 0x00f3 },    /* 0x00f3 */
-	{ CODEPAGE_ISLOWER, 0x00d4, 0x00f4 },    /* 0x00f4 */
-	{ CODEPAGE_ISLOWER, 0x00d5, 0x00f5 },    /* 0x00f5 */
-	{ CODEPAGE_ISLOWER, 0x00d6, 0x00f6 },    /* 0x00f6 */
-	{ CODEPAGE_ISNONE,  0x00f7, 0x00f7 },    /* 0x00f7 */
-	{ CO