string: Clean up for_each_line() and related functions.
[paraslash.git] / client.c
index 0ae015139fc915d5446cbb58b6eacf78d2d9eb2a..715df9c6a3aa8b107ef4bcfdffaad9a0c1abea2f 100644 (file)
--- a/client.c
+++ b/client.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1997-2012 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2013 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -114,11 +114,11 @@ static int execute_client_command(const char *cmd, char **result)
                goto out;
        schedule(&command_sched);
        *result = exec_task.result_buf;
-       btr_remove_node(exec_task.btrn);
+       btr_remove_node(&exec_task.btrn);
        client_disconnect(ct);
        ret = 1;
 out:
-       btr_free_node(exec_task.btrn);
+       btr_remove_node(&exec_task.btrn);
        if (ret < 0)
                free(exec_task.result_buf);
        return ret;
@@ -307,7 +307,7 @@ static void setatt_completer(struct i9e_completion_info *ci,
                free(orig);
        }
        sl[2 * num_atts] = NULL;
-       ret = i9e_extract_completions(ci->word, sl, &cr->matches);
+       i9e_extract_completions(ci->word, sl, &cr->matches);
 out:
        free(buf);
        free_argv(sl);
@@ -459,11 +459,6 @@ static int client_i9e_line_handler(char *line)
        return 1;
 }
 
-static void client_sighandler(int s)
-{
-       i9e_signal_dispatch(s);
-}
-
 static struct i9e_completer completers[] = {
        SERVER_COMPLETERS
        AFS_COMPLETERS
@@ -494,7 +489,7 @@ __noreturn static void interactive_session(void)
        }
        ici.history_file = history_file;
 
-       act.sa_handler = client_sighandler;
+       act.sa_handler = i9e_signal_dispatch;
        sigemptyset(&act.sa_mask);
        act.sa_flags = 0;
        sigaction(SIGINT, &act, NULL);
@@ -608,14 +603,23 @@ int main(int argc, char *argv[])
                EMBRACE(.name = "stdout", .parent = ct->btrn));
        register_task(&sched, &svt);
        ret = schedule(&sched);
+       if (ret >= 0 && ct->task.error < 0) {
+               switch(ct->task.error) {
+               /* these are not errors */
+               case -E_SERVER_CMD_SUCCESS:
+               case -E_EOF:
+               case -E_SERVER_EOF:
+               case -E_BTR_EOF:
+                       ret = 0;
+                       break;
+               default: ret = -E_SERVER_CMD_FAILURE;
+               }
+       }
 out:
+       if (ret < 0)
+               PARA_ERROR_LOG("%s\n", para_strerror(-ret));
        client_close(ct);
-       btr_free_node(sit.btrn);
-       btr_free_node(sot.btrn);
-       if (ret < 0) {
-               /* can not use PARA_LOG here because ct is NULL */
-               fprintf(stderr, "%s\n", para_strerror(-ret));
-               return EXIT_FAILURE;
-       }
-       return EXIT_SUCCESS;
+       btr_remove_node(&sit.btrn);
+       btr_remove_node(&sot.btrn);
+       return ret < 0? EXIT_FAILURE : EXIT_SUCCESS;
 }