summaryrefslogtreecommitdiffstats
path: root/compat/error.c
diff options
context:
space:
mode:
Diffstat (limited to 'compat/error.c')
-rw-r--r--compat/error.c210
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