/*
* This file is part of DisOrder.
* Copyright (C) 2004, 2005, 2006, 2007 Richard Kettlewell
+ * Portions copyright (C) 2007 Mark Wooding
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*/
char *configfile;
+/** @brief Read user configuration
+ *
+ * If clear, the user-specific configuration is not read.
+ */
+int config_per_user = 1;
+
/** @brief Config file parser state */
struct config_state {
/** @brief Filename */
struct stringlistlist *sll;
sll = ADDRESS(cs->config, struct stringlistlist);
+ if(nvec == 0) {
+ sll->n = 0;
+ return 0;
+ }
sll->n++;
sll->s = xrealloc(sll->s, (sll->n * sizeof (struct stringlist)));
s = &sll->s[sll->n - 1];
struct stringlist *sl;
sl = ADDRESS(cs->config, struct stringlist);
+ if(nvec == 0) {
+ sl->n = 0;
+ return 0;
+ }
for(n = 0; n < nvec; ++n) {
sl->n++;
sl->s = xrealloc(sl->s, (sl->n * sizeof (char *)));
return 0;
}
+static int validate_tracklength(const struct config_state *cs,
+ int nvec,
+ char attribute((unused)) **vec) {
+ if(nvec < 2) {
+ error(0, "%s:%d: should be at least 'tracklength PATTERN MODULE'",
+ cs->path, cs->line);
+ return -1;
+ }
+ return 0;
+}
+
static int validate_allow(const struct config_state *cs,
int nvec,
char attribute((unused)) **vec) {
{ C(checkpoint_min), &type_integer, validate_non_negative },
{ C(collection), &type_collections, validate_any },
{ C(connect), &type_stringlist, validate_addrport },
+ { C(cookie_login_lifetime), &type_integer, validate_positive },
+ { C(cookie_key_lifetime), &type_integer, validate_positive },
+ { C(dbversion), &type_integer, validate_positive },
{ C(device), &type_string, validate_any },
{ C(gap), &type_integer, validate_non_negative },
{ C(history), &type_integer, validate_positive },
{ C(listen), &type_stringlist, validate_port },
{ C(lock), &type_boolean, validate_any },
{ C(mixer), &type_string, validate_ischr },
+ { C(multicast_loop), &type_boolean, validate_any },
{ C(multicast_ttl), &type_integer, validate_non_negative },
{ C(namepart), &type_namepart, validate_any },
{ C2(nice, nice_rescan), &type_integer, validate_non_negative },
{ C(speaker_command), &type_string, validate_any },
{ C(stopword), &type_string_accum, validate_any },
{ C(templates), &type_string_accum, validate_isdir },
+ { C(tracklength), &type_stringlist_accum, validate_tracklength },
{ C(transform), &type_transform, validate_any },
{ C(trust), &type_string_accum, validate_any },
{ C(url), &type_string, validate_url },
c->queue_pad = 10;
c->speaker_backend = -1;
c->multicast_ttl = 1;
+ c->multicast_loop = 1;
c->authorization_algorithm = xstrdup("sha1");
c->noticed_history = 31;
c->short_display = 32;
+ c->mixer = xstrdup("/dev/mixer");
+ c->channel = xstrdup("pcm");
+ c->dbversion = 2;
+ c->cookie_login_lifetime = 86400;
+ c->cookie_key_lifetime = 86400 * 7;
return c;
}
return -1;
xfree(privconf);
/* if there's a per-user system config file for this user, read it */
- if(!(pw = getpwuid(getuid())))
- fatal(0, "cannot determine our username");
- if((privconf = config_usersysconf(pw))
- && access(privconf, F_OK) == 0
- && config_include(c, privconf))
+ if(config_per_user) {
+ if(!(pw = getpwuid(getuid())))
+ fatal(0, "cannot determine our username");
+ if((privconf = config_usersysconf(pw))
+ && access(privconf, F_OK) == 0
+ && config_include(c, privconf))
return -1;
- xfree(privconf);
- /* if we have a password file, read it */
- if((privconf = config_userconf(getenv("HOME"), pw))
- && access(privconf, F_OK) == 0
- && config_include(c, privconf))
- return -1;
- xfree(privconf);
+ xfree(privconf);
+ /* if we have a password file, read it */
+ if((privconf = config_userconf(getenv("HOME"), pw))
+ && access(privconf, F_OK) == 0
+ && config_include(c, privconf))
+ return -1;
+ xfree(privconf);
+ }
/* install default namepart and transform settings */
config_postdefaults(c, server);
/* everything is good so we shall use the new config */