util.crand: Silence compiler warning
[prosody.git] / prosody
diff --git a/prosody b/prosody
index 1a0f6ff2d76119f7907785187a94e0541be72079..9cc32cee4a740a85bbf76aad88d78b7a08cd98f7 100755 (executable)
--- a/prosody
+++ b/prosody
 
 -- Will be modified by configure script if run --
 
-CFG_SOURCEDIR=os.getenv("PROSODY_SRCDIR");
-CFG_CONFIGDIR=os.getenv("PROSODY_CFGDIR");
-CFG_PLUGINDIR=os.getenv("PROSODY_PLUGINDIR");
-CFG_DATADIR=os.getenv("PROSODY_DATADIR");
+CFG_SOURCEDIR=CFG_SOURCEDIR or os.getenv("PROSODY_SRCDIR");
+CFG_CONFIGDIR=CFG_CONFIGDIR or os.getenv("PROSODY_CFGDIR");
+CFG_PLUGINDIR=CFG_PLUGINDIR or os.getenv("PROSODY_PLUGINDIR");
+CFG_DATADIR=CFG_DATADIR or os.getenv("PROSODY_DATADIR");
 
 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
 
@@ -43,15 +43,18 @@ if CFG_DATADIR then
        end
 end
 
+if #arg > 0 and arg[1] ~= "--config" then
+       print("Unknown command-line option: "..tostring(arg[1]));
+       print("Perhaps you meant to use prosodyctl instead?");
+       return 1;
+end
+
 -- Global 'prosody' object
 local prosody = { events = require "util.events".new(); };
 _G.prosody = prosody;
 
 -- Check dependencies
 local dependencies = require "util.dependencies";
-if not dependencies.check_dependencies() then
-       os.exit(1);
-end
 
 -- Load the config-parsing module
 config = require "core.configmanager"
@@ -86,6 +89,7 @@ function read_config()
                        break;
                end
        end
+       prosody.config_file = filename
        local ok, level, err = config.load(filename);
        if not ok then
                print("\n");
@@ -115,8 +119,15 @@ function read_config()
        end
 end
 
+function check_dependencies()
+       if not dependencies.check_dependencies() then
+               os.exit(1);
+       end
+end
+
 function load_libraries()
        -- Load socket framework
+       socket = require "socket";
        server = require "net.server"
 end    
 
@@ -147,9 +158,12 @@ function sandbox_require()
        -- for neat sandboxing of modules
        local _realG = _G;
        local _real_require = require;
-       if not getfenv then
+       local getfenv = getfenv or function (f)
                -- FIXME: This is a hack to replace getfenv() in Lua 5.2
-               function getfenv(f) return debug.getupvalue(debug.getinfo(f or 1).func, 1); end
+               local name, env = debug.getupvalue(debug.getinfo(f or 1).func, 1);
+               if name == "_ENV" then
+                       return env;
+               end
        end
        function require(...)
                local curr_env = getfenv(2);
@@ -240,7 +254,7 @@ function init_global_state()
        function prosody.reload_config()
                log("info", "Reloading configuration file");
                prosody.events.fire_event("reloading-config");
-               local ok, level, err = config.load((rawget(_G, "CFG_CONFIGDIR") or ".").."/prosody.cfg.lua");
+               local ok, level, err = config.load(prosody.config_file);
                if not ok then
                        if level == "parser" then
                                log("error", "There was an error parsing the configuration file: %s", tostring(err));
@@ -258,10 +272,14 @@ function init_global_state()
        end
 
        -- Function to initiate prosody shutdown
-       function prosody.shutdown(reason)
+       function prosody.shutdown(reason, code)
                log("info", "Shutting down: %s", reason or "unknown reason");
                prosody.shutdown_reason = reason;
-               prosody.events.fire_event("server-stopping", {reason = reason});
+               prosody.shutdown_code = code;
+               prosody.events.fire_event("server-stopping", {
+                       reason = reason;
+                       code = code;
+               });
                server.setquitting(true);
        end
 end
@@ -285,6 +303,7 @@ function load_secondary_libraries()
        require "util.import"
        require "util.xmppstream"
        require "core.stanza_router"
+       require "core.statsmanager"
        require "core.hostmanager"
        require "core.portmanager"
        require "core.modulemanager"
@@ -363,8 +382,10 @@ function loop()
                prosody.events.fire_event("very-bad-error", {error = err, traceback = traceback});
        end
        
+       local sleep = require"socket".sleep;
+
        while select(2, xpcall(server.loop, catch_uncaught_error)) ~= "quitting" do
-               socket.sleep(0.2);
+               sleep(0.2);
        end
 end
 
@@ -381,6 +402,7 @@ init_logging();
 sanity_check();
 sandbox_require();
 set_function_metatable();
+check_dependencies();
 load_libraries();
 init_global_state();
 read_version();
@@ -400,3 +422,4 @@ cleanup();
 prosody.events.fire_event("server-stopped");
 log("info", "Shutdown complete");
 
+os.exit(prosody.shutdown_code)