Spades.c

/* ===========================================================================
 *
 * Initialize each level of abstraction.
 *
 * Spades_init
 */
void Spades_init(char * game_name)
{
    /* Initialize game */
    Spades = alloc_game_full(game_name, SPADES_PLAYER_COUNT);

    /* Initialize misc data */
    {
        unsigned int i;

        Spades_misc = (struct Spades_misc *)
          malloc(sizeof(struct Spades_misc));

        /* Create a place for the current round of cards */
        Spades_misc->current_cards = alloc_dll(0);

	for (i = 0; i < SPADES_TEAM_COUNT; i++) {
            Spades_misc->team_bid[i] = 0;
            Spades_misc->team_score[i] = 0;
        }
        Spades_misc->game_end_score = score;
	Spades->misc_data = Spades_misc;
    }

    /* Player count is already set */
    /* Player turn is set when the game starts */
    /* Player array is already initialized, each player isn't */

    /* Initialize the deck of cards */
    {
       /* Create a deck of cards for the game */
       Spades->deck = alloc_deck(standard_cards_count);

       /* Load the specific cards into the deck */
       load_deck(Spades->deck, standard_cards, standard_cards_count);
    }

    /* Initialize all the players now */
    {
        struct sockaddr_in addr;
        int game_fd, addrlen;
        unsigned int i;

        if (0 > (game_fd = socket(PF_INET, SOCK_STREAM, 0))) {
            exit(1);
        }

        addrlen = 1;

        /* Set the sockopt to SO_REUSEPORT */
        if (0 > (setsockopt(game_fd, SOL_SOCKET, SO_REUSEADDR, 
          &addrlen, sizeof(addrlen)))) {
	    exit(1);
        }

//        addr.sin_len = INET_ADDRSTRLEN;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(Spades_port);
        addr.sin_addr.s_addr = ntohl(INADDR_ANY);

        addrlen = sizeof(struct sockaddr_in);

        if (bind(game_fd, (struct sockaddr *)&addr, addrlen)) {
	    exit(1);
        }

        if (listen(game_fd, SPADES_PLAYER_COUNT)) {
	    exit(1);
        }

        /* Player numbers start at 0 */
        for (i = 0; i < Spades->player_count; i++) {
            struct player * player;
            int fd;

            addrlen = sizeof(struct sockaddr_in); 
            if (0 > (fd = accept(game_fd, (struct sockaddr *)&addr, 
              (unsigned int *) &addrlen))) {
	        exit(1);
	    }

            write(fd, Spades->name, GAME_NAME_LEN - 1);
            write(fd, "\n", strlen("\n"));

            if (NULL == (player = alloc_and_get_player(i, fd))) {
	        /* Player quit before entering name. */
	        i--; /* undo inc */
	        close(fd);
	        continue;
            }
	     
            put_array_b_element(Spades->players, i, player);
        }
	/* Done getting players */
        close(game_fd);
    }
}
next slide