]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - client.c
client: Only start stdin task for addblob commands.
[paraslash.git] / client.c
index 6268c3de8892f921045e18f2f7e7560ada8c5083..44862ab987015948ef3e9f3c2d6b9fdd4e12e008 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.
  */
@@ -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);
@@ -455,7 +455,7 @@ static int client_i9e_line_handler(char *line)
        ret = client_connect(ct, &sched, NULL, NULL);
        if (ret < 0)
                return ret;
-       i9e_attach_to_stdout(ct->btrn);
+       i9e_attach_to_stdout(ct->btrn[0]);
        return 1;
 }
 
@@ -531,28 +531,39 @@ __noreturn static void print_completions(void)
 
 #endif /* HAVE_READLINE */
 
+struct supervisor_task {
+       bool stdout_task_started;
+       struct task task;
+};
+
 static void supervisor_post_select(struct sched *s, struct task *t)
 {
+       struct supervisor_task *svt = container_of(t, struct supervisor_task,
+               task);
+
        if (ct->task.error < 0) {
                t->error = ct->task.error;
                return;
        }
+       if (!svt->stdout_task_started && ct->status == CL_EXECUTING) {
+               stdout_set_defaults(&sot);
+               register_task(s, &sot.task);
+               svt->stdout_task_started = true;
+               return;
+       }
        if (ct->status == CL_SENDING) {
                stdin_set_defaults(&sit);
                register_task(s, &sit.task);
                t->error = -E_TASK_STARTED;
                return;
        }
-       if (ct->status == CL_RECEIVING) {
-               stdout_set_defaults(&sot);
-               register_task(s, &sot.task);
-               t->error = -E_TASK_STARTED; return;
-       }
 }
 
-static struct task svt = {
-       .post_select = supervisor_post_select,
-       .status = "supervisor task"
+static struct supervisor_task supervisor_task = {
+       .task = {
+               .post_select = supervisor_post_select,
+               .status = "supervisor task"
+       }
 };
 
 /**
@@ -600,8 +611,8 @@ int main(int argc, char *argv[])
        if (ret < 0)
                goto out;
        sot.btrn = btr_new_node(&(struct btr_node_description)
-               EMBRACE(.name = "stdout", .parent = ct->btrn));
-       register_task(&sched, &svt);
+               EMBRACE(.name = "stdout", .parent = ct->btrn[0]));
+       register_task(&sched, &supervisor_task.task);
        ret = schedule(&sched);
        if (ret >= 0 && ct->task.error < 0) {
                switch(ct->task.error) {
@@ -612,7 +623,7 @@ int main(int argc, char *argv[])
                case -E_BTR_EOF:
                        ret = 0;
                        break;
-               default: ret = ct->task.error;
+               default: ret = -E_SERVER_CMD_FAILURE;
                }
        }
 out: