diff options
author | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-03-24 18:50:40 +0000 |
---|---|---|
committer | brain <brain@e03df62e-2008-0410-955e-edbf42e46eb7> | 2007-03-24 18:50:40 +0000 |
commit | 922069afab3804acdd53b5daeef35e6a603d43b2 (patch) | |
tree | 5d5942043e20bf370e277f293f33db0124e4bea1 | |
parent | 97d1b1791c4af29212cd647c2a327e63f05ab008 (diff) |
Fix two things: (1) log gets replaced by a user fd after restart causing debug log to go to a user's status window (!)
(2) restart failing due to segfault within libc (this is because some moron decided that stdin, stdout, and stderr should still be non-null if the files arent actually open!)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6707 e03df62e-2008-0410-955e-edbf42e46eb7
-rw-r--r-- | src/inspircd.cpp | 71 | ||||
-rw-r--r-- | src/socket.cpp | 8 | ||||
-rw-r--r-- | src/users.cpp | 1 |
3 files changed, 67 insertions, 13 deletions
diff --git a/src/inspircd.cpp b/src/inspircd.cpp index af2672102..2ec941708 100644 --- a/src/inspircd.cpp +++ b/src/inspircd.cpp @@ -126,7 +126,25 @@ void InspIRCd::Restart(const std::string &reason) /* Figure out our filename (if theyve renamed it, we're boned) */ std::string me = Config->MyDir + "/inspircd"; - if (execv(me.c_str(), Config->argv) == -1) + char* argv[10]; + int endp = 2; + argv[0] = Config->argv[0]; + argv[1] = "--restart"; + if (Config->forcedebug) + argv[endp++] = "--debug"; + if (Config->nofork) + argv[endp++] = "--nofork"; + if (!Config->writelog) + argv[endp++] = "--nolog"; + if (*this->LogFileName) + { + argv[endp++] = "--logfile"; + argv[endp++] = this->LogFileName; + } + + argv[endp] = NULL; + + if (execv(me.c_str(), argv) == -1) { /* Will raise a SIGABRT if not trapped */ throw CoreException(std::string("Failed to execv()! error: ") + strerror(errno)); @@ -277,7 +295,7 @@ InspIRCd::InspIRCd(int argc, char** argv) { int found_ports = 0; FailedPortList pl; - int do_nofork = 0, do_debug = 0, do_nolog = 0; /* flag variables */ + int do_nofork = 0, do_debug = 0, do_nolog = 0, do_restart = 0; /* flag variables */ char c = 0; modules.resize(255); @@ -318,6 +336,7 @@ InspIRCd::InspIRCd(int argc, char** argv) { "logfile", required_argument, NULL, 'f' }, { "debug", no_argument, &do_debug, 1 }, { "nolog", no_argument, &do_nolog, 1 }, + { "restart", no_argument, &do_restart, 1 }, { 0, 0, 0, 0 } }; @@ -335,7 +354,7 @@ InspIRCd::InspIRCd(int argc, char** argv) break; default: /* Unknown parameter! DANGER, INTRUDER.... err.... yeah. */ - printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>]\n", argv[0]); + printf("Usage: %s [--nofork] [--nolog] [--debug] [--logfile <filename>] [--restart]\n", argv[0]); Exit(EXIT_STATUS_ARGV); break; } @@ -369,11 +388,13 @@ InspIRCd::InspIRCd(int argc, char** argv) printf("\n"); this->SetSignals(); + if (!Config->nofork) { if (!this->DaemonSeed()) { printf("ERROR: could not go into daemon mode. Shutting down.\n"); + Log(DEFAULT,"ERROR: could not go into daemon mode. Shutting down."); Exit(EXIT_STATUS_FORK); } } @@ -394,6 +415,7 @@ InspIRCd::InspIRCd(int argc, char** argv) if ((stats->BoundPortCount == 0) && (found_ports > 0)) { printf("\nERROR: I couldn't bind any ports! Are you sure you didn't start InspIRCd twice?\n"); + Log(DEFAULT,"ERROR: I couldn't bind any ports! Are you sure you didn't start InspIRCd twice?"); Exit(EXIT_STATUS_BIND); } @@ -416,20 +438,46 @@ InspIRCd::InspIRCd(int argc, char** argv) if (!SE->AddFd(Config->openSockfd[count])) { printf("\nEH? Could not add listener to socketengine. You screwed up, aborting.\n"); + Log(DEFAULT,"EH? Could not add listener to socketengine. You screwed up, aborting."); Exit(EXIT_STATUS_INTERNAL); } } - if (!Config->nofork) + if (!Config->nofork && !do_restart) { + int closed = 0; + if (kill(getppid(), SIGTERM) == -1) + { printf("Error killing parent process: %s\n",strerror(errno)); - fclose(stdin); - fclose(stderr); - fclose(stdout); + Log(DEFAULT,"Error killing parent process: %s",strerror(errno)); + } + + /*Log(DEBUG,"Fileno(stdin, stdout, stderr): %d %d %d", fileno(stdin), fileno(stdout), fileno(stderr));*/ + + if (stdin) + { + fclose(stdin); + closed++; + } + + if (stdout) + { + fclose(stdout); + closed++; + } + + if (stderr) + { + fclose(stderr); + closed++; + } + + Log(DEBUG,"%d system descriptors closed.", closed); } printf("\nInspIRCd is now running!\n"); + Log(DEFAULT,"Startup complete, Initial TS=%d.", time(NULL)); this->WritePID(Config->PID); } @@ -1001,10 +1049,11 @@ void FileLogger::WriteLogLine(const std::string &line) /* Wrote the whole buffer, and no need for write callback */ buffer = ""; } - } - if (writeops++ % 20) - { - fflush(log); + + if (writeops++ % 20) + { + fflush(log); + } } } diff --git a/src/socket.cpp b/src/socket.cpp index 67931e49b..7a746ba0f 100644 --- a/src/socket.cpp +++ b/src/socket.cpp @@ -55,8 +55,10 @@ ListenSocket::~ListenSocket() { if (this->GetFd() > -1) { - shutdown(this->fd, 2); - close(this->fd); + ServerInstance->SE->DelFd(this); + ServerInstance->Log(DEBUG,"Shut down listener on fd %d", this->fd); + if (shutdown(this->fd, 2) || close(this->fd)) + ServerInstance->Log(DEBUG,"Failed to cancel listener: %s", strerror(errno)); this->fd = -1; } } @@ -419,12 +421,14 @@ bool InspIRCd::BindSocket(int sockfd, int port, char* addr, bool dolisten) } else { + this->Log(DEBUG,"New socket binding for %d with listen: %s:%d", sockfd, addr, port); NonBlocking(sockfd); return true; } } else { + this->Log(DEBUG,"New socket binding for %d without listen: %s:%d", sockfd, addr, port); return true; } } diff --git a/src/users.cpp b/src/users.cpp index 48260bd1f..11d1cf130 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -417,6 +417,7 @@ char* userrec::MakeHostIP() void userrec::CloseSocket() { + ServerInstance->Log(DEBUG,"Close user socket %d", this->fd); shutdown(this->fd,2); close(this->fd); } |