Exemplo n.º 1
0
/*
 * @brief Adds the specified server to the master.
 */
static void Ms_AddServer(struct sockaddr_in *from) {
	struct sockaddr_in addr;

	if (Ms_GetServer(from)) {
		Com_Print("Duplicate ping from %s\n", inet_ntoa(from->sin_addr));
		return;
	}

	if (Ms_BlacklistServer(from)) {
		Com_Print("Server %s has been blacklisted\n", inet_ntoa(from->sin_addr));
		return;
	}

	ms_server_t *server = Z_Malloc(sizeof(*server));

	server->ip = *from;
	server->last_heartbeat = time(0);
	server->port = from->sin_port;

	ms_servers = g_list_prepend(ms_servers, server);
	Com_Print("Server %s registered\n", inet_ntoa(from->sin_addr));

	// send an acknowledgment
	addr.sin_addr = server->ip.sin_addr;
	addr.sin_family = AF_INET;
	addr.sin_port = server->port;
	memset(&addr.sin_zero, 0, sizeof(addr.sin_zero));
	sendto(ms_sock, "\xFF\xFF\xFF\xFF" "ack", 7, 0, (struct sockaddr*) &addr, sizeof(addr));
}
Exemplo n.º 2
0
/**
 * @brief Removes the specified server.
 */
static void Ms_RemoveServer(struct sockaddr_in *from) {
	ms_server_t *server = Ms_GetServer(from);

	if (!server) {
		Com_Warn("Shutdown from unregistered server %s\n", atos(from));
		return;
	}

	Com_Print("Shutdown from %s\n", stos(server));
	Ms_DropServer(server);
}
Exemplo n.º 3
0
/*
 * @brief
 */
static void Ms_Ack(struct sockaddr_in *from) {
	ms_server_t *server;

	if (!(server = Ms_GetServer(from)))
		return;

	Com_Print("Ack from %s (%d).\n", inet_ntoa(server->ip.sin_addr), server->queued_pings);

	server->last_heartbeat = time(0);
	server->queued_pings = 0;
	server->heartbeats++;
	server->validated = true;
}
Exemplo n.º 4
0
/*
 * @brief Removes the specified server.
 */
static void Ms_RemoveServer(struct sockaddr_in *from, ms_server_t *server) {

	if (!server) // resolve from address
		server = Ms_GetServer(from);

	if (!server) {
		Com_Print("Shutdown from unregistered server %s\n", inet_ntoa(from->sin_addr));
		return;
	}

	Com_Print("Shutdown from %s\n", inet_ntoa(from->sin_addr));
	Ms_DropServer(server);
}
Exemplo n.º 5
0
/**
 * @brief Acknowledge the server from the specified address.
 */
static void Ms_Ack(struct sockaddr_in *from) {
	ms_server_t *server = Ms_GetServer(from);

	if (server) {
		Com_Verbose("Ack from %s (%d)\n", stos(server), server->queued_pings);

		server->validated = true;
		server->queued_pings = 0;

	} else {
		Com_Warn("Ack from unregistered server %s\n", atos(from));
	}
}
Exemplo n.º 6
0
/**
 * @brief Accept a "heartbeat" from the specified server address.
 */
static void Ms_Heartbeat(struct sockaddr_in *from) {
	ms_server_t *server = Ms_GetServer(from);

	if (server) {
		server->last_heartbeat = time(NULL);

		Com_Verbose("Heartbeat from %s\n", stos(server));

		const void *ack = "\xFF\xFF\xFF\xFF" "ack";
		sendto(ms_sock, ack, 7, 0, (struct sockaddr *) &server->addr, sizeof(server->addr));
	} else {
		Ms_AddServer(from);
	}
}
Exemplo n.º 7
0
/*
 * @brief
 */
static void Ms_Heartbeat(struct sockaddr_in *from) {
	ms_server_t *server;
	struct sockaddr_in addr;

	if ((server = Ms_GetServer(from))) { // update their timestamp
		addr.sin_addr = server->ip.sin_addr;
		addr.sin_family = AF_INET;
		addr.sin_port = server->port;
		memset(&addr.sin_zero, 0, sizeof(addr.sin_zero));

		server->validated = true;
		server->last_heartbeat = time(0);

		Com_Print("Heartbeat from %s.\n", inet_ntoa(server->ip.sin_addr));

		sendto(ms_sock, "\xFF\xFF\xFF\xFF" "ack", 7, 0, (struct sockaddr*) &addr, sizeof(addr));
		return;
	}

	Ms_AddServer(from);
}
Exemplo n.º 8
0
/**
 * @brief Adds the specified server to the master.
 */
static void Ms_AddServer(struct sockaddr_in *from) {

	if (Ms_GetServer(from)) {
		Com_Warn("Duplicate ping from %s\n", atos(from));
		return;
	}

	if (Ms_BlacklistServer(from)) {
		Com_Warn("Server %s has been blacklisted\n", atos(from));
		return;
	}

	ms_server_t *server = Mem_Malloc(sizeof(ms_server_t));

	server->addr = *from;
	server->last_heartbeat = time(NULL);

	ms_servers = g_list_prepend(ms_servers, server);
	Com_Print("Server %s registered\n", stos(server));

	// send an acknowledgment
	sendto(ms_sock, "\xFF\xFF\xFF\xFF" "ack", 7, 0, (struct sockaddr *) from, sizeof(*from));
}