diff options
Diffstat (limited to 'compat/error.c')
-rw-r--r-- | compat/error.c | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/compat/error.c b/compat/error.c new file mode 100644 index 0000000..53d1727 --- /dev/null +++ b/compat/error.c @@ -0,0 +1,210 @@ +/*--------------------------------------------------------------- + * Copyright (c) 1999,2000,2001,2002,2003 + * The Board of Trustees of the University of Illinois + * All Rights Reserved. + *--------------------------------------------------------------- + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software (Iperf) and associated + * documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * + * Redistributions of source code must retain the above + * copyright notice, this list of conditions and + * the following disclaimers. + * + * + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimers in the documentation and/or other materials + * provided with the distribution. + * + * + * Neither the names of the University of Illinois, NCSA, + * nor the names of its contributors may be used to endorse + * or promote products derived from this Software without + * specific prior written permission. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * ________________________________________________________________ + * National Laboratory for Applied Network Research + * National Center for Supercomputing Applications + * University of Illinois at Urbana-Champaign + * http://www.ncsa.uiuc.edu + * ________________________________________________________________ + * + * error.c + * by Mark Gates <mgates@nlanr.net> + * ------------------------------------------------------------------- + * error handlers + * ------------------------------------------------------------------- */ + +#include "headers.h" +#include "util.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef WIN32 + +/* ------------------------------------------------------------------- + * Implement a simple Win32 strerror function for our purposes. + * These error values weren't handled by FormatMessage; + * any particular reason why not?? + * ------------------------------------------------------------------- */ + +struct mesg { + DWORD err; + const char* str; +}; + +const struct mesg error_mesgs[] = +{ + { WSAEACCES, "Permission denied"}, + { WSAEADDRINUSE, "Address already in use"}, + { WSAEADDRNOTAVAIL, "Cannot assign requested address"}, + { WSAEAFNOSUPPORT, "Address family not supported by protocol family"}, + { WSAEALREADY, "Operation already in progress"}, + { WSAECONNABORTED, "Software caused connection abort"}, + { WSAECONNREFUSED, "Connection refused"}, + { WSAECONNRESET, "Connection reset by peer"}, + { WSAEDESTADDRREQ, "Destination address required"}, + { WSAEFAULT, "Bad address"}, + { WSAEHOSTDOWN, "Host is down"}, + { WSAEHOSTUNREACH, "No route to host"}, + { WSAEINPROGRESS, "Operation now in progress"}, + { WSAEINTR, "Interrupted function call."}, + { WSAEINVAL, "Invalid argument."}, + { WSAEISCONN, "Socket is already connected."}, + { WSAEMFILE, "Too many open files."}, + { WSAEMSGSIZE, "Message too long"}, + { WSAENETDOWN, "Network is down"}, + { WSAENETRESET, "Network dropped connection on reset"}, + { WSAENETUNREACH, "Network is unreachable"}, + { WSAENOBUFS, "No buffer space available."}, + { WSAENOPROTOOPT, "Bad protocol option."}, + { WSAENOTCONN, "Socket is not connected"}, + { WSAENOTSOCK, "Socket operation on non-socket."}, + { WSAEOPNOTSUPP, "Operation not supported"}, + { WSAEPFNOSUPPORT, "Protocol family not supported"}, + { WSAEPROCLIM, "Too many processes."}, + { WSAEPROTONOSUPPORT, "Protocol not supported"}, + { WSAEPROTOTYPE, "Protocol wrong type for socket"}, + { WSAESHUTDOWN, "Cannot send after socket shutdown"}, + { WSAESOCKTNOSUPPORT, "Socket type not supported."}, + { WSAETIMEDOUT, "Connection timed out."}, + { WSATYPE_NOT_FOUND, "Class type not found."}, + { WSAEWOULDBLOCK, "Resource temporarily unavailable"}, + { WSAHOST_NOT_FOUND, "Host not found."}, + { WSA_INVALID_HANDLE, "Specified event object handle is invalid."}, + { WSA_INVALID_PARAMETER, "One or more parameters are invalid."}, + { WSA_IO_INCOMPLETE, "Overlapped I/O event object not in signaled state."}, + { WSA_IO_PENDING, "Overlapped operations will complete later."}, + { WSA_NOT_ENOUGH_MEMORY, "Insufficient memory available."}, + { WSANOTINITIALISED, "Successful WSAStartup not yet performed."}, + { WSANO_DATA, "Valid name, no data record of requested type."}, + { WSANO_RECOVERY, "This is a non-recoverable error."}, + { WSASYSCALLFAILURE, "System call failure."}, + { WSASYSNOTREADY, "Network subsystem is unavailable."}, + { WSATRY_AGAIN, "Non-authoritative host not found."}, + { WSAVERNOTSUPPORTED, "WINSOCK.DLL version out of range."}, + { WSAEDISCON, "Graceful shutdown in progress."}, + { WSA_OPERATION_ABORTED, "Overlapped operation aborted."}, + { 0, "No error."} + + /* These appeared in the documentation, but didn't compile. + * { WSAINVALIDPROCTABLE, "Invalid procedure table from service provider." }, + * { WSAINVALIDPROVIDER, "Invalid service provider version number." }, + * { WSAPROVIDERFAILEDINIT, "Unable to initialize a service provider." }, + */ + +}; /* end error_mesgs[] */ + +const char* winsock_strerror( DWORD inErrno ); + +/* ------------------------------------------------------------------- + * winsock_strerror + * + * returns a string representing the error code. The error messages + * were taken from Microsoft's online developer library. + * ------------------------------------------------------------------- */ + +const char* winsock_strerror( DWORD inErrno ) { + const char* str = "Unknown error"; + int i; + for ( i = 0; i < sizeof(error_mesgs); i++ ) { + if ( error_mesgs[i].err == inErrno ) { + str = error_mesgs[i].str; + break; + } + } + + return str; +} /* end winsock_strerror */ + +#endif /* WIN32 */ + +/* ------------------------------------------------------------------- + * warn + * + * Prints message and return + * ------------------------------------------------------------------- */ + +void warn( const char *inMessage, const char *inFile, int inLine ) { + fflush( 0 ); + +#ifdef NDEBUG + fprintf( stderr, "%s failed\n", inMessage ); +#else + + /* while debugging output file/line number also */ + fprintf( stderr, "%s failed (%s:%d)\n", inMessage, inFile, inLine ); +#endif +} /* end warn */ + +/* ------------------------------------------------------------------- + * warn_errno + * + * Prints message and errno message, and return. + * ------------------------------------------------------------------- */ + +void warn_errno( const char *inMessage, const char *inFile, int inLine ) { + int my_err; + const char* my_str; + + /* get platform's errno and error message */ +#ifdef WIN32 + my_err = WSAGetLastError(); + my_str = winsock_strerror( my_err ); +#else + my_err = errno; + my_str = strerror( my_err ); +#endif + + fflush( 0 ); + +#ifdef NDEBUG + fprintf( stderr, "%s failed: %s\n", inMessage, my_str ); +#else + + /* while debugging output file/line number and errno value also */ + fprintf( stderr, "%s failed (%s:%d): %s (%d)\n", + inMessage, inFile, inLine, my_str, my_err ); +#endif +} /* end warn_errno */ + +#ifdef __cplusplus +} /* end extern "C" */ +#endif |