rnd-19981108-2
[rocksndiamonds.git] / src / network.c
index 126eb52351a7c2f916323a237ef9f3129735c0b0..890f405f91662423040114fc731f1db90c322af7 100644 (file)
@@ -62,23 +62,13 @@ int nread = 0, nwrite = 0;
 
 static void sysmsg(char *s)
 {
-  if (verbose)
+  if (options.verbose)
   {
     printf("** %s\n", s);
     fflush(stdout);
   }
 }
 
-static void *mmalloc(int n)
-{
-  void *r;
-
-  r = malloc(n);
-  if (r == NULL)
-    fatal("Out of memory");
-  return r;
-}
-
 static void u_sleep(int i)
 {
   struct timeval tm;
@@ -98,13 +88,13 @@ static void flushbuf()
 
 static void sendbuf(int len)
 {
-  if (network)
+  if (options.network)
   {
     realbuf[0] = realbuf[1] = realbuf[2] = 0;
     realbuf[3] = (unsigned char)len;
     buf[0] = 0;
     if (nwrite + 4 + len >= MAX_BUFFER_SIZE)
-      fatal("Internal error: send buffer overflow");
+      Error(ERR_EXIT, "internal error: network send buffer overflow");
     memcpy(writbuf + nwrite, realbuf, 4 + len);
     nwrite += 4 + len;
 
@@ -123,7 +113,8 @@ struct user *finduser(unsigned char c)
     if (u->nr == c)
       return u;
   
-  fatal("Protocol error: reference to non-existing user");
+  Error(ERR_EXIT, "protocol error: reference to non-existing user %d", c);
+
   return NULL; /* so that gcc -Wall doesn't complain */
 }
 
@@ -148,15 +139,15 @@ static void StartNetworkServer(int port)
   switch (fork())
   {
     case 0:
-      NetworkServer(port, serveronly);
+      NetworkServer(port, options.serveronly);
 
       /* never reached */
       exit(0);
 
     case -1:
-      Error(ERR_RETURN,
+      Error(ERR_WARN,
            "cannot create network server process - no network games");
-      network = FALSE;
+      options.network = FALSE;
       return;
 
     default:
@@ -165,7 +156,7 @@ static void StartNetworkServer(int port)
   }
 }
 
-BOOL ConnectToServer(char *host, int port)
+boolean ConnectToServer(char *host, int port)
 {
   struct hostent *hp;
   struct sockaddr_in s;
@@ -178,7 +169,8 @@ BOOL ConnectToServer(char *host, int port)
     {
       hp = gethostbyname(host);
       if (!hp)
-       fatal("Host not found");
+       Error(ERR_EXIT, "cannot locate host '%s'", host);
+
       s.sin_addr = *(struct in_addr *)(hp->h_addr_list[0]);
     }
   }
@@ -190,9 +182,11 @@ BOOL ConnectToServer(char *host, int port)
 
   s.sin_port = htons(port);
   s.sin_family = AF_INET;
+
   sfd = socket(PF_INET, SOCK_STREAM, 0);
   if (sfd < 0)
-    fatal("Out of file descriptors");
+    Error(ERR_EXIT, "out of file descriptors");
+
   if ((tcpproto = getprotobyname("tcp")) != NULL)
     setsockopt(sfd, tcpproto->p_proto, TCP_NODELAY, (char *)&on, sizeof(int));
 
@@ -208,18 +202,22 @@ BOOL ConnectToServer(char *host, int port)
       {
        u_sleep(500000);
        close(sfd);
+
        sfd = socket(PF_INET, SOCK_STREAM, 0);
        if (sfd < 0)
-         fatal("Out of file descriptors");
-       setsockopt(sfd, tcpproto->p_proto, TCP_NODELAY, (char *)&on, sizeof(int));
+         Error(ERR_EXIT, "out of file descriptors");
+
+       setsockopt(sfd, tcpproto->p_proto, TCP_NODELAY,
+                  (char *)&on, sizeof(int));
+
        if (connect(sfd, (struct sockaddr *)&s, sizeof(s)) >= 0)
          break;
       }
       if (i==6)
-       fatal("Can't connect to server");
+       Error(ERR_EXIT, "cannot connect to server");
     }
     else
-      fatal("Can't connect to server");
+      Error(ERR_EXIT, "cannot connect to server");
   }
 
   return(TRUE);
