server: Fix return value of com_ff().
[paraslash.git] / interactive.c
index a568d3c..c34a0f6 100644 (file)
@@ -38,6 +38,7 @@ struct i9e_private {
        bool caught_sigterm;
        Keymap standard_km;
        Keymap bare_km;
+       int fd_flags[2];
 };
 static struct i9e_private i9e_private, *i9ep = &i9e_private;
 
@@ -254,6 +255,8 @@ void i9e_close(void)
        if (hf)
                write_history(hf);
        wipe_bottom_line();
+       fcntl(i9ep->ici->fds[0], F_SETFL, i9ep->fd_flags[0]);
+       fcntl(i9ep->ici->fds[1], F_SETFL, i9ep->fd_flags[1]);
 }
 
 static void clear_bottom_line(void)
@@ -437,6 +440,9 @@ static int dispatch_key(__a_unused int count, __a_unused int key)
 {
        int i, ret;
 
+again:
+       if (i9ep->key_sequence_length == 0)
+               return 0;
        for (i = i9ep->num_key_bindings - 1; i >= 0; i--) {
                if (strcmp(i9ep->key_sequence, i9ep->ici->bound_keyseqs[i]))
                        continue;
@@ -445,7 +451,15 @@ static int dispatch_key(__a_unused int count, __a_unused int key)
                ret = i9ep->ici->key_handler(i);
                return ret < 0? ret : 0;
        }
-       assert(0);
+       PARA_WARNING_LOG("ignoring key %d\n", i9ep->key_sequence[0]);
+       /*
+        * We received an undefined key sequence. Throw away the first byte,
+        * and try to parse the remainder.
+        */
+       memmove(i9ep->key_sequence, i9ep->key_sequence + 1,
+               i9ep->key_sequence_length); /* move also terminating zero byte */
+       i9ep->key_sequence_length--;
+       goto again;
 }
 
 /**
@@ -465,6 +479,14 @@ int i9e_open(struct i9e_client_info *ici, struct sched *s)
        memset(i9ep, 0, sizeof(struct i9e_private));
        if (!isatty(ici->fds[0]))
                return -E_I9E_SETUPTERM;
+       ret = fcntl(ici->fds[0], F_GETFL);
+       if (ret < 0)
+               return -E_I9E_SETUPTERM;
+       i9ep->fd_flags[0] = ret;
+       ret = fcntl(ici->fds[1], F_GETFL);
+       if (ret < 0)
+               return -E_I9E_SETUPTERM;
+       i9ep->fd_flags[1] = ret;
        ret = mark_fd_nonblocking(ici->fds[0]);
        if (ret < 0)
                return ret;