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