]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - client_common.c
Add two missing Copyright headers and file annotations.
[paraslash.git] / client_common.c
index daead879faa7f4dff4d9016c68f95426269551f0..7bdb4738bab5feb15b4c7acb1180decb61ccfda5 100644 (file)
@@ -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.
  */
@@ -44,12 +44,12 @@ void client_disconnect(struct client_task *ct)
        if (ct->scc.fd >= 0)
                close(ct->scc.fd);
        free_argv(ct->features);
+       ct->features = NULL;
        sc_free(ct->scc.recv);
        ct->scc.recv = NULL;
        sc_free(ct->scc.send);
        ct->scc.send = NULL;
-       btr_free_node(ct->btrn);
-       ct->btrn = NULL;
+       btr_remove_node(&ct->btrn);
 }
 
 /**
@@ -242,14 +242,19 @@ static char **parse_features(char *buf)
 
 static int dispatch_sbb(struct client_task *ct, struct sb_buffer *sbb)
 {
-       int ret, ll;
+       int ret;
+       const char *designator[] = {SB_DESIGNATORS_ARRAY};
 
-       if (!sbb || !sbb->iov.iov_base || sbb->iov.iov_len == 0)
+       if (!sbb)
                return 0;
+       if (sbb->band < NUM_SB_DESIGNATORS)
+               PARA_DEBUG_LOG("band: %s\n", designator[sbb->band]);
 
        switch (sbb->band) {
        case SBD_OUTPUT:
-               btr_add_output(sbb->iov.iov_base, sbb->iov.iov_len, ct->btrn);
+               if (iov_valid(&sbb->iov))
+                       btr_add_output(sbb->iov.iov_base, sbb->iov.iov_len,
+                               ct->btrn);
                ret = 1;
                goto out;
        case SBD_DEBUG_LOG:
@@ -259,10 +264,18 @@ static int dispatch_sbb(struct client_task *ct, struct sb_buffer *sbb)
        case SBD_ERROR_LOG:
        case SBD_CRIT_LOG:
        case SBD_EMERG_LOG:
-               ll = sbb->band - SBD_DEBUG_LOG;
-               para_log(ll, "remote: %s", (char *)sbb->iov.iov_base);
+               if (iov_valid(&sbb->iov)) {
+                       int ll = sbb->band - SBD_DEBUG_LOG;
+                       para_log(ll, "remote: %s", (char *)sbb->iov.iov_base);
+               }
                ret = 1;
                goto deallocate;
+       case SBD_EXIT__SUCCESS:
+               ret = -E_SERVER_CMD_SUCCESS;
+               goto deallocate;
+       case SBD_EXIT__FAILURE:
+               ret = -E_SERVER_CMD_FAILURE;
+               goto deallocate;
        default:
                PARA_ERROR_LOG("invalid band %d\n", sbb->band);
                ret = -E_BAD_BAND;
@@ -321,7 +334,9 @@ static void client_post_select(struct sched *s, struct task *t)
        size_t n;
        char buf[CLIENT_BUFSIZE];
 
-       t->error = 0;
+       ret = task_get_notification(t);
+       if (ret < 0)
+               goto out;
        if (ct->scc.fd < 0)
                return;
        switch (ct->status) {
@@ -546,9 +561,10 @@ static void client_post_select(struct sched *s, struct task *t)
 out:
        t->error = ret;
        if (ret < 0) {
-               if (ret != -E_SERVER_EOF && ret != -E_BTR_EOF && ret != -E_EOF)
+               if (!ct->use_sideband && ret != -E_SERVER_EOF &&
+                               ret != -E_BTR_EOF && ret != -E_EOF)
                        PARA_ERROR_LOG("%s\n", para_strerror(-t->error));
-               btr_remove_node(btrn);
+               btr_remove_node(&ct->btrn);
        }
 }