MINOR: peers: Extract some code to be reused.

May be backported as far as 1.5.
diff --git a/src/peers.c b/src/peers.c
index d4d3859..3a63946 100644
--- a/src/peers.c
+++ b/src/peers.c
@@ -562,6 +562,36 @@
 }
 
 /*
+ * 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
  */
 static void peer_io_handler(struct appctx *appctx)
@@ -592,24 +622,13 @@
 				/* fall through */
 			case PEER_SESS_ST_GETVERSION:
 				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 */
 				if (strncmp(PEER_SESSION_PROTO_NAME " ", trash.area, proto_len + 1) != 0) {
@@ -628,24 +647,13 @@
 				/* fall through */
 			case PEER_SESS_ST_GETHOST:
 				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 */
 				if (strcmp(localpeer, trash.area) != 0) {
@@ -660,25 +668,13 @@
 				char *p;
 
 				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>" */
 				p = strchr(trash.area, ' ');
@@ -852,25 +848,12 @@
 				if (si_ic(si)->flags & CF_WRITE_PARTIAL)
 					curpeer->statuscode = PEER_SESS_SC_CONNECTEDCODE;
 
-				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;
+				reql = peer_getline(appctx);
+				if (!reql)
+					goto out;
 
-				co_skip(si_oc(si), reql);
+				if (reql < 0)
+					goto switchstate;
 
 				/* Register status code */
 				curpeer->statuscode = atoi(trash.area);