BUG/MEDIUM: stats: show backend may show an empty or incomplete result

This is the same issue as "show servers state", where the result is incorrect
it the data can't fit in one buffer. The similar fix is applied, to restart
the data processing where it stopped as buffers are sent to the client.

This fix should be backported to haproxy 1.6
diff --git a/include/types/applet.h b/include/types/applet.h
index bf801f4..eb15456 100644
--- a/include/types/applet.h
+++ b/include/types/applet.h
@@ -136,6 +136,9 @@
 			struct server *sv;	/* current server being dumped, NULL = not started yet. */
 		} server_state;
 		struct {
+			struct proxy *px;	/* current proxy being dumped, NULL = not started yet. */
+		} be;				/* used by "show backends" command */
+		struct {
 			char **var;
 		} env;
 	} ctx;					/* used by stats I/O handlers to dump the stats */
diff --git a/src/dumpstats.c b/src/dumpstats.c
index a6d021b..4f0c438 100644
--- a/src/dumpstats.c
+++ b/src/dumpstats.c
@@ -1304,6 +1304,7 @@
 	appctx->ctx.stats.flags = 0;
 	if (strcmp(args[0], "show") == 0) {
 		if (strcmp(args[1], "backend") == 0) {
+			appctx->ctx.be.px = NULL;
 			appctx->st2 = STAT_ST_INIT;
 			appctx->st0 = STAT_CLI_O_BACKEND;
 		}
@@ -3117,13 +3118,24 @@
 /* Parses backend list and simply report backend names */
 static int stats_dump_backend_to_buffer(struct stream_interface *si)
 {
+	struct appctx *appctx = __objt_appctx(si->end);
 	extern struct proxy *proxy;
 	struct proxy *curproxy;
 
 	chunk_reset(&trash);
-	chunk_printf(&trash, "# name\n");
 
-	for (curproxy = proxy; curproxy != NULL; curproxy = curproxy->next) {
+	if (!appctx->ctx.be.px) {
+		chunk_printf(&trash, "# name\n");
+		if (bi_putchk(si_ic(si), &trash) == -1) {
+			si_applet_cant_put(si);
+			return 0;
+		}
+		appctx->ctx.be.px = proxy;
+	}
+
+	for (; appctx->ctx.be.px != NULL; appctx->ctx.be.px = curproxy->next) {
+		curproxy = appctx->ctx.be.px;
+
 		/* looking for backends only */
 		if (!(curproxy->cap & PR_CAP_BE))
 			continue;
@@ -3133,11 +3145,10 @@
 			continue;
 
 		chunk_appendf(&trash, "%s\n", curproxy->id);
-	}
-
-	if (bi_putchk(si_ic(si), &trash) == -1) {
-		si_applet_cant_put(si);
-		return 0;
+		if (bi_putchk(si_ic(si), &trash) == -1) {
+			si_applet_cant_put(si);
+			return 0;
+		}
 	}
 
 	return 1;