Exemplo n.º 1
0
int main (int argc, char *argv[])
{
	syslog_open("nntpswitchd", LOG_PID, LOG_NEWS);

	init_options(argc, argv);

	init_sighandlers();
	initproctitle(argc, argv);

	if ((master = memmap(sizeof (MASTER))) == NULL)
		die("Can't allocate master memory");

	info("Server starting up..");

	run_daemon();

	syslog_close();
	
	return 0;
}
Exemplo n.º 2
0
//! Die Hauptfunktion zum Testen //
int main(int argc, char *argv[]) {

    int res;
    rlimit rlp;
    res = getrlimit(RLIMIT_CORE, &rlp);
    std::cout<<"max core size: "<<rlp.rlim_cur<<std::endl;
    std::cout<<"current core size: "<<rlp.rlim_max<<std::endl;
    rlp.rlim_cur = 20000;
    res = getrlimit(RLIMIT_CORE, &rlp);

    if (res < 0) {
        std::cout<<"err: "<<errno<<std::endl;
        perror("setrlimit: RLIMIT_CORE");
        exit(-2);
    }

    importmaps = false;
    //di::postgres::enable_trace_query = true;
    // get more info for unspecified exceptions
    std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
    // save starting time
    time_t starttime;
    time(&starttime);

    std::stringstream ss;
    ss << starttime;
    configOptions["starttime"] = ss.str();
    //Initialize Logging Options
    InitLogOptions();

    Logger::writeMessage("basic", "\nStarte Illarion !");

    // initialize randomizer
    initRandom();

    // initialize signalhandlers
    if (! init_sighandlers()) {
        return 1;
    }

    // deactivate savethread
    // unsigned long int thisonlinetime = 0;

    checkArguments(argc, argv);


    // set up logfiles etc. and check if everything works
    if (! setup_files()) {
        return 1;
    }

    Logger::writeMessage("basic", "main: server requires clientversion: " + configOptions["clientversion"], false);
    Logger::writeMessage("basic", "main: listen port: " + configOptions["port"], false);
    Logger::writeMessage("basic", "main: data directory: " + configOptions["datadir"], false);

    // initialise DB Manager
    Database::ConnectionManager::Login login;
    Database::ConnectionManager::Server server;
    login.database = configOptions["postgres_db"];
    login.user = configOptions["postgres_user"];
    login.password = configOptions["postgres_pwd"];
    server.host = configOptions["postgres_host"];
    server.port = configOptions["postgres_port"];
    Database::ConnectionManager::getInstance().setupManager(login, server);
    Database::SchemaHelper::setSchemata(configOptions["postgres_schema_server"],
                                        configOptions["postgres_schema_account"]);

    //Welt anlegen
    World *world = World::create(configOptions["datadir"] , starttime);

    //Laden der Daten fr die Welt (Items, Scripte, Tabellen etc.)
    loadData();

    if (!importmaps) {
        world->Load("Illarion");
    } else {
        configOptions["disable_login"] = "******";
        world->load_from_editor(configOptions["datadir"] + std::string("map/import/oberwelt_0"));
    }

    std::cout<<"Creation the PlayerManager"<<std::endl;
    PlayerManager::get()->activate();
    std::cout<<"PlayerManager activated"<<std::endl;
    PlayerManager::TPLAYERVECTOR &newplayers = PlayerManager::get()->getLogInPlayers();
    timespec stime;
    stime.tv_sec = 0;
    stime.tv_nsec = 25000000;    //25ms
    //NPC's erschaffen
    world->initNPC();

    //run both reload scripts to initialize semi-dynamic data
    try {
        boost::shared_ptr<LuaReloadScript> tmpScript(new LuaReloadScript("server.reload_defs"));

        if (!tmpScript->onReload()) {
            std::cerr << "server.reload_defs.onReload returned false" << std::endl;
        }
    } catch (ScriptException &e) {
        std::cerr << "reload_defs: " << e.what() << std::endl;
    }

    try {
        boost::shared_ptr<LuaReloadScript> tmpScript(new LuaReloadScript("server.reload_tables"));

        if (!tmpScript->onReload()) {
            std::cerr << "server.reload_tables.onReload returned false" << std::endl;
        };
    } catch (ScriptException &e) {
        std::cerr << "reload_tables: " << e.what() << std::endl;
    }

    Logger::writeMessage("basic","Scheduler wird Initialisiert \n",false);
    //Scheduler Initialisieren
    world->initScheduler();

    int new_players_processed;

    running = true;
    // die OnlinePlayer-Liste aktualisieren (-> auf 0)
    world->saveAllPlayerNamesToFile(configOptions["datadir"] + std::string(ONLINEPLFILE));

    while (running) {
        // Ausgaben auf std::cout in die Datei schreiben
        std::cout.flush();
        // make sure we don't block the server with processing new players...
        new_players_processed = 0;

        // process new players from connection thread
        while (!newplayers.empty() && new_players_processed < MAXPLAYERSPROCESSED) {

            new_players_processed++;
            Player *newPlayer = newplayers.non_block_pop_front();

            if (newPlayer) {
                login_save(newPlayer);

                if (newPlayer->isMonitoringClient()) {
                    world->monitoringClientList->clientConnect(newPlayer);
                } else {
                    try {
                        std::cout<<"login sucessully from: "<<newPlayer->name<<" "<<newPlayer->id<<std::endl;
                        world->Players.push_back(newPlayer);
                        newPlayer->login();

                        try {
                            std::cout<<"calling onlogin"<<std::endl;
                            loginScript->onLogin(newPlayer);
                        } catch (ScriptException &e) {
                            std::cerr<<"Login Script: Failed to load scripts/login.lua !"<<std::endl;
                        }

                        world->updatePlayerList();
                    } catch (Player::LogoutException &e) {
                        std::cout<<"got logout Exception during login!"<<std::endl;
                        boost::shared_ptr<BasicServerCommand> cmd(new LogOutTC(e.getReason()));
                        newPlayer->Connection->shutdownSend(cmd);
                        //newPlayer->Connection->closeConnection();
                        PlayerManager::get()->getLogOutPlayers().non_block_push_back(newPlayer);
                    }
                }
            } else {
                std::cout<<"try to get new player but was NULL!"<<std::endl;
            }

        } // get new players

        // Eingaben der Player abarbeiten und die Karte altern
        world->turntheworld();
        nanosleep(&stime, NULL);
    }


    Logger::writeMessage("basic","Beende Illarion!");

    std::cout<<"Server Shutdown:"<<std::endl;

    scriptVariables->save();
    std::cout<<"Scriptvariables saved!"<<std::endl;
    world->forceLogoutOfAllPlayers();

    //saving all players which where forced logged out.
    PlayerManager::get()->saveAll();

    world->takeMonsterAndNPCFromMap();


    Logger::writeMessage("basic","Statistik aktualisieren");
    Logger::writeMessage("basic","OnlinePlayer-Liste aktualisieren (-> auf 0)");
    world->saveAllPlayerNamesToFile(configOptions["datadir"] + std::string(ONLINEPLFILE));
    Logger::writeMessage("basic","Karten speichern");
    world->Save("Illarion");
    Logger::writeMessage("basic","InitialConnection beenden");
    Logger::writeMessage("basic", "Die in loadItems(..) angelegten Tabellen loeschen");
    delete CommonItems;
    CommonItems = NULL;
    delete ItemNames;
    ItemNames = NULL;
    delete WeaponItems;
    WeaponItems = NULL;
    delete ArmorItems;
    ArmorItems = NULL;
    delete ContainerItems;
    ContainerItems = NULL;
    delete TilesModItems;
    TilesModItems = NULL;
    delete Tiles;
    Tiles = NULL;
    delete world;
    world = NULL;

    reset_sighandlers();

    time(&starttime);
    Logger::writeMessage("basic","main: Ende ");

    return EXIT_SUCCESS;
}