|
@@ -1111,6 +1111,79 @@ int tor_socket_errno(int sock)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+/* There does not seem to be a strerror equivalent for winsock errors.
|
|
|
+ * Naturally, we have to roll our own.
|
|
|
+ */
|
|
|
+#ifdef MS_WINDOWS
|
|
|
+#define E(code, s) { code, (s " [" #code " ]") }
|
|
|
+struct { int code; char *msg; } windows_socket_errors = {
|
|
|
+ E(WSAEINTR, "Interrupted function call"),
|
|
|
+ E(WSAEACCES, "Permission denied"),
|
|
|
+ E(WSAEFAULT, "Bad address"),
|
|
|
+ E(WSAEINVAL, "Invalid argument"),
|
|
|
+ E(WSAEMFILE, "Too many open files"),
|
|
|
+ E(WSAEWOULDBLOCK, "Resource temporarily unavailable"),
|
|
|
+ E(WSAEINPROGRESS, "Operation now in progress"),
|
|
|
+ E(WSAEALREADY, "Operation already in progress"),
|
|
|
+ E(WSAENOTSOCK, "Socket operation on nonsocket"),
|
|
|
+ E(WSAEDESTADDRREQ, "Destination address required"),
|
|
|
+ E(WSAEMSGSIZE, "Message too long"),
|
|
|
+ E(WASEPROTOTYPE, "Protocol wrong for socket"),
|
|
|
+ E(WSAENOPROTOOPT, "Bad protocol option"),
|
|
|
+ E(WSAEPROTONOSUPPORT, "Protocol not supported"),
|
|
|
+ E(WSAESOCKTNOSUPPORT, "Socket type not supported"),
|
|
|
+ /* What's the difference between NOTSUPP and NOSUPPORT? :) */
|
|
|
+ E(WASEOPNOTSUPP, "Operation not supported"),
|
|
|
+ E(WSAEPFNOSUPPORT, "Protocol family not supported"),
|
|
|
+ E(WSAEAFNOSUPPORT, "Address family not supported by protocol family"),
|
|
|
+ E(WSAEADDRINUSE, "Address already in use"),
|
|
|
+ E(WSAEADDRNOTAVAIL, "Cannot assign requested address"),
|
|
|
+ E(WSAENETDOWN, "Network is down"),
|
|
|
+ E(WSAENETUNREACH, "Network is unreachable"),
|
|
|
+ E(WSAENETRESET, "Network dropped connection on reset")
|
|
|
+ E(WSAECONNABORTED, "Software caused connection abort"),
|
|
|
+ E(WSAECONNRESET, "Connection reset by peer"),
|
|
|
+ E(WSAENOBUFS, "No buffer space avaialable"),
|
|
|
+ E(WSAEISCONN, "Socket is already connected"),
|
|
|
+ E(WSAENOTCONN, "Socket is not connected"),
|
|
|
+ E(WSAESHUTDOWN, "Cannot send after socket shutdown"),
|
|
|
+ E(WSAETIMEDOUT, "Connection timed out"),
|
|
|
+ E(WSAECONNREFUSED, "Connection refused"),
|
|
|
+ E(WSAEHOSTDOWN, "Host is down"),
|
|
|
+ E(WSAEHOSTUNREACH, "No route to host"),
|
|
|
+ E(WSAEPROCLIM, "Too many processes"),
|
|
|
+ /* Yes, some of these start with WSA, not WSAE. No, I don't know why. */
|
|
|
+ E(WSASYSNOTREADY, "Network subsystem is unavailable"),
|
|
|
+ E(WSAVERNOTSUPPORTED, "Winsock.dll out of range"),
|
|
|
+ E(WSANOTINITIALISED, "Successful WSAStartup not yet performed"),
|
|
|
+ E(WSAEDISCONN, "Graceful shutdown no in progress"),
|
|
|
+ E(WSATYPE_NOT_FOUND, "Class type not found"),
|
|
|
+ E(WSAHOST_NOT_FOUND, "Host not found"),
|
|
|
+ E(WSATRY_AGAIN, "Nonauthoritative host not found"),
|
|
|
+ E(WSANO_RECOVERY, "This is a nonrecoverable error"),
|
|
|
+ E(WSANO_DATA, "Valid name, no data record of requested type)"),
|
|
|
+
|
|
|
+ /* There are some more error codes whose numeric values are marked
|
|
|
+ * 'OS dependent'. They start with WSA_, apparently for the same
|
|
|
+ * reason that practitioners of some craft traditions deliberately
|
|
|
+ * introduce imperfections into their baskets and rugs "to allow the
|
|
|
+ * evil spirits to escape." If we catch them, then our binaries
|
|
|
+ * might not report consistent results across versions of Windows.
|
|
|
+ * Thus, I'm going to let them all fall through.
|
|
|
+ */
|
|
|
+ { -1, NULL },
|
|
|
+};
|
|
|
+const char *tor_socket_strerror(int e)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ for (i=0; windows_socket_errors[i].code >= 0; ++i) {
|
|
|
+ if (e == windows_socket_errors[i].code)
|
|
|
+ return windows_socket_errors[i].msg;
|
|
|
+ }
|
|
|
+ return strerror(e);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
/*
|
|
|
* Filesystem operations.
|
|
|
*/
|
|
@@ -1476,7 +1549,7 @@ void write_pidfile(char *filename) {
|
|
|
FILE *pidfile;
|
|
|
|
|
|
if ((pidfile = fopen(filename, "w")) == NULL) {
|
|
|
- log_fn(LOG_WARN, "unable to open %s for writing: %s", filename,
|
|
|
+ log_fn(LOG_WARN, "Unable to open %s for writing: %s", filename,
|
|
|
strerror(errno));
|
|
|
} else {
|
|
|
fprintf(pidfile, "%d\n", (int)getpid());
|