]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd_io.cpp
(Untested) added hashcomp.cpp, seperates out the stl hash_map stuff
[user/henk/code/inspircd.git] / src / inspircd_io.cpp
index 19f853ddbf4c47f4c69477577042b15a0fd3527c..fcbb83aaeb18a57cbc495f68cfda81a436b5f471 100644 (file)
 #include "inspircd_io.h"
 #include "inspircd_util.h"
 #include "inspstring.h"
+#include "helperfuncs.h"
 
 using namespace std;
 
 extern FILE *log_file;
+extern int boundPortCount;
+extern int openSockfd[MAXSOCKS];
+extern time_t TIME;
+extern bool unlimitcore;
 
 void WriteOpers(char* text, ...);
 
 void Exit (int status)
 {
-  if (log_file)
-       fclose(log_file);
-  send_error("Server shutdown.");
-  exit (status);
+       if (log_file)
+               fclose(log_file);
+       send_error("Server shutdown.");
+       exit (status);
 }
 
 void Killed(int status)
 {
-  if (log_file)
-       fclose(log_file);
-  send_error("Server terminated.");
-  exit(status);
+       if (log_file)
+               fclose(log_file);
+       send_error("Server terminated.");
+       exit(status);
 }
 
 void Rehash(int status)
 {
-  WriteOpers("Rehashing config file %s due to SIGHUP",CONFIG_FILE);
-  ReadConfig(false,NULL);
+       WriteOpers("Rehashing config file %s due to SIGHUP",CONFIG_FILE);
+       ReadConfig(false,NULL);
 }
 
 
 
 void Start (void)
 {
-  printf("\033[1;37mInspire Internet Relay Chat Server, compiled " __DATE__ " at " __TIME__ "\n");
-  printf("(C) ChatSpike Development team.\033[0;37m\n\n");
-  printf("\033[1;37mDevelopers:\033[0;37m     Brain, FrostyCoolSlug\n");
-  printf("\033[1;37mDocumentation:\033[0;37m  FrostyCoolSlug, w00t\n");
-  printf("\033[1;37mTesters:\033[0;37m        typobox43, piggles, Lord_Zathras, CC\n");
-  printf("\033[1;37mName concept:\033[0;37m   Lord_Zathras\n\n");
+       printf("\033[1;32mInspire Internet Relay Chat Server, compiled %s at %s\n",__DATE__,__TIME__);
+       printf("(C) ChatSpike Development team.\033[0m\n\n");
+       printf("Developers:\033[1;32m     Brain, FrostyCoolSlug\033[0m\n");
+       printf("Documentation:\033[1;32m  FrostyCoolSlug, w00t\033[0m\n");
+       printf("Testers:\033[1;32m        typobox43, piggles, Lord_Zathras, CC\033[0m\n");
+       printf("Name concept:\033[1;32m   Lord_Zathras\033[0m\n\n");
 }
 
 void WritePID(std::string filename)
@@ -78,40 +83,49 @@ void WritePID(std::string filename)
        else
        {
                printf("Failed to write PID-file '%s', exiting.\n",filename.c_str());
+               log(DEFAULT,"Failed to write PID-file '%s', exiting.",filename.c_str());
                Exit(0);
        }
 }
 
-void DeadPipe(int status)
-{
-  signal (SIGPIPE, DeadPipe);
-}
 
 int DaemonSeed (void)
 {
-  int childpid;
-  signal (SIGALRM, SIG_IGN);
-  signal (SIGHUP, Rehash);
-  signal (SIGPIPE, DeadPipe);
-  signal (SIGTERM, Exit);
-  signal (SIGABRT, Exit);
-  signal (SIGSEGV, Error);
-  signal (SIGURG, Exit);
-  signal (SIGKILL, Exit);
-  if ((childpid = fork ()) < 0)
-    return (ERROR);
-  else if (childpid > 0)
-    exit (0);
-  setsid ();
-  umask (007);
-  /* close stdout, stdin, stderr */
-  close(0);
-  close(1);
-  close(2);
-
-  setpriority(PRIO_PROCESS,(int)getpid(),15); /* ircd sets to low process priority so it doesnt hog the box */
+       int childpid;
+       signal (SIGALRM, SIG_IGN);
+       signal (SIGHUP, Rehash);
+       signal (SIGPIPE, SIG_IGN);
+       signal (SIGTERM, Exit);
+       signal (SIGSEGV, Error);
+       if ((childpid = fork ()) < 0)
+               return (ERROR);
+       else if (childpid > 0)
+               exit (0);
+       setsid ();
+       umask (007);
+       printf("InspIRCd Process ID: \033[1;32m%lu\033[0m\n",(unsigned long)getpid());
+       freopen("/dev/null","w",stdout);
+       freopen("/dev/null","w",stderr);
+       
+       setpriority(PRIO_PROCESS,(int)getpid(),15);
+
+       if (unlimitcore)
+       {
+               rlimit rl;
+               if (getrlimit(RLIMIT_CORE, &rl) == -1)
+               {
+                       log(DEFAULT,"Failed to getrlimit()!");
+                       return(FALSE);
+               }
+               else
+               {
+                       rl.rlim_cur = rl.rlim_max;
+                       if (setrlimit(RLIMIT_CORE, &rl) == -1)
+                               log(DEFAULT,"setrlimit() failed, cannot increase coredump size.");
+               }
+       }
   
-  return (TRUE);
+       return (TRUE);
 }
 
 
