From 8fb580aaf52975b428c3bf90ce7adf827f09a688 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sun, 12 Aug 2018 11:56:53 -0700 Subject: [PATCH] configure/ircd: Overhaul install system directory related. --- configure.ac | 199 ++++++++++++----------------------------- construct/construct.cc | 2 +- include/ircd/fs/fs.h | 49 +++++----- ircd/Makefile.am | 3 +- ircd/conf.cc | 19 +++- ircd/fs.cc | 119 ++++++++++++------------ ircd/mods.cc | 2 +- modules/console.cc | 2 +- 8 files changed, 161 insertions(+), 234 deletions(-) diff --git a/configure.ac b/configure.ac index 27d3c53dd..0e67042e1 100644 --- a/configure.ac +++ b/configure.ac @@ -9,7 +9,7 @@ AC_INIT([construct], [1.0]) AC_GNU_SOURCE AC_USE_SYSTEM_EXTENSIONS AC_CONFIG_MACRO_DIR([m4]) -AC_PREFIX_DEFAULT($HOME/ircd) +AC_PREFIX_DEFAULT([/]) AC_PATH_PROG(AUTOMAKE, automake) AC_PATH_PROG(ACLOCAL, aclocal) @@ -713,8 +713,7 @@ AM_COND_IF(LINUX, AC_ARG_ENABLE(aio, AC_HELP_STRING([--disable-aio], [Disable kernel AIO support]), [ aio=$enableval - ], - [ + ], [ aio=yes ]) ], []) @@ -736,180 +735,96 @@ dnl PKG_PROG_PKG_CONFIG if test "$prefix" = "NONE"; then - AC_DEFINE_UNQUOTED(RB_PREFIX, "$ac_default_prefix", [Prefix where librb is installed.]) + prefix="$ac_default_prefix" else dnl Don't get bitten by Cygwin's stupidity if the user specified dnl a custom prefix with a trailing slash prefix=`echo $prefix | sed 's/\/$//'` - AC_DEFINE_UNQUOTED(RB_PREFIX, "$prefix", [Prefix where librb is installed.]) - AC_SUBST(RB_PREFIX) fi +RB_DEFINE_UNQUOTED(PREFIX, ["$prefix"], [Prefix of IRCd install]) +AC_SUBST_DIR([prefix]) -if test "$prefix" = "NONE"; then - AC_DEFINE_UNQUOTED(IRCD_PREFIX, "$ac_default_prefix", [Prefix where the ircd is installed.]) -else - dnl Don't get bitten by Cygwin's stupidity if the user specified - dnl a custom prefix with a trailing slash - prefix=`echo $prefix | sed 's/\/$//'` - AC_DEFINE_UNQUOTED(IRCD_PREFIX, "$prefix", [Prefix where the ircd is installed.]) -fi +dnl +dnl bindir +dnl +RB_DEFINE_UNQUOTED([BIN_DIR], ["$(bindir)"], [Directory where binary executables are to be found.]) +AC_SUBST_DIR([bindir]) -AC_ARG_ENABLE([fhs-paths], - [AS_HELP_STRING([--enable-fhs-paths], [Use more FHS-like pathnames (for packagers).])], - [], - [dnl detect if the user appears to want --enable-fhs-paths - AS_IF([test "$libexecdir" = '${exec_prefix}/libexec' && \ - test "$localstatedir" = '${prefix}/var' && \ - test "$libdir" = '${exec_prefix}/lib'], - [enable_fhs_paths=no], - [enable_fhs_paths=yes]) - ]) -dnl use directory structure of cached as default (hack) -AS_IF([test "x$enable_fhs_paths" = "xyes"], - [dnl Avoid name collisions. - pkglibexecdir='${libexecdir}/${PACKAGE_TARNAME}' - rundir=${rundir-'${prefix}/run'} - pkgrundir='${rundir}/${PACKAGE_TARNAME}' - pkglocalstatedir='${localstatedir}/${PACKAGE_TARNAME}' - AC_DEFINE([ENABLE_FHS_PATHS], [1], [Uncomment if FHS pathnames are enabled])], - [libexecdir='${bindir}' - pkglibexecdir='${libexecdir}' - rundir='${sysconfdir}' - pkgrundir='${rundir}' - localstatedir='${prefix}' - pkglocalstatedir='${sysconfdir}']) -pkglibdir='${libdir}/${PACKAGE_TARNAME}' -AC_SUBST([pkglibdir]) -AC_SUBST([rundir]) -AC_SUBST([pkgrundir]) -AC_SUBST([pkglocalstatedir]) -AC_DEFINE_DIR([PKGLOCALSTATEDIR], [pkglocalstatedir], [[Directory in which to store state, such as ban database]]) -AC_SUBST([pkglibexecdir]) -AC_DEFINE_DIR([PKGLIBEXECDIR], [pkglibexecdir], [Directory where binaries the IRCd itself spawns live]) +dnl +dnl libdir +dnl +RB_DEFINE_UNQUOTED([LIB_DIR], ["$(libdir)"], [Prefix where libs are installed.]) +AC_SUBST_DIR([libdir]) + +dnl +dnl localstatedir +dnl + +dnl Avoid name collisions. +RB_DEFINE_UNQUOTED([LOCALSTATE_DIR], ["$(localstatedir)"], [Prefix where db and logs go.]) +AC_SUBST_DIR([localstatedir]) dnl dnl Check for --with-confdir [deprecated, use --sysconfdir instead] dnl -AC_ARG_WITH([confdir], - [AC_HELP_STRING([--with-confdir=DIR], - [Directory to install config files [deprecated, use --sysconfdir instead].])], - [ sysconfdir=`echo $withval | sed 's/\/$//'` ], - [ confdir='etc' ]) -RB_DEFINE_UNQUOTED([ETC_DIR], ["${prefix}/${confdir}"], [Prefix where config files are installed.]) - +RB_DEFINE_UNQUOTED([CONF_DIR], ["$(sysconfdir)"], [Prefix where config files are installed.]) +AC_SUBST_DIR([sysconfdir]) dnl -dnl Check for --with-bindir +dnl Check for --with-dbdir dnl -AC_MSG_CHECKING([whether to modify binary directory]) -AC_ARG_WITH(bindir, -AC_HELP_STRING([--with-bindir=DIR], - [Directory where binary executables are placed.]), - [ logdir=`echo $withval | sed 's/\/$//'` - AC_MSG_RESULT(yes)], - [ AS_IF([test "x$enable_fhs_paths" = "xyes"], - [bindir="${prefix}/bin"], - [bindir="${prefix}/bin"]) - AC_MSG_RESULT(no)]) -RB_DEFINE_UNQUOTED([BIN_DIR], ["${bindir}"], [Directory where binary executables are to be found.]) -AC_SUBST_DIR([bindir]) +AC_MSG_CHECKING([whether to modify database directory]) +AC_ARG_WITH(dbdir, AC_HELP_STRING([--with-dbdir=DIR], [Directory where databases are located]), +[ + AC_MSG_RESULT(yes) + dbdir=`echo $withval | sed 's/\/$//'` +], [ + AC_MSG_RESULT(no) + dbdir="${localstatedir}/db/${PACKAGE_TARNAME}" +]) +RB_DEFINE_UNQUOTED([DB_DIR], ["$dbdir"], [Directory where databases are located]) +AC_SUBST_DIR([dbdir]) dnl dnl Check for --with-logdir dnl AC_MSG_CHECKING([whether to modify logdir]) -AC_ARG_WITH(logdir, -AC_HELP_STRING([--with-logdir=DIR], - [Directory where to write logfiles.]), - [ logdir=`echo $withval | sed 's/\/$//'` - AC_MSG_RESULT(yes)], - [ AS_IF([test "x$enable_fhs_paths" = "xyes"], - [logdir="${prefix}/var/log"], - [logdir="${prefix}/var/${PACKAGE_TARNAME}/log"]) - AC_MSG_RESULT(no)]) -RB_DEFINE_UNQUOTED([LOG_DIR], ["${logdir}"], [Prefix where to write logfiles.]) +AC_ARG_WITH(logdir, AC_HELP_STRING([--with-logdir=DIR], [Directory where to write logfiles.]), +[ + AC_MSG_RESULT(yes) + logdir=`echo $withval | sed 's/\/$//'` +], [ + AC_MSG_RESULT(no) + logdir="${localstatedir}/log/${PACKAGE_TARNAME}" +]) + +RB_DEFINE_UNQUOTED([LOG_DIR], ["$logdir"], [Prefix where to write logfiles.]) AC_SUBST_DIR([logdir]) - -dnl -dnl Check for --with-helpdir -dnl - -AC_MSG_CHECKING([whether to modify helpdir]) -AC_ARG_WITH(helpdir, -AC_HELP_STRING([--with-helpdir=DIR], - [Directory to install help files.]), - [ helpdir=`echo $withval | sed 's/\/$//'` - AC_MSG_RESULT(yes) ], - [ AS_IF([test "x$enable_fhs_paths" = "xyes"], - [helpdir="${prefix}/share/help"], - [helpdir="${prefix}/share/${PACKAGE_TARNAME}/help"]) - AC_MSG_RESULT(no) ]) -RB_DEFINE_UNQUOTED([HELP_DIR], ["${helpdir}"], [Prefix where help files are installed.]) -AC_SUBST_DIR([helpdir]) - - dnl dnl Check for --with-moduledir dnl AC_MSG_CHECKING([whether to modify moduledir]) -AC_ARG_WITH(moduledir, - [AC_HELP_STRING([--with-moduledir=DIR], - [Directory to install modules.])], - [ moduledir=`echo $withval | sed 's/\/$//'` - AC_MSG_RESULT(yes)], - [ AS_IF([test "x$enable_fhs_paths" = "xyes"], - [moduledir="${prefix}/lib/modules"], - [moduledir="${prefix}/lib/${PACKAGE_TARNAME}/modules"]) - AC_MSG_RESULT(no) - ]) -RB_DEFINE_UNQUOTED([MODULE_DIR], ["${moduledir}"], [Prefix where modules are installed.]) +AC_ARG_WITH(moduledir, [AC_HELP_STRING([--with-moduledir=DIR], [Directory to install modules.])], +[ + AC_MSG_RESULT(yes) + moduledir=`echo $withval | sed 's/\/$//'` +], [ + AC_MSG_RESULT(no) + moduledir="${libdir}/modules/${PACKAGE_TARNAME}" +]) + +RB_DEFINE_UNQUOTED([MODULE_DIR], ["$moduledir"], [Prefix where modules are installed.]) AC_SUBST_DIR([moduledir]) - -dnl -dnl Check for --with-rundir -dnl - -AC_MSG_CHECKING([whether or modify rundir]) -AC_ARG_WITH([rundir], - [AC_HELP_STRING([--with-rundir=DIR], - [Directory in which to store pidfile.])], - [AC_MSG_RESULT([yes]) - rundir=`echo $withval | sed 's/\/$//'`], - [AC_MSG_RESULT([no]) - AS_IF([test "x$enable_fhs_paths" = "xyes"], - [rundir="${prefix}/var/run"], - [rundir="${prefix}/${PACKAGE_TARNAME}/run"])]) -AC_SUBST([rundir]) -AC_DEFINE_DIR([PKGRUNDIR], ["${rundir}"], [Directory to store pidfile in.]) - - -dnl -dnl Check for --with-program-prefix -dnl - -dnl Installed utility program prefixes (does not affect binaries -dnl installed into pkglibexecdir) -AC_MSG_CHECKING([for program prefix]) -AC_ARG_WITH([program-prefix], - [AS_HELP_STRING([--with-program-prefix=], [If set, programs installed into PATH will be installed with names prefixed by this prefix.])], - [test "x$with_program_prefix" = "xno" && with_program_prefix=], - [with_program_prefix=]) -AC_MSG_RESULT(["$with_program_prefix"]) -PROGRAM_PREFIX="$with_program_prefix" -AC_SUBST([PROGRAM_PREFIX]) -AC_DEFINE_UNQUOTED([PROGRAM_PREFIX], ["$with_program_prefix"], [String with which all programs intended to be in PATH are prefixed.]) - - dnl *************************************************************************** dnl dnl Third party diff --git a/construct/construct.cc b/construct/construct.cc index fc09296a3..c1f96703c 100644 --- a/construct/construct.cc +++ b/construct/construct.cc @@ -92,7 +92,7 @@ try // argument or fall back to the default. const std::string confpath { - configfile?: fs::get(fs::IRCD_CONF) + configfile?: "" }; // Associates libircd with our io_context and posts the initial routines diff --git a/include/ircd/fs/fs.h b/include/ircd/fs/fs.h index c7c6e0a17..95e7766bc 100644 --- a/include/ircd/fs/fs.h +++ b/include/ircd/fs/fs.h @@ -36,38 +36,17 @@ namespace ircd::fs { struct aio; struct init; + enum index :int; IRCD_EXCEPTION(ircd::error, error) IRCD_EXCEPTION(error, filesystem_error) - constexpr auto DPATH = IRCD_PREFIX; - constexpr auto BINPATH = IRCD_PREFIX "/bin"; - constexpr auto ETCPATH = RB_ETC_DIR; - constexpr auto LOGPATH = RB_LOG_DIR; - constexpr auto MODPATH = RB_MODULE_DIR; - constexpr auto CPATH = RB_ETC_DIR "/ircd.conf"; // ircd.conf file - constexpr auto SPATH = RB_BIN_DIR "/" BRANDING_NAME; // ircd executable - constexpr auto DBPATH = PKGLOCALSTATEDIR "/db"; // database prefix + constexpr size_t PATH_MAX { 2048 }; - // Below are the elements for default paths. - enum index - { - PREFIX, - BIN, - ETC, - LOG, - LIBEXEC, - MODULES, - IRCD_CONF, - IRCD_EXEC, - DB, - - _NUM_ - }; - - const char *get(index) noexcept; - const char *name(index) noexcept; + extern aio *aioctx; + string_view get(index) noexcept; + string_view name(index) noexcept; std::string make_path(const vector_view &); bool exists(const string_view &path); @@ -80,17 +59,29 @@ namespace ircd::fs bool rename(std::nothrow_t, const string_view &old, const string_view &new_); void rename(const string_view &old, const string_view &new_); - bool remove(std::nothrow_t, const string_view &path); bool remove(const string_view &path); - std::string cwd(); void chdir(const string_view &path); bool mkdir(const string_view &path); - extern aio *aioctx; + std::string cwd(); } +/// elements for default paths. +enum ircd::fs::index +:int +{ + PREFIX, + BIN, + CONF, + DB, + LOG, + MODULES, + + _NUM_ +}; + #include "fd.h" #include "read.h" #include "write.h" diff --git a/ircd/Makefile.am b/ircd/Makefile.am index eecfc3ca7..5902705be 100644 --- a/ircd/Makefile.am +++ b/ircd/Makefile.am @@ -139,4 +139,5 @@ libircd_la_SOURCES += \ endif install-data-local: - test -d $(prefix)/@logdir@ || mkdir -p $(prefix)/@logdir@ + test -d $(logdir) || mkdir -p $(logdir) + test -d $(dbdir) || mkdir -p $(dbdir) diff --git a/ircd/conf.cc b/ircd/conf.cc index 15100f4fa..65d5437f4 100644 --- a/ircd/conf.cc +++ b/ircd/conf.cc @@ -10,8 +10,10 @@ namespace ircd::conf { + extern const string_view default_filename; + std::string _config; - static std::string read_json_file(string_view filename); + static std::string read_json_file(std::string filename); } //TODO: X @@ -21,10 +23,16 @@ ircd::conf::config _config }; +decltype(ircd::conf::default_filename) +ircd::conf::default_filename +{ + "ircd.conf" +}; + void ircd::conf::init(const string_view &filename) { - _config = read_json_file(filename); + _config = read_json_file(std::string{filename}); } bool @@ -149,7 +157,7 @@ const // std::string -ircd::conf::read_json_file(string_view filename) +ircd::conf::read_json_file(std::string filename) try { if(!filename.empty()) @@ -159,7 +167,10 @@ try }; if(filename.empty()) - filename = fs::CPATH; + filename = fs::make_path( + { + fs::get(fs::CONF), conf::default_filename + }); if(!fs::exists(filename)) return {}; diff --git a/ircd/fs.cc b/ircd/fs.cc index 56de03c7f..83e3e5196 100644 --- a/ircd/fs.cc +++ b/ircd/fs.cc @@ -19,10 +19,6 @@ namespace filesystem = boost::filesystem; namespace ircd::fs { - enum { NAME, PATH }; - using ent = std::pair; - extern const std::array()> paths; - filesystem::path path(std::string); filesystem::path path(const string_view &); filesystem::path path(const vector_view &); @@ -33,20 +29,6 @@ decltype(ircd::fs::aioctx) ircd::fs::aioctx {}; -decltype(ircd::fs::paths) -ircd::fs::paths -{{ - { "prefix", DPATH }, - { "binary dir", BINPATH }, - { "config", ETCPATH }, - { "log", LOGPATH }, - { "libexec dir", PKGLIBEXECDIR }, - { "modules", MODPATH }, - { "ircd.conf", CPATH }, - { "ircd binary", SPATH }, - { "db", DBPATH }, -}}; - ircd::fs::init::init() { #ifdef IRCD_USE_AIO @@ -71,6 +53,55 @@ noexcept assert(!aioctx); } +// +// Compile-time path index +// + +namespace ircd::fs +{ + struct sysent; + extern const std::array()> syspaths; +} + +struct ircd::fs::sysent +{ + string_view name; + string_view path; +}; + +decltype(ircd::fs::syspaths) +ircd::fs::syspaths +{{ + { "prefix", RB_PREFIX }, + { "binary dir", RB_BIN_DIR }, + { "database", RB_DB_DIR }, + { "conf", RB_CONF_DIR }, + { "log", RB_LOG_DIR }, + { "modules", RB_MODULE_DIR }, +}}; + +ircd::string_view +ircd::fs::get(index index) +noexcept try +{ + return syspaths.at(index).path; +} +catch(const std::out_of_range &e) +{ + return {}; +} + +ircd::string_view +ircd::fs::name(index index) +noexcept try +{ + return syspaths.at(index).name; +} +catch(const std::out_of_range &e) +{ + return {}; +} + /////////////////////////////////////////////////////////////////////////////// // // fs/stdin.h @@ -355,7 +386,7 @@ catch(const std::exception &e) namespace ircd::fs { - thread_local char path_buf[2048]; + thread_local char path_buf[PATH_MAX]; static const char *path_str(const string_view &); static uint posix_flags(const std::ios::open_mode &mode); } @@ -481,6 +512,20 @@ noexcept(false) // fs.h / misc // +std::string +ircd::fs::cwd() +try +{ + return filesystem::current_path().string(); +} +catch(const filesystem::filesystem_error &e) +{ + throw filesystem_error + { + "%s", e.what() + }; +} + void ircd::fs::chdir(const string_view &path) try @@ -509,20 +554,6 @@ catch(const filesystem::filesystem_error &e) }; } -std::string -ircd::fs::cwd() -try -{ - return filesystem::current_path().string(); -} -catch(const filesystem::filesystem_error &e) -{ - throw filesystem_error - { - "%s", e.what() - }; -} - bool ircd::fs::remove(const string_view &path) try @@ -703,25 +734,3 @@ ircd::fs::path(std::string s) { return filesystem::path(std::move(s)); } - -const char * -ircd::fs::get(index index) -noexcept try -{ - return std::get(paths.at(index)).c_str(); -} -catch(const std::out_of_range &e) -{ - return nullptr; -} - -const char * -ircd::fs::name(index index) -noexcept try -{ - return std::get(paths.at(index)).c_str(); -} -catch(const std::out_of_range &e) -{ - return nullptr; -} diff --git a/ircd/mods.cc b/ircd/mods.cc index f01f90881..99d3f742e 100644 --- a/ircd/mods.cc +++ b/ircd/mods.cc @@ -473,7 +473,7 @@ namespace ircd::mods decltype(ircd::mods::modroot) ircd::mods::modroot { - ircd::fs::get(ircd::fs::MODULES) + std::string{ircd::fs::get(ircd::fs::MODULES)} }; decltype(ircd::mods::paths) diff --git a/modules/console.cc b/modules/console.cc index f4378b992..e6b75d43c 100644 --- a/modules/console.cc +++ b/modules/console.cc @@ -1878,7 +1878,7 @@ console_cmd__db__list(opt &out, const string_view &line) { const auto name { - replace(lstrip(lstrip(path, fs::DBPATH), '/'), "/", ":") + replace(lstrip(lstrip(path, fs::get(fs::DB)), '/'), "/", ":") }; const auto &d