11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* $NetBSD: ns_samedomain.c,v 1.2 2004/05/20 20:35:05 christos Exp $ */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1995,1999 by Internet Software Consortium. 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef notdef 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char rcsid[] = "Id: ns_samedomain.c,v 1.1.2.2.4.2 2004/03/16 12:34:17 marka Exp"; 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__RCSID("$NetBSD: ns_samedomain.c,v 1.2 2004/05/20 20:35:05 christos Exp $"); 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h> 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "arpa_nameser.h" 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <errno.h> 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h> 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _LIBC 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * int 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ns_samedomain(a, b) 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Check whether a name belongs to a domain. 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Inputs: 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * a - the domain whose ancestory is being verified 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * b - the potential ancestor we're checking against 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return: 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * boolean - is a at or below b? 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Notes: 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Trailing dots are first removed from name and domain. 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Always compare complete subdomains, not only whether the 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * domain name is the trailing string of the given name. 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "host.foobar.top" lies in "foobar.top" and in "top" and in "" 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * but NOT in "bar.top" 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_samedomain(const char *a, const char *b) { 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size_t la, lb; 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int diff, i, escaped; 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp; 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project la = strlen(a); 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project lb = strlen(b); 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Ignore a trailing label separator (i.e. an unescaped dot) in 'a'. */ 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (la != 0U && a[la - 1] == '.') { 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Note this loop doesn't get executed if la==1. */ 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = la - 2; i >= 0; i--) 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (a[i] == '\\') { 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (escaped) 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 1; 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!escaped) 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project la--; 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Ignore a trailing label separator (i.e. an unescaped dot) in 'b'. */ 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (lb != 0U && b[lb - 1] == '.') { 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* note this loop doesn't get executed if lb==1 */ 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = lb - 2; i >= 0; i--) 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (b[i] == '\\') { 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (escaped) 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 1; 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!escaped) 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project lb--; 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* lb == 0 means 'b' is the root domain, so 'a' must be in 'b'. */ 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (lb == 0U) 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (1); 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 'b' longer than 'a' means 'a' can't be in 'b'. */ 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (lb > la) 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 'a' and 'b' being equal at this point indicates sameness. */ 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (lb == la) 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (strncasecmp(a, b, lb) == 0); 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Ok, we know la > lb. */ 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project diff = la - lb; 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * If 'a' is only 1 character longer than 'b', then it can't be 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * a subdomain of 'b' (because of the need for the '.' label 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * separator). 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (diff < 2) 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * If the character before the last 'lb' characters of 'b' 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * isn't '.', then it can't be a match (this lets us avoid 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * having "foobar.com" match "bar.com"). 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (a[diff - 1] != '.') 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * We're not sure about that '.', however. It could be escaped 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * and thus not a really a label separator. 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = diff - 2; i >= 0; i--) 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (a[i] == '\\') { 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (escaped) 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 1; 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (escaped) 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Now compare aligned trailing substring. */ 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = a + diff; 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (strncasecmp(cp, b, lb) == 0); 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * int 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ns_subdomain(a, b) 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * is "a" a subdomain of "b"? 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_subdomain(const char *a, const char *b) { 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (ns_samename(a, b) != 1 && ns_samedomain(a, b)); 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * int 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ns_makecanon(src, dst, dstsize) 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * make a canonical copy of domain name "src" 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notes: 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * foo -> foo. 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * foo. -> foo. 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * foo.. -> foo. 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * foo\. -> foo\.. 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * foo\\. -> foo\\. 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_makecanon(const char *src, char *dst, size_t dstsize) { 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size_t n = strlen(src); 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (n + sizeof "." > dstsize) { /* Note: sizeof == 2 */ 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = EMSGSIZE; 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcpy(dst, src); 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (n >= 1U && dst[n - 1] == '.') /* Ends in "." */ 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (n >= 2U && dst[n - 2] == '\\' && /* Ends in "\." */ 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (n < 3U || dst[n - 3] != '\\')) /* But not "\\." */ 1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dst[--n] = '\0'; 1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dst[n++] = '.'; 1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dst[n] = '\0'; 1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * int 1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ns_samename(a, b) 1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * determine whether domain name "a" is the same as domain name "b" 1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * return: 1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * -1 on error 1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 0 if names differ 1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1 if names are the same 1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_samename(const char *a, const char *b) { 2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char ta[NS_MAXDNAME], tb[NS_MAXDNAME]; 2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_makecanon(a, ta, sizeof ta) < 0 || 2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_makecanon(b, tb, sizeof tb) < 0) 2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (strcasecmp(ta, tb) == 0) 2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (1); 2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 2101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 2111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 212