11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* $NetBSD: herror.c,v 1.4 2004/05/23 05:09:52 christos Exp $ */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1987, 1993 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * The Regents of the University of California. All rights reserved. 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * documentation and/or other materials provided with the distribution. 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3. All advertising materials mentioning features or use of this software 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * must display the following acknowledgement: 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This product includes software developed by the University of 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * California, Berkeley and its contributors. 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 4. Neither the name of the University nor the names of its contributors 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * may be used to endorse or promote products derived from this software 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * without specific prior written permission. 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Portions Copyright (c) 1996-1999 by Internet Software Consortium. 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies. 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if defined(LIBC_SCCS) && !defined(lint) 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef notdef 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char sccsid[] = "@(#)herror.c 8.1 (Berkeley) 6/4/93"; 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char rcsid[] = "Id: herror.c,v 1.2.206.1 2004/03/09 08:33:54 marka Exp"; 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__RCSID("$NetBSD: herror.c,v 1.4 2004/05/23 05:09:52 christos Exp $"); 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* LIBC_SCCS and not lint */ 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h> 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/param.h> 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/uio.h> 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netinet/in.h> 68569fb9887d00104509df79fa77d92e3cf9afe7dbCalin Juravle#include <arpa/nameser.h> 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netdb.h> 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ANDROID_CHANGES 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "resolv_private.h" 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <resolv.h> 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h> 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <unistd.h> 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef DE_CONST 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define DE_CONST(c,v) v = ((c) ? \ 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project strchr((const void *)(c), *(const char *)(const void *)(c)) : NULL) 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * const h_errlist[] = { 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "Resolver Error 0 (no error)", 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "Unknown host", /* 1 HOST_NOT_FOUND */ 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "Host name lookup failure", /* 2 TRY_AGAIN */ 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "Unknown server error", /* 3 NO_RECOVERY */ 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project "No address associated with name", /* 4 NO_ADDRESS */ 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst int h_nerr = { sizeof h_errlist / sizeof h_errlist[0] }; 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * herror -- 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * print the error indicated by the h_errno value. 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectvoid 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectherror(const char *s) { 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project struct iovec iov[4], *v = iov; 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char *t; 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (s != NULL && *s != '\0') { 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DE_CONST(s, t); 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project v->iov_base = t; 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project v->iov_len = strlen(t); 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project v++; 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DE_CONST(": ", t); 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project v->iov_base = t; 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project v->iov_len = 2; 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project v++; 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DE_CONST(hstrerror(h_errno), t); 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project v->iov_base = t; 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project v->iov_len = strlen(v->iov_base); 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project v++; 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project DE_CONST("\n", t); 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project v->iov_base = t; 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project v->iov_len = 1; 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project writev(STDERR_FILENO, iov, (v - iov) + 1); 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * hstrerror -- 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * return the string associated with a given "host" errno value. 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst char * 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projecthstrerror(int err) { 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (err < 0) 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("Resolver internal error"); 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else if (err < h_nerr) 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (h_errlist[err]); 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return ("Unknown resolver error"); 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 134