mirror of
https://github.com/matrix-construct/construct
synced 2024-05-19 11:23:45 +02:00
ircd: Move matrix application related to derived library.
This commit is contained in:
parent
fb3c6b47a4
commit
89e0a7fc82
|
@ -3,6 +3,7 @@ ACLOCAL_AMFLAGS = -I tools/m4
|
||||||
|
|
||||||
SUBDIRS = include/ircd
|
SUBDIRS = include/ircd
|
||||||
SUBDIRS += ircd
|
SUBDIRS += ircd
|
||||||
|
SUBDIRS += matrix
|
||||||
SUBDIRS += modules
|
SUBDIRS += modules
|
||||||
SUBDIRS += share
|
SUBDIRS += share
|
||||||
SUBDIRS += construct
|
SUBDIRS += construct
|
||||||
|
|
37
configure.ac
37
configure.ac
|
@ -42,6 +42,7 @@ AC_CONFIG_FILES(\
|
||||||
include/ircd/Makefile \
|
include/ircd/Makefile \
|
||||||
construct/Makefile \
|
construct/Makefile \
|
||||||
ircd/Makefile \
|
ircd/Makefile \
|
||||||
|
matrix/Makefile \
|
||||||
modules/Makefile \
|
modules/Makefile \
|
||||||
share/Makefile \
|
share/Makefile \
|
||||||
)
|
)
|
||||||
|
@ -500,6 +501,42 @@ AC_ARG_ENABLE(lowmem-compile, AC_HELP_STRING([--enable-lowmem-compile], [Enable
|
||||||
|
|
||||||
AM_CONDITIONAL([LOWMEM_COMPILE], [[[[ $lowmem_compile = "yes" ]]]])
|
AM_CONDITIONAL([LOWMEM_COMPILE], [[[[ $lowmem_compile = "yes" ]]]])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
dnl Gold linker
|
||||||
|
dnl
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(gold, AC_HELP_STRING([--enable-ld-gold], [Use the gold linker.]),
|
||||||
|
[
|
||||||
|
ld_gold="yes"
|
||||||
|
], [
|
||||||
|
ld_gold="yes"
|
||||||
|
])
|
||||||
|
|
||||||
|
AM_CONDITIONAL([LD_GOLD], [[[[ $ld_gold = "yes" ]]]])
|
||||||
|
|
||||||
|
AM_COND_IF([LD_GOLD],
|
||||||
|
[
|
||||||
|
AM_COND_IF([GCC],
|
||||||
|
[
|
||||||
|
LDFLAGS+=" -Wl,-fuse-ld=gold"
|
||||||
|
LDFLAGS+=" -Wl,--gdb-index"
|
||||||
|
])
|
||||||
|
|
||||||
|
AM_COND_IF([CLANG],
|
||||||
|
[
|
||||||
|
LDFLAGS+=" -fuse-ld=gold"
|
||||||
|
])
|
||||||
|
|
||||||
|
LDFLAGS+=" -Wl,--warn-common"
|
||||||
|
LDFLAGS+=" -Wl,--warn-execstack"
|
||||||
|
LDFLAGS+=" -Wl,--detect-odr-violations"
|
||||||
|
LDFLAGS+=" -Wl,--rosegment"
|
||||||
|
LDFLAGS+=" -Wl,--icf=all"
|
||||||
|
LDFLAGS+=" -Wl,-z,noexecstack"
|
||||||
|
LDFLAGS+=" -Wl,-z,combreloc"
|
||||||
|
LDFLAGS+=" -Wl,-z,text-unlikely-segment"
|
||||||
|
])
|
||||||
|
|
||||||
dnl
|
dnl
|
||||||
dnl Optimization
|
dnl Optimization
|
||||||
dnl
|
dnl
|
||||||
|
|
|
@ -102,7 +102,6 @@ noexcept try
|
||||||
auto argv(_argv), envp(_envp);
|
auto argv(_argv), envp(_envp);
|
||||||
const char *const progname(_argv[0]);
|
const char *const progname(_argv[0]);
|
||||||
parseargs(&argc, &argv, opts);
|
parseargs(&argc, &argv, opts);
|
||||||
applyargs();
|
|
||||||
|
|
||||||
// cores are not dumped without consent of the user to maintain the privacy
|
// cores are not dumped without consent of the user to maintain the privacy
|
||||||
// of cryptographic key material in memory at the time of the crash. Note
|
// of cryptographic key material in memory at the time of the crash. Note
|
||||||
|
@ -118,9 +117,6 @@ noexcept try
|
||||||
if(printversion)
|
if(printversion)
|
||||||
return print_version();
|
return print_version();
|
||||||
|
|
||||||
if(quietmode)
|
|
||||||
ircd::log::console_disable();
|
|
||||||
|
|
||||||
// The matrix origin is the first positional argument after any switched
|
// The matrix origin is the first positional argument after any switched
|
||||||
// arguments. The matrix origin is the hostpart of MXID's for the server.
|
// arguments. The matrix origin is the hostpart of MXID's for the server.
|
||||||
const ircd::string_view origin
|
const ircd::string_view origin
|
||||||
|
@ -151,26 +147,30 @@ noexcept try
|
||||||
"usage :%s <origin> [servername]", progname
|
"usage :%s <origin> [servername]", progname
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Set the required name conf items based on the positional program
|
||||||
|
// arguments. This operation will throw if the strings are not fit for
|
||||||
|
// purpose as host/domain names.
|
||||||
|
ircd::network_name.set(origin);
|
||||||
|
ircd::server_name.set(hostname);
|
||||||
|
|
||||||
|
// Sets various other conf items based on the program options captured into
|
||||||
|
// the globals preceding this frame.
|
||||||
|
applyargs();
|
||||||
|
|
||||||
// The smoketest uses this ircd::run::level callback to set a flag when
|
// The smoketest uses this ircd::run::level callback to set a flag when
|
||||||
// each ircd::run::level is reached. All flags must be set to pass.
|
// each ircd::run::level is reached. All flags must be set to pass. The
|
||||||
|
// smoketest is inert unless the -smoketest program option is used.
|
||||||
const ircd::run::changed smoketester{[](const auto &level)
|
const ircd::run::changed smoketester{[](const auto &level)
|
||||||
{
|
{
|
||||||
smoketest.at(size_t(level) + 1) = true;
|
smoketest.at(size_t(level) + 1) = true;
|
||||||
if(smoketest[0] && level == ircd::run::level::RUN) ircd::post{[]
|
if(smoketest[0] && level == ircd::run::level::RUN)
|
||||||
{
|
ircd::post {[] { ircd::quit(); }};
|
||||||
ircd::quit();
|
|
||||||
}};
|
|
||||||
}};
|
}};
|
||||||
|
|
||||||
// This is the sole io_context for Construct, and the ios.run() below is the
|
// This is the sole io_context for Construct, and the ios.run() below is the
|
||||||
// the only place where the program actually blocks.
|
// the only place where the program actually blocks.
|
||||||
boost::asio::io_context ios;
|
boost::asio::io_context ios;
|
||||||
|
|
||||||
// Associates libircd with our io_context and posts the initial routines
|
|
||||||
// to that io_context. Execution of IRCd will then occur during ios::run()
|
|
||||||
// note: only supports service for one hostname/origin at this time.
|
|
||||||
ircd::init(ios, origin, hostname);
|
|
||||||
|
|
||||||
// libircd does no signal handling (or at least none that you ever have to
|
// libircd does no signal handling (or at least none that you ever have to
|
||||||
// care about); reaction to all signals happens out here instead. Handling
|
// care about); reaction to all signals happens out here instead. Handling
|
||||||
// is done properly through the io_context which registers the handler for
|
// is done properly through the io_context which registers the handler for
|
||||||
|
@ -180,6 +180,10 @@ noexcept try
|
||||||
// platformness with windows etc.
|
// platformness with windows etc.
|
||||||
const construct::signals signals{ios};
|
const construct::signals signals{ios};
|
||||||
|
|
||||||
|
// Associates libircd with our io_context and posts the initial routines
|
||||||
|
// to that io_context. Execution of IRCd will then occur during ios::run()
|
||||||
|
ircd::init(ios);
|
||||||
|
|
||||||
// If the user wants to immediately drop to an interactive command line
|
// If the user wants to immediately drop to an interactive command line
|
||||||
// without having to send a ctrl-c for it, that is provided here. This does
|
// without having to send a ctrl-c for it, that is provided here. This does
|
||||||
// not actually take effect until it's processed in the ios.run() below.
|
// not actually take effect until it's processed in the ios.run() below.
|
||||||
|
@ -375,4 +379,7 @@ applyargs()
|
||||||
|
|
||||||
if(soft_assert)
|
if(soft_assert)
|
||||||
ircd::soft_assert.set("true");
|
ircd::soft_assert.set("true");
|
||||||
|
|
||||||
|
if(quietmode)
|
||||||
|
ircd::log::console_disable();
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,7 @@
|
||||||
#include "net/net.h"
|
#include "net/net.h"
|
||||||
#include "server/server.h"
|
#include "server/server.h"
|
||||||
#include "magick.h"
|
#include "magick.h"
|
||||||
#include "m/m.h"
|
#include "m/matrix.h"
|
||||||
#include "resource/resource.h"
|
#include "resource/resource.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
|
||||||
|
@ -74,11 +74,8 @@
|
||||||
///
|
///
|
||||||
namespace ircd
|
namespace ircd
|
||||||
{
|
{
|
||||||
seconds uptime();
|
extern const info::versions version_api;
|
||||||
|
extern const info::versions version_abi;
|
||||||
void cont() noexcept;
|
|
||||||
bool quit() noexcept;
|
|
||||||
void init(boost::asio::io_context &ios, const string_view &origin, const string_view &hostname);
|
|
||||||
|
|
||||||
extern conf::item<bool> restart;
|
extern conf::item<bool> restart;
|
||||||
extern conf::item<bool> debugmode;
|
extern conf::item<bool> debugmode;
|
||||||
|
@ -86,8 +83,13 @@ namespace ircd
|
||||||
extern conf::item<bool> write_avoid;
|
extern conf::item<bool> write_avoid;
|
||||||
extern conf::item<bool> soft_assert;
|
extern conf::item<bool> soft_assert;
|
||||||
|
|
||||||
extern const info::versions version_api;
|
extern conf::item<std::string> server_name;
|
||||||
extern const info::versions version_abi;
|
extern conf::item<std::string> network_name;
|
||||||
|
|
||||||
|
seconds uptime();
|
||||||
|
void init(boost::asio::io_context &ios);
|
||||||
|
void cont() noexcept;
|
||||||
|
bool quit() noexcept;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // HAVE_IRCD_IRCD_H
|
#endif // HAVE_IRCD_IRCD_H
|
||||||
|
|
35
include/ircd/m/init.h
Normal file
35
include/ircd/m/init.h
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
// Matrix Construct
|
||||||
|
//
|
||||||
|
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
||||||
|
// Copyright (C) 2016-2019 Jason Volk <jason@zemos.net>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice is present in all copies. The
|
||||||
|
// full license for this software is available in the LICENSE file.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#define HAVE_IRCD_M_INIT_H
|
||||||
|
|
||||||
|
namespace ircd::m::init
|
||||||
|
{
|
||||||
|
struct modules;
|
||||||
|
struct backfill;
|
||||||
|
struct bootstrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Internal use only; do not call
|
||||||
|
struct ircd::m::init::modules
|
||||||
|
{
|
||||||
|
void fini_imports() noexcept;
|
||||||
|
void init_imports();
|
||||||
|
|
||||||
|
modules();
|
||||||
|
~modules() noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Internal use only; do not call
|
||||||
|
struct ircd::m::init::bootstrap
|
||||||
|
{
|
||||||
|
bootstrap();
|
||||||
|
};
|
|
@ -34,7 +34,7 @@ namespace ircd::m
|
||||||
/// Matrix Protocol System
|
/// Matrix Protocol System
|
||||||
namespace ircd::m
|
namespace ircd::m
|
||||||
{
|
{
|
||||||
struct init;
|
struct matrix;
|
||||||
|
|
||||||
IRCD_OVERLOAD(generate)
|
IRCD_OVERLOAD(generate)
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ namespace ircd::m
|
||||||
#include "name.h"
|
#include "name.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "self.h"
|
#include "self.h"
|
||||||
|
#include "init.h"
|
||||||
#include "id.h"
|
#include "id.h"
|
||||||
#include "event/event.h"
|
#include "event/event.h"
|
||||||
#include "get.h"
|
#include "get.h"
|
||||||
|
@ -83,30 +84,15 @@ namespace ircd::m
|
||||||
#include "media.h"
|
#include "media.h"
|
||||||
#include "search.h"
|
#include "search.h"
|
||||||
|
|
||||||
struct ircd::m::init
|
struct ircd::m::matrix
|
||||||
{
|
{
|
||||||
struct modules;
|
std::string module_path
|
||||||
struct backfill;
|
{
|
||||||
|
fs::path_string(fs::base::LIB, "libircd_matrix")
|
||||||
|
};
|
||||||
|
|
||||||
self::init _self;
|
ircd::module module
|
||||||
dbs::init _dbs;
|
{
|
||||||
std::unique_ptr<modules> _modules;
|
module_path
|
||||||
|
};
|
||||||
static void bootstrap();
|
|
||||||
void close();
|
|
||||||
|
|
||||||
public:
|
|
||||||
init(const string_view &origin, const string_view &hostname);
|
|
||||||
~init() noexcept;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ircd::m::init::modules
|
|
||||||
{
|
|
||||||
void fini_imports() noexcept;
|
|
||||||
void init_imports();
|
|
||||||
void init_keys();
|
|
||||||
|
|
||||||
public:
|
|
||||||
modules();
|
|
||||||
~modules() noexcept;
|
|
||||||
};
|
};
|
|
@ -13,12 +13,12 @@
|
||||||
|
|
||||||
namespace ircd::m
|
namespace ircd::m
|
||||||
{
|
{
|
||||||
|
struct room;
|
||||||
|
|
||||||
IRCD_M_EXCEPTION(m::error, CONFLICT, http::CONFLICT);
|
IRCD_M_EXCEPTION(m::error, CONFLICT, http::CONFLICT);
|
||||||
IRCD_M_EXCEPTION(m::error, NOT_MODIFIED, http::NOT_MODIFIED);
|
IRCD_M_EXCEPTION(m::error, NOT_MODIFIED, http::NOT_MODIFIED);
|
||||||
IRCD_M_EXCEPTION(CONFLICT, ALREADY_MEMBER, http::CONFLICT);
|
IRCD_M_EXCEPTION(CONFLICT, ALREADY_MEMBER, http::CONFLICT);
|
||||||
|
|
||||||
struct room;
|
|
||||||
|
|
||||||
// Util
|
// Util
|
||||||
bool my(const room &);
|
bool my(const room &);
|
||||||
bool operator!(const room &); // room_id empty
|
bool operator!(const room &); // room_id empty
|
||||||
|
|
|
@ -51,7 +51,7 @@ struct ircd::m::self::init
|
||||||
static void tls_certificate();
|
static void tls_certificate();
|
||||||
static void keys();
|
static void keys();
|
||||||
|
|
||||||
init(const string_view &origin, const string_view &servername);
|
init();
|
||||||
};
|
};
|
||||||
|
|
||||||
inline ircd::string_view
|
inline ircd::string_view
|
||||||
|
|
|
@ -32,39 +32,19 @@ AM_CPPFLAGS = \
|
||||||
@EXTRA_CPPFLAGS@ \
|
@EXTRA_CPPFLAGS@ \
|
||||||
###
|
###
|
||||||
|
|
||||||
|
#TODO: split options for if LD_GOLD
|
||||||
AM_LDFLAGS = \
|
AM_LDFLAGS = \
|
||||||
-version-info 3:1:0 \
|
-version-info 3:1:0 \
|
||||||
-Wl,--warn-common \
|
|
||||||
-Wl,--warn-execstack \
|
|
||||||
-Wl,--detect-odr-violations \
|
|
||||||
-Wl,--unresolved-symbols=report-all \
|
|
||||||
-Wl,--no-undefined-version \
|
-Wl,--no-undefined-version \
|
||||||
|
-Wl,--unresolved-symbols=report-all \
|
||||||
-Wl,--weak-unresolved-symbols \
|
-Wl,--weak-unresolved-symbols \
|
||||||
-Wl,--icf=all \
|
-Wl,-z,now \
|
||||||
-Wl,--rosegment \
|
|
||||||
-Wl,--gdb-index \
|
|
||||||
-Wl,-z,lazy \
|
|
||||||
-Wl,-z,nodelete \
|
-Wl,-z,nodelete \
|
||||||
-Wl,-z,nodlopen \
|
-Wl,-z,nodlopen \
|
||||||
-Wl,-z,noexecstack \
|
|
||||||
-Wl,-z,combreloc \
|
|
||||||
-Wl,-z,text-unlikely-segment \
|
|
||||||
$(PLATFORM_LDFLAGS) \
|
$(PLATFORM_LDFLAGS) \
|
||||||
@EXTRA_LDFLAGS@ \
|
@EXTRA_LDFLAGS@ \
|
||||||
###
|
###
|
||||||
|
|
||||||
if GCC
|
|
||||||
AM_LDFLAGS += \
|
|
||||||
-Wl,-fuse-ld=gold \
|
|
||||||
###
|
|
||||||
endif
|
|
||||||
|
|
||||||
if CLANG
|
|
||||||
AM_LDFLAGS += \
|
|
||||||
-fuse-ld=gold \
|
|
||||||
###
|
|
||||||
endif
|
|
||||||
|
|
||||||
if MINGW
|
if MINGW
|
||||||
AM_LDFLAGS += \
|
AM_LDFLAGS += \
|
||||||
-Wl,--enable-runtime-pseudo-reloc \
|
-Wl,--enable-runtime-pseudo-reloc \
|
||||||
|
@ -176,13 +156,6 @@ libircd_la_SOURCES += resource.cc
|
||||||
if JS
|
if JS
|
||||||
libircd_la_SOURCES += js.cc
|
libircd_la_SOURCES += js.cc
|
||||||
endif
|
endif
|
||||||
libircd_la_SOURCES += m_name.cc
|
|
||||||
libircd_la_SOURCES += m_id.cc
|
|
||||||
libircd_la_SOURCES += m_dbs.cc
|
|
||||||
libircd_la_SOURCES += m_room.cc
|
|
||||||
libircd_la_SOURCES += m_fed.cc
|
|
||||||
libircd_la_SOURCES += m.cc
|
|
||||||
libircd_la_SOURCES += m_event.cc
|
|
||||||
libircd_la_SOURCES += ircd.cc
|
libircd_la_SOURCES += ircd.cc
|
||||||
|
|
||||||
db_write_thread.lo: AM_CPPFLAGS += -I$(top_srcdir)/deps/rocksdb/include
|
db_write_thread.lo: AM_CPPFLAGS += -I$(top_srcdir)/deps/rocksdb/include
|
||||||
|
@ -227,6 +200,3 @@ rfc3986.lo: CXXFLAGS += ${GUNIT_CXXFLAGS}
|
||||||
|
|
||||||
rfc1459.lo: AM_CPPFLAGS := -include ircd/spirit.h ${AM_CPPFLAGS}
|
rfc1459.lo: AM_CPPFLAGS := -include ircd/spirit.h ${AM_CPPFLAGS}
|
||||||
rfc1459.lo: CXXFLAGS += ${GUNIT_CXXFLAGS}
|
rfc1459.lo: CXXFLAGS += ${GUNIT_CXXFLAGS}
|
||||||
|
|
||||||
m_id.lo: AM_CPPFLAGS := -include ircd/spirit.h ${AM_CPPFLAGS}
|
|
||||||
m_id.lo: CXXFLAGS += ${GUNIT_CXXFLAGS}
|
|
||||||
|
|
84
ircd/ircd.cc
84
ircd/ircd.cc
|
@ -10,10 +10,7 @@
|
||||||
|
|
||||||
namespace ircd
|
namespace ircd
|
||||||
{
|
{
|
||||||
std::string _origin; // user's supplied param
|
extern ctx::ctx *main_context;
|
||||||
std::string _servername; // user's supplied param
|
|
||||||
ctx::ctx *main_context; // Main program loop
|
|
||||||
|
|
||||||
static void main() noexcept;
|
static void main() noexcept;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,6 +66,45 @@ ircd::restart
|
||||||
{ "persist", false },
|
{ "persist", false },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
decltype(ircd::server_name)
|
||||||
|
ircd::server_name
|
||||||
|
{
|
||||||
|
{
|
||||||
|
{ "name", "ircd.name.server" },
|
||||||
|
{ "default", "localhost" },
|
||||||
|
{ "persist", false },
|
||||||
|
}, []
|
||||||
|
{
|
||||||
|
if(!rfc3986::valid_remote(std::nothrow, ircd::server_name))
|
||||||
|
throw user_error
|
||||||
|
{
|
||||||
|
"The 'ircd.name.server' conf \"%s\" is not a valid hostname.",
|
||||||
|
string_view(server_name),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
decltype(ircd::network_name)
|
||||||
|
ircd::network_name
|
||||||
|
{
|
||||||
|
{
|
||||||
|
{ "name", "ircd.name.network" },
|
||||||
|
{ "default", "localhost" },
|
||||||
|
{ "persist", false },
|
||||||
|
}, []
|
||||||
|
{
|
||||||
|
if(!rfc3986::valid_remote(std::nothrow, ircd::network_name))
|
||||||
|
throw user_error
|
||||||
|
{
|
||||||
|
"The 'ircd.name.network' conf \"%s\" is not a valid hostname.",
|
||||||
|
string_view(network_name),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
decltype(ircd::main_context)
|
||||||
|
ircd::main_context;
|
||||||
|
|
||||||
/// Sets up the IRCd and its main context, then returns without blocking.
|
/// Sets up the IRCd and its main context, then returns without blocking.
|
||||||
//
|
//
|
||||||
/// Pass your io_context instance, it will share it with the rest of your program.
|
/// Pass your io_context instance, it will share it with the rest of your program.
|
||||||
|
@ -79,9 +115,7 @@ ircd::restart
|
||||||
///
|
///
|
||||||
/// init() can only be called from a run::level::HALT state
|
/// init() can only be called from a run::level::HALT state
|
||||||
void
|
void
|
||||||
ircd::init(boost::asio::io_context &user_ios,
|
ircd::init(boost::asio::io_context &user_ios)
|
||||||
const string_view &origin,
|
|
||||||
const string_view &servername)
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// This function must only be called from a HALT state.
|
// This function must only be called from a HALT state.
|
||||||
|
@ -91,24 +125,6 @@ try
|
||||||
"Cannot init() IRCd from runlevel %s", reflect(run::level)
|
"Cannot init() IRCd from runlevel %s", reflect(run::level)
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check that the supplied origin string is properly formatted.
|
|
||||||
if(!rfc3986::valid_remote(std::nothrow, origin))
|
|
||||||
throw user_error
|
|
||||||
{
|
|
||||||
"The 'origin' argument \"%s\" is not a valid hostname.", origin
|
|
||||||
};
|
|
||||||
|
|
||||||
// Check that the supplied servername string is properly formatted.
|
|
||||||
if(!rfc3986::valid_remote(std::nothrow, servername))
|
|
||||||
throw user_error
|
|
||||||
{
|
|
||||||
"The 'servername' argument \"%s\" is not a valid hostname.", servername
|
|
||||||
};
|
|
||||||
|
|
||||||
// Save the params used for m::init later.
|
|
||||||
_origin = std::string{origin};
|
|
||||||
_servername = std::string{servername};
|
|
||||||
|
|
||||||
// Setup the core event loop system starting with the user's supplied ios.
|
// Setup the core event loop system starting with the user's supplied ios.
|
||||||
ios::init(user_ios);
|
ios::init(user_ios);
|
||||||
|
|
||||||
|
@ -299,23 +315,7 @@ noexcept try
|
||||||
server::init _server_; // Server related
|
server::init _server_; // Server related
|
||||||
client::init _client_; // Client related
|
client::init _client_; // Client related
|
||||||
js::init _js_; // SpiderMonkey
|
js::init _js_; // SpiderMonkey
|
||||||
m::init _matrix_ // Matrix
|
m::matrix _matrix_; // Matrix
|
||||||
{
|
|
||||||
string_view{_origin},
|
|
||||||
string_view{_servername}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Any deinits which have to be done with all subsystems intact
|
|
||||||
const unwind shutdown{[&]
|
|
||||||
{
|
|
||||||
_matrix_.close();
|
|
||||||
server::interrupt_all();
|
|
||||||
client::terminate_all();
|
|
||||||
client::close_all();
|
|
||||||
server::close_all();
|
|
||||||
server::wait_all();
|
|
||||||
client::wait_all();
|
|
||||||
}};
|
|
||||||
|
|
||||||
// IRCd will now transition to the RUN state indicating full functionality.
|
// IRCd will now transition to the RUN state indicating full functionality.
|
||||||
run::set(run::level::RUN);
|
run::set(run::level::RUN);
|
||||||
|
|
|
@ -481,6 +481,9 @@ ircd::mods::available()
|
||||||
std::string
|
std::string
|
||||||
ircd::mods::fullpath(const string_view &name)
|
ircd::mods::fullpath(const string_view &name)
|
||||||
{
|
{
|
||||||
|
if(fs::is_absolute(name))
|
||||||
|
return postfixed(name);
|
||||||
|
|
||||||
std::vector<std::string> why;
|
std::vector<std::string> why;
|
||||||
const auto path
|
const auto path
|
||||||
{
|
{
|
||||||
|
|
|
@ -1444,11 +1444,11 @@ ircd::server::peer::open_links()
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if(unlikely(is_loop(open_opts.ipport)))
|
if(unlikely(is_loop(open_opts.ipport)))
|
||||||
if(!my_host(server_name(open_opts)))
|
if(!my_host(net::server_name(open_opts)))
|
||||||
throw unavailable
|
throw unavailable
|
||||||
{
|
{
|
||||||
"Won't open loopback for remote host '%s'",
|
"Won't open loopback for remote host '%s'",
|
||||||
server_name(open_opts),
|
net::server_name(open_opts),
|
||||||
};
|
};
|
||||||
|
|
||||||
// The hostname in open_opts should still reference this object's string.
|
// The hostname in open_opts should still reference this object's string.
|
||||||
|
|
86
matrix/Makefile.am
Normal file
86
matrix/Makefile.am
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
AUTOMAKE_OPTIONS = foreign
|
||||||
|
|
||||||
|
DEFS += \
|
||||||
|
-DIRCD_UNIT \
|
||||||
|
-DIRCD_MATRIX_UNIT \
|
||||||
|
###
|
||||||
|
|
||||||
|
AM_CXXFLAGS = \
|
||||||
|
-ftls-model=global-dynamic \
|
||||||
|
@EXTRA_CXXFLAGS@ \
|
||||||
|
###
|
||||||
|
|
||||||
|
if DEBUG
|
||||||
|
if GCC
|
||||||
|
AM_CXXFLAGS += -fmax-errors=2
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
AM_CPPFLAGS = \
|
||||||
|
-I$(top_srcdir)/include \
|
||||||
|
-include ircd/ircd.pic.h \
|
||||||
|
-include ircd/mods/mapi.h \
|
||||||
|
@EXTRA_CPPFLAGS@ \
|
||||||
|
###
|
||||||
|
|
||||||
|
#TODO: split options for if LD_GOLD
|
||||||
|
AM_LDFLAGS = \
|
||||||
|
-version-info 0:1:0 \
|
||||||
|
-Wl,--no-undefined-version \
|
||||||
|
-Wl,--unresolved-symbols=report-all \
|
||||||
|
-Wl,--allow-shlib-undefined \
|
||||||
|
-Wl,--weak-unresolved-symbols \
|
||||||
|
-Wl,-z,now \
|
||||||
|
-L$(top_srcdir)/ircd \
|
||||||
|
$(PLATFORM_LDFLAGS) \
|
||||||
|
@EXTRA_LDFLAGS@ \
|
||||||
|
###
|
||||||
|
|
||||||
|
if MINGW
|
||||||
|
AM_LDFLAGS += \
|
||||||
|
-Wl,--enable-runtime-pseudo-reloc \
|
||||||
|
###
|
||||||
|
endif
|
||||||
|
|
||||||
|
libircd_matrixdir = @libdir@
|
||||||
|
libircd_matrix_LTLIBRARIES = libircd_matrix.la
|
||||||
|
|
||||||
|
libircd_matrix_LIBADD =#
|
||||||
|
libircd_matrix_LIBADD += -lircd
|
||||||
|
|
||||||
|
libircd_matrix_la_SOURCES =#
|
||||||
|
libircd_matrix_la_SOURCES += name.cc
|
||||||
|
libircd_matrix_la_SOURCES += id.cc
|
||||||
|
libircd_matrix_la_SOURCES += dbs.cc
|
||||||
|
libircd_matrix_la_SOURCES += room.cc
|
||||||
|
libircd_matrix_la_SOURCES += fed.cc
|
||||||
|
libircd_matrix_la_SOURCES += init_bootstrap.cc
|
||||||
|
libircd_matrix_la_SOURCES += matrix.cc
|
||||||
|
libircd_matrix_la_SOURCES += event.cc
|
||||||
|
|
||||||
|
### TODO: dedup with ircd/Makefile.am
|
||||||
|
|
||||||
|
# Units containing a spirit grammar have some special needs to mitigate
|
||||||
|
# larger-than-normal compile time, compile memory, and output objects.
|
||||||
|
# A composite of CXXFLAGS is used specifically on units with grammars.
|
||||||
|
GUNIT_CXXFLAGS = ###
|
||||||
|
|
||||||
|
# Grammar templates can generate a huge number of individual debug symbols
|
||||||
|
# for each template instantiation deep within spirit; we try to reduce...
|
||||||
|
GUNIT_CXXFLAGS += -fno-var-tracking
|
||||||
|
if GCC
|
||||||
|
GUNIT_CXXFLAGS += -fno-var-tracking-assignments
|
||||||
|
GUNIT_CXXFLAGS += -femit-struct-debug-baseonly
|
||||||
|
endif
|
||||||
|
|
||||||
|
# The recursive grammars can consume a large amount of RAM when compiling
|
||||||
|
# (>= 2 GiB) which can thrash small systems and even sometimes crash GCC.
|
||||||
|
# This option reduces memory consumption at the cost of compilation speed.
|
||||||
|
if GCC
|
||||||
|
if LOWMEM_COMPILE
|
||||||
|
GUNIT_CXXFLAGS += --param ggc-min-expand=1
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
id.lo: AM_CPPFLAGS := -include ircd/spirit.h ${AM_CPPFLAGS}
|
||||||
|
id.lo: CXXFLAGS += ${GUNIT_CXXFLAGS}
|
|
@ -8,15 +8,7 @@
|
||||||
// copyright notice and this permission notice is present in all copies. The
|
// copyright notice and this permission notice is present in all copies. The
|
||||||
// full license for this software is available in the LICENSE file.
|
// full license for this software is available in the LICENSE file.
|
||||||
|
|
||||||
ircd::mapi::header
|
ircd::m::init::bootstrap::bootstrap()
|
||||||
IRCD_MODULE
|
|
||||||
{
|
|
||||||
"Matrix initial bootstrap support."
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
IRCD_MODULE_EXPORT
|
|
||||||
ircd::m::init::bootstrap()
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
assert(dbs::events);
|
assert(dbs::events);
|
|
@ -8,6 +8,25 @@
|
||||||
// copyright notice and this permission notice is present in all copies. The
|
// copyright notice and this permission notice is present in all copies. The
|
||||||
// full license for this software is available in the LICENSE file.
|
// full license for this software is available in the LICENSE file.
|
||||||
|
|
||||||
|
namespace ircd::m
|
||||||
|
{
|
||||||
|
std::unique_ptr<self::init> _self;
|
||||||
|
std::unique_ptr<dbs::init> _dbs;
|
||||||
|
std::unique_ptr<init::modules> _modules;
|
||||||
|
|
||||||
|
static void on_load();
|
||||||
|
static void on_unload() noexcept;
|
||||||
|
}
|
||||||
|
|
||||||
|
ircd::mapi::header
|
||||||
|
IRCD_MODULE
|
||||||
|
{
|
||||||
|
"Matrix Chat Protocol",
|
||||||
|
ircd::m::on_load,
|
||||||
|
ircd::m::on_unload,
|
||||||
|
};
|
||||||
|
|
||||||
|
IRCD_MODULE_EXPORT_DATA
|
||||||
decltype(ircd::m::log)
|
decltype(ircd::m::log)
|
||||||
ircd::m::log
|
ircd::m::log
|
||||||
{
|
{
|
||||||
|
@ -32,26 +51,14 @@ me_offline_status_msg
|
||||||
{ "default", "Catch ya on the flip side..." }
|
{ "default", "Catch ya on the flip side..." }
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
void
|
||||||
// init::init
|
ircd::m::on_load()
|
||||||
//
|
|
||||||
|
|
||||||
ircd::m::init::init(const string_view &origin,
|
|
||||||
const string_view &servername)
|
|
||||||
try
|
try
|
||||||
:_self
|
|
||||||
{
|
|
||||||
origin, servername
|
|
||||||
}
|
|
||||||
,_dbs
|
|
||||||
{
|
|
||||||
self::servername, std::string{}
|
|
||||||
}
|
|
||||||
,_modules
|
|
||||||
{
|
|
||||||
std::make_unique<modules>()
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
|
_self = std::make_unique<self::init>();
|
||||||
|
_dbs = std::make_unique<dbs::init>(ircd::server_name, std::string{});
|
||||||
|
_modules = std::make_unique<init::modules>();
|
||||||
|
|
||||||
if(!ircd::write_avoid && vm::sequence::retired != 0)
|
if(!ircd::write_avoid && vm::sequence::retired != 0)
|
||||||
presence::set(me, "online", me_online_status_msg);
|
presence::set(me, "online", me_online_status_msg);
|
||||||
}
|
}
|
||||||
|
@ -78,14 +85,29 @@ catch(const std::exception &e)
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
||||||
ircd::m::init::~init()
|
void
|
||||||
|
ircd::m::on_unload()
|
||||||
noexcept try
|
noexcept try
|
||||||
{
|
{
|
||||||
|
mods::imports.erase("m_listen"s);
|
||||||
|
|
||||||
if(m::sync::pool.size())
|
if(m::sync::pool.size())
|
||||||
m::sync::pool.join();
|
m::sync::pool.join();
|
||||||
|
|
||||||
if(!std::uncaught_exceptions() && !ircd::write_avoid)
|
if(!std::uncaught_exceptions() && !ircd::write_avoid)
|
||||||
presence::set(me, "offline", me_offline_status_msg);
|
presence::set(me, "offline", me_offline_status_msg);
|
||||||
|
|
||||||
|
_modules.reset(nullptr);
|
||||||
|
_dbs.reset(nullptr);
|
||||||
|
_self.reset(nullptr);
|
||||||
|
|
||||||
|
//TODO: remove this for non-interfering shutdown
|
||||||
|
server::interrupt_all();
|
||||||
|
client::terminate_all();
|
||||||
|
client::close_all();
|
||||||
|
server::close_all();
|
||||||
|
server::wait_all();
|
||||||
|
client::wait_all();
|
||||||
}
|
}
|
||||||
catch(const m::error &e)
|
catch(const m::error &e)
|
||||||
{
|
{
|
||||||
|
@ -97,12 +119,6 @@ catch(const m::error &e)
|
||||||
ircd::terminate();
|
ircd::terminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
ircd::m::init::close()
|
|
||||||
{
|
|
||||||
mods::imports.erase("m_listen"s);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// init::modules
|
// init::modules
|
||||||
//
|
//
|
||||||
|
@ -164,17 +180,7 @@ ircd::m::init::modules::init_imports()
|
||||||
"database is empty. I will be bootstrapping it with initial events now..."
|
"database is empty. I will be bootstrapping it with initial events now..."
|
||||||
};
|
};
|
||||||
|
|
||||||
const module m_init_bootstrap
|
m::init::bootstrap{};
|
||||||
{
|
|
||||||
"m_init_bootstrap"
|
|
||||||
};
|
|
||||||
|
|
||||||
const mods::import<void ()> bootstrap
|
|
||||||
{
|
|
||||||
m_init_bootstrap, "ircd::m::init::bootstrap"
|
|
||||||
};
|
|
||||||
|
|
||||||
bootstrap();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -483,18 +489,18 @@ ircd::m::self::host()
|
||||||
extern ircd::m::room::id::buf users_room_id;
|
extern ircd::m::room::id::buf users_room_id;
|
||||||
extern ircd::m::room::id::buf tokens_room_id;
|
extern ircd::m::room::id::buf tokens_room_id;
|
||||||
|
|
||||||
ircd::m::self::init::init(const string_view &origin,
|
ircd::m::self::init::init()
|
||||||
const string_view &servername)
|
try
|
||||||
{
|
{
|
||||||
|
self::origin = string_view{ircd::network_name};
|
||||||
|
self::servername = string_view{ircd::server_name};
|
||||||
|
|
||||||
// Sanity check that these are valid hostname strings. This was likely
|
// Sanity check that these are valid hostname strings. This was likely
|
||||||
// already checked, so these validators will simply throw without very
|
// already checked, so these validators will simply throw without very
|
||||||
// useful error messages if invalid strings ever make it this far.
|
// useful error messages if invalid strings ever make it this far.
|
||||||
rfc3986::valid_host(origin);
|
rfc3986::valid_host(origin);
|
||||||
rfc3986::valid_host(servername);
|
rfc3986::valid_host(servername);
|
||||||
|
|
||||||
self::origin = origin;
|
|
||||||
self::servername = servername;
|
|
||||||
|
|
||||||
m::my_node = string_view{strlcpy
|
m::my_node = string_view{strlcpy
|
||||||
{
|
{
|
||||||
ircd_node_id, origin
|
ircd_node_id, origin
|
||||||
|
@ -521,6 +527,17 @@ ircd::m::self::init::init(const string_view &origin,
|
||||||
assert(ircd::run::level == run::level::START);
|
assert(ircd::run::level == run::level::START);
|
||||||
mods::imports.emplace("m_keys"s, "m_keys"s);
|
mods::imports.emplace("m_keys"s, "m_keys"s);
|
||||||
}
|
}
|
||||||
|
catch(const std::exception &e)
|
||||||
|
{
|
||||||
|
log::critical
|
||||||
|
{
|
||||||
|
m::log, "Failed to init self origin[%s] servername[%s]",
|
||||||
|
origin,
|
||||||
|
servername,
|
||||||
|
};
|
||||||
|
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
|
@ -20,36 +20,18 @@ AM_CPPFLAGS = \
|
||||||
@EXTRA_CPPFLAGS@ \
|
@EXTRA_CPPFLAGS@ \
|
||||||
###
|
###
|
||||||
|
|
||||||
|
#TODO: split options for if LD_GOLD
|
||||||
AM_LDFLAGS = \
|
AM_LDFLAGS = \
|
||||||
-module \
|
-module \
|
||||||
-avoid-version \
|
-avoid-version \
|
||||||
-Wl,--warn-common \
|
|
||||||
-Wl,--warn-execstack \
|
|
||||||
-Wl,--detect-odr-violations \
|
|
||||||
-Wl,--allow-shlib-undefined \
|
-Wl,--allow-shlib-undefined \
|
||||||
-Wl,--icf=all \
|
|
||||||
-Wl,--gdb-index \
|
|
||||||
-Wl,-z,lazy \
|
-Wl,-z,lazy \
|
||||||
-Wl,-z,noexecstack \
|
|
||||||
-Wl,-z,combreloc \
|
|
||||||
-Wl,-z,text-unlikely-segment \
|
|
||||||
-L$(top_srcdir)/ircd \
|
-L$(top_srcdir)/ircd \
|
||||||
|
-L$(top_srcdir)/matrix \
|
||||||
$(PLATFORM_LDFLAGS) \
|
$(PLATFORM_LDFLAGS) \
|
||||||
@EXTRA_LDFLAGS@ \
|
@EXTRA_LDFLAGS@ \
|
||||||
###
|
###
|
||||||
|
|
||||||
if GCC
|
|
||||||
AM_LDFLAGS += \
|
|
||||||
-Wl,-fuse-ld=gold \
|
|
||||||
###
|
|
||||||
endif
|
|
||||||
|
|
||||||
if CLANG
|
|
||||||
AM_LDFLAGS += \
|
|
||||||
-fuse-ld=gold \
|
|
||||||
###
|
|
||||||
endif
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# /
|
# /
|
||||||
|
@ -161,7 +143,6 @@ m_event_append_la_SOURCES = m_event_append.cc
|
||||||
m_event_horizon_la_SOURCES = m_event_pretty.cc
|
m_event_horizon_la_SOURCES = m_event_pretty.cc
|
||||||
m_event_pretty_la_SOURCES = m_event_horizon.cc
|
m_event_pretty_la_SOURCES = m_event_horizon.cc
|
||||||
|
|
||||||
m_init_bootstrap_la_SOURCES = m_init_bootstrap.cc
|
|
||||||
m_init_backfill_la_SOURCES = m_init_backfill.cc
|
m_init_backfill_la_SOURCES = m_init_backfill.cc
|
||||||
m_listen_la_SOURCES = m_listen.cc
|
m_listen_la_SOURCES = m_listen.cc
|
||||||
|
|
||||||
|
@ -225,7 +206,6 @@ m_module_LTLIBRARIES = \
|
||||||
m_room_server_acl.la \
|
m_room_server_acl.la \
|
||||||
m_room_bootstrap.la \
|
m_room_bootstrap.la \
|
||||||
m_room_name.la \
|
m_room_name.la \
|
||||||
m_init_bootstrap.la \
|
|
||||||
m_init_backfill.la \
|
m_init_backfill.la \
|
||||||
m_listen.la \
|
m_listen.la \
|
||||||
m_users.la \
|
m_users.la \
|
||||||
|
|
|
@ -10,6 +10,19 @@
|
||||||
|
|
||||||
#include "net_dns.h"
|
#include "net_dns.h"
|
||||||
|
|
||||||
|
namespace ircd::net::dns
|
||||||
|
{
|
||||||
|
template<class T> static rfc1035::record *new_record(mutable_buffer &, const rfc1035::answer &);
|
||||||
|
static void handle_resolved(std::exception_ptr, const tag &, const answers &);
|
||||||
|
|
||||||
|
static void handle_resolve_A_ipport(const hostport &, const json::object &rr, opts, uint16_t, callback_ipport);
|
||||||
|
static void handle_resolve_SRV_ipport(const hostport &, const json::object &rr, opts, callback_ipport);
|
||||||
|
static void handle_resolve_one(const hostport &, const json::array &rr, callback_one);
|
||||||
|
|
||||||
|
static void fini();
|
||||||
|
static void init();
|
||||||
|
}
|
||||||
|
|
||||||
ircd::mapi::header
|
ircd::mapi::header
|
||||||
IRCD_MODULE
|
IRCD_MODULE
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,34 +21,24 @@ namespace ircd::net::dns
|
||||||
using answers_callback = std::function<void (std::exception_ptr, const tag &, const answers &)>;
|
using answers_callback = std::function<void (std::exception_ptr, const tag &, const answers &)>;
|
||||||
|
|
||||||
constexpr const size_t MAX_COUNT {64};
|
constexpr const size_t MAX_COUNT {64};
|
||||||
|
|
||||||
template<class T> static rfc1035::record *new_record(mutable_buffer &, const rfc1035::answer &);
|
|
||||||
static void handle_resolved(std::exception_ptr, const tag &, const answers &);
|
|
||||||
|
|
||||||
static void handle_resolve_A_ipport(const hostport &, const json::object &rr, opts, uint16_t, callback_ipport);
|
|
||||||
static void handle_resolve_SRV_ipport(const hostport &, const json::object &rr, opts, callback_ipport);
|
|
||||||
static void handle_resolve_one(const hostport &, const json::array &rr, callback_one);
|
|
||||||
|
|
||||||
static void fini();
|
|
||||||
static void init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace ircd::net::dns::cache
|
namespace ircd::net::dns::cache
|
||||||
{
|
{
|
||||||
struct waiter;
|
struct waiter;
|
||||||
|
|
||||||
static bool operator==(const waiter &, const waiter &);
|
bool operator==(const waiter &, const waiter &);
|
||||||
static bool operator!=(const waiter &, const waiter &);
|
bool operator!=(const waiter &, const waiter &);
|
||||||
|
|
||||||
static bool call_waiter(const string_view &, const string_view &, const json::array &, waiter &);
|
bool call_waiter(const string_view &, const string_view &, const json::array &, waiter &);
|
||||||
static size_t call_waiters(const string_view &, const string_view &, const json::array &);
|
size_t call_waiters(const string_view &, const string_view &, const json::array &);
|
||||||
static void handle(const m::event &, m::vm::eval &);
|
void handle(const m::event &, m::vm::eval &);
|
||||||
|
|
||||||
static bool put(const string_view &type, const string_view &state_key, const records &rrs);
|
bool put(const string_view &type, const string_view &state_key, const records &rrs);
|
||||||
static bool put(const string_view &type, const string_view &state_key, const uint &code, const string_view &msg);
|
bool put(const string_view &type, const string_view &state_key, const uint &code, const string_view &msg);
|
||||||
|
|
||||||
static void fini();
|
void fini();
|
||||||
static void init();
|
void init();
|
||||||
|
|
||||||
extern conf::item<seconds> min_ttl IRCD_MODULE_EXPORT_DATA;
|
extern conf::item<seconds> min_ttl IRCD_MODULE_EXPORT_DATA;
|
||||||
extern conf::item<seconds> error_ttl IRCD_MODULE_EXPORT_DATA;
|
extern conf::item<seconds> error_ttl IRCD_MODULE_EXPORT_DATA;
|
||||||
|
|
Loading…
Reference in a new issue