summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2005-04-03 18:39:10 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2005-04-03 18:39:10 +0000
commitadac447f46b50e2d5d4a43f2f1697ad2ccda788d (patch)
treeb2cc27a092c6c9c5243d715cbfa63562e5b221cd
parente408a82d5b8a0067e45397b563289717b94a9afb (diff)
Added code to shutdown listening sockets on exit
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@964 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r--src/inspircd.cpp4
-rw-r--r--src/inspircd_io.cpp178
2 files changed, 97 insertions, 85 deletions
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index 74682edb1..60fcbe378 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -99,7 +99,7 @@ extern std::vector<ircd_module*> factory;
std::vector<int> fd_reap;
extern int MODCOUNT;
-
+int openSockfd[MAXSOCKS];
bool nofork = false;
namespace nspace
@@ -3202,7 +3202,7 @@ int InspIRCd(void)
{
struct sockaddr_in client,server;
char addrs[MAXBUF][255];
- int openSockfd[MAXSOCKS], incomingSockfd, result = TRUE;
+ int incomingSockfd, result = TRUE;
socklen_t length;
int count = 0;
int selectResult = 0, selectResult2 = 0;
diff --git a/src/inspircd_io.cpp b/src/inspircd_io.cpp
index 685e84865..7330a3f6f 100644
--- a/src/inspircd_io.cpp
+++ b/src/inspircd_io.cpp
@@ -30,41 +30,50 @@
using namespace std;
extern FILE *log_file;
+extern int boundPortCount;
+extern int openSockfd[MAXSOCKS];
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.");
+
+ // close down all listening sockets
+ for (int count = 0; count < boundPortCount; count++)
+ {
+ shutdown(openSockfd[count], 2);
+ }
+
+ 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;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");
}
void WritePID(std::string filename)
@@ -89,29 +98,29 @@ void DeadPipe(int status)
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, 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 */
- return (TRUE);
+ return (TRUE);
}
@@ -123,10 +132,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:
@@ -597,54 +612,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 = 0;
+ 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 = 0;
+ setsockopt(sockfd, SOL_SOCKET, SO_LINGER, (const char*)&linger,sizeof(linger));
+ return (sockfd);
+ }
}