// Initialize intermud services.
private void startup_reply(mixed *packet) {
    string host;
    int port;
    if (sizeof(packet) != (S_P + SIZEOF_STARTUP_REPLY)) {
        packet_invalid(packet);
        return;
    }
    if ((packet[S_P+STARTUP_REPLY_ROUTERS][0][0]!=config->routers[0][0]) ||
      (packet[S_P+STARTUP_REPLY_ROUTERS][0][1]!=config->routers[0][1])) {
        tcp_client::close_socket(0);
        config -> connected = NULL;
        config -> routers = copy(packet[S_P + STARTUP_REPLY_ROUTERS]);
        sscanf(config -> routers[0][1], "%s %d", host, port);
        open_socket(host, port, MUD);
        return;
    }
    config -> routers = packet[S_P + STARTUP_REPLY_ROUTERS];
    config -> connected = packet[S_P + STARTUP_REPLY_ROUTERS][0][0];
    config -> passwd = packet[S_P + STARTUP_REPLY_PASSWD];
    config -> mud_list -> list = ([ ]);
    config -> channel_list -> list = ([ ]);
    save_me();
} /* startup_reply() */
// Register ourselves with the router.
private void startup_req() {
    mixed *packet = packet_allocate(STARTUP_REQ_PACKET);
    packet[P_DESTINATION]              = config -> routers[0][0];
    packet[S_P + STARTUP_REQ_PASSWD]   = config -> passwd;
    packet[S_P + STARTUP_REQ_MUDLIST]  = config -> mud_list -> id;
    packet[S_P + STARTUP_REQ_CHANLIST] = config -> channel_list -> id;
    packet[S_P + STARTUP_REQ_PPORT]    = PORT_MUD;
    packet[S_P + STARTUP_REQ_TCPPORT]  = PORT_OOB;
    packet[S_P + STARTUP_REQ_UDPPORT]  = 0;
    packet[S_P + STARTUP_REQ_MUDLIB]   = MUDLIB;
    packet[S_P + STARTUP_REQ_BMUDLIB]  = "Discworld";
    packet[S_P + STARTUP_REQ_DRIVER]   = __VERSION__;
    packet[S_P + STARTUP_REQ_TYPE]     = "LP";
    packet[S_P + STARTUP_REQ_STATUS]   = "Mudlib Development";
    packet[S_P + STARTUP_REQ_EMAIL]    = ADMIN_EMAIL;
    packet[S_P + STARTUP_REQ_SERVICES] = SERVICES;
    packet[S_P + STARTUP_REQ_OTHER]    = ([ ]);
    add_buffer(0, packet);
} /* startup_req() */