static void service_game_server(int connection) { int rc; int i; struct sockaddr peer; struct sockaddr_in *ip4addr; unsigned int addrlen; struct ssgl_game_server gs; unsigned char *x; /* Get game server information */ rc = ssgl_readsocket(connection, &gs, sizeof(gs)); if (rc < 0) return; printf("1 gs.game_type = '%s', gs.port = %hu\n",gs.game_type, gs.port); if (sanitize_game_server_entry(&gs)) return; printf("2 gs.game_type = '%s'\n",gs.game_type); /* Get the game server's ip addr (don't trust what we were told.) */ memset(&gs.ipaddr, 0, sizeof(gs.ipaddr)); addrlen = sizeof(peer); rc = getpeername(connection, &peer, &addrlen); if (rc != 0) { printf("getpeername failed: %s\n", strerror(errno)); } printf("addrlen = %d\n", addrlen); x = (unsigned char *) &peer; for (i = 0; i < addrlen; i++) printf("%02x ", x[i]); printf("\n"); ip4addr = (struct sockaddr_in *) &peer; memcpy(&gs.ipaddr, &ip4addr->sin_addr, sizeof(gs.ipaddr)); printf("3 gs.game_type = '%s'\n",gs.game_type); /* Update directory with new info. */ ssgl_lock(); /* replace with faster algorithm if need be. */ for (i = 0; i < ngame_servers; i++) { /* already present? */ if (memcmp(&game_server[i], &gs, sizeof(gs)) == 0) { update_expiration(i); goto out; } } printf("4 gs.game_type = '%s'\n",gs.game_type); if (ngame_servers >= MAX_GAME_SERVERS) goto out; /* no room at the inn. */ printf("5 gs.game_type = '%s'\n",gs.game_type); /* add the new game server info into the directory... */ game_server[ngame_servers] = gs; update_expiration(ngame_servers); printf("6 gs.game_type = '%s'\n",gs.game_type); ngame_servers++; out: ssgl_unlock(); return; }
static void service_game_server(int connection) { int rc; int i; struct ssgl_game_server gs; #if 0 struct sockaddr peer; struct sockaddr_in *ip4addr; unsigned int addrlen; unsigned char *x; #endif /* Get game server information */ rc = ssgl_readsocket(connection, &gs, sizeof(gs)); if (rc < 0) { ssgl_log(SSGL_WARN, "Failed initial socket read from game server\n"); return; } /* printf("1 gs.game_type = '%s', gs.port = %hu\n",gs.game_type, gs.port); */ if (sanitize_game_server_entry(&gs)) { ssgl_log(SSGL_WARN, "Failed to sanitize game server information\n"); return; } /* printf("2 gs.game_type = '%s'\n",gs.game_type); */ #if 0 /* This doesn't work... will return 127.0.0.1 if gameserver is on * the same host as lobby server. */ /* Get the game server's ip addr (don't trust what we were told.) */ memset(&gs.ipaddr, 0, sizeof(gs.ipaddr)); addrlen = sizeof(peer); rc = getpeername(connection, &peer, &addrlen); if (rc != 0) { printf("getpeername failed: %s\n", strerror(errno)); } printf("addrlen = %d\n", addrlen); x = (unsigned char *) &peer; for (i = 0; i < addrlen; i++) printf("%02x ", x[i]); printf("\n"); ip4addr = (struct sockaddr_in *) &peer; memcpy(&gs.ipaddr, &ip4addr->sin_addr, sizeof(gs.ipaddr)); #endif /* printf("3 gs.game_type = '%s'\n",gs.game_type); */ /* Update directory with new info. */ ssgl_lock(); /* replace with faster algorithm if need be. */ for (i = 0; i < ngame_servers; i++) { struct ssgl_game_server *ogs = &game_server[i]; /* already present? */ if (ogs->port == gs.port && ogs->ipaddr == gs.ipaddr && memcmp(ogs->game_type, gs.game_type, sizeof(gs.game_type)) == 0 && memcmp(ogs->game_instance, gs.game_instance, sizeof(gs.game_instance)) == 0 && memcmp(ogs->server_nickname, gs.server_nickname, sizeof(gs.server_nickname)) == 0 && memcmp(ogs->location, gs.location, sizeof(gs.location)) == 0) { ogs->nconnections = gs.nconnections; update_expiration(i); goto out; } } /* printf("4 gs.game_type = '%s'\n",gs.game_type); */ if (ngame_servers >= MAX_GAME_SERVERS) { ssgl_log(SSGL_WARN, "Too many game servers connected, rejecting game server.\n"); goto out; /* no room at the inn. */ } /* printf("5 gs.game_type = '%s'\n",gs.game_type); */ /* add the new game server info into the directory... */ game_server[ngame_servers] = gs; update_expiration(ngame_servers); /* printf("6 gs.game_type = '%s'\n",gs.game_type); */ ngame_servers++; out: ssgl_unlock(); return; }