static void debug_print(const char *dbg, const char *buf) { #if defined(ENABLE_NETWORK) if (_debug_socket != INVALID_SOCKET) { char buf2[1024 + 32]; snprintf(buf2, lengthof(buf2), "%sdbg: [%s] %s\n", GetLogPrefix(), dbg, buf); send(_debug_socket, buf2, (int)strlen(buf2), 0); return; } #endif /* ENABLE_NETWORK */ if (strcmp(dbg, "desync") != 0) { #if defined(WINCE) /* We need to do OTTD2FS twice, but as it uses a static buffer, we need to store one temporary */ TCHAR tbuf[512]; _sntprintf(tbuf, sizeof(tbuf), _T("%s"), OTTD2FS(dbg)); NKDbgPrintfW(_T("dbg: [%s] %s\n"), tbuf, OTTD2FS(buf)); #else fprintf(stderr, "%sdbg: [%s] %s\n", GetLogPrefix(), dbg, buf); #endif IConsoleDebug(dbg, buf); } else { static FILE *f = FioFOpenFile("commands-out.log", "wb", AUTOSAVE_DIR); if (f == NULL) return; fprintf(f, "%s%s\n", GetLogPrefix(), buf); fflush(f); } }
const char* EosUdpIn_Mac::RecvPacket(EosLog &log, unsigned int timeoutMS, unsigned int retryCount, int &len, void *addr, int *addrSize) { if( IsInitialized() ) { for(;;) { fd_set readfds; FD_ZERO(&readfds); FD_SET(m_Socket, &readfds); timeval timeout; timeout.tv_sec = timeoutMS/1000; timeout.tv_usec = ((timeoutMS - timeoutMS/1000) * 1000); int result = select(m_Socket+1, &readfds, 0, 0, &timeout); if(result > 0) { socklen_t fromSize = (addrSize ? static_cast<socklen_t>(*addrSize) : 0); len = recvfrom(m_Socket, m_RecvBuf, EOS_UDP_RECV_BUF_LEN, 0, static_cast<sockaddr*>(addr), (addr && addrSize) ? (&fromSize) : 0); if(len == -1) { char text[256]; sprintf(text, "%s recvfrom failed with error %d", GetLogPrefix(m_LogPrefix), errno); log.AddError(text); } else if(len < 1) { char text[256]; sprintf(text, "%s recvfrom failed, received %d bytes", GetLogPrefix(m_LogPrefix), len); log.AddWarning(text); } else return m_RecvBuf; } else if(result < 0) { char text[256]; sprintf(text, "%s select failed with error %d", GetLogPrefix(m_LogPrefix), errno); log.AddError(text); break; } if(retryCount-- == 0) break; } } else { char text[256]; sprintf(text, "%s RecvPacket failed, not initialized", GetLogPrefix(m_LogPrefix)); log.AddError(text); } return 0; }
const char* EosUdpIn_Win::RecvPacket(EosLog &log, unsigned int timeoutMS, unsigned int retryCount, int &len, void *addr, int *addrSize) { if( IsInitialized() ) { for(;;) { fd_set readfds; readfds.fd_count = 1; readfds.fd_array[0] = m_Socket; TIMEVAL timeout; timeout.tv_sec = timeoutMS/1000; timeout.tv_usec = ((timeoutMS - timeoutMS/1000) * 1000); int result = select(0, &readfds, 0, 0, &timeout); if(result > 0) { len = recvfrom(m_Socket, m_RecvBuf, EOS_UDP_RECV_BUF_LEN, 0, static_cast<sockaddr*>(addr), addrSize); if(len == SOCKET_ERROR) { char text[256]; sprintf(text, "%s recvfrom failed with error %d", GetLogPrefix(m_LogPrefix), WSAGetLastError()); log.AddError(text); } else if(len < 1) { char text[256]; sprintf(text, "%s recvfrom failed, received %d bytes", GetLogPrefix(m_LogPrefix), len); log.AddWarning(text); } else return m_RecvBuf; } else if(result < 0) { char text[256]; sprintf(text, "%s select failed with error %d", GetLogPrefix(m_LogPrefix), WSAGetLastError()); log.AddError(text); break; } if(retryCount-- == 0) break; } } else { char text[256]; sprintf(text, "%s RecvPacket failed, not initialized", GetLogPrefix(m_LogPrefix)); log.AddError(text); } return 0; }
/** * Handle the printing of text entered into the console or redirected there * by any other means. Text can be redirected to other clients in a network game * as well as to a logfile. If the network server is a dedicated server, all activities * are also logged. All lines to print are added to a temporary buffer which can be * used as a history to print them onscreen * @param colour_code the colour of the command. Red in case of errors, etc. * @param string the message entered or output on the console (notice, error, etc.) */ void IConsolePrint(ConsoleColour colour_code, const char *string) { char *str; #ifdef ENABLE_NETWORK if (_redirect_console_to_client != INVALID_CLIENT_ID) { /* Redirect the string to the client */ NetworkServerSendRcon(_redirect_console_to_client, colour_code, string); return; } #endif /* Create a copy of the string, strip if of colours and invalid * characters and (when applicable) assign it to the console buffer */ str = strdup(string); str_strip_colours(str); str_validate(str, str + strlen(str)); if (_network_dedicated) { fprintf(stdout, "%s%s\n", GetLogPrefix(), str); fflush(stdout); IConsoleWriteToLogFile(str); free(str); // free duplicated string since it's not used anymore return; } IConsoleWriteToLogFile(str); IConsoleGUIPrint(colour_code, str); }
static void IConsoleWriteToLogFile(const char *string) { if (_iconsole_output_file != NULL) { /* if there is an console output file ... also print it there */ const char *header = GetLogPrefix(); if ((strlen(header) != 0 && fwrite(header, strlen(header), 1, _iconsole_output_file) != 1) || fwrite(string, strlen(string), 1, _iconsole_output_file) != 1 || fwrite("\n", 1, 1, _iconsole_output_file) != 1) { fclose(_iconsole_output_file); _iconsole_output_file = NULL; IConsolePrintF(CC_DEFAULT, "cannot write to log file"); } } }
bool EosUdpIn_Win::Initialize(EosLog &log, const char *ip, unsigned short port) { if( !IsInitialized() ) { SetLogPrefix("udp in", ip, port, m_LogPrefix); if( ip ) { WSADATA wsaData; int result = WSAStartup(MAKEWORD(2,2), &wsaData); if(result == 0) { m_Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(m_Socket != INVALID_SOCKET) { int optval = 1; if(setsockopt(m_Socket,SOL_SOCKET,SO_REUSEADDR,(const char*)&optval,sizeof(optval)) == SOCKET_ERROR) { char text[256]; sprintf(text, "%s setsockopt(SO_REUSEADDR) failed with error %d", GetLogPrefix(m_LogPrefix), WSAGetLastError()); log.AddWarning(text); } sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.S_un.S_addr = inet_addr(ip); addr.sin_port = htons(port); result = bind(m_Socket, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)); if(result != SOCKET_ERROR) { char text[256]; sprintf(text, "%s socket intialized", GetLogPrefix(m_LogPrefix)); log.AddInfo(text); } else { char text[256]; sprintf(text, "%s bind failed with error %d", GetLogPrefix(m_LogPrefix), WSAGetLastError()); log.AddError(text); closesocket(m_Socket); m_Socket = INVALID_SOCKET; WSACleanup(); } } else { char text[256]; sprintf(text, "%s socket failed with error %d", GetLogPrefix(m_LogPrefix), WSAGetLastError()); log.AddError(text); WSACleanup(); } } else { char text[256]; sprintf(text, "%s WSAStartup failed with error %d", GetLogPrefix(m_LogPrefix), result); log.AddError(text); WSACleanup(); } } else { char text[256]; sprintf(text, "%s initialize failed, invalid arguments", GetLogPrefix(m_LogPrefix)); log.AddError(text); } } else { char text[256]; sprintf(text, "%s initialize failed, already initialized", GetLogPrefix(m_LogPrefix)); log.AddWarning(text); } return IsInitialized(); }
bool EosUdpIn_Mac::Initialize(EosLog &log, const char *ip, unsigned short port) { if( !IsInitialized() ) { SetLogPrefix("udp input", ip, port, m_LogPrefix); if( ip ) { m_Socket = socket(AF_INET, SOCK_DGRAM, 0); if(m_Socket != -1) { int optval = 1; if(setsockopt(m_Socket,SOL_SOCKET,SO_REUSEADDR,(const char*)&optval,sizeof(optval)) == -1) { char text[256]; sprintf(text, "%s setsockopt(SO_REUSEADDR) failed with error %d", GetLogPrefix(m_LogPrefix), errno); log.AddWarning(text); } sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(ip); addr.sin_port = htons(port); int result = bind(m_Socket, reinterpret_cast<sockaddr*>(&addr), static_cast<socklen_t>(sizeof(addr))); if(result != -1) { char text[256]; sprintf(text, "%s socket intialized", GetLogPrefix(m_LogPrefix)); log.AddInfo(text); } else { char text[256]; sprintf(text, "%s bind failed with error %d", GetLogPrefix(m_LogPrefix), errno); log.AddError(text); close(m_Socket); m_Socket = -1; } } else { char text[256]; sprintf(text, "%s socket failed with error %d", GetLogPrefix(m_LogPrefix), errno); log.AddError(text); } } else { char text[256]; sprintf(text, "%s initialize failed, invalid arguments", GetLogPrefix(m_LogPrefix)); log.AddError(text); } } else { char text[256]; sprintf(text, "%s initialize failed, already initialized", GetLogPrefix(m_LogPrefix)); log.AddWarning(text); } return IsInitialized(); }