chiark / gitweb /
Knock address specifications into order.
[disorder] / lib / configuration.c
index 60b3e0e278a87332c6cb7b0d065e0268eddc2f05..47ba9f4c68d4fd29a18f83a69438b3e886ef4c3a 100644 (file)
@@ -17,6 +17,9 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  * USA
  */
+/** @file lib/configuration.c
+ * @brief Configuration file support
+ */
 
 #include <config.h>
 #include "types.h"
@@ -791,7 +794,7 @@ static int validate_addrport(const struct config_state attribute((unused)) *cs,
   }
 }
 
-static int validate_address(const struct config_state attribute((unused)) *cs,
+static int validate_port(const struct config_state attribute((unused)) *cs,
                         int nvec,
                         char attribute((unused)) **vec) {
   switch(nvec) {
@@ -803,7 +806,7 @@ static int validate_address(const struct config_state attribute((unused)) *cs,
   case 2:
     return 0;
   default:
-    error(0, "%s:%d: expected ADDRESS PORT",
+    error(0, "%s:%d: expected [ADDRESS] PORT",
          cs->path, cs->line);
     return -1;
   }
@@ -819,7 +822,7 @@ static const struct conf conf[] = {
   { C(alias),            &type_string,           validate_alias },
   { C(allow),            &type_stringlist_accum, validate_allow },
   { C(broadcast),        &type_stringlist,       validate_addrport },
-  { C(broadcast_from),   &type_stringlist,       validate_address },
+  { C(broadcast_from),   &type_stringlist,       validate_addrport },
   { C(channel),          &type_string,           validate_channel },
   { C(checkpoint_kbyte), &type_integer,          validate_non_negative },
   { C(checkpoint_min),   &type_integer,          validate_non_negative },
@@ -829,9 +832,10 @@ static const struct conf conf[] = {
   { C(gap),              &type_integer,          validate_non_negative },
   { C(history),          &type_integer,          validate_positive },
   { C(home),             &type_string,           validate_isdir },
-  { C(listen),           &type_stringlist,       validate_addrport },
+  { C(listen),           &type_stringlist,       validate_port },
   { C(lock),             &type_boolean,          validate_any },
   { C(mixer),            &type_string,           validate_ischr },
+  { C(multicast_ttl),    &type_integer,          validate_non_negative },
   { C(namepart),         &type_namepart,         validate_any },
   { C2(nice, nice_rescan), &type_integer,        validate_non_negative },
   { C(nice_rescan),      &type_integer,          validate_non_negative },
@@ -883,6 +887,7 @@ static int config_set(const struct config_state *cs,
          || which->type->set(cs, which, nvec - 1, vec + 1));
 }
 
+/** @brief Error callback used by config_include() */
 static void config_error(const char *msg, void *u) {
   const struct config_state *cs = u;
 
@@ -969,6 +974,7 @@ static struct config *config_default(void) {
   c->sample_format.byte_format = AO_FMT_NATIVE;
   c->queue_pad = 10;
   c->speaker_backend = -1;
+  c->multicast_ttl = 1;
   return c;
 }
 
@@ -1063,8 +1069,10 @@ int config_read() {
 
   set_configfile();
   c = config_default();
-  if(config_include(c, configfile))
-    return -1;
+  /* standalone Disobedience installs might not have a global config file */
+  if(access(configfile, F_OK) == 0)
+    if(config_include(c, configfile))
+      return -1;
   /* if we can read the private config file, do */
   if((privconf = config_private())
      && access(privconf, R_OK) == 0