@@ -123,10 +137,16 @@ int DaemonSeed (void)
 
 bool FileExists (const char* file)
 {
-  FILE *input;
-  
-  if ((input = fopen (file, "r")) == NULL) { return(false); }
-  else { fclose (input); return(true); }
+       FILE *input;
+       if ((input = fopen (file, "r")) == NULL)
+       {
+               return(false);
+       }
+       else
+       {
+               fclose (input);
+               return(true);
+       }
 }
 
 /* ConfProcess does the following things to a config line in the following order:
@@ -268,12 +288,16 @@ bool LoadConf(const char* filename, std::stringstream *target, std::stringstream
        target->str("");
        errorstream->str("");
        long linenumber = 1;
-       FILE* conf = fopen(filename,"r");
+       // first, check that the file exists before we try to do anything with it
        if (!FileExists(filename))
        {
                *errorstream << "File " << filename << " not found." << endl;
                return false;
        }
+       // Fix the chmod of the file to restrict it to the current user and group
+       chmod(filename,0600);
+       // now open it
+       FILE* conf = fopen(filename,"r");
        char buffer[MAXBUF];
        if (conf)
        {
@@ -309,8 +333,7 @@ int EnumConf(std::stringstream *config, const char* tag)
 {
        int ptr = 0;
        char buffer[MAXBUF], c_tag[MAXBUF], c, lastc;
-       int in_token, in_quotes, tptr, j, idx = 0;
-       char* key;
+       int in_token, in_quotes, tptr, idx = 0;
 
        const char* buf = config->str().c_str();
        long bptr = 0;
@@ -380,8 +403,7 @@ int EnumValues(std::stringstream *config, const char* tag, int index)
 {
        int ptr = 0;
        char buffer[MAXBUF], c_tag[MAXBUF], c, lastc;
-       int in_token, in_quotes, tptr, j, idx = 0;
-       char* key;
+       int in_token, in_quotes, tptr, idx = 0;
        
        bool correct_tag = false;
        int num_items = 0;
@@ -484,7 +506,7 @@ int ReadConf(std::stringstream *config, const char* tag, const char* var, int in
 
        const char* buf = config->str().c_str();
        long bptr = 0;
-       long len = strlen(buf);
+       long len = config->str().length();
        
        ptr = 0;
        in_token = 0;
@@ -593,54 +615,51 @@ int ConfValue(char* tag, char* var, int index, char *result,std::stringstream *c
 
 
 
-/* This will bind a socket to a port. It works for UDP/TCP */
+// This will bind a socket to a port. It works for UDP/TCP
 int BindSocket (int sockfd, struct sockaddr_in client, struct sockaddr_in server, int port, char* addr)
 {
-  bzero((char *)&server,sizeof(server));
-  struct in_addr addy;
-  inet_aton(addr,&addy);
-
-  server.sin_family = AF_INET;
-  if (!strcmp(addr,""))
-  {
-         server.sin_addr.s_addr = htonl(INADDR_ANY);
-  }
-  else
-  {
-         server.sin_addr = addy;
-  }
-
-  server.sin_port = htons(port);
-
-  if (bind(sockfd,(struct sockaddr*)&server,sizeof(server))<0)
-  {
-    return(ERROR);
-  }
-  else
-  {
-    listen(sockfd,5);
-    return(TRUE);
-  }
+       bzero((char *)&server,sizeof(server));
+       struct in_addr addy;
+       inet_aton(addr,&addy);
+       server.sin_family = AF_INET;
+       if (!strcmp(addr,""))
+       {
+               server.sin_addr.s_addr = htonl(INADDR_ANY);
+       }
+       else
+       {
+               server.sin_addr = addy;
+       }
+       server.sin_port = htons(port);
+       if (bind(sockfd,(struct sockaddr*)&server,sizeof(server))<0)
+       {
+               return(ERROR);
+       }
+       else
+       {
+               listen(sockfd,5);
+               return(TRUE);
+       }
 }
 
 
-/* Open a TCP Socket */
+// Open a TCP Socket
 int OpenTCPSocket (void)
 {
-  int sockfd;
-  int on = 0;
-  struct linger linger = { 0 };
+       int sockfd;
+       int on = 1;
+       struct linger linger = { 0 };
   
-  if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0)
-    return (ERROR);
-  else
-  {
-    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on));
-    /* This is BSD compatible, setting l_onoff to 0 is *NOT* http://web.irc.org/mla/ircd-dev/msg02259.html */
-    linger.l_onoff = 1;
-    linger.l_linger = 0;
-    setsockopt(sockfd, SOL_SOCKET, SO_LINGER, (const char*)&linger,sizeof(linger));
-    return (sockfd);
-  }
+       if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0)
+               return (ERROR);
+       else
+       {
+               setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on));
+               /* This is BSD compatible, setting l_onoff to 0 is *NOT* http://web.irc.org/mla/ircd-dev/msg02259.html */
+               linger.l_onoff = 1;
+               linger.l_linger = 1;
+               setsockopt(sockfd, SOL_SOCKET, SO_LINGER, (const char*)&linger,sizeof(linger));
+               return (sockfd);
+       }
 }