1da6c28aaSamw /*
2da6c28aaSamw  * CDDL HEADER START
3da6c28aaSamw  *
4da6c28aaSamw  * The contents of this file are subject to the terms of the
5da6c28aaSamw  * Common Development and Distribution License (the "License").
6da6c28aaSamw  * You may not use this file except in compliance with the License.
7da6c28aaSamw  *
8da6c28aaSamw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9da6c28aaSamw  * or http://www.opensolaris.org/os/licensing.
10da6c28aaSamw  * See the License for the specific language governing permissions
11da6c28aaSamw  * and limitations under the License.
12da6c28aaSamw  *
13da6c28aaSamw  * When distributing Covered Code, include this CDDL HEADER in each
14da6c28aaSamw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15da6c28aaSamw  * If applicable, add the following below this CDDL HEADER, with the
16da6c28aaSamw  * fields enclosed by brackets "[]" replaced with your own identifying
17da6c28aaSamw  * information: Portions Copyright [yyyy] [name of copyright owner]
18da6c28aaSamw  *
19da6c28aaSamw  * CDDL HEADER END
20da6c28aaSamw  */
21da6c28aaSamw /*
229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23da6c28aaSamw  * Use is subject to license terms.
24*b819cea2SGordon Ross  *
25*b819cea2SGordon Ross  * Copyright 2014 Nexenta Systems, Inc.  All rights reserved.
26da6c28aaSamw  */
27da6c28aaSamw 
28da6c28aaSamw /*
29da6c28aaSamw  * This module defines generic functions to map Native OS and Native
30da6c28aaSamw  * LanMan names to values.
31da6c28aaSamw  */
32da6c28aaSamw 
33*b819cea2SGordon Ross #if defined(_KERNEL) || defined(_FAKE_KERNEL)
34da6c28aaSamw #include <sys/types.h>
35da6c28aaSamw #include <sys/sunddi.h>
36da6c28aaSamw #else
37da6c28aaSamw #include <string.h>
38da6c28aaSamw #endif
39da6c28aaSamw #include <smbsrv/string.h>
40da6c28aaSamw #include <smbsrv/smbinfo.h>
41da6c28aaSamw 
42fc724630SAlan Wright typedef struct smb_native {
43fc724630SAlan Wright 	int sn_value;
44fc724630SAlan Wright 	const char *sn_name;
45fc724630SAlan Wright } smb_native_t;
46fc724630SAlan Wright 
47da6c28aaSamw /*
48da6c28aaSamw  * smbnative_os_value
49da6c28aaSamw  *
50da6c28aaSamw  * Return the appropriate native OS value for the specified native OS name.
51da6c28aaSamw  *
52fc724630SAlan Wright  * Example OS values used by Windows:
53fc724630SAlan Wright  *
54fc724630SAlan Wright  *	Windows 4.0, Windows NT, Windows NT 4.0
55fc724630SAlan Wright  *	Windows 5.0, Windows 5.1
56fc724630SAlan Wright  *	Windows 2000, Windows 2000 5.0, Windows 2000 5.1
57fc724630SAlan Wright  *	Windows 2002
58fc724630SAlan Wright  *	Windows .NET
59fc724630SAlan Wright  *	Windows Server 2003
60fc724630SAlan Wright  *	Windows XP
61fc724630SAlan Wright  *
62da6c28aaSamw  * Windows 2000 server:            "Windows 2000 2195"
63da6c28aaSamw  * Windows XP Professional client: "Windows 2002 2543"
64da6c28aaSamw  * Windows XP PDC server:          "Windows 5.1"
65da6c28aaSamw  * Windows .Net:                   "Windows .NET 3621"
66da6c28aaSamw  * Windows .Net:                   "Windows .NET 3718"
67da6c28aaSamw  *
68da6c28aaSamw  * DAVE (Thursby Software: CIFS for MacOS) uses "MacOS", sometimes with a
69da6c28aaSamw  * version number appended, i.e. "MacOS 8.5.1". We treat DAVE like NT 4.0
70da6c28aaSamw  * except for the cases that DAVE clients set 'watch tree' flag in notify
71da6c28aaSamw  * change requests.
72da6c28aaSamw  *
73da6c28aaSamw  * Samba reports UNIX as its Native OS, which we can map to NT 4.0.
74da6c28aaSamw  */
75da6c28aaSamw int
smbnative_os_value(const char * native_os)76fc724630SAlan Wright smbnative_os_value(const char *native_os)
77da6c28aaSamw {
78fc724630SAlan Wright 	static smb_native_t os_table[] = {
79da6c28aaSamw 		{ NATIVE_OS_WINNT,	"Windows NT 4.0"	},
80da6c28aaSamw 		{ NATIVE_OS_WINNT,	"Windows NT"		},
81da6c28aaSamw 		{ NATIVE_OS_WIN95,	"Windows 4.0"		},
82da6c28aaSamw 		{ NATIVE_OS_WIN2000,	"Windows 5.0"		},
83da6c28aaSamw 		{ NATIVE_OS_WIN2000,	"Windows 5.1"		},
84da6c28aaSamw 		{ NATIVE_OS_WIN2000,	"Windows 2000"		},
85da6c28aaSamw 		{ NATIVE_OS_WIN2000,	"Windows 2002"		},
86da6c28aaSamw 		{ NATIVE_OS_WIN2000,	"Windows .NET"		},
87fc724630SAlan Wright 		{ NATIVE_OS_WIN2000,	"Windows Server"	},
88da6c28aaSamw 		{ NATIVE_OS_WIN2000,	"Windows XP"		},
89da6c28aaSamw 		{ NATIVE_OS_WINNT,	"UNIX"			},
90da6c28aaSamw 		{ NATIVE_OS_MACOS,	"MacOS" 		}
91da6c28aaSamw 	};
92da6c28aaSamw 
93da6c28aaSamw 	int i;
94da6c28aaSamw 	int len;
95fc724630SAlan Wright 	const char *name;
96da6c28aaSamw 
97fc724630SAlan Wright 	if (native_os == NULL)
98da6c28aaSamw 		return (NATIVE_OS_UNKNOWN);
99da6c28aaSamw 
100fc724630SAlan Wright 	/*
101fc724630SAlan Wright 	 * Windows Vista sends an empty native OS string.
102fc724630SAlan Wright 	 */
103fc724630SAlan Wright 	if (*native_os == '\0')
10455bf511dSas 		return (NATIVE_OS_WIN2000);
10555bf511dSas 
106da6c28aaSamw 	for (i = 0; i < sizeof (os_table)/sizeof (os_table[0]); ++i) {
107fc724630SAlan Wright 		name = os_table[i].sn_name;
108fc724630SAlan Wright 		len = strlen(name);
109da6c28aaSamw 
110bbf6f00cSJordan Brown 		if (smb_strcasecmp(name, native_os, len) == 0)
111fc724630SAlan Wright 			return (os_table[i].sn_value);
112da6c28aaSamw 	}
113fc724630SAlan Wright 
114da6c28aaSamw 	return (NATIVE_OS_UNKNOWN);
115da6c28aaSamw }
116da6c28aaSamw 
117da6c28aaSamw /*
118da6c28aaSamw  * smbnative_lm_value
119da6c28aaSamw  *
120da6c28aaSamw  * Return the appropriate native LanMan value for the specified native
121da6c28aaSamw  * LanMan name. There's an alignment problem in some packets from some
122da6c28aaSamw  * clients that means we can miss the first character, so we do an
123da6c28aaSamw  * additional check starting from the second character.
124da6c28aaSamw  *
125fc724630SAlan Wright  * Example LanMan values:
126da6c28aaSamw  *
127fc724630SAlan Wright  *	NT LAN Manager 4.0
128fc724630SAlan Wright  *	Windows 4.0
129fc724630SAlan Wright  *	Windows NT, Windows NT 4.0
130fc724630SAlan Wright  *	Windows 2000 LAN Manager
131fc724630SAlan Wright  *	Windows 2000, Windows 2000 5.0, Windows 2000 5.1
132fc724630SAlan Wright  *	Windows 2002, Windows 2002 5.1
133fc724630SAlan Wright  *	Windows .NET, Windows .NET 5.2
134fc724630SAlan Wright  *	Windows Server 2003
135fc724630SAlan Wright  *	Windows XP
136fc724630SAlan Wright  *	NETSMB		(Solaris CIFS client)
137fc724630SAlan Wright  *	DAVE		(Thursby Software: CIFS for MacOS)
138fc724630SAlan Wright  *	Samba
139da6c28aaSamw  */
140da6c28aaSamw int
smbnative_lm_value(const char * native_lm)141fc724630SAlan Wright smbnative_lm_value(const char *native_lm)
142da6c28aaSamw {
143fc724630SAlan Wright 	static smb_native_t lm_table[] = {
144da6c28aaSamw 		{ NATIVE_LM_NT,		"NT LAN Manager 4.0"		},
145da6c28aaSamw 		{ NATIVE_LM_NT,		"Windows NT"			},
146da6c28aaSamw 		{ NATIVE_LM_NT,		"Windows 4.0"			},
147da6c28aaSamw 		{ NATIVE_LM_NT,		"DAVE"				}
148da6c28aaSamw 	};
149da6c28aaSamw 
150da6c28aaSamw 	int i;
151da6c28aaSamw 	int len;
152fc724630SAlan Wright 	const char *name;
153da6c28aaSamw 
154fc724630SAlan Wright 	/*
155fc724630SAlan Wright 	 * Windows Vista sends an empty native LM string.
156fc724630SAlan Wright 	 */
157fc724630SAlan Wright 	if (native_lm == NULL || *native_lm == '\0')
15855bf511dSas 		return (NATIVE_LM_WIN2000);
15955bf511dSas 
160da6c28aaSamw 	for (i = 0; i < sizeof (lm_table)/sizeof (lm_table[0]); ++i) {
161fc724630SAlan Wright 		name = lm_table[i].sn_name;
162fc724630SAlan Wright 		len = strlen(name);
163da6c28aaSamw 
164bbf6f00cSJordan Brown 		if ((smb_strcasecmp(name, native_lm, len) == 0) ||
165bbf6f00cSJordan Brown 		    (smb_strcasecmp(&name[1], native_lm, len - 1) == 0)) {
166fc724630SAlan Wright 			return (lm_table[i].sn_value);
167da6c28aaSamw 		}
168da6c28aaSamw 	}
169fc724630SAlan Wright 
170fc724630SAlan Wright 	return (NATIVE_LM_WIN2000);
171da6c28aaSamw }
172da6c28aaSamw 
173da6c28aaSamw /*
174da6c28aaSamw  * smbnative_pdc_value
175da6c28aaSamw  *
176fc724630SAlan Wright  * This function is called when libsmbrdr connects to a PDC.
177fc724630SAlan Wright  * The PDC type is derived from the Native LanMan string.
178fc724630SAlan Wright  * The PDC value will default to PDC_WIN2000.
179fc724630SAlan Wright  *
180fc724630SAlan Wright  * Example strings:
181fc724630SAlan Wright  *
182fc724630SAlan Wright  *	NT LAN Manager 4.0
183fc724630SAlan Wright  *	Windows 4.0, Windows NT, Windows NT 4.0
184fc724630SAlan Wright  *	Windows 2000 LAN Manager
185fc724630SAlan Wright  *	Windows 2000, Windows 2000 5.0, Windows 2000 5.1
186fc724630SAlan Wright  *	Windows 2002, Windows 2002 5.1
187fc724630SAlan Wright  *	Windows .NET, Windows .NET 5.2
188fc724630SAlan Wright  *	Samba
189fc724630SAlan Wright  *	DAVE
190da6c28aaSamw  */
191da6c28aaSamw int
smbnative_pdc_value(const char * native_lm)192fc724630SAlan Wright smbnative_pdc_value(const char *native_lm)
193da6c28aaSamw {
194fc724630SAlan Wright 	static smb_native_t pdc_table[] = {
195da6c28aaSamw 		{ PDC_WINNT,	"NT LAN Manager 4.0"		},
196da6c28aaSamw 		{ PDC_WINNT,	"Windows NT 4.0"		},
197da6c28aaSamw 		{ PDC_WINNT,	"Windows NT"			},
198da6c28aaSamw 		{ PDC_WINNT,	"Windows 4.0"			},
199fc724630SAlan Wright 		{ PDC_WINNT,	"DAVE"				},
200fc724630SAlan Wright 		{ PDC_SAMBA,	"Samba"				}
201da6c28aaSamw 	};
202da6c28aaSamw 
203da6c28aaSamw 	int i;
204da6c28aaSamw 	int len;
205fc724630SAlan Wright 	const char *name;
206da6c28aaSamw 
207fc724630SAlan Wright 	if (native_lm == NULL || *native_lm == '\0')
208fc724630SAlan Wright 		return (PDC_WIN2000);
209da6c28aaSamw 
210da6c28aaSamw 	for (i = 0; i < sizeof (pdc_table)/sizeof (pdc_table[0]); ++i) {
211fc724630SAlan Wright 		name = pdc_table[i].sn_name;
212fc724630SAlan Wright 		len = strlen(name);
213da6c28aaSamw 
214bbf6f00cSJordan Brown 		if ((smb_strcasecmp(name, native_lm, len) == 0) ||
215bbf6f00cSJordan Brown 		    (smb_strcasecmp(&name[1], native_lm, len - 1) == 0)) {
216fc724630SAlan Wright 			return (pdc_table[i].sn_value);
217da6c28aaSamw 		}
218da6c28aaSamw 	}
219da6c28aaSamw 
220fc724630SAlan Wright 	return (PDC_WIN2000);
221da6c28aaSamw }
2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns the native OS string for the given OS version.
2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If no match is found the string for Windows 2000 is returned.
2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States const char *
smbnative_os_str(smb_version_t * version)2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbnative_os_str(smb_version_t *version)
2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int i;
2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	static smb_native_t osstr_table[] = {
2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_NT,		"Windows NT"		},
2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_2000,	"Windows 2000"		},
2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_XP,		"Windows XP"		},
2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_2003,	"Windows Server 2003"	},
2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_VISTA,	""			},
2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_2008,	""			},
2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_2008R2,	""			}
2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	};
2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	for (i = 0; i < sizeof (osstr_table)/sizeof (osstr_table[0]); ++i) {
2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (version->sv_major == osstr_table[i].sn_value)
2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (osstr_table[i].sn_name);
2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (osstr_table[1].sn_name);
2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns the native Lanman string for the given OS version.
2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If no match is found the string for Windows 2000 is returned.
2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States const char *
smbnative_lm_str(smb_version_t * version)2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smbnative_lm_str(smb_version_t *version)
2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int i;
2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	static smb_native_t lmstr_table[] = {
2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_NT,		"NT LAN Manager 4.0"		},
2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_2000,	"Windows 2000 LAN Manager"	},
2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_XP,		"Windows 2002 5.1"		},
2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_2003,	"Windows Server 2003 5.2"	},
2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_VISTA,	""				},
2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_2008,	""				},
2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		{ SMB_MAJOR_2008R2,	""				}
2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	};
2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	for (i = 0; i < sizeof (lmstr_table)/sizeof (lmstr_table[0]); ++i) {
2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (version->sv_major == lmstr_table[i].sn_value)
2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (lmstr_table[i].sn_name);
2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (lmstr_table[1].sn_name);
2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
276