|
|
@ -640,6 +640,62 @@ static int recv_available(ckpool_t *ckp, connsock_t *cs) |
|
|
|
return len; |
|
|
|
return len; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bool read_cs_length(ckpool_t *ckp, connsock_t *cs, float *timeout, int len) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
bool ret = false; |
|
|
|
|
|
|
|
tv_t start; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tv_time(&start); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (cs->bufofs < len) { |
|
|
|
|
|
|
|
float diff; |
|
|
|
|
|
|
|
tv_t now; |
|
|
|
|
|
|
|
int res; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (*timeout < 0) { |
|
|
|
|
|
|
|
LOGDEBUG("Timed out in read_cs_length"); |
|
|
|
|
|
|
|
ret = 0; |
|
|
|
|
|
|
|
goto out; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
res = wait_read_select(cs->fd, *timeout); |
|
|
|
|
|
|
|
if (res < 1) |
|
|
|
|
|
|
|
goto out; |
|
|
|
|
|
|
|
res = recv_available(ckp, cs); |
|
|
|
|
|
|
|
if (res < 1) |
|
|
|
|
|
|
|
goto out; |
|
|
|
|
|
|
|
tv_time(&now); |
|
|
|
|
|
|
|
diff = tvdiff(&now, &start); |
|
|
|
|
|
|
|
copy_tv(&start, &now); |
|
|
|
|
|
|
|
*timeout -= diff; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ret = true; |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static char *bkey_eom(ckpool_t *ckp, connsock_t *cs, char *bkey, float *timeout) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int slen, msglen; |
|
|
|
|
|
|
|
char *ret; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* String length till bkey */ |
|
|
|
|
|
|
|
slen = bkey - cs->buf - 1; |
|
|
|
|
|
|
|
if (!read_cs_length(ckp, cs, timeout, slen + BKEY_LENOFS + BKEY_LENLEN)) { |
|
|
|
|
|
|
|
LOGWARNING("Failed to read cs bkey header"); |
|
|
|
|
|
|
|
ret = cs->buf + cs->bufofs; |
|
|
|
|
|
|
|
goto out; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
msglen = bkey_len(bkey); |
|
|
|
|
|
|
|
if (!read_cs_length(ckp, cs, timeout, slen + msglen)) { |
|
|
|
|
|
|
|
LOGWARNING("Failed to read cs bkey msg length %d", msglen); |
|
|
|
|
|
|
|
ret = cs->buf + cs->bufofs; |
|
|
|
|
|
|
|
goto out; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ret = cs->buf + slen + msglen; |
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
return ret; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Read from a socket into cs->buf till we get an '\n', converting it to '\0'
|
|
|
|
/* Read from a socket into cs->buf till we get an '\n', converting it to '\0'
|
|
|
|
* and storing how much extra data we've received, to be moved to the beginning |
|
|
|
* and storing how much extra data we've received, to be moved to the beginning |
|
|
|
* of the buffer for use on the next receive. Returns length of the line if a |
|
|
|
* of the buffer for use on the next receive. Returns length of the line if a |
|
|
@ -647,9 +703,9 @@ static int recv_available(ckpool_t *ckp, connsock_t *cs) |
|
|
|
* and -1 on error. */ |
|
|
|
* and -1 on error. */ |
|
|
|
int read_socket_line(connsock_t *cs, float *timeout) |
|
|
|
int read_socket_line(connsock_t *cs, float *timeout) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
char *eom = NULL, *bkey = NULL; |
|
|
|
ckpool_t *ckp = cs->ckp; |
|
|
|
ckpool_t *ckp = cs->ckp; |
|
|
|
bool proxy = ckp->proxy; |
|
|
|
bool proxy = ckp->proxy; |
|
|
|
char *eom = NULL; |
|
|
|
|
|
|
|
tv_t start, now; |
|
|
|
tv_t start, now; |
|
|
|
float diff; |
|
|
|
float diff; |
|
|
|
int ret; |
|
|
|
int ret; |
|
|
@ -700,8 +756,12 @@ int read_socket_line(connsock_t *cs, float *timeout) |
|
|
|
copy_tv(&start, &now); |
|
|
|
copy_tv(&start, &now); |
|
|
|
*timeout -= diff; |
|
|
|
*timeout -= diff; |
|
|
|
} |
|
|
|
} |
|
|
|
ret = eom - cs->buf; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret = eom - cs->buf; |
|
|
|
|
|
|
|
if (unlikely(ret > 5) && (bkey = strstr(cs->buf + ret - 5, "bkey"))) { |
|
|
|
|
|
|
|
eom = bkey_eom(ckp, cs, bkey, timeout); |
|
|
|
|
|
|
|
ret = eom - cs->buf; |
|
|
|
|
|
|
|
} |
|
|
|
cs->buflen = cs->buf + cs->bufofs - eom - 1; |
|
|
|
cs->buflen = cs->buf + cs->bufofs - eom - 1; |
|
|
|
if (cs->buflen) |
|
|
|
if (cs->buflen) |
|
|
|
cs->bufofs = eom - cs->buf + 1; |
|
|
|
cs->bufofs = eom - cs->buf + 1; |
|
|
|