attempt to work around the modules/ctl message chunk limitation

remotes/origin/3.3+ngcp2.6
Richard Fuchs 14 years ago
parent 5e236f8a13
commit 8988f41030

@ -107,6 +107,8 @@ struct iovec_array{
struct iovec* v;
int idx;
int len;
int (*output)(struct iovec_array *);
void *data;
};
/* send */
@ -254,15 +256,17 @@ error:
inline static int append_iovec(struct iovec_array* a, unsigned char* buf,
int len)
{
if (a->idx >= a->len)
goto error;
int ret;
if (a->idx >= a->len) {
ret = a->output(a);
if (ret < 0)
return ret;
}
a->v[a->idx].iov_base=buf;
a->v[a->idx].iov_len=len;
a->idx++;
return 0;
error:
return -1; /* overflow */
}
@ -537,6 +541,22 @@ static void rpc_fault_reset(struct binrpc_ctx* ctx)
}
}
/* wrapper around sock_send_v for staggered buffer writing */
static int rpc_send_v(struct iovec_array *a)
{
int ret;
if (a->idx <= 0)
return 0;
ret = sock_send_v(a->data, a->v, a->idx);
if (ret < 0)
return ret;
a->idx = 0;
return 0;
}
/* build the reply from the current body */
static int rpc_send(struct binrpc_ctx* ctx)
{
@ -551,6 +571,8 @@ static int rpc_send(struct binrpc_ctx* ctx)
a.v=v;
a.idx=1;
a.len=MAX_MSG_CHUNKS;
a.output = rpc_send_v;
a.data = ctx->send_h;
if (ctx->replied){
LOG(L_ERR, "ERROR: binrpc: rpc_send: rpc method %s tried to reply"
@ -573,7 +595,7 @@ static int rpc_send(struct binrpc_ctx* ctx)
LOG(L_ERR, "ERROR: binrprc: rpc_send: too many message chunks\n");
goto error;
}
if ((err=sock_send_v(ctx->send_h, v, a.idx))<0){
if ((err = a.output(&a)) < 0){
if (err==-2){
LOG(L_ERR, "ERROR: binrpc: rpc_send: send failed: "
"datagram too big\n");

Loading…
Cancel
Save