Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygennames.c
Go to the documentation of this file.
00001 /* 00002 * DNS support 00003 * 00004 * Copyright (C) 2006 Matthew Kehrer 00005 * Copyright (C) 2006 Hans Leidekker 00006 * 00007 * This library is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * This library is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with this library; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 00020 */ 00021 00022 #include "precomp.h" 00023 00024 #define NDEBUG 00025 #include <debug.h> 00026 00027 /****************************************************************************** 00028 * DnsNameCompare_A [DNSAPI.@] 00029 * 00030 */ 00031 BOOL WINAPI DnsNameCompare_A( LPCSTR name1, LPCSTR name2 ) 00032 { 00033 BOOL ret; 00034 PWSTR name1W, name2W; 00035 00036 name1W = dns_strdup_aw( name1 ); 00037 name2W = dns_strdup_aw( name2 ); 00038 00039 ret = DnsNameCompare_W( name1W, name2W ); 00040 00041 HeapFree(GetProcessHeap(), 0, name1W ); 00042 HeapFree(GetProcessHeap(), 0, name2W ); 00043 00044 return ret; 00045 } 00046 00047 /****************************************************************************** 00048 * DnsNameCompare_W [DNSAPI.@] 00049 * 00050 */ 00051 BOOL WINAPI DnsNameCompare_W( PCWSTR name1, PCWSTR name2 ) 00052 { 00053 PCWSTR p, q; 00054 00055 if (!name1 && !name2) return TRUE; 00056 if (!name1 || !name2) return FALSE; 00057 00058 p = name1 + lstrlenW( name1 ) - 1; 00059 q = name2 + lstrlenW( name2 ) - 1; 00060 00061 while (*p == '.' && p >= name1) p--; 00062 while (*q == '.' && q >= name2) q--; 00063 00064 if (p - name1 != q - name2) return FALSE; 00065 00066 while (name1 <= p) 00067 { 00068 if (towupper( *name1 ) != towupper( *name2 )) 00069 return FALSE; 00070 00071 name1++; 00072 name2++; 00073 } 00074 return TRUE; 00075 } 00076 00077 /****************************************************************************** 00078 * DnsValidateName_A [DNSAPI.@] 00079 * 00080 */ 00081 DNS_STATUS WINAPI DnsValidateName_A( PCSTR name, DNS_NAME_FORMAT format ) 00082 { 00083 PWSTR nameW; 00084 DNS_STATUS ret; 00085 00086 nameW = dns_strdup_aw( name ); 00087 ret = DnsValidateName_W( nameW, format ); 00088 00089 HeapFree(GetProcessHeap(), 0, nameW ); 00090 return ret; 00091 } 00092 00093 /****************************************************************************** 00094 * DnsValidateName_UTF8 [DNSAPI.@] 00095 * 00096 */ 00097 DNS_STATUS WINAPI DnsValidateName_UTF8( PCSTR name, DNS_NAME_FORMAT format ) 00098 { 00099 PWSTR nameW; 00100 DNS_STATUS ret; 00101 00102 nameW = dns_strdup_uw( name ); 00103 ret = DnsValidateName_W( nameW, format ); 00104 00105 HeapFree(GetProcessHeap(), 0, nameW ); 00106 return ret; 00107 } 00108 00109 #define HAS_EXTENDED 0x0001 00110 #define HAS_NUMERIC 0x0002 00111 #define HAS_NON_NUMERIC 0x0004 00112 #define HAS_DOT 0x0008 00113 #define HAS_DOT_DOT 0x0010 00114 #define HAS_SPACE 0x0020 00115 #define HAS_INVALID 0x0040 00116 #define HAS_ASTERISK 0x0080 00117 #define HAS_UNDERSCORE 0x0100 00118 #define HAS_LONG_LABEL 0x0200 00119 00120 /****************************************************************************** 00121 * DnsValidateName_W [DNSAPI.@] 00122 * 00123 */ 00124 DNS_STATUS WINAPI DnsValidateName_W( PCWSTR name, DNS_NAME_FORMAT format ) 00125 { 00126 PCWSTR p; 00127 unsigned int i, j, state = 0; 00128 static const WCHAR invalid[] = { 00129 '{','|','}','~','[','\\',']','^','\'',':',';','<','=','>', 00130 '?','@','!','\"','#','$','%','^','`','(',')','+','/',',',0 }; 00131 00132 if (!name) return ERROR_INVALID_NAME; 00133 00134 for (p = name, i = 0, j = 0; *p; p++, i++, j++) 00135 { 00136 if (*p == '.') 00137 { 00138 j = 0; 00139 state |= HAS_DOT; 00140 if (p[1] == '.') state |= HAS_DOT_DOT; 00141 } 00142 else if (*p < '0' || *p > '9') state |= HAS_NON_NUMERIC; 00143 else state |= HAS_NUMERIC; 00144 00145 if (j > 62) state |= HAS_LONG_LABEL; 00146 00147 if (wcschr( invalid, *p )) state |= HAS_INVALID; 00148 else if ((unsigned)*p > 127) state |= HAS_EXTENDED; 00149 else if (*p == ' ') state |= HAS_SPACE; 00150 else if (*p == '_') state |= HAS_UNDERSCORE; 00151 else if (*p == '*') state |= HAS_ASTERISK; 00152 } 00153 00154 if (i == 0 || i > 255 || 00155 (state & HAS_LONG_LABEL) || 00156 (state & HAS_DOT_DOT) || 00157 (name[0] == '.' && name[1])) return ERROR_INVALID_NAME; 00158 00159 switch (format) 00160 { 00161 case DnsNameDomain: 00162 { 00163 if (!(state & HAS_NON_NUMERIC) && (state & HAS_NUMERIC)) 00164 return DNS_ERROR_NUMERIC_NAME; 00165 if ((state & HAS_EXTENDED) || (state & HAS_UNDERSCORE)) 00166 return DNS_ERROR_NON_RFC_NAME; 00167 if ((state & HAS_SPACE) || 00168 (state & HAS_INVALID) || 00169 (state & HAS_ASTERISK)) return DNS_ERROR_INVALID_NAME_CHAR; 00170 break; 00171 } 00172 case DnsNameDomainLabel: 00173 { 00174 if (state & HAS_DOT) return ERROR_INVALID_NAME; 00175 if ((state & HAS_EXTENDED) || (state & HAS_UNDERSCORE)) 00176 return DNS_ERROR_NON_RFC_NAME; 00177 if ((state & HAS_SPACE) || 00178 (state & HAS_INVALID) || 00179 (state & HAS_ASTERISK)) return DNS_ERROR_INVALID_NAME_CHAR; 00180 break; 00181 } 00182 case DnsNameHostnameFull: 00183 { 00184 if (!(state & HAS_NON_NUMERIC) && (state & HAS_NUMERIC)) 00185 return DNS_ERROR_NUMERIC_NAME; 00186 if ((state & HAS_EXTENDED) || (state & HAS_UNDERSCORE)) 00187 return DNS_ERROR_NON_RFC_NAME; 00188 if ((state & HAS_SPACE) || 00189 (state & HAS_INVALID) || 00190 (state & HAS_ASTERISK)) return DNS_ERROR_INVALID_NAME_CHAR; 00191 break; 00192 } 00193 case DnsNameHostnameLabel: 00194 { 00195 if (state & HAS_DOT) return ERROR_INVALID_NAME; 00196 if (!(state & HAS_NON_NUMERIC) && (state & HAS_NUMERIC)) 00197 return DNS_ERROR_NUMERIC_NAME; 00198 if ((state & HAS_EXTENDED) || (state & HAS_UNDERSCORE)) 00199 return DNS_ERROR_NON_RFC_NAME; 00200 if ((state & HAS_SPACE) || 00201 (state & HAS_INVALID) || 00202 (state & HAS_ASTERISK)) return DNS_ERROR_INVALID_NAME_CHAR; 00203 break; 00204 } 00205 case DnsNameWildcard: 00206 { 00207 if (!(state & HAS_NON_NUMERIC) && (state & HAS_NUMERIC)) 00208 return ERROR_INVALID_NAME; 00209 if (name[0] != '*') return ERROR_INVALID_NAME; 00210 if (name[1] && name[1] != '.') 00211 return DNS_ERROR_INVALID_NAME_CHAR; 00212 if ((state & HAS_EXTENDED) || 00213 (state & HAS_SPACE) || 00214 (state & HAS_INVALID)) return ERROR_INVALID_NAME; 00215 break; 00216 } 00217 case DnsNameSrvRecord: 00218 { 00219 if (!(state & HAS_NON_NUMERIC) && (state & HAS_NUMERIC)) 00220 return ERROR_INVALID_NAME; 00221 if (name[0] != '_') return ERROR_INVALID_NAME; 00222 if ((state & HAS_UNDERSCORE) && !name[1]) 00223 return DNS_ERROR_NON_RFC_NAME; 00224 if ((state & HAS_EXTENDED) || 00225 (state & HAS_SPACE) || 00226 (state & HAS_INVALID)) return ERROR_INVALID_NAME; 00227 break; 00228 } 00229 default: 00230 DPRINT1( "unknown format: %d\n", format ); 00231 break; 00232 } 00233 return ERROR_SUCCESS; 00234 } Generated on Sun May 27 2012 04:23:30 for ReactOS by
1.7.6.1
|