prosody
author Jonas Schäfer <jonas@wielicki.name>
Wed, 27 Apr 2022 17:44:14 +0200
changeset 12484 7e9ebdc75ce4
parent 12300 49ebac8a5260
child 12557 cc0ec0277813
permissions -rwxr-xr-x
net: isolate LuaSec-specifics For this, various accessor functions are now provided directly on the sockets, which reach down into the LuaSec implementation to obtain the information. While this may seem of little gain at first, it hides the implementation detail of the LuaSec+LuaSocket combination that the actual socket and the TLS layer are separate objects. The net gain here is that an alternative implementation does not have to emulate that specific implementation detail and "only" has to expose LuaSec-compatible data structures on the new functions.

#!/usr/bin/env lua
-- Prosody IM
-- 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.
--

-- prosody - main executable for Prosody XMPP server

-- Will be modified by configure script if run --

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");

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

local function is_relative(path)
	local path_sep = package.config:sub(1,1);
	return ((path_sep == "/" and path:sub(1,1) ~= "/")
		or (path_sep == "\\" and (path:sub(1,1) ~= "/" and path:sub(2,3) ~= ":\\")))
end

-- Tell Lua where to find our libraries
if CFG_SOURCEDIR then
	local function filter_relative_paths(path)
		if is_relative(path) then return ""; end
	end
	local function sanitise_paths(paths)
		return (paths:gsub("[^;]+;?", filter_relative_paths):gsub(";;+", ";"));
	end
	package.path = sanitise_paths(CFG_SOURCEDIR.."/?.lua;"..package.path);
	package.cpath = sanitise_paths(CFG_SOURCEDIR.."/?.so;"..package.cpath);
end

-- Substitute ~ with path to home directory in data path
if CFG_DATADIR then
	if os.getenv("HOME") then
		CFG_DATADIR = CFG_DATADIR:gsub("^~", os.getenv("HOME"));
	end
end



local startup = require "util.startup";
local async = require "util.async";

-- Note: it's important that this thread is not GC'd, as some C libraries
-- that are initialized here store a pointer to it ( :/ ).
local thread = async.runner();

thread:run(startup.prosody);

prosody.main_thread = thread;

local function loop()
	-- Error handler for errors that make it this far
	local function catch_uncaught_error(err)
		if type(err) == "string" and err:match("interrupted!$") then
			return "quitting";
		end

		prosody.log("error", "Top-level error, please report:\n%s", tostring(err));
		local traceback = debug.traceback("", 2);
		if traceback then
			prosody.log("error", "%s", traceback);
		end

		prosody.events.fire_event("very-bad-error", {error = err, traceback = traceback});
	end

	local sleep = require"socket".sleep;
	local server = require "net.server";

	while select(2, xpcall(server.loop, catch_uncaught_error)) ~= "quitting" do
		sleep(0.2);
	end
end

loop();

thread:run(startup.shutdown);