void quit(ev_source *ev) attribute((noreturn));
/* terminate the daemon */
-int reconfigure(ev_source *ev, int reload);
-/* reconfigure. If @reload@ is nonzero, update the configuration. */
+int reconfigure(ev_source *ev, unsigned flags);
+/* reconfigure */
+
+void reset_sockets(ev_source *ev);
+
+/** @brief Set when starting server */
+#define RECONFIGURE_FIRST 0x0001
+
+/** @brief Set when reloading after SIGHUP etc */
+#define RECONFIGURE_RELOADING 0x0002
void dbparams_check(void);
int attribute((unused)) sig,
void attribute((unused)) *u) {
info("received SIGHUP");
- reconfigure(ev, 1);
+ reconfigure(ev, RECONFIGURE_RELOADING);
return 0;
}
/* initialize database environment */
trackdb_init(TRACKDB_NORMAL_RECOVER|TRACKDB_MAY_CREATE);
trackdb_master(ev);
- /* install new config (calls trackdb_open()) */
- if(reconfigure(ev, 0))
+ /* install new config; don't create socket */
+ if(reconfigure(ev, RECONFIGURE_FIRST))
fatal(0, "failed to read configuration");
/* Open the database */
trackdb_open(TRACKDB_CAN_UPGRADE);
trackdb_old_users();
/* create a root login */
trackdb_create_root();
+ /* create sockets */
+ reset_sockets(ev);
/* check for change to database parameters */
dbparams_check();
/* re-read config if we receive a SIGHUP */
}
/** @brief Create and destroy sockets to set current configuration */
-static void reset_socket(ev_source *ev) {
+void reset_sockets(ev_source *ev) {
const char *new_unix;
struct addrinfo *res, *r;
struct listener *l, **ll;
}
/** @brief Reconfigure the server
- * @param reload 0 at startup, 1 for a reload
+ * @param flags Flags
+ * @return As config_read(); 0 on success, -1 if could not (re-)read config
*/
-int reconfigure(ev_source *ev, int reload) {
+int reconfigure(ev_source *ev, unsigned flags) {
int need_another_rescan = 0;
int ret = 0;
- D(("reconfigure(%d)", reload));
+ D(("reconfigure(%x)", flags));
/* Deconfigure the old audio API if there is one */
if(api) {
if(api->close_mixer)
api->close_mixer();
api = NULL;
}
- if(reload) {
+ if(flags & RECONFIGURE_RELOADING) {
/* If there's a rescan in progress, cancel it but remember to start a fresh
* one after the reload. */
need_another_rescan = trackdb_rescan_cancel();
/* If we interrupted a rescan of all the tracks, start a new one */
if(need_another_rescan)
trackdb_rescan(ev, 1/*check*/, 0, 0);
- if(!ret) {
- /* Reset sockets */
- reset_socket(ev);
+ if(!ret && !(flags & RECONFIGURE_FIRST)) {
+ /* Open/close sockets */
+ reset_sockets(ev);
}
return ret;
}