Fix Lint broken by b662a4577d692329b9ca83525e6039f2ddcd1ac1
[oweals/minetest.git] / src / main.cpp
index 1b95a9f1c7cf606ec87f16e9fe01b908cf1d4551..6a2e89f7aa4bc8465d4b15a0121f89ad89fbe666 100644 (file)
@@ -17,16 +17,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifdef _MSC_VER
-       #ifndef SERVER // Dedicated server isn't linked with Irrlicht
-               #pragma comment(lib, "Irrlicht.lib")
-               // This would get rid of the console window
-               //#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
-       #endif
-       #pragma comment(lib, "zlibwapi.lib")
-       #pragma comment(lib, "Shell32.lib")
-#endif
-
 #include "irrlicht.h" // createDevice
 
 #include "mainmenumanager.h"
@@ -51,11 +41,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "gameparams.h"
 #include "database.h"
 #include "config.h"
+#include "porting.h"
 #if USE_CURSES
        #include "terminal_chat_console.h"
 #endif
 #ifndef SERVER
 #include "client/clientlauncher.h"
+
 #endif
 
 #ifdef HAVE_TOUCHSCREENGUI
@@ -111,28 +103,10 @@ static bool get_game_from_cmdline(GameParams *game_params, const Settings &cmd_a
 static bool determine_subgame(GameParams *game_params);
 
 static bool run_dedicated_server(const GameParams &game_params, const Settings &cmd_args);
-static bool migrate_database(const GameParams &game_params, const Settings &cmd_args);
+static bool migrate_map_database(const GameParams &game_params, const Settings &cmd_args);
 
 /**********************************************************************/
 
-/*
-       gettime.h implementation
-*/
-
-#ifdef SERVER
-
-u32 getTimeMs()
-{
-       /* Use imprecise system calls directly (from porting.h) */
-       return porting::getTime(PRECISION_MILLI);
-}
-
-u32 getTime(TimePrecision prec)
-{
-       return porting::getTime(prec);
-}
-
-#endif
 
 FileLogOutput file_log_output;
 
@@ -141,7 +115,6 @@ static OptionList allowed_options;
 int main(int argc, char *argv[])
 {
        int retval;
-
        debug_set_exception_handler();
 
        g_logger.registerThread("Main");
@@ -152,11 +125,15 @@ int main(int argc, char *argv[])
        if (!cmd_args_ok
                        || cmd_args.getFlag("help")
                        || cmd_args.exists("nonopt1")) {
+               porting::attachOrCreateConsole();
                print_help(allowed_options);
                return cmd_args_ok ? 0 : 1;
        }
+       if (cmd_args.getFlag("console"))
+               porting::attachOrCreateConsole();
 
        if (cmd_args.getFlag("version")) {
+               porting::attachOrCreateConsole();
                print_version();
                return 0;
        }
@@ -198,6 +175,9 @@ int main(int argc, char *argv[])
        if (!init_common(cmd_args, argc, argv))
                return 1;
 
+       if (g_settings->getBool("enable_console"))
+               porting::attachOrCreateConsole();
+
 #ifndef __ANDROID__
        // Run unit tests
        if (cmd_args.getFlag("run-unittests")) {
@@ -207,9 +187,13 @@ int main(int argc, char *argv[])
 
        GameParams game_params;
 #ifdef SERVER
+       porting::attachOrCreateConsole();
        game_params.is_dedicated_server = true;
 #else
-       game_params.is_dedicated_server = cmd_args.getFlag("server");
+       const bool isServer = cmd_args.getFlag("server");
+       if (isServer)
+               porting::attachOrCreateConsole();
+       game_params.is_dedicated_server = isServer;
 #endif
 
        if (!game_configure(&game_params, cmd_args))
@@ -220,10 +204,6 @@ int main(int argc, char *argv[])
        infostream << "Using commanded world path ["
                   << game_params.world_path << "]" << std::endl;
 
-       //Run dedicated server if asked to or no other option
-       g_settings->set("server_dedicated",
-                       game_params.is_dedicated_server ? "true" : "false");
-
        if (game_params.is_dedicated_server)
                return run_dedicated_server(game_params, cmd_args) ? 0 : 1;
 
@@ -295,6 +275,8 @@ static void set_allowed_options(OptionList *allowed_options)
                        _("Set gameid (\"--gameid list\" prints available ones)"))));
        allowed_options->insert(std::make_pair("migrate", ValueSpec(VALUETYPE_STRING,
                        _("Migrate from current map backend to another (Only works when using minetestserver or with --server)"))));
