gboolean RpcChannel_Start(RpcChannel *chan) { gboolean ok; const RpcChannelFuncs *funcs; if (chan == NULL || chan->funcs == NULL || chan->funcs->start == NULL) { return FALSE; } if (chan->outStarted) { /* Already started. Make sure both channels are in sync and return. */ ASSERT(chan->in == NULL || chan->inStarted); return TRUE; } if (chan->in != NULL && !chan->inStarted) { ok = RpcIn_start(chan->in, RPCIN_MAX_DELAY, RpcChannel_Error, chan); chan->inStarted = ok; } funcs = chan->funcs; ok = funcs->start(chan); if (!ok && funcs->onStartErr != NULL) { Debug(LGPFX "Fallback to backdoor ...\n"); funcs->onStartErr(chan); ok = BackdoorChannel_Fallback(chan); } return ok; }
static gboolean RpcInStart(RpcChannel *chan) { gboolean ret = TRUE; BackdoorChannel *bdoor = chan->_private; if (bdoor->outStarted) { /* Already started. Make sure both channels are in sync and return. */ ASSERT(bdoor->in == NULL || bdoor->inStarted); return ret; } else { ASSERT(bdoor->in == NULL || !bdoor->inStarted); } if (bdoor->in != NULL) { ret = RpcIn_start(bdoor->in, RPCIN_MAX_DELAY, RpcChannel_Error, chan); } if (ret) { ret = RpcOut_start(bdoor->out); if (!ret) { RpcIn_stop(bdoor->in); } } bdoor->inStarted = (bdoor->in != NULL); bdoor->outStarted = TRUE; return ret; }