diff options
-rw-r--r-- | include/consolecolors.h | 100 | ||||
-rw-r--r-- | include/inspircd.h | 2 | ||||
-rw-r--r-- | src/configreader.cpp | 3 | ||||
-rw-r--r-- | src/helperfuncs.cpp | 5 | ||||
-rw-r--r-- | src/inspircd.cpp | 90 | ||||
-rw-r--r-- | src/inspsocket.cpp | 10 | ||||
-rw-r--r-- | src/modmanager_dynamic.cpp | 15 | ||||
-rw-r--r-- | src/modmanager_static.cpp | 7 | ||||
-rw-r--r-- | src/socketengines/socketengine_epoll.cpp | 7 | ||||
-rw-r--r-- | src/socketengines/socketengine_kqueue.cpp | 7 | ||||
-rw-r--r-- | src/socketengines/socketengine_poll.cpp | 3 | ||||
-rw-r--r-- | src/socketengines/socketengine_ports.cpp | 7 | ||||
-rw-r--r-- | win/colors.h | 114 | ||||
-rw-r--r-- | win/configure.cpp | 105 | ||||
-rw-r--r-- | win/configure.vcxproj | 3 | ||||
-rw-r--r-- | win/inspircd.vcxproj | 2 | ||||
-rw-r--r-- | win/inspircd_win32wrapper.cpp | 3 | ||||
-rw-r--r-- | win/inspircd_win32wrapper.h | 3 | ||||
-rw-r--r-- | win/win32service.cpp | 17 |
19 files changed, 257 insertions, 246 deletions
diff --git a/include/consolecolors.h b/include/consolecolors.h new file mode 100644 index 000000000..953beb346 --- /dev/null +++ b/include/consolecolors.h @@ -0,0 +1,100 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. + * + * 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 General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef CONSOLECOLORS_H +#define CONSOLECOLORS_H + +#include <ostream> + +#ifdef _WIN32 + +#include <windows.h> + +extern WORD g_wOriginalColors; +extern WORD g_wBackgroundColor; +extern HANDLE g_hStdout; + +inline std::ostream& con_green(std::ostream &s) +{ + SetConsoleTextAttribute(g_hStdout, FOREGROUND_GREEN|FOREGROUND_INTENSITY|g_wBackgroundColor); + return s; +} + +inline std::ostream& con_red(std::ostream &s) +{ + SetConsoleTextAttribute(g_hStdout, FOREGROUND_RED|FOREGROUND_INTENSITY|g_wBackgroundColor); + return s; +} + +inline std::ostream& con_white(std::ostream &s) +{ + SetConsoleTextAttribute(g_hStdout, FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|g_wBackgroundColor); + return s; +} + +inline std::ostream& con_white_bright(std::ostream &s) +{ + SetConsoleTextAttribute(g_hStdout, FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY|g_wBackgroundColor); + return s; +} + +inline std::ostream& con_bright(std::ostream &s) +{ + SetConsoleTextAttribute(g_hStdout, FOREGROUND_INTENSITY|g_wBackgroundColor); + return s; +} + +inline std::ostream& con_reset(std::ostream &s) +{ + SetConsoleTextAttribute(g_hStdout, g_wOriginalColors); + return s; +} + +#else + +inline std::ostream& con_green(std::ostream &s) +{ + return s << "\033[1;32m"; +} + +inline std::ostream& con_red(std::ostream &s) +{ + return s << "\033[1;31m"; +} + +inline std::ostream& con_white(std::ostream &s) +{ + return s << "\033[0m"; +} + +inline std::ostream& con_white_bright(std::ostream &s) +{ + return s << "\033[1m"; +} + +inline std::ostream& con_bright(std::ostream &s) +{ + return s << "\033[1m"; +} + +inline std::ostream& con_reset(std::ostream &s) +{ + return s << "\033[0m"; +} + +#endif + +#endif
\ No newline at end of file diff --git a/include/inspircd.h b/include/inspircd.h index cc627ca57..69c8bf47f 100644 --- a/include/inspircd.h +++ b/include/inspircd.h @@ -34,7 +34,6 @@ #ifndef _WIN32 #define DllExport #define CoreExport -#define printf_c printf #else #include "inspircd_win32wrapper.h" /** Windows defines these already */ @@ -71,6 +70,7 @@ #include "inspircd_config.h" #include "inspircd_version.h" #include "typedefs.h" +#include "consolecolors.h" CoreExport extern InspIRCd* ServerInstance; diff --git a/src/configreader.cpp b/src/configreader.cpp index 660df77d7..82f4d7c43 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -28,6 +28,7 @@ #include "exitcodes.h" #include "commands/cmd_whowas.h" #include "configparser.h" +#include <iostream> #ifdef _WIN32 #include <Iphlpapi.h> #pragma comment(lib, "Iphlpapi.lib") @@ -750,7 +751,7 @@ void ServerConfig::Apply(ServerConfig* old, const std::string &useruid) continue; // On startup, print out to console (still attached at this point) if (!old) - printf("%s\n", line.c_str()); + std::cout << line << std::endl; // If a user is rehashing, tell them directly if (user) user->SendText(":%s NOTICE %s :*** %s", ServerInstance->Config->ServerName.c_str(), user->nick.c_str(), line.c_str()); diff --git a/src/helperfuncs.cpp b/src/helperfuncs.cpp index 7351a07de..a6df520c5 100644 --- a/src/helperfuncs.cpp +++ b/src/helperfuncs.cpp @@ -32,6 +32,7 @@ #include "inspircd.h" #include "xline.h" #include "exitcodes.h" +#include <iostream> std::string InspIRCd::GetServerDescription(const std::string& servername) { @@ -319,8 +320,8 @@ void InspIRCd::CheckRoot() #ifndef _WIN32 if (geteuid() == 0) { - printf("WARNING!!! You are running an irc server as ROOT!!! DO NOT DO THIS!!!\n\n"); - this->Logs->Log("STARTUP",DEFAULT,"Cant start as root"); + std::cout << "ERROR: You are running an irc server as root! DO NOT DO THIS!" << std::endl << std::endl; + this->Logs->Log("STARTUP",DEFAULT,"Can't start as root"); Exit(EXIT_STATUS_ROOT); } #endif diff --git a/src/inspircd.cpp b/src/inspircd.cpp index 42047ce11..cb50595d2 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -45,9 +45,14 @@ #include <pwd.h> // setuid #include <grp.h> // setgid +#else + WORD g_wOriginalColors; + WORD g_wBackgroundColor; + HANDLE g_hStdout; #endif #include <fstream> +#include <iostream> #include "xline.h" #include "bancache.h" #include "socketengine.h" @@ -242,7 +247,7 @@ void InspIRCd::QuickExit(int status) bool InspIRCd::DaemonSeed() { #ifdef _WIN32 - printf_c("InspIRCd Process ID: \033[1;32m%lu\033[0m\n", GetCurrentProcessId()); + std::cout << "InspIRCd Process ID: " << con_green << GetCurrentProcessId() << con_reset << std::endl; return true; #else signal(SIGTERM, InspIRCd::QuickExit); @@ -264,7 +269,7 @@ bool InspIRCd::DaemonSeed() exit(0); } setsid (); - printf("InspIRCd Process ID: \033[1;32m%lu\033[0m\n",(unsigned long)getpid()); + std::cout << "InspIRCd Process ID: " << con_green << getpid() << con_reset << std::endl; signal(SIGTERM, InspIRCd::SetSignal); @@ -297,7 +302,7 @@ void InspIRCd::WritePID(const std::string &filename) } else { - printf("Failed to write PID-file '%s', exiting.\n",fname.c_str()); + std::cout << "Failed to write PID-file '" << fname << "', exiting." << std::endl; this->Logs->Log("STARTUP",DEFAULT,"Failed to write PID-file '%s', exiting.",fname.c_str()); Exit(EXIT_STATUS_PID); } @@ -389,6 +394,20 @@ InspIRCd::InspIRCd(int argc, char** argv) : #ifdef _WIN32 srand(TIME.tv_nsec ^ TIME.tv_sec); + + // Initialize the console values + g_hStdout = GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO bufinf; + if(GetConsoleScreenBufferInfo(g_hStdout, &bufinf)) + { + g_wOriginalColors = bufinf.wAttributes & 0x00FF; + g_wBackgroundColor = bufinf.wAttributes & 0x00F0; + } + else + { + g_wOriginalColors = FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN; + g_wBackgroundColor = 0; + } #else srandom(TIME.tv_nsec ^ TIME.tv_sec); #endif @@ -426,8 +445,9 @@ InspIRCd::InspIRCd(int argc, char** argv) : /* Unknown parameter */ default: /* Fall through to handle other weird values too */ - printf("Unknown parameter '%s'\n", argv[optind-1]); - printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>]\n%*s[--runasroot] [--version] [--config <config>] [--testsuite]\n", argv[0], static_cast<int>(8+strlen(argv[0])), " "); + std::cout << "Unknown parameter '" << argv[optind-1] << "'" << std::endl; + std::cout << "Usage: " << argv[0] << " [--nofork] [--nolog] [--debug] [--logfile <filename>] " << std::endl << + std::string(static_cast<int>(8+strlen(argv[0])), ' ') << "[--runasroot] [--version] [--config <config>] [--testsuite]" << std::endl; Exit(EXIT_STATUS_ARGV); break; } @@ -438,7 +458,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : if (do_version) { - printf("\n%s r%s\n", VERSION, REVISION); + std::cout << std::endl << VERSION << " r" << REVISION << std::endl; Exit(EXIT_STATUS_NOERROR); } @@ -462,7 +482,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : } else if (!this->OpenLog(argv, argc)) { - printf("ERROR: Could not open initial logfile %s: %s\n\n", Config->cmdline.startup_log.c_str(), strerror(errno)); + std::cout << "ERROR: Could not open initial logfile " << Config->cmdline.startup_log << ": " << strerror(errno) << std::endl << std::endl; Exit(EXIT_STATUS_LOG); } @@ -480,18 +500,18 @@ InspIRCd::InspIRCd(int argc, char** argv) : else #endif { - printf("ERROR: Cannot open config file: %s\nExiting...\n", ConfigFileName.c_str()); + std::cout << "ERROR: Cannot open config file: " << ConfigFileName << std::endl << "Exiting..." << std::endl; this->Logs->Log("STARTUP",DEFAULT,"Unable to open config file %s", ConfigFileName.c_str()); Exit(EXIT_STATUS_CONFIG); } } - printf_c("\033[1;32mInspire Internet Relay Chat Server, compiled %s at %s\n",__DATE__,__TIME__); - printf_c("(C) InspIRCd Development Team.\033[0m\n\n"); - printf_c("Developers:\n"); - printf_c("\t\033[1;32mBrain, FrostyCoolSlug, w00t, Om, Special, peavey\n"); - printf_c("\t\033[1;32maquanight, psychon, dz, danieldg, jackmcbarn\033[0m\n\n"); - printf_c("Others:\t\t\t\033[1;32mSee /INFO Output\033[0m\n"); + std::cout << con_green << "Inspire Internet Relay Chat Server" << con_reset << ", compiled on " __DATE__ " at " __TIME__ << std::endl; + std::cout << con_green << "(C) InspIRCd Development Team." << con_reset << std::endl << std::endl; + std::cout << "Developers:" << std::endl; + std::cout << con_green << "\tBrain, FrostyCoolSlug, w00t, Om, Special, peavey" << std::endl; + std::cout << "\taquanight, psychon, dz, danieldg, jackmcbarn" << con_reset << std::endl << std::endl; + std::cout << "Others:\t\t\t" << con_green << "See /INFO Output" << con_reset << std::endl; this->Modes = new ModeParser; @@ -500,14 +520,14 @@ InspIRCd::InspIRCd(int argc, char** argv) : this->CheckRoot(); else { - printf("* WARNING * WARNING * WARNING * WARNING * WARNING * \n\n"); - printf("YOU ARE RUNNING INSPIRCD AS ROOT. THIS IS UNSUPPORTED\n"); - printf("AND IF YOU ARE HACKED, CRACKED, SPINDLED OR MUTILATED\n"); - printf("OR ANYTHING ELSE UNEXPECTED HAPPENS TO YOU OR YOUR\n"); - printf("SERVER, THEN IT IS YOUR OWN FAULT. IF YOU DID NOT MEAN\n"); - printf("TO START INSPIRCD AS ROOT, HIT CTRL+C NOW AND RESTART\n"); - printf("THE PROGRAM AS A NORMAL USER. YOU HAVE BEEN WARNED!\n"); - printf("\nInspIRCd starting in 20 seconds, ctrl+c to abort...\n"); + std::cout << "* WARNING * WARNING * WARNING * WARNING * WARNING *" << std::endl
+ << "YOU ARE RUNNING INSPIRCD AS ROOT. THIS IS UNSUPPORTED" << std::endl
+ << "AND IF YOU ARE HACKED, CRACKED, SPINDLED OR MUTILATED" << std::endl
+ << "OR ANYTHING ELSE UNEXPECTED HAPPENS TO YOU OR YOUR" << std::endl
+ << "SERVER, THEN IT IS YOUR OWN FAULT. IF YOU DID NOT MEAN" << std::endl
+ << "TO START INSPIRCD AS ROOT, HIT CTRL+C NOW AND RESTART" << std::endl
+ << "THE PROGRAM AS A NORMAL USER. YOU HAVE BEEN WARNED!" << std::endl << std::endl
+ << "InspIRCd starting in 20 seconds, ctrl+c to abort..." << std::endl;
sleep(20); } #endif @@ -518,7 +538,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : { if (!this->DaemonSeed()) { - printf("ERROR: could not go into daemon mode. Shutting down.\n"); + std::cout << "ERROR: could not go into daemon mode. Shutting down." << std::endl; Logs->Log("STARTUP", DEFAULT, "ERROR: could not go into daemon mode. Shutting down."); Exit(EXIT_STATUS_FORK); } @@ -564,7 +584,7 @@ InspIRCd::InspIRCd(int argc, char** argv) : int bounditems = BindPorts(pl); - printf("\n"); + std::cout << std::endl; this->Modules->LoadAll(); @@ -574,26 +594,26 @@ InspIRCd::InspIRCd(int argc, char** argv) : if (!pl.empty()) { - printf("\nWARNING: Not all your client ports could be bound --\nstarting anyway with %d of %d client ports bound.\n\n", - bounditems, bounditems + (int)pl.size()); - printf("The following port(s) failed to bind:\n"); - printf("Hint: Try using a public IP instead of blank or *\n\n"); + std::cout << std::endl << "WARNING: Not all your client ports could be bound -- " << std::endl << "starting anyway with " << bounditems + << " of " << bounditems + (int)pl.size() << " client ports bound." << std::endl << std::endl; + std::cout << "The following port(s) failed to bind:" << std::endl << std::endl; int j = 1; for (FailedPortList::iterator i = pl.begin(); i != pl.end(); i++, j++) { - printf("%d.\tAddress: %s\tReason: %s\n", j, i->first.empty() ? "<all>" : i->first.c_str(), i->second.c_str()); + std::cout << j << ".\tAddress: " << (i->first.empty() ? "<all>" : i->first) << " \tReason: " << i->second << std::endl; } + + std::cout << std::endl << "Hint: Try using a public IP instead of blank or *" << std::endl; } - printf("\nInspIRCd is now running as '%s'[%s] with %d max open sockets\n", - Config->ServerName.c_str(),Config->GetSID().c_str(), SE->GetMaxFds()); + std::cout << "InspIRCd is now running as '" << Config->ServerName << "'[" << Config->GetSID() << "] with " << SE->GetMaxFds() << " max open sockets" << std::endl; #ifndef _WIN32 if (!Config->cmdline.nofork) { if (kill(getppid(), SIGTERM) == -1) { - printf("Error killing parent process: %s\n",strerror(errno)); + std::cout << "Error killing parent process: " << strerror(errno) << std::endl; Logs->Log("STARTUP", DEFAULT, "Error killing parent process: %s",strerror(errno)); } } @@ -778,9 +798,9 @@ int InspIRCd::Run() if(QueryPerformanceCounter(&stats->LastSampled)) { FILETIME CreationTime; - FILETIME ExitTime; - FILETIME KernelTime; - FILETIME UserTime; + FILETIME ExitTime; + FILETIME KernelTime; + FILETIME UserTime; GetProcessTimes(GetCurrentProcess(), &CreationTime, &ExitTime, &KernelTime, &UserTime); stats->LastCPU.dwHighDateTime = KernelTime.dwHighDateTime + UserTime.dwHighDateTime; stats->LastCPU.dwLowDateTime = KernelTime.dwLowDateTime + UserTime.dwLowDateTime; diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp index 81e61f051..1326093b9 100644 --- a/src/inspsocket.cpp +++ b/src/inspsocket.cpp @@ -82,16 +82,6 @@ BufferedSocketError BufferedSocket::BeginConnect(const std::string &ipaddr, int return BeginConnect(addr, bind, maxtime); } -static void IncreaseOSBuffers(int fd) -{ - // attempt to increase socket sendq and recvq as high as its possible - int sendbuf = 32768; - int recvbuf = 32768; - setsockopt(fd,SOL_SOCKET,SO_SNDBUF,(const char *)&sendbuf,sizeof(sendbuf)); - setsockopt(fd,SOL_SOCKET,SO_RCVBUF,(const char *)&recvbuf,sizeof(recvbuf)); - // on failure, do nothing. I'm a little sick of people trying to interpret this message as a result of why their incorrect setups don't work. -} - BufferedSocketError BufferedSocket::BeginConnect(const irc::sockets::sockaddrs& dest, const irc::sockets::sockaddrs& bind, unsigned long timeout) { if (fd < 0) diff --git a/src/modmanager_dynamic.cpp b/src/modmanager_dynamic.cpp index 0e90a9ae5..27da56c69 100644 --- a/src/modmanager_dynamic.cpp +++ b/src/modmanager_dynamic.cpp @@ -24,6 +24,7 @@ #include "command_parse.h" #include "dns.h" #include "exitcodes.h" +#include <iostream> #ifndef _WIN32 #include <dirent.h> @@ -183,7 +184,7 @@ void ModuleManager::LoadAll() { ModCount = 0; - printf("\nLoading core commands"); + std::cout << std::endl << "Loading core commands"; fflush(stdout); DIR* library = opendir(ServerInstance->Config->ModPath.c_str()); @@ -194,19 +195,19 @@ void ModuleManager::LoadAll() { if (InspIRCd::Match(entry->d_name, "cmd_*.so", ascii_case_insensitive_map)) { - printf("."); + std::cout << "."; fflush(stdout); if (!Load(entry->d_name, true)) { ServerInstance->Logs->Log("MODULE", DEFAULT, this->LastError()); - printf_c("\n[\033[1;31m*\033[0m] %s\n\n", this->LastError().c_str()); + std::cout << std::endl << "[" << con_red << "*" << con_reset << "]" << this->LastError() << std::endl << std::endl; ServerInstance->Exit(EXIT_STATUS_MODULE); } } } closedir(library); - printf("\n"); + std::cout << std::endl; } ConfigTagList tags = ServerInstance->Config->ConfTags("module"); @@ -214,12 +215,12 @@ void ModuleManager::LoadAll() { ConfigTag* tag = i->second; std::string name = tag->getString("name"); - printf_c("[\033[1;32m*\033[0m] Loading module:\t\033[1;32m%s\033[0m\n",name.c_str()); + std::cout << "[" << con_green << "*" << con_reset << "] Loading module:\t" << con_green << name << con_reset << std::endl; if (!this->Load(name, true)) { ServerInstance->Logs->Log("MODULE", DEFAULT, this->LastError()); - printf_c("\n[\033[1;31m*\033[0m] %s\n\n", this->LastError().c_str()); + std::cout << std::endl << "[" << con_red << "*" << con_reset << "]" << this->LastError() << std::endl << std::endl; ServerInstance->Exit(EXIT_STATUS_MODULE); } } @@ -236,7 +237,7 @@ void ModuleManager::LoadAll() { LastModuleError = "Unable to initialize " + mod->ModuleSourceFile + ": " + modexcept.GetReason(); ServerInstance->Logs->Log("MODULE", DEFAULT, LastModuleError); - printf_c("\n[\033[1;31m*\033[0m] %s\n\n", LastModuleError.c_str()); + std::cout << std::endl << "[" << con_red << "*" << con_reset << "]" << LastModuleError << std::endl << std::endl; ServerInstance->Exit(EXIT_STATUS_MODULE); } } diff --git a/src/modmanager_static.cpp b/src/modmanager_static.cpp index bb8fda400..b105eea92 100644 --- a/src/modmanager_static.cpp +++ b/src/modmanager_static.cpp @@ -21,6 +21,7 @@ #include "inspircd.h" #include "exitcodes.h" +#include <iostream> #ifdef PURE_STATIC @@ -188,12 +189,12 @@ void ModuleManager::LoadAll() { ConfigTag* tag = i->second; std::string name = tag->getString("name"); - printf_c("[\033[1;32m*\033[0m] Loading module:\t\033[1;32m%s\033[0m\n",name.c_str()); + std::cout << "[" << con_green << "*" << con_reset << "] Loading module:\t" << con_green << name << con_reset << std::endl; if (!this->Load(name, true)) { ServerInstance->Logs->Log("MODULE", DEFAULT, this->LastError()); - printf_c("\n[\033[1;31m*\033[0m] %s\n\n", this->LastError().c_str()); + std::cout << std::endl << "[" << con_red << "*" << con_reset << "]" << this->LastError() << std::endl << std::endl; ServerInstance->Exit(EXIT_STATUS_MODULE); } } @@ -209,7 +210,7 @@ void ModuleManager::LoadAll() { LastModuleError = "Unable to initialize " + mod->ModuleSourceFile + ": " + modexcept.GetReason(); ServerInstance->Logs->Log("MODULE", DEFAULT, LastModuleError); - printf_c("\n[\033[1;31m*\033[0m] %s\n\n", LastModuleError.c_str()); + std::cout << std::endl << "[" << con_red << "*" << con_reset << "]" << LastModuleError << std::endl << std::endl; ServerInstance->Exit(EXIT_STATUS_MODULE); } } diff --git a/src/socketengines/socketengine_epoll.cpp b/src/socketengines/socketengine_epoll.cpp index 79d69698a..f7e107e7b 100644 --- a/src/socketengines/socketengine_epoll.cpp +++ b/src/socketengines/socketengine_epoll.cpp @@ -26,6 +26,7 @@ #include "socketengine.h" #include <sys/epoll.h> #include <ulimit.h> +#include <iostream> #define EP_DELAY 5 /** A specialisation of the SocketEngine class, designed to use linux 2.6 epoll(). @@ -61,7 +62,7 @@ EPollEngine::EPollEngine() else { ServerInstance->Logs->Log("SOCKET", DEFAULT, "ERROR: Can't determine maximum number of open sockets!"); - printf("ERROR: Can't determine maximum number of open sockets!\n"); + std::cout << "ERROR: Can't determine maximum number of open sockets!" << std::endl; ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE); } @@ -72,8 +73,8 @@ EPollEngine::EPollEngine() { ServerInstance->Logs->Log("SOCKET",DEFAULT, "ERROR: Could not initialize socket engine: %s", strerror(errno)); ServerInstance->Logs->Log("SOCKET",DEFAULT, "ERROR: Your kernel probably does not have the proper features. This is a fatal error, exiting now."); - printf("ERROR: Could not initialize epoll socket engine: %s\n", strerror(errno)); - printf("ERROR: Your kernel probably does not have the proper features. This is a fatal error, exiting now.\n"); + std::cout << "ERROR: Could not initialize epoll socket engine: " << strerror(errno) << std::endl; + std::cout << "ERROR: Your kernel probably does not have the proper features. This is a fatal error, exiting now." << std::endl; ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE); } diff --git a/src/socketengines/socketengine_kqueue.cpp b/src/socketengines/socketengine_kqueue.cpp index 63e16ac6e..5dd653363 100644 --- a/src/socketengines/socketengine_kqueue.cpp +++ b/src/socketengines/socketengine_kqueue.cpp @@ -25,6 +25,7 @@ #include <sys/event.h> #include <sys/time.h> #include "socketengine.h" +#include <iostream> /** A specialisation of the SocketEngine class, designed to use FreeBSD kqueue(). */ @@ -68,7 +69,7 @@ KQueueEngine::KQueueEngine() if (MAX_DESCRIPTORS <= 0) { ServerInstance->Logs->Log("SOCKET", DEFAULT, "ERROR: Can't determine maximum number of open sockets!"); - printf("ERROR: Can't determine maximum number of open sockets!\n"); + std::cout << "ERROR: Can't determine maximum number of open sockets!" << std::endl; ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE); } @@ -90,8 +91,8 @@ void KQueueEngine::RecoverFromFork() { ServerInstance->Logs->Log("SOCKET",DEFAULT, "ERROR: Could not initialize socket engine. Your kernel probably does not have the proper features."); ServerInstance->Logs->Log("SOCKET",DEFAULT, "ERROR: this is a fatal error, exiting now."); - printf("ERROR: Could not initialize socket engine. Your kernel probably does not have the proper features.\n"); - printf("ERROR: this is a fatal error, exiting now.\n"); + std::cout << "ERROR: Could not initialize socket engine. Your kernel probably does not have the proper features." << std::endl; + std::cout << "ERROR: this is a fatal error, exiting now." << std::endl; ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE); } CurrentSetSize = 0; diff --git a/src/socketengines/socketengine_poll.cpp b/src/socketengines/socketengine_poll.cpp index dd38c32b9..6a385c8d8 100644 --- a/src/socketengines/socketengine_poll.cpp +++ b/src/socketengines/socketengine_poll.cpp @@ -26,6 +26,7 @@ #ifndef SOCKETENGINE_POLL #define SOCKETENGINE_POLL +#include <iostream> #include <vector> #include <string> #include <map> @@ -92,7 +93,7 @@ PollEngine::PollEngine() else { ServerInstance->Logs->Log("SOCKET", DEFAULT, "ERROR: Can't determine maximum number of open sockets: %s", strerror(errno)); - printf("ERROR: Can't determine maximum number of open sockets: %s\n", strerror(errno)); + std::cout << "ERROR: Can't determine maximum number of open sockets: " << strerror(errno) << std::endl; ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE); } #else diff --git a/src/socketengines/socketengine_ports.cpp b/src/socketengines/socketengine_ports.cpp index 5fc645bb1..9a86c47d0 100644 --- a/src/socketengines/socketengine_ports.cpp +++ b/src/socketengines/socketengine_ports.cpp @@ -36,6 +36,7 @@ #include "inspircd.h" #include "socketengine.h" #include <port.h> +#include <iostream> /** A specialisation of the SocketEngine class, designed to use solaris 10 I/O completion ports */ @@ -75,7 +76,7 @@ PortsEngine::PortsEngine() else { ServerInstance->Logs->Log("SOCKET", DEFAULT, "ERROR: Can't determine maximum number of open sockets!"); - printf("ERROR: Can't determine maximum number of open sockets!\n"); + std::cout << "ERROR: Can't determine maximum number of open sockets!" << std::endl; ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE); } EngineHandle = port_create(); @@ -84,8 +85,8 @@ PortsEngine::PortsEngine() { ServerInstance->Logs->Log("SOCKET",SPARSE,"ERROR: Could not initialize socket engine: %s", strerror(errno)); ServerInstance->Logs->Log("SOCKET",SPARSE,"ERROR: This is a fatal error, exiting now."); - printf("ERROR: Could not initialize socket engine: %s\n", strerror(errno)); - printf("ERROR: This is a fatal error, exiting now.\n"); + std::cout << "ERROR: Could not initialize socket engine: " << strerror(errno) << std::endl; + std::cout << "ERROR: This is a fatal error, exiting now." << std::endl; ServerInstance->Exit(EXIT_STATUS_SOCKETENGINE); } CurrentSetSize = 0; diff --git a/win/colors.h b/win/colors.h deleted file mode 100644 index b43ccbd62..000000000 --- a/win/colors.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * InspIRCd -- Internet Relay Chat Daemon - * - * Copyright (C) 2007 Dennis Friis <peavey@inspircd.org> - * Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net> - * - * This file is part of InspIRCd. InspIRCd is free software: you can - * redistribute it and/or modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation, version 2. - * - * 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 General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - - -#ifndef COLORS_H -#define COLORS_H - -#define TRED FOREGROUND_RED | FOREGROUND_INTENSITY -#define TGREEN FOREGROUND_GREEN | FOREGROUND_INTENSITY -#define TYELLOW FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY -#define TNORMAL FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE -#define TWHITE TNORMAL | FOREGROUND_INTENSITY -#define TBLUE FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY - -/* Handles colors in printf */ -int printf_c(const char * format, ...) -{ - // Better hope we're not multithreaded, otherwise we'll have chickens crossing the road other side to get the to :P - static char message[500]; - static char temp[500]; - int color1, color2; - - /* parse arguments */ - va_list ap; - va_start(ap, format); - vsnprintf(message, 500, format, ap); - va_end(ap); - - /* search for unix-style escape sequences */ - int t; - int c = 0; - const char * p = message; - while (*p != 0) - { - if (*p == '\033') - { - // Escape sequence -> copy into the temp buffer, and parse the color. - p++; - t = 0; - while ((*p) && (*p != 'm')) - { - temp[t++] = *p; - ++p; - } - - temp[t] = 0; - p++; - - if (*temp == '[') - { - if (sscanf(temp, "[%u;%u", &color1, &color2) == 2) - { - switch(color2) - { - case 32: // Green - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY); // Yellow - break; - - default: // Unknown - // White - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); - break; - } - } - else - { - switch (*(temp+1)) - { - case '0': - // Returning to normal colour. - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); - break; - - case '1': - // White - SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), TWHITE); - break; - - default: - char message[50]; - sprintf(message, "Unknown color code: %s", temp); - MessageBoxA(0, message, message, MB_OK); - break; - } - } - } - } - - putchar(*p); - ++c; - ++p; - } - - return c; -} - -#endif - diff --git a/win/configure.cpp b/win/configure.cpp index f05b00f8e..6f821894b 100644 --- a/win/configure.cpp +++ b/win/configure.cpp @@ -29,12 +29,17 @@ #include <windows.h> #include <stdio.h> #include <process.h> +#include "../include/consolecolors.h" + +WORD g_wOriginalColors; +WORD g_wBackgroundColor; +HANDLE g_hStdout; + #include <iostream> #include <string> #include <vector> #include <time.h> #include "inspircd_win32wrapper.h" -#include "colors.h" using namespace std; void Run(); @@ -43,8 +48,6 @@ void WriteCompileModules(const vector<string> &, const vector<string> &); void WriteCompileCommands(); void CopyExtras(); -inline void sc(WORD color) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color); } - #ifdef _WIN64 // /MACHINE:X64 #ifdef _DEBUG @@ -64,12 +67,12 @@ int get_int_option(const char * text, int def) { static char buffer[500]; int ret; - printf_c("%s\n[\033[1;32m%u\033[0m] -> ", text, def); + std::cout << text << std::endl << " [" << con_green << def << con_reset << "] -> "; fgets(buffer, sizeof(buffer), stdin); if(sscanf(buffer, "%u", &ret) != 1) ret = def; - printf("\n"); + std::cout << std::endl; return ret; } @@ -77,28 +80,28 @@ bool get_bool_option(const char * text, bool def) { static char buffer[500]; char ret[100]; - printf_c("%s [\033[1;32m%c\033[0m] -> ", text, def ? 'y' : 'n'); + std::cout << text << " [" << con_green << (def ? 'y' : 'n') << con_reset << "] -> "; fgets(buffer, sizeof(buffer), stdin); if(sscanf(buffer, "%s", ret) != 1) strcpy(ret, def ? "y" : "n"); - printf("\n"); + std::cout << std::endl; return !strnicmp(ret, "y", 1); } string get_string_option(const char * text, char * def) { if (def && *def) - printf_c("%s\n[\033[1;32m%s\033[0m] -> ", text, def); + std::cout << text << std::endl << "[" << con_green << def << con_reset << "] -> "; else - printf_c("%s\n[] -> ", text); + std::cout << text << std::endl << "[] -> "; char buffer[1000], buf[1000]; fgets(buffer, sizeof(buffer), stdin); if (sscanf(buffer, "%s", buf) != 1) strcpy(buf, def); - printf("\n"); + std::cout << std::endl; return buf; } @@ -228,6 +231,20 @@ int __stdcall WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPS freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); + // Initialize the console values + g_hStdout = GetStdHandle(STD_OUTPUT_HANDLE); + CONSOLE_SCREEN_BUFFER_INFO bufinf; + if(GetConsoleScreenBufferInfo(g_hStdout, &bufinf)) + { + g_wOriginalColors = bufinf.wAttributes & 0x00FF; + g_wBackgroundColor = bufinf.wAttributes & 0x00F0; + } + else + { + g_wOriginalColors = FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN; + g_wBackgroundColor = 0; + } + Banner(); Run(); FreeConsole(); @@ -236,14 +253,14 @@ int __stdcall WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPS void Banner() { - printf_c("\nWelcome to the \033[1mInspIRCd\033[0m Configuration program! (\033[1minteractive mode\033[0m)\n" - "\033[1mPackage maintainers: Type ./configure --help for non-interactive help\033[0m\n\n"); - printf_c("*** If you are unsure of any of these values, leave it blank for ***\n" - "*** standard settings that will work, and your server will run ***\n" - "*** using them. Please consult your IRC network admin if in doubt. ***\n\n" - "Press \033[1m<RETURN>\033[0m to accept the default for any option, or enter\n" - "a new value. Please note: You will \033[1mHAVE\033[0m to read the docs\n" - "dir, otherwise you won't have a config file!\n\n"); + std::cout << std::endl << "Welcome to the " << con_white_bright << "InspIRCd" << con_reset << " Configuration program! (" << con_white_bright << "interactive mode" << con_reset << ")" << std::endl + << con_white_bright << "Package maintainers: Type ./configure --help for non-interactive help" << con_reset << std::endl << std::endl + << "*** If you are unsure of any of these values, leave it blank for ***" << std::endl + << "*** standard settings that will work, and your server will run ***" << std::endl + << "*** using them. Please consult your IRC network admin if in doubt. ***" << std::endl << std::endl + << "Press " << con_white_bright << "<RETURN>" << con_reset << " to accept the default for any option, or enter" << std::endl + << "a new value. Please note: You will " << con_white_bright << "HAVE" << con_reset << " to read the docs" << std::endl + << "dir, otherwise you won't have a config file!" << std::endl << std::endl; } @@ -278,14 +295,14 @@ void Run() string branch(version); branch.erase(branch.find_last_of('.')); + std::cout << "Your operating system is: " << con_green << "Windows " << #ifdef _WIN64 - printf_c("Your operating system is: \033[1;32mWindows x64\033[0m\n"); + "x64 (64-bit)" #else - printf_c("Your operating system is: \033[1;32mWindows x86\033[0m\n"); + "x86 (32-bit)" #endif - printf_c("InspIRCd revision ID: \033[1;32m%s \033[0m\n\n", (!revision.empty() && revision != "0") ? revision.c_str() : "(Non-GIT build)"); - - printf_c("\033[1mExtra modules.\033[0m\n"); + << con_reset << std::endl << "InspIRCd revision ID: " << con_green << ( (!revision.empty() && revision != "0") ? revision : "(Non-GIT build)" ) << con_reset << std::endl << std::endl + << con_white_bright << "Extra modules." << con_reset << std::endl; if (get_bool_option("Do you want to compile any extra non-core modules?", false)) { string extra_i_path = get_string_option("Extra include search paths separate by \";\"", "."); @@ -295,7 +312,7 @@ void Run() extra_lib_paths = get_dir_list(extra_l_path); } - printf_c("\033[1mAll paths are relative to the binary directory.\033[0m\n"); + std::cout << con_white_bright << "All paths are relative to the binary directory." << con_reset << std::endl; string base_path = get_string_option("In what directory do you wish to install the InspIRCd base?", ".."); string config_path = get_string_option("In what directory are the configuration files?", "conf"); string mod_path = get_string_option("In what directory are the modules to be compiled to?", "modules"); @@ -303,25 +320,24 @@ void Run() string log_path = get_string_option("In what directory is the logs to be placed in?", "logs"); string bin_dir = get_string_option("In what directory is the IRCd binary to be placed?", "."); - printf_c("\n\033[1;32mPre-build configuration is complete!\n\n"); sc(TNORMAL); + std::cout << std::endl << con_green << "Pre-build configuration is complete!" << std::endl << std::endl; CopyExtras(); // dump all the options back out - printf_c("\033[0mBase install path:\033[1;32m\t%s\n", base_path.c_str()); - printf_c("\033[0mConfig path:\033[1;32m\t\t%s\n", config_path.c_str()); - printf_c("\033[0mModule path:\033[1;32m\t\t%s\n", mod_path.c_str()); - printf_c("\033[0mData path:\033[1;32m\t\t%s\n", data_path.c_str()); - printf_c("\033[0mLog path:\033[1;32m\t\t%s\n", log_path.c_str()); - printf_c("\033[0mSocket Engine:\033[1;32m\t\t%s\n", "select"); - - printf("\n"); sc(TNORMAL); + std::cout << con_reset << "Base install path:\t" << con_green << base_path << std::endl + << con_reset << "Config path:\t" << con_green << config_path << std::endl + << con_reset << "Module path:\t" << con_green << mod_path << std::endl + << con_reset << "Data path:\t"<< con_green << data_path << std::endl + << con_reset << "Log path:\t" << con_green << log_path << std::endl + << con_reset << "Socket Engine:\t" << con_green << "select" << con_reset << std::endl; + if(get_bool_option("Are these settings correct?", true) == false) { Run(); return; } - printf("\n"); + std::cout << std::endl; // escape the pathes escape_string(data_path); @@ -347,7 +363,7 @@ void Run() fprintf(f, "#endif\n\n"); fclose(f); - sc(TGREEN); printf(" done\n"); sc(TNORMAL); + std::cout << con_green << "done" << con_reset << std::endl; printf("Writing inspircd_version.h..."); f = fopen("..\\include\\inspircd_version.h", "w"); fprintf(f, "#define BRANCH \"%s\"\n", branch.c_str()); @@ -356,11 +372,11 @@ void Run() fprintf(f, "#define SYSTEM \"%s\"\n", machine_text); fclose(f); - sc(TGREEN); printf(" done\n"); sc(TNORMAL); + std::cout << con_green << "done" << con_reset << std::endl; printf("Writing command and module compilation scripts..."); WriteCompileCommands(); WriteCompileModules(extra_include_paths, extra_lib_paths); - sc(TGREEN); printf(" done\n"); sc(TNORMAL); + std::cout << con_green << "done" << con_reset << std::endl; printf("\nconfigure is done.. exiting!\n"); } @@ -390,8 +406,7 @@ void CopyExtras() { fclose(x); CopyFileA(src, dest, false); - sc(TGREEN); printf(" %s", fd.cFileName); sc(TNORMAL); - printf("...\n"); + std::cout << con_green << "\t" << fd.cFileName << con_reset << "..." << std::endl; } } while (FindNextFileA(fh, &fd)); @@ -409,10 +424,10 @@ void WriteCompileCommands() WIN32_FIND_DATAA fd; HANDLE fh = FindFirstFileA("..\\src\\commands\\cmd_*.cpp", &fd); if(fh == INVALID_HANDLE_VALUE) - printf_c("\033[1;32m No command sources could be found! This \033[1m*could*\033[1;32m be a bad thing.. :P\033[0m"); + std::cout << con_green << " No command sources could be found! This *could* be a bad thing.. :P" << con_reset << std::endl; else { - sc(TGREEN); + std::cout << con_green; do { strcpy(commands[command_count], fd.cFileName); @@ -420,7 +435,7 @@ void WriteCompileCommands() printf(" %s\n", commands[command_count]); ++command_count; } while(FindNextFileA(fh, &fd)); - sc(TNORMAL); + std::cout << con_reset; } // Write our spiffy new makefile :D @@ -476,10 +491,10 @@ void WriteCompileModules(const vector<string> &includes, const vector<string> &l WIN32_FIND_DATAA fd; HANDLE fh = FindFirstFileA("..\\src\\modules\\m_*.cpp", &fd); if(fh == INVALID_HANDLE_VALUE) - printf_c("\033[1;32m No module sources could be found! This \033[1m*could*\033[1;32m be a bad thing.. :P\033[0m"); + std::cout << con_green << " No module sources could be found! This *could* be a bad thing.. :P" << con_reset << std::endl; else { - sc(TGREEN); + std::cout << con_green; do { strcpy(modules[module_count], fd.cFileName); @@ -487,7 +502,7 @@ void WriteCompileModules(const vector<string> &includes, const vector<string> &l printf(" %s\n", modules[module_count]); ++module_count; } while(FindNextFileA(fh, &fd)); - sc(TNORMAL); + std::cout << con_reset; } string extra_include, extra_lib; diff --git a/win/configure.vcxproj b/win/configure.vcxproj index 5e1fd897d..df1175712 100644 --- a/win/configure.vcxproj +++ b/win/configure.vcxproj @@ -203,9 +203,6 @@ </Link>
</ItemDefinitionGroup>
<ItemGroup>
- <ClInclude Include="colors.h" />
- </ItemGroup>
- <ItemGroup>
<ClCompile Include="configure.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
diff --git a/win/inspircd.vcxproj b/win/inspircd.vcxproj index c4901cdf1..3087a966d 100644 --- a/win/inspircd.vcxproj +++ b/win/inspircd.vcxproj @@ -338,6 +338,7 @@ nmake -f modules.mak <ClInclude Include="..\include\channels.h" /> <ClInclude Include="..\include\command_parse.h" /> <ClInclude Include="..\include\configreader.h" /> + <ClInclude Include="..\include\consolecolors.h" /> <ClInclude Include="..\include\ctables.h" /> <ClInclude Include="..\include\cull_list.h" /> <ClInclude Include="..\include\dns.h" /> @@ -370,7 +371,6 @@ nmake -f modules.mak <ClInclude Include="..\include\u_listmode.h" /> <ClInclude Include="..\include\wildcard.h" /> <ClInclude Include="..\include\xline.h" /> - <ClInclude Include="colors.h" /> <ClInclude Include="inspircd_win32wrapper.h" /> <ClInclude Include="win32service.h" /> </ItemGroup> diff --git a/win/inspircd_win32wrapper.cpp b/win/inspircd_win32wrapper.cpp index 26d154898..a451dd0df 100644 --- a/win/inspircd_win32wrapper.cpp +++ b/win/inspircd_win32wrapper.cpp @@ -25,12 +25,9 @@ #include "inspircd_win32wrapper.h" #include "inspircd.h" #include "configreader.h" -#include "colors.h" #include <string> #include <errno.h> #include <assert.h> -#include <mmsystem.h> -#pragma comment(lib, "Winmm.lib") CoreExport const char *insp_inet_ntop(int af, const void *src, char *dst, socklen_t cnt) { diff --git a/win/inspircd_win32wrapper.h b/win/inspircd_win32wrapper.h index 1f9936caf..d60276b88 100644 --- a/win/inspircd_win32wrapper.h +++ b/win/inspircd_win32wrapper.h @@ -106,9 +106,6 @@ __inline int inet_aton(const char *cp, struct in_addr *addr) return (addr->s_addr == INADDR_NONE) ? 0 : 1; }; -/* Handles colors in printf */ -int printf_c(const char * format, ...); - /* getopt() wrapper */ #define no_argument 0 #define required_argument 1 diff --git a/win/win32service.cpp b/win/win32service.cpp index b677b6662..81f8e7516 100644 --- a/win/win32service.cpp +++ b/win/win32service.cpp @@ -24,6 +24,7 @@ #include <stdlib.h> #include <string.h> #include <stdio.h> +#include <iostream> static SERVICE_STATUS_HANDLE serviceStatusHandle; static HANDLE hThreadEvent; @@ -244,7 +245,7 @@ void InstallService() scm = OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE); if (!scm) { - printf("Unable to open service control manager: %s\n", RetrieveLastError()); + std::cout << "Unable to open service control manager: " << RetrieveLastError() << std::endl; return; } @@ -253,7 +254,7 @@ void InstallService() if (!myService) { - printf("Unable to create service: %s\n", RetrieveLastError()); + std::cout << "Unable to create service: " << RetrieveLastError() << std::endl; CloseServiceHandle(scm); return; } @@ -274,7 +275,7 @@ void InstallService() BOOL success = ChangeServiceConf(myService,SERVICE_CONFIG_DESCRIPTION, &svDesc); if (!success) { - printf("Unable to set service description: %s\n", RetrieveLastError()); + std::cout << "Unable to set service description: " << RetrieveLastError() << std::endl; CloseServiceHandle(myService); CloseServiceHandle(scm); return; @@ -283,7 +284,7 @@ void InstallService() FreeLibrary(advapi32); } - printf("Service installed.\n"); + std::cout << "Service installed." << std::endl; CloseServiceHandle(myService); CloseServiceHandle(scm); } @@ -296,27 +297,27 @@ void RemoveService() scm = OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE); if (!scm) { - printf("Unable to open service control manager: %s\n", RetrieveLastError()); + std::cout << "Unable to open service control manager: " << RetrieveLastError() << std::endl; return; } myService = OpenService(scm,TEXT("InspIRCd"),SERVICE_ALL_ACCESS); if (!myService) { - printf("Unable to open service: %s\n", RetrieveLastError()); + std::cout << "Unable to open service: " << RetrieveLastError() << std::endl; CloseServiceHandle(scm); return; } if (!DeleteService(myService)) { - printf("Unable to delete service: %s\n", RetrieveLastError()); + std::cout << "Unable to delete service: " << RetrieveLastError() << std::endl; CloseServiceHandle(myService); CloseServiceHandle(scm); return; } - printf("Service removed.\n"); + std::cout << "Service removed." << std::endl; CloseServiceHandle(myService); CloseServiceHandle(scm); } |