mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-08 16:17:09 +02:00
MINOR: peers: Extract some code to be reused.
May be backported as far as 1.5.
This commit is contained in:
parent
9589c3bce7
commit
ce02557aad
123
src/peers.c
123
src/peers.c
@ -561,6 +561,36 @@ static int peer_get_version(const char *str,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse a line terminated by an optional '\r' character, followed by a mandatory
|
||||||
|
* '\n' character.
|
||||||
|
* Returns 1 if succeeded or 0 if a '\n' character could not be found, and -1 if
|
||||||
|
* a line could not be read because the communication channel is closed.
|
||||||
|
*/
|
||||||
|
static inline int peer_getline(struct appctx *appctx)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
struct stream_interface *si = appctx->owner;
|
||||||
|
|
||||||
|
n = co_getline(si_oc(si), trash.area, trash.size);
|
||||||
|
if (!n)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (n < 0 || trash.area[n - 1] != '\n') {
|
||||||
|
appctx->st0 = PEER_SESS_ST_END;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n > 1 && (trash.area[n - 2] == '\r'))
|
||||||
|
trash.area[n - 2] = 0;
|
||||||
|
else
|
||||||
|
trash.area[n - 1] = 0;
|
||||||
|
|
||||||
|
co_skip(si_oc(si), n);
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IO Handler to handle message exchance with a peer
|
* IO Handler to handle message exchance with a peer
|
||||||
*/
|
*/
|
||||||
@ -592,24 +622,13 @@ static void peer_io_handler(struct appctx *appctx)
|
|||||||
/* fall through */
|
/* fall through */
|
||||||
case PEER_SESS_ST_GETVERSION:
|
case PEER_SESS_ST_GETVERSION:
|
||||||
prev_state = appctx->st0;
|
prev_state = appctx->st0;
|
||||||
reql = co_getline(si_oc(si), trash.area,
|
|
||||||
trash.size);
|
|
||||||
if (reql <= 0) { /* closed or EOL not found */
|
|
||||||
if (reql == 0)
|
|
||||||
goto out;
|
|
||||||
appctx->st0 = PEER_SESS_ST_END;
|
|
||||||
goto switchstate;
|
|
||||||
}
|
|
||||||
if (trash.area[reql-1] != '\n') {
|
|
||||||
appctx->st0 = PEER_SESS_ST_END;
|
|
||||||
goto switchstate;
|
|
||||||
}
|
|
||||||
else if (reql > 1 && (trash.area[reql-2] == '\r'))
|
|
||||||
trash.area[reql-2] = 0;
|
|
||||||
else
|
|
||||||
trash.area[reql-1] = 0;
|
|
||||||
|
|
||||||
co_skip(si_oc(si), reql);
|
reql = peer_getline(appctx);
|
||||||
|
if (!reql)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (reql < 0)
|
||||||
|
goto switchstate;
|
||||||
|
|
||||||
/* test protocol */
|
/* test protocol */
|
||||||
if (strncmp(PEER_SESSION_PROTO_NAME " ", trash.area, proto_len + 1) != 0) {
|
if (strncmp(PEER_SESSION_PROTO_NAME " ", trash.area, proto_len + 1) != 0) {
|
||||||
@ -628,24 +647,13 @@ static void peer_io_handler(struct appctx *appctx)
|
|||||||
/* fall through */
|
/* fall through */
|
||||||
case PEER_SESS_ST_GETHOST:
|
case PEER_SESS_ST_GETHOST:
|
||||||
prev_state = appctx->st0;
|
prev_state = appctx->st0;
|
||||||
reql = co_getline(si_oc(si), trash.area,
|
|
||||||
trash.size);
|
|
||||||
if (reql <= 0) { /* closed or EOL not found */
|
|
||||||
if (reql == 0)
|
|
||||||
goto out;
|
|
||||||
appctx->st0 = PEER_SESS_ST_END;
|
|
||||||
goto switchstate;
|
|
||||||
}
|
|
||||||
if (trash.area[reql-1] != '\n') {
|
|
||||||
appctx->st0 = PEER_SESS_ST_END;
|
|
||||||
goto switchstate;
|
|
||||||
}
|
|
||||||
else if (reql > 1 && (trash.area[reql-2] == '\r'))
|
|
||||||
trash.area[reql-2] = 0;
|
|
||||||
else
|
|
||||||
trash.area[reql-1] = 0;
|
|
||||||
|
|
||||||
co_skip(si_oc(si), reql);
|
reql = peer_getline(appctx);
|
||||||
|
if (!reql)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (reql < 0)
|
||||||
|
goto switchstate;
|
||||||
|
|
||||||
/* test hostname match */
|
/* test hostname match */
|
||||||
if (strcmp(localpeer, trash.area) != 0) {
|
if (strcmp(localpeer, trash.area) != 0) {
|
||||||
@ -660,25 +668,13 @@ static void peer_io_handler(struct appctx *appctx)
|
|||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
prev_state = appctx->st0;
|
prev_state = appctx->st0;
|
||||||
reql = co_getline(si_oc(si), trash.area,
|
|
||||||
trash.size);
|
|
||||||
if (reql <= 0) { /* closed or EOL not found */
|
|
||||||
if (reql == 0)
|
|
||||||
goto out;
|
|
||||||
appctx->st0 = PEER_SESS_ST_END;
|
|
||||||
goto switchstate;
|
|
||||||
}
|
|
||||||
if (trash.area[reql-1] != '\n') {
|
|
||||||
/* Incomplete line, we quit */
|
|
||||||
appctx->st0 = PEER_SESS_ST_END;
|
|
||||||
goto switchstate;
|
|
||||||
}
|
|
||||||
else if (reql > 1 && (trash.area[reql-2] == '\r'))
|
|
||||||
trash.area[reql-2] = 0;
|
|
||||||
else
|
|
||||||
trash.area[reql-1] = 0;
|
|
||||||
|
|
||||||
co_skip(si_oc(si), reql);
|
reql = peer_getline(appctx);
|
||||||
|
if (!reql)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (reql < 0)
|
||||||
|
goto switchstate;
|
||||||
|
|
||||||
/* parse line "<peer name> <pid> <relative_pid>" */
|
/* parse line "<peer name> <pid> <relative_pid>" */
|
||||||
p = strchr(trash.area, ' ');
|
p = strchr(trash.area, ' ');
|
||||||
@ -852,25 +848,12 @@ static void peer_io_handler(struct appctx *appctx)
|
|||||||
if (si_ic(si)->flags & CF_WRITE_PARTIAL)
|
if (si_ic(si)->flags & CF_WRITE_PARTIAL)
|
||||||
curpeer->statuscode = PEER_SESS_SC_CONNECTEDCODE;
|
curpeer->statuscode = PEER_SESS_SC_CONNECTEDCODE;
|
||||||
|
|
||||||
reql = co_getline(si_oc(si), trash.area,
|
reql = peer_getline(appctx);
|
||||||
trash.size);
|
if (!reql)
|
||||||
if (reql <= 0) { /* closed or EOL not found */
|
goto out;
|
||||||
if (reql == 0)
|
|
||||||
goto out;
|
|
||||||
appctx->st0 = PEER_SESS_ST_END;
|
|
||||||
goto switchstate;
|
|
||||||
}
|
|
||||||
if (trash.area[reql-1] != '\n') {
|
|
||||||
/* Incomplete line, we quit */
|
|
||||||
appctx->st0 = PEER_SESS_ST_END;
|
|
||||||
goto switchstate;
|
|
||||||
}
|
|
||||||
else if (reql > 1 && (trash.area[reql-2] == '\r'))
|
|
||||||
trash.area[reql-2] = 0;
|
|
||||||
else
|
|
||||||
trash.area[reql-1] = 0;
|
|
||||||
|
|
||||||
co_skip(si_oc(si), reql);
|
if (reql < 0)
|
||||||
|
goto switchstate;
|
||||||
|
|
||||||
/* Register status code */
|
/* Register status code */
|
||||||
curpeer->statuscode = atoi(trash.area);
|
curpeer->statuscode = atoi(trash.area);
|
||||||
|
Loading…
Reference in New Issue
Block a user