]> git.sesse.net Git - vlc/commitdiff
win32: implement vlc_strerror and vlc_strerror_c
authorRémi Denis-Courmont <remi@remlab.net>
Sat, 28 Dec 2013 16:33:59 +0000 (18:33 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Sun, 29 Dec 2013 13:36:02 +0000 (15:36 +0200)
src/Makefile.am
src/win32/error.c [new file with mode: 0644]
src/win32/winsock.c

index 15aec52935a331a9fe6659cc5e1c30440f90a028..e5abc934975b591282225185f6d667cf9de565f7 100644 (file)
@@ -284,6 +284,7 @@ SOURCES_libvlc_linux = \
 
 SOURCES_libvlc_win32 = \
        win32/dirs.c \
+       win32/error.c \
        win32/filesystem.c \
        win32/netconf.c \
        win32/plugin.c \
diff --git a/src/win32/error.c b/src/win32/error.c
new file mode 100644 (file)
index 0000000..dd14dfa
--- /dev/null
@@ -0,0 +1,153 @@
+/*****************************************************************************
+ * error.c: DOS and Winsock error messages formatting
+ *****************************************************************************
+ * Copyright © 2006-2013 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <errno.h>
+#include <winerror.h>
+
+#include <vlc_common.h>
+
+#ifndef WSA_QOS_EUNKNOWNPSOBJ
+# define WSA_QOS_EUNKNOWNPSOBJ 11024L
+#endif
+
+typedef struct
+{
+    int code;
+    const char *msg;
+} wsaerrmsg_t;
+
+static const wsaerrmsg_t wsaerrmsg[] =
+{
+    { WSAEINTR, "Interrupted function call" },
+    { WSAEBADF, "File handle is not valid" },
+    { WSAEACCES, "Access denied" },
+    { WSAEFAULT, "Invalid memory address" },
+    { WSAEINVAL, "Invalid argument" },
+    { WSAEMFILE, "Too many open sockets" },
+    { WSAEWOULDBLOCK, "Resource temporarily unavailable" },
+    { WSAEINPROGRESS, "Operation now in progress" },
+    { WSAEALREADY, "Operation already in progress" },
+    { WSAENOTSOCK, "Non-socket handle specified" },
+    { WSAEDESTADDRREQ, "Missing destination address" },
+    { WSAEMSGSIZE, "Message too long" },
+    { WSAEPROTOTYPE, "Protocol wrong type for socket", },
+    { WSAENOPROTOOPT, "Option not supported by protocol" },
+    { WSAEPROTONOSUPPORT, "Protocol not supported" },
+    { WSAESOCKTNOSUPPORT, "Socket type not supported" },
+    { WSAEOPNOTSUPP, "Operation not supported" },
+    { WSAEPFNOSUPPORT, "Protocol family not supported" },
+    { WSAEAFNOSUPPORT, "Address family not supported by protocol family" },
+    { WSAEADDRINUSE, "Address already in use" },
+    { WSAEADDRNOTAVAIL, "Cannot assign requested address" },
+    { WSAENETDOWN, "Network is down" },
+    { WSAENETUNREACH, "Network unreachable" },
+    { WSAENETRESET, "Network dropped connection on reset" },
+    { WSAECONNABORTED, "Software caused connection abort" },
+    { WSAECONNRESET, "Connection reset by peer" },
+    { WSAENOBUFS, "No buffer space available (not enough memory)" },
+    { WSAEISCONN, "Socket is already connected" },
+    { WSAENOTCONN, "Socket is not connected" },
+    { WSAESHUTDOWN, "Cannot send after socket shutdown" },
+    { WSAETOOMANYREFS, "Too many references" },
+    { WSAETIMEDOUT, "Connection timed out" },
+    { WSAECONNREFUSED, "Connection refused by peer" },
+    { WSAELOOP, "Cannot translate name" },
+    { WSAENAMETOOLONG, "Name too long" },
+    { WSAEHOSTDOWN, "Remote host is down" },
+    { WSAEHOSTUNREACH, "No route to host (unreachable)" },
+    { WSAENOTEMPTY, "Directory not empty" },
+    { WSAEPROCLIM, "Too many processes" },
+    { WSAEUSERS, "User quota exceeded" },
+    { WSAEDQUOT, "Disk quota exceeded" },
+    { WSAESTALE, "Stale file handle reference" },
+    { WSAEREMOTE, "Item is remote", },
+    { WSASYSNOTREADY, "Network subsystem is unavailable (network stack not ready)" },
+    { WSAVERNOTSUPPORTED, "Winsock.dll version out of range (network stack version not supported" },
+    { WSANOTINITIALISED, "Network not initialized" },
+    { WSAEDISCON, "Graceful shutdown in progress" },
+    { WSAENOMORE, "No more results" },
+    { WSAECANCELLED, "Call has been cancelled" },
+    { WSAEINVALIDPROCTABLE, "Procedure call table is invalid" },
+    { WSAEINVALIDPROVIDER, "Service provider is invalid" },
+    { WSAEPROVIDERFAILEDINIT, "Service provider failed to initialize" },
+    { WSASYSCALLFAILURE, "System call failure" },
+    { WSASERVICE_NOT_FOUND, "Service not found" },
+    { WSATYPE_NOT_FOUND, "Class type not found" },
+    { WSA_E_NO_MORE, "No more results" },
+    { WSA_E_CANCELLED, "Call was cancelled" },
+    { WSAEREFUSED, "Database query was refused" },
+    { WSAHOST_NOT_FOUND, "Host not found" },
+    { WSATRY_AGAIN, "Nonauthoritative host not found (temporary hostname error)" },
+    { WSANO_RECOVERY, "Non-recoverable hostname error" },
+    { WSANO_DATA, "Valid name, no data record of requested type" },
+    { WSA_QOS_RECEIVERS, "QOS receivers" },
+    { WSA_QOS_SENDERS, "QOS senders" },
+    { WSA_QOS_NO_SENDERS, "No QOS senders" },
+    { WSA_QOS_NO_RECEIVERS, "QOS no receivers" },
+    { WSA_QOS_REQUEST_CONFIRMED, "QOS request confirmed" },
+    { WSA_QOS_ADMISSION_FAILURE, "QOS admission error" },
+    { WSA_QOS_POLICY_FAILURE, "QOS policy failure" },
+    { WSA_QOS_BAD_STYLE, "QOS bad style" },
+    { WSA_QOS_BAD_OBJECT, "QOS bad object" },
+    { WSA_QOS_TRAFFIC_CTRL_ERROR, "QOS traffic control error" },
+    { WSA_QOS_GENERIC_ERROR, "QOS generic error" },
+    { WSA_QOS_ESERVICETYPE, "QOS service type error" },
+    { WSA_QOS_EFLOWSPEC, "QOS flowspec error" },
+    { WSA_QOS_EPROVSPECBUF, "Invalid QOS provider buffer" },
+    { WSA_QOS_EFILTERSTYLE, "Invalid QOS filter style" },
+    { WSA_QOS_EFILTERTYPE, "Invalid QOS filter type" },
+    { WSA_QOS_EFILTERCOUNT, "Incorrect QOS filter count" },
+    { WSA_QOS_EOBJLENGTH, "Invalid QOS object length" },
+    { WSA_QOS_EFLOWCOUNT, "Incorrect QOS flow count" },
+    { WSA_QOS_EUNKNOWNPSOBJ, "Unrecognized QOS object" },
+    { WSA_QOS_EPOLICYOBJ, "Invalid QOS policy object" },
+    { WSA_QOS_EFLOWDESC, "Invalid QOS flow descriptor" },
+    { WSA_QOS_EPSFLOWSPEC, "Invalid QOS provider-specific flowspec" },
+    { WSA_QOS_EPSFILTERSPEC, "Invalid QOS provider-specific filterspec" },
+    { WSA_QOS_ESDMODEOBJ, "Invalid QOS shape discard mode object" },
+    { WSA_QOS_ESHAPERATEOBJ, "Invalid QOS shaping rate object" },
+    { WSA_QOS_RESERVED_PETYPE, "Reserved policy QOS element type" },
+    { 0, NULL }
+    /* Winsock2 error codes are missing, they "never" occur */
+};
+
+const char *vlc_strerror_c(int errnum)
+{
+    /* C run-time errors */
+    if ((unsigned)errnum < (unsigned)_sys_nerr)
+        return _sys_errlist[errnum];
+
+    /* Windows socket errors */
+    for (const wsaerrmsg_t *e = wsaerrmsg; e->msg != NULL; e++)
+        if (e->code == errnum)
+            return e->msg;
+
+    return "Unknown error";
+}
+
+const char *vlc_strerror(int errnum)
+{
+    return /*vlc_gettext*/(vlc_strerror_c(errnum));
+}
index ea04f177c5333d4c3fa7ee73a14636e5b2a7543d..ee24a201131f30e4b85a4020a51de00ba31b69dc 100644 (file)
 #include <errno.h>
 #include <vlc_network.h>
 
