From c7662795f519d2b6797e4b1ac7fa4a22afa26310 Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Thu, 27 Jul 2006 23:18:35 +0000 Subject: * merge - This is my current patch queue. I think that all of these are safe to apply. This is just under half of the pending changes in chris/general (the easy half). --- lib/server/Daemon.cpp | 50 ++++++++++++++++++++++++++++++++++-------- lib/server/ServerStream.h | 18 ++++++++++++++- lib/server/SocketStream.cpp | 47 ++++++++++++++++++++++++++++----------- lib/server/SocketStream.h | 2 ++ lib/server/SocketStreamTLS.cpp | 8 +++++-- lib/server/makeprotocol.pl.in | 18 ++++++++++++--- 6 files changed, 115 insertions(+), 28 deletions(-) (limited to 'lib/server') diff --git a/lib/server/Daemon.cpp b/lib/server/Daemon.cpp index 2f902473..2131bdcb 100644 --- a/lib/server/Daemon.cpp +++ b/lib/server/Daemon.cpp @@ -23,6 +23,10 @@ #include #endif +#ifdef WIN32 + #include +#endif + #include "Daemon.h" #include "Configuration.h" #include "ServerException.h" @@ -142,7 +146,7 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) { fprintf(stderr, "%s: failed to start: " "failed to open configuration file: " - "%s", DaemonName(), + "%s\n", DaemonName(), mConfigFileName.c_str()); #ifdef WIN32 ::syslog(LOG_ERR, "%s: failed to start: " @@ -189,6 +193,7 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) { THROW_EXCEPTION(ServerException, DaemoniseFailed) } +#endif // !WIN32 // Server configuration const Configuration &serverConfig( @@ -197,7 +202,8 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) // Open PID file for writing pidFileName = serverConfig.GetKeyValue("PidFile"); FileHandleGuard<(O_WRONLY | O_CREAT | O_TRUNC), (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)> pidFile(pidFileName.c_str()); - + +#ifndef WIN32 // Handle changing to a different user if(serverConfig.KeyExists("User")) { @@ -267,20 +273,25 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) // open the log ::openlog(DaemonName(), LOG_PID, LOG_LOCAL6); + // Log the start message ::syslog(LOG_INFO, "Starting daemon (config: %s) (version " BOX_VERSION ")", mConfigFileName.c_str()); -#ifndef WIN32 // Write PID to file char pid[32]; + +#ifdef WIN32 + int pidsize = sprintf(pid, "%d", (int)GetCurrentProcessId()); +#else int pidsize = sprintf(pid, "%d", (int)getpid()); +#endif + if(::write(pidFile, pid, pidsize) != pidsize) { ::syslog(LOG_ERR, "can't write pid file"); THROW_EXCEPTION(ServerException, DaemoniseFailed) } -#endif // Set up memory leak reporting #ifdef BOX_MEMORY_LEAK_TESTING @@ -352,6 +363,22 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) #endif return 1; } + +#ifdef WIN32 + // Under win32 we must initialise the Winsock library + // before using sockets + + WSADATA info; + + if (WSAStartup(0x0101, &info) == SOCKET_ERROR) + { + // will not run without sockets + ::syslog(LOG_ERR, "Failed to initialise Windows Sockets"); + THROW_EXCEPTION(CommonException, Internal) + } +#endif + + int retcode = 0; // Main Daemon running try @@ -381,7 +408,8 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) mConfigFileName.c_str(), errors.c_str()); // And give up - return 1; + retcode = 1; + break; } // delete old configuration @@ -409,22 +437,26 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) ::syslog(LOG_ERR, "%s: terminating due to exception %s " "(%d/%d)", DaemonName(), e.what(), e.GetType(), e.GetSubType()); - return 1; + retcode = 1; } catch(std::exception &e) { ::syslog(LOG_ERR, "%s: terminating due to exception %s", DaemonName(), e.what()); - return 1; + retcode = 1; } catch(...) { ::syslog(LOG_ERR, "%s: terminating due to unknown exception", DaemonName()); - return 1; + retcode = 1; } + +#ifdef WIN32 + WSACleanup(); +#endif - return 0; + return retcode; } // -------------------------------------------------------------------------- diff --git a/lib/server/ServerStream.h b/lib/server/ServerStream.h index 8dafccae..745c3ccb 100644 --- a/lib/server/ServerStream.h +++ b/lib/server/ServerStream.h @@ -56,6 +56,10 @@ public: return "generic-stream-server"; } + #ifdef WIN32 + virtual void OnIdle() { } + #endif + virtual void Run() { // Set process title as appropraite @@ -215,6 +219,7 @@ public: if(connection.get()) { // Since this is a template parameter, the if() will be optimised out by the compiler + #ifndef WIN32 // no fork on Win32 if(ForkToHandleRequests) { pid_t pid = ::fork(); @@ -255,14 +260,20 @@ public: } else { + #endif // !WIN32 // Just handle in this connection SetProcessTitle("handling"); HandleConnection(*connection); SetProcessTitle("idle"); + #ifndef WIN32 } + #endif // !WIN32 } } - + + #ifdef WIN32 + OnIdle(); + #else // !WIN32 // Clean up child processes (if forking daemon) if(ForkToHandleRequests) { @@ -277,6 +288,7 @@ public: } } while(p > 0); } + #endif // !WIN32 } } catch(...) @@ -301,7 +313,11 @@ protected: // depends on the forking model in case someone changes it later. bool WillForkToHandleRequests() { + #ifdef WIN32 + return false; + #else return ForkToHandleRequests; + #endif // WIN32 } private: diff --git a/lib/server/SocketStream.cpp b/lib/server/SocketStream.cpp index aa3825bf..61d3846f 100644 --- a/lib/server/SocketStream.cpp +++ b/lib/server/SocketStream.cpp @@ -36,7 +36,7 @@ // // -------------------------------------------------------------------------- SocketStream::SocketStream() - : mSocketHandle(-1), + : mSocketHandle(INVALID_SOCKET_VALUE), mReadClosed(false), mWriteClosed(false), mBytesRead(0), @@ -85,7 +85,7 @@ SocketStream::SocketStream(const SocketStream &rToCopy) { THROW_EXCEPTION(ServerException, BadSocketHandle); } - if(mSocketHandle == -1) + if(mSocketHandle == INVALID_SOCKET_VALUE) { THROW_EXCEPTION(ServerException, DupError); } @@ -101,7 +101,7 @@ SocketStream::SocketStream(const SocketStream &rToCopy) // -------------------------------------------------------------------------- SocketStream::~SocketStream() { - if(mSocketHandle != -1) + if(mSocketHandle != INVALID_SOCKET_VALUE) { Close(); } @@ -117,7 +117,10 @@ SocketStream::~SocketStream() // -------------------------------------------------------------------------- void SocketStream::Attach(int socket) { - if(mSocketHandle != -1) {THROW_EXCEPTION(ServerException, SocketAlreadyOpen)} + if(mSocketHandle != INVALID_SOCKET_VALUE) + { + THROW_EXCEPTION(ServerException, SocketAlreadyOpen) + } mSocketHandle = socket; ResetCounters(); @@ -134,7 +137,10 @@ void SocketStream::Attach(int socket) // -------------------------------------------------------------------------- void SocketStream::Open(int Type, const char *Name, int Port) { - if(mSocketHandle != -1) {THROW_EXCEPTION(ServerException, SocketAlreadyOpen)} + if(mSocketHandle != INVALID_SOCKET_VALUE) + { + THROW_EXCEPTION(ServerException, SocketAlreadyOpen) + } // Setup parameters based on type, looking up names if required int sockDomain = 0; @@ -144,7 +150,7 @@ void SocketStream::Open(int Type, const char *Name, int Port) // Create the socket mSocketHandle = ::socket(sockDomain, SOCK_STREAM, 0 /* let OS choose protocol */); - if(mSocketHandle == -1) + if(mSocketHandle == INVALID_SOCKET_VALUE) { THROW_EXCEPTION(ServerException, SocketOpenError) } @@ -158,7 +164,7 @@ void SocketStream::Open(int Type, const char *Name, int Port) #else ::close(mSocketHandle); #endif - mSocketHandle = -1; + mSocketHandle = INVALID_SOCKET_VALUE; THROW_EXCEPTION(ConnectionException, Conn_SocketConnectError) } ResetCounters(); @@ -174,7 +180,10 @@ void SocketStream::Open(int Type, const char *Name, int Port) // -------------------------------------------------------------------------- int SocketStream::Read(void *pBuffer, int NBytes, int Timeout) { - if(mSocketHandle == -1) {THROW_EXCEPTION(ServerException, BadSocketHandle)} + if(mSocketHandle == INVALID_SOCKET_VALUE) + { + THROW_EXCEPTION(ServerException, BadSocketHandle) + } if(Timeout != IOStream::TimeOutInfinite) { @@ -247,7 +256,10 @@ int SocketStream::Read(void *pBuffer, int NBytes, int Timeout) // -------------------------------------------------------------------------- void SocketStream::Write(const void *pBuffer, int NBytes) { - if(mSocketHandle == -1) {THROW_EXCEPTION(ServerException, BadSocketHandle)} + if(mSocketHandle == INVALID_SOCKET_VALUE) + { + THROW_EXCEPTION(ServerException, BadSocketHandle) + } // Buffer in byte sized type. ASSERT(sizeof(char) == 1); @@ -311,7 +323,10 @@ void SocketStream::Write(const void *pBuffer, int NBytes) // -------------------------------------------------------------------------- void SocketStream::Close() { - if(mSocketHandle == -1) {THROW_EXCEPTION(ServerException, BadSocketHandle)} + if(mSocketHandle == INVALID_SOCKET_VALUE) + { + THROW_EXCEPTION(ServerException, BadSocketHandle) + } #ifdef WIN32 if(::closesocket(mSocketHandle) == -1) #else @@ -320,7 +335,7 @@ void SocketStream::Close() { THROW_EXCEPTION(ServerException, SocketCloseError) } - mSocketHandle = -1; + mSocketHandle = INVALID_SOCKET_VALUE; } // -------------------------------------------------------------------------- @@ -333,7 +348,10 @@ void SocketStream::Close() // -------------------------------------------------------------------------- void SocketStream::Shutdown(bool Read, bool Write) { - if(mSocketHandle == -1) {THROW_EXCEPTION(ServerException, BadSocketHandle)} + if(mSocketHandle == INVALID_SOCKET_VALUE) + { + THROW_EXCEPTION(ServerException, BadSocketHandle) + } // Do anything? if(!Read && !Write) return; @@ -388,7 +406,10 @@ bool SocketStream::StreamClosed() // -------------------------------------------------------------------------- tOSSocketHandle SocketStream::GetSocketHandle() { - if(mSocketHandle == -1) {THROW_EXCEPTION(ServerException, BadSocketHandle)} + if(mSocketHandle == INVALID_SOCKET_VALUE) + { + THROW_EXCEPTION(ServerException, BadSocketHandle) + } return mSocketHandle; } diff --git a/lib/server/SocketStream.h b/lib/server/SocketStream.h index 7f1cb741..ca07434e 100644 --- a/lib/server/SocketStream.h +++ b/lib/server/SocketStream.h @@ -14,8 +14,10 @@ #ifdef WIN32 typedef SOCKET tOSSocketHandle; + #define INVALID_SOCKET_VALUE (tOSSocketHandle)(-1) #else typedef int tOSSocketHandle; + #define INVALID_SOCKET_VALUE -1 #endif // -------------------------------------------------------------------------- diff --git a/lib/server/SocketStreamTLS.cpp b/lib/server/SocketStreamTLS.cpp index 94aa3868..af4ad460 100644 --- a/lib/server/SocketStreamTLS.cpp +++ b/lib/server/SocketStreamTLS.cpp @@ -137,8 +137,12 @@ void SocketStreamTLS::Handshake(const TLSContext &rContext, bool IsServer) THROW_EXCEPTION(ServerException, TLSAllocationFailed) } -#ifndef WIN32 // Make the socket non-blocking so timeouts on Read work + +#ifdef WIN32 + u_long nonblocking = 1; + ioctlsocket(socket, FIONBIO, &nonblocking); +#else // !WIN32 // This is more portable than using ioctl with FIONBIO int statusFlags = 0; if(::fcntl(socket, F_GETFL, &statusFlags) < 0 @@ -309,7 +313,7 @@ int SocketStreamTLS::Read(void *pBuffer, int NBytes, int Timeout) case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: - // wait for the requried data + // wait for the required data // Will only get once around this loop, so don't need to calculate timeout values if(WaitWhenRetryRequired(se, Timeout) == false) { diff --git a/lib/server/makeprotocol.pl.in b/lib/server/makeprotocol.pl.in index 3dce6118..efe6519d 100755 --- a/lib/server/makeprotocol.pl.in +++ b/lib/server/makeprotocol.pl.in @@ -1,6 +1,9 @@ #!@PERL@ use strict; +use lib "../../infrastructure"; +use BoxPlatform; + # Make protocol C++ classes from a protocol description file # built in type info (values are is basic type, C++ typename) @@ -167,8 +170,8 @@ close IN; # open files my $h_filename = 'autogen_'.$protocol_name.'Protocol'.$type.'.h'; -open CPP,'>autogen_'.$protocol_name.'Protocol'.$type.'.cpp'; -open H,">$h_filename"; +open CPP,'>autogen_'.$protocol_name.'Protocol'.$type.'.cpp.new'; +open H,">$h_filename.new"; print CPP <<__E; @@ -912,6 +915,8 @@ __E close H; close CPP; +update_if_changed('autogen_'.$protocol_name.'Protocol'.$type.'.cpp'); +update_if_changed($h_filename); sub obj_is_type { @@ -981,8 +986,15 @@ sub make_log_strings { # need to translate it my ($format,$arg) = @{$log_display_types{$ty}}; - push @str,$format; $arg =~ s/VAR/m$nm/g; + + if ($format eq "0x%llx" and $target_windows) + { + $format = "0x%I64x"; + $arg = "(uint64_t)$arg"; + } + + push @str,$format; push @arg,$arg; } else -- cgit v1.2.3