chiark / gitweb /
set default gap to 0
[disorder] / lib / configuration.c
index 0f1dc96c016b4ffb545a5b79a0d47e9ab2385f19..95720a3fdca228601b3ddc70e26056eb9ba0a522 100644 (file)
@@ -131,28 +131,55 @@ static int set_collections(const struct config_state *cs,
                           const struct conf *whoami,
                           int nvec, char **vec) {
   struct collectionlist *cl;
+  const char *root, *encoding, *module;
   
-  if(nvec != 3) {
-    error(0, "%s:%d: '%s' requires three arguments",
+  switch(nvec) {
+  case 1:
+    module = 0;
+    encoding = 0;
+    root = vec[0];
+    break;
+  case 2:
+    module = vec[0];
+    encoding = 0;
+    root = vec[1];
+    break;
+  case 3:
+    module = vec[0];
+    encoding = vec[1];
+    root = vec[2];
+    break;
+  case 0:
+    error(0, "%s:%d: '%s' requires at least one argument",
+         cs->path, cs->line, whoami->name);
+    return -1;
+  default:
+    error(0, "%s:%d: '%s' requires at most three arguments",
          cs->path, cs->line, whoami->name);
     return -1;
   }
-  if(vec[2][0] != '/') {
+  /* Sanity check root */
+  if(root[0] != '/') {
     error(0, "%s:%d: collection root must start with '/'",
          cs->path, cs->line);
     return -1;
   }
-  if(vec[2][1] && vec[2][strlen(vec[2])-1] == '/') {
+  if(root[1] && root[strlen(root)-1] == '/') {
     error(0, "%s:%d: collection root must not end with '/'",
          cs->path, cs->line);
     return -1;
   }
+  /* Defaults */
+  if(!module)
+    module = "fs";
+  if(!encoding)
+    encoding = nl_langinfo(CODESET);
   cl = ADDRESS(cs->config, struct collectionlist);
   ++cl->n;
   cl->s = xrealloc(cl->s, cl->n * sizeof (struct collection));
-  cl->s[cl->n - 1].module = xstrdup(vec[0]);
-  cl->s[cl->n - 1].encoding = xstrdup(vec[1]);
-  cl->s[cl->n - 1].root = xstrdup(vec[2]);
+  cl->s[cl->n - 1].module = xstrdup(module);
+  cl->s[cl->n - 1].encoding = xstrdup(encoding);
+  cl->s[cl->n - 1].root = xstrdup(root);
   return 0;
 }
 
@@ -493,19 +520,17 @@ static int set_backend(const struct config_state *cs,
 static int set_rights(const struct config_state *cs,
                      const struct conf *whoami,
                      int nvec, char **vec) {
-  rights_type r;
-
   if(nvec != 1) {
     error(0, "%s:%d: '%s' requires one argument",
          cs->path, cs->line, whoami->name);
     return -1;
   }
-  if(parse_rights(vec[0], &r)) {
+  if(parse_rights(vec[0], 0, 1)) {
     error(0, "%s:%d: invalid rights string '%s'",
          cs->path, cs->line, vec[0]);
     return -1;
   }
-  *ADDRESS(cs->config, rights_type) = r;
+  *ADDRESS(cs->config, char *) = vec[0];
   return 0;
 }
 
@@ -930,6 +955,7 @@ static const struct conf conf[] = {
   { C(home),             &type_string,           validate_isabspath },
   { C(listen),           &type_stringlist,       validate_port },
   { C(lock),             &type_boolean,          validate_any },
+  { C(mail_sender),      &type_string,           validate_any },
   { C(mixer),            &type_string,           validate_ischr },
   { C(multicast_loop),   &type_boolean,          validate_any },
   { C(multicast_ttl),    &type_integer,          validate_non_negative },
@@ -950,6 +976,7 @@ static const struct conf conf[] = {
   { C(scratch),          &type_string_accum,     validate_isreg },
   { C(short_display),    &type_integer,          validate_positive },
   { C(signal),           &type_signal,           validate_any },
+  { C(smtp_server),      &type_string,           validate_any },
   { C(sox_generation),   &type_integer,          validate_non_negative },
   { C(speaker_backend),  &type_backend,          validate_any },
   { C(speaker_command),  &type_string,           validate_any },
@@ -1046,14 +1073,79 @@ static int config_include(struct config *c, const char *path) {
   return ret;
 }
 
+static const char *const default_stopwords[] = {
+  "stopword",
+
+  "01",
+  "02",
+  "03",
+  "04",
+  "05",
+  "06",
+  "07",
+  "08",
+  "09",
+  "1",
+  "10",
+  "11",
+  "12",
+  "13",
+  "14",
+  "15",
+  "16",
+  "17",
+  "18",
+  "19",
+  "2",
+  "20",
+  "21",
+  "22",
+  "23",
+  "24",
+  "25",
+  "26",
+  "27",
+  "28",
+  "29",
+  "3",
+  "30",
+  "4",
+  "5",
+  "6",
+  "7",
+  "8",
+  "9",
+  "a",
+  "am",
+  "an",
+  "and",
+  "as",
+  "for",
+  "i",
+  "im",
+  "in",
+  "is",
+  "of",
+  "on",
+  "the",
+  "to",
+  "too",
+  "we",
+};
+#define NDEFAULT_STOPWORDS (sizeof default_stopwords / sizeof *default_stopwords)
+
 /** @brief Make a new default configuration */
 static struct config *config_default(void) {
   struct config *c = xmalloc(sizeof *c);
   const char *logname;
   struct passwd *pw;
+  struct config_state cs;
 
+  cs.path = "<internal>";
+  cs.line = 0;
+  cs.config = c;
   /* Strings had better be xstrdup'd as they will get freed at some point. */
-  c->gap = 2;
+  c->gap = 0;
   c->history = 60;
   c->home = xstrdup(pkgstatedir);
   if(!(pw = getpwuid(getuid())))
@@ -1084,6 +1176,9 @@ static struct config *config_default(void) {
   c->dbversion = 2;
   c->cookie_login_lifetime = 86400;
   c->cookie_key_lifetime = 86400 * 7;
+  c->smtp_server = xstrdup("127.0.0.1");
+  if(config_set(&cs, (int)NDEFAULT_STOPWORDS, (char **)default_stopwords))
+    exit(1);
   return c;
 }
 
@@ -1207,7 +1302,7 @@ static void config_postdefaults(struct config *c,
       r |= RIGHT_REMOVE_MINE;
     else
       r |= RIGHT_REMOVE_ANY;
-    c->default_rights = r;
+    c->default_rights = rights_string(r);
   }
 }