-#ifndef WSA_QOS_EUNKNOWNPSOBJ
-# define WSA_QOS_EUNKNOWNPSOBJ 11024L
-#endif
-
-typedef struct
-{
-    int code;
-    const char *msg;
-} wsaerrmsg_t;
-
-static const wsaerrmsg_t wsaerrmsg[] =
-{
-    { WSA_INVALID_HANDLE, "Specified event object handle is invalid" },
-    { WSA_NOT_ENOUGH_MEMORY, "Insufficient memory available" },
-    { WSA_INVALID_PARAMETER, "One or more parameters are invalid" },
-    { WSA_OPERATION_ABORTED, "Overlapped operation aborted" },
-    { WSA_IO_INCOMPLETE, "Overlapped I/O event object not in signaled state" },
-    { WSA_IO_PENDING, "Overlapped operations will complete later" },
-    { WSAEINTR, "Interrupted function call" },
-    { WSAEBADF, "File handle is not valid" },
-    { WSAEACCES, "Access denied" },
-    { WSAEFAULT, "Invalid memory address" },
-    { WSAEINVAL, "Invalid argument" },
-    { WSAEMFILE, "Too many open sockets" },
-    { WSAEWOULDBLOCK, "Resource temporarily unavailable" },
-    { WSAEINPROGRESS, "Operation now in progress" },
-    { WSAEALREADY, "Operation already in progress" },
-    { WSAENOTSOCK, "Non-socket handle specified" },
-    { WSAEDESTADDRREQ, "Missing destination address" },
-    { WSAEMSGSIZE, "Message too long" },
-    { WSAEPROTOTYPE, "Protocol wrong type for socket", },
-    { WSAENOPROTOOPT, "Option not supported by protocol" },
-    { WSAEPROTONOSUPPORT, "Protocol not supported" },
-    { WSAESOCKTNOSUPPORT, "Socket type not supported" },
-    { WSAEOPNOTSUPP, "Operation not supported" },
-    { WSAEPFNOSUPPORT, "Protocol family not supported" },
-    { WSAEAFNOSUPPORT, "Address family not supported by protocol family" },
-    { WSAEADDRINUSE, "Address already in use" },
-    { WSAEADDRNOTAVAIL, "Cannot assign requested address" },
-    { WSAENETDOWN, "Network is down" },
-    { WSAENETUNREACH, "Network unreachable" },
-    { WSAENETRESET, "Network dropped connection on reset" },
-    { WSAECONNABORTED, "Software caused connection abort" },
-    { WSAECONNRESET, "Connection reset by peer" },
-    { WSAENOBUFS, "No buffer space available (not enough memory)" },
-    { WSAEISCONN, "Socket is already connected" },
-    { WSAENOTCONN, "Socket is not connected" },
-    { WSAESHUTDOWN, "Cannot send after socket shutdown" },
-    { WSAETOOMANYREFS, "Too many references" },
-    { WSAETIMEDOUT, "Connection timed out" },
-    { WSAECONNREFUSED, "Connection refused by peer" },
-    { WSAELOOP, "Cannot translate name" },
-    { WSAENAMETOOLONG, "Name too long" },
-    { WSAEHOSTDOWN, "Remote host is down" },
-    { WSAEHOSTUNREACH, "No route to host (unreachable)" },
-    { WSAENOTEMPTY, "Directory not empty" },
-    { WSAEPROCLIM, "Too many processes" },
-    { WSAEUSERS, "User quota exceeded" },
-    { WSAEDQUOT, "Disk quota exceeded" },
-    { WSAESTALE, "Stale file handle reference" },
-    { WSAEREMOTE, "Item is remote", },
-    { WSASYSNOTREADY, "Network subsystem is unavailable (network stack not ready)" },
-    { WSAVERNOTSUPPORTED, "Winsock.dll version out of range (network stack version not supported" },
-    { WSANOTINITIALISED, "Network not initialized" },
-    { WSAEDISCON, "Graceful shutdown in progress" },
-    { WSAENOMORE, "No more results" },
-    { WSAECANCELLED, "Call has been cancelled" },
-    { WSAEINVALIDPROCTABLE, "Procedure call table is invalid" },
-    { WSAEINVALIDPROVIDER, "Service provider is invalid" },
-    { WSAEPROVIDERFAILEDINIT, "Service provider failed to initialize" },
-    { WSASYSCALLFAILURE, "System call failure" },
-    { WSASERVICE_NOT_FOUND, "Service not found" },
-    { WSATYPE_NOT_FOUND, "Class type not found" },
-    { WSA_E_NO_MORE, "No more results" },
-    { WSA_E_CANCELLED, "Call was cancelled" },
-    { WSAEREFUSED, "Database query was refused" },
-    { WSAHOST_NOT_FOUND, "Host not found" },
-    { WSATRY_AGAIN, "Nonauthoritative host not found (temporary hostname error)" },
-    { WSANO_RECOVERY, "Non-recoverable hostname error" },
-    { WSANO_DATA, "Valid name, no data record of requested type" },
-    { WSA_QOS_RECEIVERS, "QOS receivers" },
-    { WSA_QOS_SENDERS, "QOS senders" },
-    { WSA_QOS_NO_SENDERS, "No QOS senders" },
-    { WSA_QOS_NO_RECEIVERS, "QOS no receivers" },
-    { WSA_QOS_REQUEST_CONFIRMED, "QOS request confirmed" },
-    { WSA_QOS_ADMISSION_FAILURE, "QOS admission error" },
-    { WSA_QOS_POLICY_FAILURE, "QOS policy failure" },
-    { WSA_QOS_BAD_STYLE, "QOS bad style" },
-    { WSA_QOS_BAD_OBJECT, "QOS bad object" },
-    { WSA_QOS_TRAFFIC_CTRL_ERROR, "QOS traffic control error" },
-    { WSA_QOS_GENERIC_ERROR, "QOS generic error" },
-    { WSA_QOS_ESERVICETYPE, "QOS service type error" },
-    { WSA_QOS_EFLOWSPEC, "QOS flowspec error" },
-    { WSA_QOS_EPROVSPECBUF, "Invalid QOS provider buffer" },
-    { WSA_QOS_EFILTERSTYLE, "Invalid QOS filter style" },
-    { WSA_QOS_EFILTERTYPE, "Invalid QOS filter type" },
-    { WSA_QOS_EFILTERCOUNT, "Incorrect QOS filter count" },
-    { WSA_QOS_EOBJLENGTH, "Invalid QOS object length" },
-    { WSA_QOS_EFLOWCOUNT, "Incorrect QOS flow count" },
-    { WSA_QOS_EUNKNOWNPSOBJ, "Unrecognized QOS object" },
-    { WSA_QOS_EPOLICYOBJ, "Invalid QOS policy object" },
-    { WSA_QOS_EFLOWDESC, "Invalid QOS flow descriptor" },
-    { WSA_QOS_EPSFLOWSPEC, "Invalid QOS provider-specific flowspec" },
-    { WSA_QOS_EPSFILTERSPEC, "Invalid QOS provider-specific filterspec" },
-    { WSA_QOS_ESDMODEOBJ, "Invalid QOS shape discard mode object" },
-    { WSA_QOS_ESHAPERATEOBJ, "Invalid QOS shaping rate object" },
-    { WSA_QOS_RESERVED_PETYPE, "Reserved policy QOS element type" },
-    { 0, NULL }
-    /* Winsock2 error codes are missing, they "never" occur */
-};
-
-
 const char *net_strerror( int value )
 {
     /* There doesn't seem to be any portable error message generation for
      * Winsock errors. Some old versions had s_error, but it appears to be
      * gone, and is not documented.
      */
-    for( const wsaerrmsg_t *e = wsaerrmsg; e->msg != NULL; e++ )
-        if( e->code == value )
-            return e->msg;
-
-    /* Remember to update src/misc/messages.c if you change this one */
-    return "Unknown network stack error";
+    return vlc_strerror(value);
 }
 
 #if 0