NULL
};
-struct NetworkLevelFileInfo
-{
- char *leveldir_identifier;
- struct LevelFileInfo file_info;
- struct LevelFileInfo tmpl_info;
- boolean use_network_level_files;
- boolean use_custom_template;
-};
-
/* server stuff */
static TCPsocket sfd; /* TCP server socket */
static boolean stop_network_client = FALSE;
static char stop_network_client_message[MAX_OUTPUT_LINESIZE + 1];
-static struct NetworkLevelFileInfo network_level;
+static struct NetworkLevelInfo network_level;
static void DrawNetworkTextExt(char *message, int font_nr, boolean initialize)
{
SDLNet_TCP_Send(sfd, nb->buffer, nb->size);
}
-struct NetworkClientPlayerInfo *getNetworkPlayer(int player_nr)
+static struct NetworkClientPlayerInfo *getNetworkPlayer(int player_nr)
{
struct NetworkClientPlayerInfo *player = NULL;
return(EMPTY_PLAYER_NAME);
}
+static boolean hasPathSeparator(char *s)
+{
+ return (strchr(s, '/') != NULL);
+}
+
static void StartNetworkServer(int port)
{
static int p;
SDLNet_ResolveHost(&ip, hostname, port);
if (ip.host == INADDR_NONE)
- Error(ERR_EXIT, "cannot locate host '%s'", hostname);
+ {
+ char message[100];
+
+ sprintf(message, "Failed to resolve network server hostname '%s'!",
+ hostname);
+
+ DrawNetworkText_Failed(message);
+
+ return FALSE;
+ }
else
server_host = SDLNet_Read32(&ip.host);
Error(ERR_NETWORK_CLIENT, "you set your player name to \"%s\"", player_name);
}
-void SendToServer_ProtocolVersion()
+void SendToServer_ProtocolVersion(void)
{
initNetworkBufferForWriting(write_buffer, OP_PROTOCOL_VERSION, 0);
SendNetworkBufferToServer(write_buffer);
}
-void SendToServer_LevelFile()
+void SendToServer_LevelFile(void)
{
initNetworkBufferForWriting(write_buffer, OP_LEVEL_FILE, 0);
#endif
}
-void SendToServer_StartPlaying()
+void SendToServer_StartPlaying(void)
{
unsigned int new_random_seed = InitRND(level.random_seed);
SendNetworkBufferToServer(write_buffer);
}
-void SendToServer_PausePlaying()
+void SendToServer_PausePlaying(void)
{
initNetworkBufferForWriting(write_buffer, OP_PAUSE_PLAYING, 0);
SendNetworkBufferToServer(write_buffer);
}
-void SendToServer_ContinuePlaying()
+void SendToServer_ContinuePlaying(void)
{
initNetworkBufferForWriting(write_buffer, OP_CONTINUE_PLAYING, 0);
SendNetworkBufferToServer(write_buffer);
}
-static void Handle_OP_BAD_PROTOCOL_VERSION()
+static void Handle_OP_BAD_PROTOCOL_VERSION(void)
{
int protocol_version_major = getNetworkBuffer8BitInteger(read_buffer);
int protocol_version_minor = getNetworkBuffer8BitInteger(read_buffer);
stop_network_client = TRUE;
}
-static void Handle_OP_YOUR_NUMBER()
+static void Handle_OP_YOUR_NUMBER(void)
{
int old_client_nr = getNetworkBuffer8BitInteger(read_buffer);
int new_client_nr = getNetworkBuffer8BitInteger(read_buffer);
stored_player[new_index_nr].connected_network = TRUE;
}
-static void Handle_OP_NUMBER_WANTED()
+static void Handle_OP_NUMBER_WANTED(void)
{
int old_client_nr = getNetworkBuffer8BitInteger(read_buffer);
int client_nr_wanted = getNetworkBuffer8BitInteger(read_buffer);
DrawNetworkPlayers();
}
-static void Handle_OP_PLAYER_NAME()
+static void Handle_OP_PLAYER_NAME(void)
{
int player_nr = getNetworkBuffer8BitInteger(read_buffer);
char *player_name = getNetworkBufferString(read_buffer);
player_nr, player->name);
}
-static void Handle_OP_PLAYER_CONNECTED()
+static void Handle_OP_PLAYER_CONNECTED(void)
{
struct NetworkClientPlayerInfo *player, *last_player = NULL;
int new_client_nr = getNetworkBuffer8BitInteger(read_buffer);
stored_player[new_index_nr].connected_network = TRUE;
}
-static void Handle_OP_PLAYER_DISCONNECTED()
+static void Handle_OP_PLAYER_DISCONNECTED(void)
{
struct NetworkClientPlayerInfo *player, *player_disconnected;
int player_nr = getNetworkBuffer8BitInteger(read_buffer);
}
}
-static void Handle_OP_START_PLAYING()
+static void Handle_OP_START_PLAYING(void)
{
int player_nr = getNetworkBuffer8BitInteger(read_buffer);
char *new_leveldir_identifier = getNetworkBufferString(read_buffer);
TapeErase();
if (network_level.use_network_level_files)
- LoadLevelFromNetwork(&network_level.file_info,
- &network_level.tmpl_info);
+ LoadNetworkLevel(&network_level);
else
LoadLevel(level_nr);
StartGameActions(FALSE, setup.autorecord, new_random_seed);
}
-static void Handle_OP_PAUSE_PLAYING()
+static void Handle_OP_PAUSE_PLAYING(void)
{
int player_nr = getNetworkBuffer8BitInteger(read_buffer);
}
}
-static void Handle_OP_CONTINUE_PLAYING()
+static void Handle_OP_CONTINUE_PLAYING(void)
{
int player_nr = getNetworkBuffer8BitInteger(read_buffer);
}
}
-static void Handle_OP_STOP_PLAYING()
+static void Handle_OP_STOP_PLAYING(void)
{
int client_nr = getNetworkBuffer8BitInteger(read_buffer);
int cause_for_stopping = getNetworkBuffer8BitInteger(read_buffer);
boolean stopped_by_remote_player = (!client_player->connected_locally);
char message[100];
- sprintf(message, (cause_for_stopping == NETWORK_STOP_BY_PLAYER ?
- "Network game stopped by player %d!" :
- cause_for_stopping == NETWORK_STOP_BY_ERROR ?
- "Network game stopped due to internal error!" :
- "Network game stopped!"), client_nr);
+ if (cause_for_stopping == NETWORK_STOP_BY_PLAYER)
+ sprintf(message, "Network game stopped by player %d!", client_nr);
+ else
+ sprintf(message, (cause_for_stopping == NETWORK_STOP_BY_ERROR ?
+ "Network game stopped due to internal error!" :
+ "Network game stopped!"));
if (cause_for_stopping != NETWORK_STOP_BY_PLAYER ||
stopped_by_remote_player)
}
}
-static void Handle_OP_MOVE_PLAYER()
+static void Handle_OP_MOVE_PLAYER(void)
{
int player_nr = getNetworkBuffer8BitInteger(read_buffer);
int server_frame_counter = getNetworkBuffer32BitInteger(read_buffer);
network_player_action_received = TRUE;
}
-static void Handle_OP_BROADCAST_MESSAGE()
+static void Handle_OP_BROADCAST_MESSAGE(void)
{
int player_nr = getNetworkBuffer8BitInteger(read_buffer);
Error(ERR_NETWORK_CLIENT, "client %d sends message", player_nr);
}
-static void Handle_OP_LEVEL_FILE()
+static void Handle_OP_LEVEL_FILE(void)
{
int player_nr = getNetworkBuffer8BitInteger(read_buffer);
char *leveldir_identifier;
leveldir_identifier = getStringCopy(getNetworkBufferString(read_buffer));
+ if (hasPathSeparator(leveldir_identifier))
+ Error(ERR_EXIT, "protocol error: invalid filename from network client");
+
InitNetworkLevelDirectory(leveldir_identifier);
network_level_dir = getNetworkLevelDir(leveldir_identifier);
file_info->basename = getStringCopy(getNetworkBufferString(read_buffer));
file_info->filename = getPath2(network_level_dir, file_info->basename);
+ if (hasPathSeparator(file_info->basename))
+ Error(ERR_EXIT, "protocol error: invalid filename from network client");
+
getNetworkBufferFile(read_buffer, file_info->filename);
use_custom_template = getNetworkBuffer8BitInteger(read_buffer);
tmpl_info->basename = getStringCopy(getNetworkBufferString(read_buffer));
tmpl_info->filename = getPath2(network_level_dir, tmpl_info->basename);
+ if (hasPathSeparator(tmpl_info->basename))
+ Error(ERR_EXIT, "protocol error: invalid filename from network client");
+
getNetworkBufferFile(read_buffer, tmpl_info->filename);
}
#endif
}
-static void HandleNetworkingMessage()
+static void HandleNetworkingMessage(void)
{
stop_network_game = FALSE;
SendToServer_StopPlaying(NETWORK_STOP_BY_ERROR);
}
-static char *HandleNetworkingPackets()
+static char *HandleNetworkingPackets(void)
{
while (1)
{
checked_free(player);
}
-static void HandleNetworkingDisconnect()
+static void HandleNetworkingDisconnect(void)
{
int i;
first_player.next = NULL;
}
-void HandleNetworking()
+void HandleNetworking(void)
{
char *error_message = HandleNetworkingPackets();
}
}
-void DisconnectFromNetworkServer()
+void DisconnectFromNetworkServer(void)
{
DrawNetworkText_Title("Terminating Network");
DrawNetworkText("Disconnecting from network server ...");
HandleNetworkingDisconnect();
DrawNetworkText_Success("Successfully disconnected!");
-
- /* short time to recognize result of network initialization */
- Delay_WithScreenUpdates(1000);
}