Merge 0.7->trunk
[prosody.git] / plugins / mod_posix.lua
index 8b0bd3992343cba31dd47f7ff1e80ef39b775aa3..52b1e0e6e510533ca87987ce01da71b0a1d02177 100644 (file)
@@ -1,13 +1,13 @@
 -- Prosody IM
--- Copyright (C) 2008-2009 Matthew Wild
--- Copyright (C) 2008-2009 Waqas Hussain
+-- Copyright (C) 2008-2010 Matthew Wild
+-- Copyright (C) 2008-2010 Waqas Hussain
 -- 
 -- This project is MIT/X11 licensed. Please see the
 -- COPYING file in the source package for more information.
 --
 
 
-local want_pposix_version = "0.3.1";
+local want_pposix_version = "0.3.3";
 
 local pposix = assert(require "util.pposix");
 if pposix._VERSION ~= want_pposix_version then module:log("warn", "Unknown version (%s) of binary pposix module, expected %s", tostring(pposix._VERSION), want_pposix_version); end
@@ -20,11 +20,15 @@ end
 local logger_set = require "util.logger".setwriter;
 
 local lfs = require "lfs";
+local stat = lfs.attributes;
 
 local prosody = _G.prosody;
 
 module.host = "*"; -- we're a global module
 
+local umask = module:get_option("umask") or "027";
+pposix.umask(umask);
+
 -- Allow switching away from root, some people like strange ports.
 module:add_event_hook("server-started", function ()
                local uid = module:get_option("setuid");
@@ -50,16 +54,16 @@ module:add_event_hook("server-started", function ()
        end);
 
 -- Don't even think about it!
-module:add_event_hook("server-starting", function ()
-               local suid = module:get_option("setuid");
-               if not suid or suid == 0 or suid == "root" then
-                       if pposix.getuid() == 0 and not module:get_option("run_as_root") then
-                               module:log("error", "Danger, Will Robinson! Prosody doesn't need to be run as root, so don't do it!");
-                               module:log("error", "For more information on running Prosody as root, see http://prosody.im/doc/root");
-                               prosody.shutdown("Refusing to run as root");
-                       end
+if not prosody.start_time then -- server-starting
+       local suid = module:get_option("setuid");
+       if not suid or suid == 0 or suid == "root" then
+               if pposix.getuid() == 0 and not module:get_option("run_as_root") then
+                       module:log("error", "Danger, Will Robinson! Prosody doesn't need to be run as root, so don't do it!");
+                       module:log("error", "For more information on running Prosody as root, see http://prosody.im/doc/root");
+                       prosody.shutdown("Refusing to run as root");
                end
-       end);
+       end
+end
 
 local pidfile;
 local pidfile_handle;
@@ -78,7 +82,9 @@ local function write_pidfile()
        end
        pidfile = module:get_option("pidfile");
        if pidfile then
-               pidfile_handle, err = io.open(pidfile, "a+");
+               local err;
+               local mode = stat(pidfile) and "r+" or "w+";
+               pidfile_handle, err = io.open(pidfile, mode);
                if not pidfile_handle then
                        module:log("error", "Couldn't write pidfile at %s; %s", pidfile, err);
                        prosody.shutdown("Couldn't write pidfile");
@@ -135,7 +141,9 @@ if daemonize then
                        write_pidfile();
                end
        end
-       module:add_event_hook("server-starting", daemonize_server);
+       if not prosody.start_time then -- server-starting
+               daemonize_server();
+       end
 else
        -- Not going to daemonize, so write the pid of this process
        write_pidfile();
@@ -157,4 +165,11 @@ if signal.signal then
                prosody.reload_config();
                prosody.reopen_logfiles();
        end);
+       
+       signal.signal("SIGINT", function ()
+               module:log("info", "Received SIGINT");
+               prosody.unlock_globals();
+               prosody.shutdown("Received SIGINT");
+               prosody.lock_globals();
+       end);
 end