chiark / gitweb /
'collection' no longer requires an encoding to be specified (or a module).
authorRichard Kettlewell <richard@fanticule>
Sun, 30 Dec 2007 13:37:54 +0000 (13:37 +0000)
committerRichard Kettlewell <richard@fanticule>
Sun, 30 Dec 2007 13:37:54 +0000 (13:37 +0000)
This isn't quite as useful as it sounds as it depends on the server getting
the right LC_CTYPE, which it might well not do.

debian/changelog
doc/disorder_config.5.in
lib/configuration.c

index 484da6d..1a39128 100644 (file)
@@ -1,3 +1,9 @@
+disorder (2.0+) unstable; urgency=low
+
+  * Intermediate version number
+
+ -- Richard Kettlewell <rjk@greenend.org.uk>  Sun, 30 Dec 2007 11:25:08 +0000
+
 disorder (2.0) unstable; urgency=low
 
   * DisOrder 2.0
index bd422d5..ffabeb8 100644 (file)
@@ -287,18 +287,29 @@ You can also specify channels by number, if you know the right value.  NB that
 volume setting only works on OSS systems (including ALSA, via emulation).
 .TP
 .B collection \fIMODULE\fR \fIENCODING\fR \fIROOT\fR
+.TP
+.B collection \fIMODULE\fR \fIROOT\fR
+.TP
+.B collection \fIROOT\fR
 Define a collection of tracks.
 .IP
 \fIMODULE\fR defines which plugin module should be used for this
-collection.  Use the supplied \fBfs\fR module for tracks that exists
-as ordinary files in the filesystem.
+collection.  Use the supplied \fBfs\fR module for tracks that exist
+as ordinary files in the filesystem.  If no \fIMODULE\fR is specified
+then \fBfs\fR is assumed.
+.IP
+\fIENCODING\fR defines the encoding of filenames in this collection.  For
+\fBfs\fR this would be the encoding you use for filenames.  Examples might be
+\fBiso-8859-1\fR or \fButf-8\fR.  If no encoding is specified then the current
+locale's character encoding is used.
 .IP
-\fIENCODING\fR defines the encoding of filenames in this collection.
-For \fBfs\fR this would be the encoding you use for filenames.
-Examples might be \fBiso-8859-1\fR or \fButf-8\fR.
+NB that this default depends on the locale the server runs in, which is not
+necessarily the same as that of ordinary users, depending how the system is
+configured.  It's best to explicitly specify it to be certain.
 .IP
 \fIROOT\fR is the root in the filesystem of the filenames and is
-passed to the plugin module.
+passed to the plugin module.  It must be an absolute path and should not
+end with a "/".
 .TP
 .B default_rights \fIRIGHTS\fR
 Defines the set of rights given to new users.  The argument is a
index e5dd120..dde3d3c 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;
 }