chiark / gitweb /
Convert track names and input lines to NFC. This is a database format
[disorder] / server / server.c
index ccd08238967754d3c34584733b077e521cab4173..64502c0330d7588e4afcd27b242abefcfd9c23c7 100644 (file)
@@ -63,6 +63,7 @@
 #include "eventlog.h"
 #include "defs.h"
 #include "cache.h"
+#include "unicode.h"
 
 #ifndef NONCE_SIZE
 # define NONCE_SIZE 16
@@ -126,20 +127,19 @@ static int writer_error(ev_source attribute((unused)) *ev,
                        void *u) {
   struct conn *c = u;
 
-  D(("server writer_error %d", errno_value));
-  info("writer_error S%x %d", c->tag, errno_value);
+  D(("server writer_error S%x %d", c->tag, errno_value));
   if(errno_value == 0) {
     /* writer is done */
-    error(errno_value, "S%x writer completed", c->tag);        /* TODO */
+    D(("S%x writer completed", c->tag));
   } else {
     if(errno_value != EPIPE)
       error(errno_value, "S%x write error on socket", c->tag);
     if(c->r) {
-      info("cancel reader");
+      D(("cancel reader"));
       ev_reader_cancel(c->r);
       c->r = 0;
     }
-    info("done cancel reader");
+    D(("done cancel reader"));
   }
   c->w = 0;
   ev_report(ev);
@@ -155,8 +155,7 @@ static int reader_error(ev_source attribute((unused)) *ev,
                        void *u) {
   struct conn *c = u;
 
-  D(("server reader_error %d", errno_value));
-  info("reader_error S%x %d", c->tag, errno_value);
+  D(("server reader_error S%x %d", c->tag, errno_value));
   error(errno_value, "S%x read error on socket", c->tag);
   if(c->w)
     ev_writer_close(c->w);
@@ -753,9 +752,9 @@ static int logging_reader_callback(ev_source attribute((unused)) *ev,
   ev_reader_consume(reader, bytes);
   if(eof) {
     /* Oops, that's all for now */
-    info("logging reader eof");
+    D(("logging reader eof"));
     if(c->w) {
-      info("close writer");
+      D(("close writer"));
       ev_writer_close(c->w);
       c->w = 0;
     }
@@ -923,6 +922,10 @@ static int c_tags(struct conn *c,
 static int c_set_global(struct conn *c,
                        char **vec,
                        int attribute((unused)) nvec) {
+  if(vec[0][0] == '_') {
+    sink_writes(ev_writer_sink(c->w), "550 cannot set internal global preferences\n");
+    return 1;
+  }
   trackdb_set_global(vec[0], vec[1], c->who);
   sink_printf(ev_writer_sink(c->w), "250 OK\n");
   return 1;
@@ -1042,6 +1045,11 @@ static int command(struct conn *c, char *line) {
   int nvec, n;
 
   D(("server command %s", line));
+  /* We force everything into NFC as early as possible */
+  if(!(line = utf8_compose_canon(line, strlen(line), 0))) {
+    sink_writes(ev_writer_sink(c->w), "500 cannot normalize command\n");
+    return 1;
+  }
   if(!(vec = split(line, &nvec, SPLIT_QUOTES, command_error, c))) {
     sink_writes(ev_writer_sink(c->w), "500 cannot parse command\n");
     return 1;
@@ -1120,10 +1128,10 @@ static int reader_callback(ev_source attribute((unused)) *ev,
   if(eof) {
     if(bytes)
       error(0, "S%x unterminated line", c->tag);
-    info("normal reader close");
+    D(("normal reader close"));
     c->r = 0;
     if(c->w) {
-      info("close associated writer");
+      D(("close associated writer"));
       ev_writer_close(c->w);
       c->w = 0;
     }