updated contact info in source file headers
[rocksndiamonds.git] / src / netserv.c
index 692265338b597df45b8b62510eb2bb736da08919..5ecbf1b72082c7586a3f3604ffbbd5299c5d67cc 100644 (file)
@@ -1,15 +1,13 @@
-/***********************************************************
-* Rocks'n'Diamonds -- McDuffin Strikes Back!               *
-*----------------------------------------------------------*
-* (c) 1995-2002 Artsoft Entertainment                      *
-*               Holger Schemel                             *
-*               Detmolder Strasse 189                      *
-*               33604 Bielefeld                            *
-*               Germany                                    *
-*               e-mail: info@artsoft.org                   *
-*----------------------------------------------------------*
-* netserv.c                                                *
-***********************************************************/
+// ============================================================================
+// Rocks'n'Diamonds - McDuffin Strikes Back!
+// ----------------------------------------------------------------------------
+// (c) 1995-2014 by Artsoft Entertainment
+//                         Holger Schemel
+//                 info@artsoft.org
+//                 http://www.artsoft.org/
+// ----------------------------------------------------------------------------
+// netserv.c
+// ============================================================================
 
 #include "libgame/platform.h"
 
@@ -77,7 +75,7 @@ static unsigned char realbuffer[512], *buffer = realbuffer + 4;
 
 static int interrupt;
 
-static unsigned long ServerFrameCounter = 0;
+static unsigned int ServerFrameCounter = 0;
 
 static void addtobuffer(struct NetworkServerPlayerInfo *player,
                        unsigned char *b, int len)
@@ -97,7 +95,8 @@ static void flushuser(struct NetworkServerPlayerInfo *player)
 #if defined(TARGET_SDL)
     SDLNet_TCP_Send(player->fd, player->writbuffer, player->nwrite);
 #else
-    write(player->fd, player->writbuffer, player->nwrite);
+    if (write(player->fd, player->writbuffer, player->nwrite) == -1)
+      Error(ERR_WARN, "write() failed; %s", strerror(errno));
 #endif
     player->nwrite = 0;
   }
@@ -203,7 +202,6 @@ static void AddPlayer(int fd)
 
   nxn = 1;
 
-#if 1
   while (again)
   {
     again = FALSE;
@@ -221,19 +219,6 @@ static void AddPlayer(int fd)
       v = v->next;
     }
   }
-#else
- again:
-  v = player->next;
-  while (v)
-  {
-    if (v->number == nxn)
-    {
-      nxn++;
-      goto again;
-    }
-    v = v->next;
-  }
-#endif
 
   player->number = nxn;
 #if !defined(TARGET_SDL)
@@ -307,11 +292,11 @@ static void Handle_OP_NUMBER_WANTED(struct NetworkServerPlayerInfo *player)
       Error(ERR_NETWORK_SERVER, "client %d (%s) switches to # %d",
            player->number, player->player_name, nr_wanted);
     else if (player->number == nr_wanted)
-      Error(ERR_NETWORK_SERVER, "client %d (%s) still has # %d",
+      Error(ERR_NETWORK_SERVER, "client %d (%s) already has # %d",
            player->number, player->player_name, nr_wanted);
     else
       Error(ERR_NETWORK_SERVER,
-           "client %d (%s) cannot switch (client %d still exists)",
+           "client %d (%s) cannot switch (client %d already exists)",
            player->number, player->player_name, nr_wanted);
   }
 
@@ -389,11 +374,11 @@ static void Handle_OP_START_PLAYING(struct NetworkServerPlayerInfo *player)
 
   if (options.verbose)
     Error(ERR_NETWORK_SERVER,
-         "client %d (%s) starts game [level %d from levedir %d (%s)]",
+         "client %d (%s) starts game [level %d from leveldir %d (%s)]",
          player->number, player->player_name,
          (buffer[2] << 8) + buffer[3],
          (buffer[4] << 8) + buffer[5],
-         &buffer[6]);
+         &buffer[10]);
 
   for (w = first_player; w; w = w->next)
     if (w->introduced)
@@ -402,6 +387,8 @@ static void Handle_OP_START_PLAYING(struct NetworkServerPlayerInfo *player)
   /* reset frame counter */
   ServerFrameCounter = 0;
 
+  Error(ERR_NETWORK_SERVER, "resetting ServerFrameCounter to 0");
+
   /* reset player actions */
   for (v = first_player; v; v = v->next)
   {
@@ -430,10 +417,12 @@ static void Handle_OP_CONTINUE_PLAYING(struct NetworkServerPlayerInfo *player)
 
 static void Handle_OP_STOP_PLAYING(struct NetworkServerPlayerInfo *player)
 {
+  int cause_for_stopping = buffer[2];
+
   if (options.verbose)
-    Error(ERR_NETWORK_SERVER, "client %d (%s) stops game",
-         player->number, player->player_name);
-  broadcast(NULL, 2, 0);
+    Error(ERR_NETWORK_SERVER, "client %d (%s) stops game [%d]",
+         player->number, player->player_name, cause_for_stopping);
+  broadcast(NULL, 3, 0);
 }
 
 static void Handle_OP_MOVE_PLAYER(struct NetworkServerPlayerInfo *player)
@@ -481,6 +470,11 @@ static void Handle_OP_MOVE_PLAYER(struct NetworkServerPlayerInfo *player)
 
   broadcast(NULL, 6 + last_client_nr, 0);
 
+#if 0
+  Error(ERR_NETWORK_SERVER, "sending ServerFrameCounter value %d",
+       ServerFrameCounter);
+#endif
+
   ServerFrameCounter++;
 }
 
@@ -591,7 +585,8 @@ void NetworkServer(int port, int serveronly)
     setsid();
     if (fork())
       exit(0);
-    chdir("/");
+    if (chdir("/") == -1)
+      Error(ERR_WARN, "chdir() failed; %s", strerror(errno));
 
     /* open a fake stdin, stdout, stderr, just in case */
     open("/dev/null", O_RDONLY);
@@ -617,7 +612,8 @@ void NetworkServer(int port, int serveronly)
 #if defined(TARGET_SDL)
     if ((sl = SDLNet_CheckSockets(fds, 500000)) < 1)
     {
-      Error(ERR_NETWORK_SERVER, SDLNet_GetError());
+      Error(ERR_NETWORK_SERVER, "SDLNet_CheckSockets failed: %s",
+           SDLNet_GetError());
       perror("SDLNet_CheckSockets");
     }
 
@@ -667,7 +663,8 @@ void NetworkServer(int port, int serveronly)
 
     if (FD_ISSET(lfd, &fds))
     {
-      int newfd, slen;
+      int newfd;
+      socklen_t slen;
 
       slen = sizeof(saddr);
       newfd = accept(lfd, (struct sockaddr *)&saddr, &slen);
@@ -745,7 +742,7 @@ void NetworkServer(int port, int serveronly)
            break;
          }
 
-         switch(buffer[1])
+         switch (buffer[1])
          {
            case OP_PLAYER_NAME:
              Handle_OP_PLAYER_NAME(player, len);