+/** @brief Log an error and quit
+ *
+ * If @c ${DISORDER_FATAL_ABORT} is defined (as anything) then the process
+ * is aborted, so you can get a backtrace.
+ */
+void disorder_fatal(int errno_value, const char *msg, ...) {
+ va_list ap;
+
+ va_start(ap, msg);
+ elog(LOG_CRIT, ec_errno, errno_value, msg, ap);
+ va_end(ap);
+ if(getenv("DISORDER_FATAL_ABORT")) abort();
+ exitfn(EXIT_FAILURE);
+}
+
+/** @brief Log an error and quit
+ *
+ * If @c ${DISORDER_FATAL_ABORT} is defined (as anything) then the process
+ * is aborted, so you can get a backtrace.
+ */
+void disorder_fatal_ec(enum error_class ec, int errno_value, const char *msg, ...) {
+ va_list ap;
+
+ va_start(ap, msg);
+ elog(LOG_CRIT, ec, errno_value, msg, ap);
+ va_end(ap);
+ if(getenv("DISORDER_FATAL_ABORT")) abort();
+ exitfn(EXIT_FAILURE);
+}
+
+/** @brief Log an error */
+void disorder_error(int errno_value, const char *msg, ...) {
+ va_list ap;
+
+ va_start(ap, msg);
+ elog(LOG_ERR, ec_errno, errno_value, msg, ap);
+ va_end(ap);
+}
+
+/** @brief Log an error */
+void disorder_error_ec(enum error_class ec, int errno_value, const char *msg, ...) {
+ va_list ap;
+
+ va_start(ap, msg);
+ elog(LOG_ERR, ec, errno_value, msg, ap);
+ va_end(ap);
+}
+
+/** @brief Log an informational message */
+void disorder_info(const char *msg, ...) {
+ va_list ap;