1fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle/* $NetBSD: ns_samedomain.c,v 1.8 2012/11/22 20:22:31 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 23fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravlestatic const char rcsid[] = "Id: ns_samedomain.c,v 1.6 2005/04/27 04:56:40 sra Exp"; 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 25fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle__RCSID("$NetBSD: ns_samedomain.c,v 1.8 2012/11/22 20:22:31 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> 30569fb9887d00104509df79fa77d92e3cf9afe7dbCalin Juravle#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 34fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle#ifdef _LIBRESOLV 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Check whether a name belongs to a domain. 37fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle * 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Inputs: 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * a - the domain whose ancestory is being verified 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * b - the potential ancestor we're checking against 41fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle * 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Return: 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * boolean - is a at or below b? 44fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle * 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Notes: 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Trailing dots are first removed from name and domain. 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Always compare complete subdomains, not only whether the 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * domain name is the trailing string of the given name. 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "host.foobar.top" lies in "foobar.top" and in "top" and in "" 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * but NOT in "bar.top" 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_samedomain(const char *a, const char *b) { 56fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle size_t la, lb, i; 57fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle int diff, escaped; 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *cp; 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project la = strlen(a); 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project lb = strlen(b); 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Ignore a trailing label separator (i.e. an unescaped dot) in 'a'. */ 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (la != 0U && a[la - 1] == '.') { 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Note this loop doesn't get executed if la==1. */ 67fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle for (i = la - 1; i > 0; i--) 68fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle if (a[i - 1] == '\\') { 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (escaped) 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 1; 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!escaped) 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project la--; 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Ignore a trailing label separator (i.e. an unescaped dot) in 'b'. */ 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (lb != 0U && b[lb - 1] == '.') { 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* note this loop doesn't get executed if lb==1 */ 83fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle for (i = lb - 1; i > 0; i--) 84fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle if (b[i - 1] == '\\') { 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (escaped) 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 1; 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (!escaped) 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project lb--; 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* lb == 0 means 'b' is the root domain, so 'a' must be in 'b'. */ 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (lb == 0U) 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (1); 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 'b' longer than 'a' means 'a' can't be in 'b'. */ 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (lb > la) 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 'a' and 'b' being equal at this point indicates sameness. */ 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (lb == la) 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (strncasecmp(a, b, lb) == 0); 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Ok, we know la > lb. */ 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 109fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle diff = (int)(la - lb); 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * If 'a' is only 1 character longer than 'b', then it can't be 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * a subdomain of 'b' (because of the need for the '.' label 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * separator). 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (diff < 2) 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * If the character before the last 'lb' characters of 'b' 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * isn't '.', then it can't be a match (this lets us avoid 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * having "foobar.com" match "bar.com"). 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (a[diff - 1] != '.') 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * We're not sure about that '.', however. It could be escaped 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * and thus not a really a label separator. 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 132fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle for (i = diff - 1; i > 0; i--) 133fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle if (a[i - 1] == '\\') { 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (escaped) 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 0; 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project escaped = 1; 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (escaped) 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Now compare aligned trailing substring. */ 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project cp = a + diff; 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (strncasecmp(cp, b, lb) == 0); 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * is "a" a subdomain of "b"? 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_subdomain(const char *a, const char *b) { 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (ns_samename(a, b) != 1 && ns_samedomain(a, b)); 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 157fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle#ifdef _LIBC 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * make a canonical copy of domain name "src" 160fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle * 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notes: 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * foo -> foo. 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 */ 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_makecanon(const char *src, char *dst, size_t dstsize) { 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project size_t n = strlen(src); 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (n + sizeof "." > dstsize) { /* Note: sizeof == 2 */ 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = EMSGSIZE; 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strcpy(dst, src); 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (n >= 1U && dst[n - 1] == '.') /* Ends in "." */ 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (n >= 2U && dst[n - 2] == '\\' && /* Ends in "\." */ 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project (n < 3U || dst[n - 3] != '\\')) /* But not "\\." */ 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project break; 1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dst[--n] = '\0'; 1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dst[n++] = '.'; 1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project dst[n] = '\0'; 1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * determine whether domain name "a" is the same as domain name "b" 191fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle * 1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * return: 1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * -1 on error 1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 0 if names differ 1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1 if names are the same 1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_samename(const char *a, const char *b) { 2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char ta[NS_MAXDNAME], tb[NS_MAXDNAME]; 2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ns_makecanon(a, ta, sizeof ta) < 0 || 2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ns_makecanon(b, tb, sizeof tb) < 0) 2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (strcasecmp(ta, tb) == 0) 2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (1); 2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else 2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 210fcb502e3ec032497bba7f8634fb214e0c05394d8Calin Juravle#endif 211