1/* 2 * Copyright (C) 2004, 2005, 2007, 2011, 2012 Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (C) 2000-2002 Internet Software Consortium. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 * PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18/* $Id$ */ 19 20/*! \file */ 21 22#include <config.h> 23 24#include <isc/result.h> 25#include <isc/strerror.h> 26#include <isc/util.h> 27 28#include "errno2result.h" 29 30/*% 31 * Convert a POSIX errno value into an isc_result_t. The 32 * list of supported errno values is not complete; new users 33 * of this function should add any expected errors that are 34 * not already there. 35 */ 36isc_result_t 37isc___errno2result(int posixerrno, const char *file, unsigned int line) { 38 char strbuf[ISC_STRERRORSIZE]; 39 40 switch (posixerrno) { 41 case ENOTDIR: 42 case ELOOP: 43 case EINVAL: /* XXX sometimes this is not for files */ 44 case ENAMETOOLONG: 45 case EBADF: 46 return (ISC_R_INVALIDFILE); 47 case ENOENT: 48 return (ISC_R_FILENOTFOUND); 49 case EACCES: 50 case EPERM: 51 return (ISC_R_NOPERM); 52 case EEXIST: 53 return (ISC_R_FILEEXISTS); 54 case EIO: 55 return (ISC_R_IOERROR); 56 case ENOMEM: 57 return (ISC_R_NOMEMORY); 58 case ENFILE: 59 case EMFILE: 60 return (ISC_R_TOOMANYOPENFILES); 61 case EPIPE: 62#ifdef ECONNRESET 63 case ECONNRESET: 64#endif 65#ifdef ECONNABORTED 66 case ECONNABORTED: 67#endif 68 return (ISC_R_CONNECTIONRESET); 69#ifdef ENOTCONN 70 case ENOTCONN: 71 return (ISC_R_NOTCONNECTED); 72#endif 73#ifdef ETIMEDOUT 74 case ETIMEDOUT: 75 return (ISC_R_TIMEDOUT); 76#endif 77#ifdef ENOBUFS 78 case ENOBUFS: 79 return (ISC_R_NORESOURCES); 80#endif 81#ifdef EAFNOSUPPORT 82 case EAFNOSUPPORT: 83 return (ISC_R_FAMILYNOSUPPORT); 84#endif 85#ifdef ENETDOWN 86 case ENETDOWN: 87 return (ISC_R_NETDOWN); 88#endif 89#ifdef EHOSTDOWN 90 case EHOSTDOWN: 91 return (ISC_R_HOSTDOWN); 92#endif 93#ifdef ENETUNREACH 94 case ENETUNREACH: 95 return (ISC_R_NETUNREACH); 96#endif 97#ifdef EHOSTUNREACH 98 case EHOSTUNREACH: 99 return (ISC_R_HOSTUNREACH); 100#endif 101#ifdef EADDRINUSE 102 case EADDRINUSE: 103 return (ISC_R_ADDRINUSE); 104#endif 105 case EADDRNOTAVAIL: 106 return (ISC_R_ADDRNOTAVAIL); 107 case ECONNREFUSED: 108 return (ISC_R_CONNREFUSED); 109 default: 110 isc__strerror(posixerrno, strbuf, sizeof(strbuf)); 111 UNEXPECTED_ERROR(file, line, "unable to convert errno " 112 "to isc_result: %d: %s", 113 posixerrno, strbuf); 114 /* 115 * XXXDCL would be nice if perhaps this function could 116 * return the system's error string, so the caller 117 * might have something more descriptive than "unexpected 118 * error" to log with. 119 */ 120 return (ISC_R_UNEXPECTED); 121 } 122} 123