Example #1
0
/*****************************************************************************
 * Dedicated server
 *****************************************************************************/
static bool run_dedicated_server(const GameParams &game_params, const Settings &cmd_args)
{
    DSTACK("Dedicated server branch");

    verbosestream << _("Using world path") << " ["
                  << game_params.world_path << "]" << std::endl;
    verbosestream << _("Using gameid") << " ["
                  << game_params.game_spec.id << "]" << std::endl;

    // Bind address
    std::string bind_str = g_settings->get("bind_address");
    Address bind_addr(0, 0, 0, 0, game_params.socket_port);

    if (g_settings->getBool("ipv6_server")) {
        bind_addr.setAddress((IPv6AddressBytes*) NULL);
    }
    try {
        bind_addr.Resolve(bind_str.c_str());
    } catch (ResolveError &e) {
        infostream << "Resolving bind address \"" << bind_str
                   << "\" failed: " << e.what()
                   << " -- Listening on all addresses." << std::endl;
    }
    if (bind_addr.isIPv6() && !g_settings->getBool("enable_ipv6")) {
        errorstream << "Unable to listen on "
                    << bind_addr.serializeString()
                    << L" because IPv6 is disabled" << std::endl;
        return false;
    }

    // Database migration
    if (cmd_args.exists("migrate"))
        return migrate_database(game_params, cmd_args);

    try {
        // Create server
        Server server(game_params.world_path, game_params.game_spec, false,
                      bind_addr.isIPv6());
        server.start(bind_addr);

        // Run server
        bool &kill = *porting::signal_handler_killstatus();
        dedicated_server_loop(server, kill);
    } catch (const ModError &e) {
        errorstream << "ModError: " << e.what() << std::endl;
        return false;
    } catch (const ServerError &e) {
        errorstream << "ServerError: " << e.what() << std::endl;
        return false;
    }

    return true;
}
Example #2
0
/*****************************************************************************
 * Dedicated server
 *****************************************************************************/
static bool run_dedicated_server(const GameParams &game_params, const Settings &cmd_args)
{
	DSTACK("Dedicated server branch");

	verbosestream << _("Using world path") << " ["
	              << game_params.world_path << "]" << std::endl;
	verbosestream << _("Using gameid") << " ["
	              << game_params.game_spec.id << "]" << std::endl;

	// Bind address
	std::string bind_str = g_settings->get("bind_address");
	Address bind_addr(0, 0, 0, 0, game_params.socket_port);

	if (g_settings->getBool("ipv6_server")) {
		bind_addr.setAddress(in6addr_any);
	}
	try {
		if (!bind_str.empty())
		bind_addr.Resolve(bind_str.c_str());
	} catch (ResolveError &e) {
		infostream << "Resolving bind address \"" << bind_str
		           << "\" failed: " << e.what()
		           << " -- Listening on all addresses." << std::endl;
	}
	if (bind_addr.isIPv6() && !g_settings->getBool("enable_ipv6")) {
		errorstream << "Unable to listen on "
		            << bind_addr.serializeString()
		            << L" because IPv6 is disabled" << std::endl;
		return false;
	}

	// Database migration
	if (cmd_args.exists("migrate"))
		return migrate_database(game_params, cmd_args);

	if (cmd_args.exists("terminal")) {
#if USE_CURSES
		bool name_ok = true;
		std::string admin_nick = g_settings->get("name");

		name_ok = name_ok && !admin_nick.empty();
		name_ok = name_ok && string_allowed(admin_nick, PLAYERNAME_ALLOWED_CHARS);

		if (!name_ok) {
			if (admin_nick.empty()) {
				errorstream << "No name given for admin. "
					<< "Please check your minetest.conf that it "
					<< "contains a 'name = ' to your main admin account."
					<< std::endl;
			} else {
				errorstream << "Name for admin '"
					<< admin_nick << "' is not valid. "
					<< "Please check that it only contains allowed characters. "
					<< "Valid characters are: " << PLAYERNAME_ALLOWED_CHARS_USER_EXPL
					<< std::endl;
			}
			return false;
		}
		ChatInterface iface;
		bool &kill = *porting::signal_handler_killstatus();

		try {
			// Create server
			Server server(game_params.world_path,
				game_params.game_spec, false, bind_addr.isIPv6(), &iface);

			g_term_console.setup(&iface, &kill, admin_nick);

			g_term_console.start();

			server.start(bind_addr);
			// Run server
			dedicated_server_loop(server, kill);
		} catch (const ModError &e) {
			g_term_console.stopAndWaitforThread();
			errorstream << "ModError: " << e.what() << std::endl;
			return false;
		} catch (const ServerError &e) {
			g_term_console.stopAndWaitforThread();
			errorstream << "ServerError: " << e.what() << std::endl;
			return false;
		}

		// Tell the console to stop, and wait for it to finish,
		// only then leave context and free iface
		g_term_console.stop();
		g_term_console.wait();

		g_term_console.clearKillStatus();
	} else {
#else
		errorstream << "Cmd arg --terminal passed, but "
			<< "compiled without ncurses. Ignoring." << std::endl;
	} {
#endif
		try {

			// Create server
			Server server(game_params.world_path, game_params.game_spec, false,
				bind_addr.isIPv6());
			server.start(bind_addr);

			int autoexit_ = 0;
			cmd_args.getS32NoEx("autoexit", autoexit_);
			server.m_autoexit = autoexit_;

			// Run server
			bool &kill = *porting::signal_handler_killstatus();
			dedicated_server_loop(server, kill);

		} catch (const ModError &e) {
			errorstream << "ModError: " << e.what() << std::endl;
			return false;
		} catch (const ServerError &e) {
			errorstream << "ServerError: " << e.what() << std::endl;
			return false;
		}
	}

	return true;
}