]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/tcpclient.cpp
Fixed some p10, bugs, and gameserv is now running as a true daemon with pid outputtin...
[irc/gameservirc.git] / gameserv / tcpclient.cpp
index d3cc364f76771b6f0124a9741f321fb41fb8a4f6..b8b2752d783c864c71a884066ab78555c8736ec9 100644 (file)
 #include <string.h>
 #include <fstream>
 #include <stdlib.h>
+#include <fcntl.h>
+#include <signal.h>
+//#include <sys/types.h>
+//#include <sys/wait.h>
+//#include <errno.h>
+
+
 
 using std::ofstream;
 using std::ifstream;
+using std::cerr;
+using std::endl;
 
 char *PACKAGE = "GameServ";
-char *VERSION = "1.1.7";
+char *VERSION = "1.1.8";
 
 int sock;
 long timestamp;
@@ -37,6 +46,12 @@ List<aClient> clients;
 void save_timestamp();
 void load_timestamp();
 
+// Make this a daemon
+int daemon(int nochdir, int noclose);
+
+// Close all file descriptors from >= fd
+void closeall(int fd);
+
 int main()
 {
   char buffer[1024], buf[1024];
@@ -47,6 +62,13 @@ int main()
 
   load_config_file();          // default = gameserv.conf
 
+    // Turn into a daemon
+    if (daemon(1,0) < 0)
+    {
+        perror("Could not turn into a daemon");
+        exit(2);
+    }
+
   ignore_pipe();
   sock = make_connection(remoteport, SOCK_STREAM, remoteserver);
   if (sock == -1) {
@@ -191,9 +213,10 @@ int main()
       #else
        } else if (stricmp(cmd, "N") == 0 && strlen(source) == 2) {
            {   
-               char *nick;
+               char *nick, *realnick;
+               realnick = strtok(NULL, " ");
 
-               for (int x = 0; x < 6; x++)
+               for (int x = 0; x < 5; x++)
                      nick = strtok(NULL, " ");
 
                if (nick[0] == '+')
@@ -218,9 +241,19 @@ int main()
 
                nick = strtok(NULL, " ");
 
-               newuser = new aClient(nick);
+               #ifdef P10
+                   newuser = new aClient(nick, realnick);
+               #else
+                   newuser = new aClient(nick);
+               #endif
+
+
                if (loaded)
+               #ifdef P10
+                   notice(s_GameServ, nick, welcomemsg, realnick);
+               #else
                    notice(s_GameServ, nick, welcomemsg, nick);
+               #endif
 
                clients.insertAtBack(newuser);
                delete newuser;
@@ -342,6 +375,26 @@ aClient *find(const char *nick)
        return findbynick(nick);
 }
 
+#ifdef P10
+
+aClient *findbyrealnick(char *realnick)
+{
+   ListNode <aClient> *newPtr;
+    newPtr = clients.First();
+
+    aClient *client = NULL;
+
+    while (newPtr)
+    {
+       client = newPtr->getData();
+           if (stricmp(client->getRealNick(), realnick) == 0)
+           return client;
+       client = NULL;
+       newPtr = newPtr->Next();
+    }
+    return client;    
+}
+#endif
 
 aClient *findbynick(char *nick)
 {
@@ -468,3 +521,68 @@ long int midnight(long int offset)
 {
     return (time(NULL) - (time(NULL) % 86400)) + (offset * 3600);
 }
+
+/* daemon() - detach process from user and disappear into the background
+ * returns -1 on failure, but you can't do much except exit in that case
+ * since we may already have forked. This is based on the BSD version,
+ * so the caller is responsible for things like the umask, etc.
+ */
+
+/* believed to work on all Posix systems */
+
+int daemon(int nochdir, int noclose)
+{
+    pid_t pid;
+    switch (pid = fork())
+    {
+        case 0:  break;
+        case -1: return -1;
+        default: _exit(0);          /* exit the original process */
+    }
+
+    if (setsid() < 0)               /* shoudn't fail */
+      return -1;
+
+    /* dyke out this switch if you want to acquire a control tty in */
+    /* the future -- not normally advisable for daemons */
+
+    switch (pid = fork())
+    {
+        case 0:  break;
+        case -1: return -1;
+        default: 
+               ofstream outfile;
+               outfile.open("gameserv.pid");
+               if (outfile.fail())
+                   cerr << "Unable to open gameserv.pid" << endl;
+               outfile << pid << endl;
+               outfile.close();
+
+       _exit(0);
+    }
+
+    if (!nochdir)
+      chdir("/");
+
+    if (!noclose)
+    {
+        closeall(0);
+        open("/dev/null",O_RDWR);
+        dup(0); dup(0);
+    }
+
+    return 0;
+}
+
+
+/* closeall() -- close all FDs >= a specified value */
+
+void closeall(int fd)
+{
+    int fdlimit = sysconf(_SC_OPEN_MAX);
+
+    while (fd < fdlimit)
+      close(fd++);
+}
+
+