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 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 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 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 * 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 * 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