@@ -305,7 +303,7 @@ void SendToServer_MovePlayer(byte player_action)
 
 static void Handle_OP_BAD_PROTOCOL_VERSION()
 {
-  Error(ERR_RETURN, "protocol version mismatch");
+  Error(ERR_WARN, "protocol version mismatch");
   Error(ERR_EXIT, "server expects %d.%d.x instead of %d.%d.%d",
        buf[2], buf[3], PROT_VERS_1, PROT_VERS_2, PROT_VERS_3);
 }
@@ -326,7 +324,6 @@ static void Handle_OP_YOUR_NUMBER()
 
     *new_local_player = *old_local_player;
     old_local_player->connected = FALSE;
-    old_local_player->local = FALSE;
 
     local_player = new_local_player;
   }
@@ -375,17 +372,15 @@ static void Handle_OP_NUMBER_WANTED()
 
       *new_player = *old_player;
       old_player->connected = FALSE;
-      old_player->local = FALSE;
     }
 
     u = finduser(old_client_nr);
     u->nr = new_client_nr;
 
-    if (old_client_nr == local_player->client_nr) /* local player switched */
+    if (old_player == local_player)            /* local player switched */
       local_player = new_player;
 
 
-
     TestPlayer = new_index_nr;
   }
   else if (old_client_nr == me.nr)             /* failed -- local player? */
@@ -432,7 +427,7 @@ static void Handle_OP_PLAYER_CONNECTED()
       v = u;
   }
 
-  v->next = u = mmalloc(sizeof(struct user));
+  v->next = u = checked_malloc(sizeof(struct user));
   u->nr = new_client_nr;
   u->name[0] = '\0';
   u->next = NULL;
@@ -483,25 +478,39 @@ static void Handle_OP_START_PLAYING()
 
 
   if (strcmp(leveldir[new_leveldir_nr].name, new_leveldir_name) != 0)
-    Error(ERR_RETURN, "no such level directory: '%s'",new_leveldir_name);
+    Error(ERR_WARN, "no such level directory: '%s'",new_leveldir_name);
 
   leveldir_nr = new_leveldir_nr;
 
+  /*
   local_player->leveldir_nr = leveldir_nr;
+  */
+
+
+  /*
+  SaveLevelSetup();
+  */
+
+  /*
   LoadPlayerInfo(PLAYER_LEVEL);
   SavePlayerInfo(PLAYER_SETUP);
+  */
+
 
   level_nr = new_level_nr;
 
   TapeErase();
-  LoadLevelTape(level_nr);
+  LoadTape(level_nr);
 
+  /*
   GetPlayerConfig();
+  */
+
   LoadLevel(level_nr);
 
 
 
-  if (autorecord_on)
+  if (setup.autorecord)
     TapeStartRecording();
 
 
@@ -571,7 +580,7 @@ static void Handle_OP_MOVE_FIGURE(unsigned int len)
 
   /* copy valid player actions */
   for (i=0; i<MAX_PLAYERS; i++)
-    network_player_action[i] =
+    stored_player[i].effective_action =
       (i < len - 6 && stored_player[i].active ? buf[6 + i] : 0);
 
   network_player_action_received = TRUE;
@@ -583,7 +592,7 @@ static void Handle_OP_MOVE_FIGURE(unsigned int len)
   */
 }
 
-static void handlemessages()
+static void HandleNetworkingMessages()
 {
   unsigned int len;
 
@@ -591,11 +600,11 @@ static void handlemessages()
   {
     len = readbuf[3];
     if (readbuf[0] || readbuf[1] || readbuf[2])
-      fatal("Wrong server line length");
+      Error(ERR_EXIT, "wrong network server line length");
 
     memcpy(buf, &readbuf[4], len);
     nread -= 4 + len;
-    copydown(readbuf, readbuf + 4 + len, nread);
+    memmove(readbuf, readbuf + 4 + len, nread);
 
     switch(buf[1])
     {
@@ -689,10 +698,7 @@ void HandleNetworking()
   r = select(sfd + 1, &rfds, NULL, NULL, &tv);
 
   if (r < 0 && errno != EINTR)
-  {
-    perror("select");
-    fatal("fatal: select() failed");
-  }
+    Error(ERR_EXIT, "HandleNetworking(): select() failed");
 
   if (r < 0)
     FD_ZERO(&rfds);
@@ -704,11 +710,13 @@ void HandleNetworking()
     r = read(sfd, readbuf + nread, MAX_BUFFER_SIZE - nread);
 
     if (r < 0)
-      fatal("Error reading from server");
+      Error(ERR_EXIT, "error reading from network server");
+
     if (r == 0)
-      fatal("Connection to server lost");
+      Error(ERR_EXIT, "connection to network server lost");
+
     nread += r;
 
-    handlemessages();
+    HandleNetworkingMessages();
   }
 }