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)
{
return(EMPTY_PLAYER_NAME);
}
+static boolean hasPathSeparator(char *s)
+{
+ return (strchr(s, '/') != NULL);
+}
+
static void StartNetworkServer(int port)
{
static int p;
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;
printf("OP_LEVEL_FILE: %d\n", player_nr);
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->nr = getNetworkBuffer16BitInteger(read_buffer);
file_info->basename = getStringCopy(getNetworkBufferString(read_buffer));
file_info->filename = getPath2(network_level_dir, file_info->basename);
- InitNetworkLevelDirectory(leveldir_identifier);
+ if (hasPathSeparator(file_info->basename))
+ Error(ERR_EXIT, "protocol error: invalid filename from network client");
getNetworkBufferFile(read_buffer, file_info->filename);
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 ...");