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*7206bf49SGordon Ross *
25*7206bf49SGordon 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*7206bf49SGordon 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
10055bf511dSas200622 /*
10155bf511dSas200622 * Windows Vista sends an empty native OS string.
10255bf511dSas200622 */
103fc724630SAlan Wright if (*native_os == '\0')
10455bf511dSas200622 return (NATIVE_OS_WIN2000);
10555bf511dSas200622
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
15455bf511dSas200622 /*
15555bf511dSas200622 * Windows Vista sends an empty native LM string.
15655bf511dSas200622 */
157fc724630SAlan Wright if (native_lm == NULL || *native_lm == '\0')
15855bf511dSas200622 return (NATIVE_LM_WIN2000);
15955bf511dSas200622
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.
179da6c28aaSamw *
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