+       allowed_options->insert(std::make_pair("migrate-players", ValueSpec(VALUETYPE_STRING,
+               _("Migrate from current players backend to another (Only works when using minetestserver or with --server)"))));
        allowed_options->insert(std::make_pair("terminal", ValueSpec(VALUETYPE_FLAG,
                        _("Feature an interactive terminal (Only works when using minetestserver or with --server)"))));
 #ifndef SERVER
@@ -314,6 +296,8 @@ static void set_allowed_options(OptionList *allowed_options)
                        _("Set password"))));
        allowed_options->insert(std::make_pair("go", ValueSpec(VALUETYPE_FLAG,
                        _("Disable main menu"))));
+       allowed_options->insert(std::make_pair("console", ValueSpec(VALUETYPE_FLAG,
+               _("Starts with the console (Windows only)"))));
 #endif
 
 }
@@ -333,7 +317,7 @@ static void print_allowed_options(const OptionList &allowed_options)
                if (i->second.type != VALUETYPE_FLAG)
                        os1 << _(" <value>");
 
-               std::cout << padStringRight(os1.str(), 24);
+               std::cout << padStringRight(os1.str(), 30);
 
                if (i->second.help != NULL)
                        std::cout << i->second.help;
@@ -829,7 +813,9 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings &
 
        // Database migration
        if (cmd_args.exists("migrate"))
-               return migrate_database(game_params, cmd_args);
+               return migrate_map_database(game_params, cmd_args);
+       else if (cmd_args.exists("migrate-players"))
+               return ServerEnvironment::migratePlayersDatabase(game_params, cmd_args);
 
        if (cmd_args.exists("terminal")) {
 #if USE_CURSES
@@ -859,8 +845,8 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings &
 
                try {
                        // Create server
-                       Server server(game_params.world_path,
-                               game_params.game_spec, false, bind_addr.isIPv6(), &iface);
+                       Server server(game_params.world_path, game_params.game_spec,
+                                       false, bind_addr.isIPv6(), true, &iface);
 
                        g_term_console.setup(&iface, &kill, admin_nick);
 
@@ -894,7 +880,7 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings &
                try {
                        // Create server
                        Server server(game_params.world_path, game_params.game_spec, false,
-                               bind_addr.isIPv6());
+                               bind_addr.isIPv6(), true);
                        server.start(bind_addr);
 
                        // Run server
@@ -913,7 +899,7 @@ static bool run_dedicated_server(const GameParams &game_params, const Settings &
        return true;
 }
 
-static bool migrate_database(const GameParams &game_params, const Settings &cmd_args)
+static bool migrate_map_database(const GameParams &game_params, const Settings &cmd_args)
 {
        std::string migrate_to = cmd_args.get("migrate");
        Settings world_mt;
@@ -922,20 +908,23 @@ static bool migrate_database(const GameParams &game_params, const Settings &cmd_
                errorstream << "Cannot read world.mt!" << std::endl;
                return false;
        }
+
        if (!world_mt.exists("backend")) {
                errorstream << "Please specify your current backend in world.mt:"
                        << std::endl
-                       << "    backend = {sqlite3|leveldb|redis|dummy}"
+                       << "    backend = {sqlite3|leveldb|redis|dummy|postgresql}"
                        << std::endl;
                return false;
        }
+
        std::string backend = world_mt.get("backend");
        if (backend == migrate_to) {
                errorstream << "Cannot migrate: new backend is same"
                        << " as the old one" << std::endl;
                return false;
        }
-       Database *old_db = ServerMap::createDatabase(backend, game_params.world_path, world_mt),
+
+       MapDatabase *old_db = ServerMap::createDatabase(backend, game_params.world_path, world_mt),
                *new_db = ServerMap::createDatabase(migrate_to, game_params.world_path, world_mt);
 
        u32 count = 0;
@@ -948,7 +937,8 @@ static bool migrate_database(const GameParams &game_params, const Settings &cmd_
        for (std::vector<v3s16>::const_iterator it = blocks.begin(); it != blocks.end(); ++it) {
                if (kill) return false;
 
-               const std::string &data = old_db->loadBlock(*it);
+               std::string data;
+               old_db->loadBlock(*it, &data);
                if (!data.empty()) {
                        new_db->saveBlock(*it, data);
                } else {
@@ -976,4 +966,3 @@ static bool migrate_database(const GameParams &game_params, const Settings &cmd_
 
        return true;
 }
-