ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

names.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.