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);
}
/**
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:
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;
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);
}
}