MINOR: stats: add agent_status, agent_code, agent_duration to output

The agent check status is now reported :
- agent_status : status of last agent check
- agent_code : numeric code reported by agent if any (unused for now)
- agent_duration : time in ms taken to finish last check
diff --git a/doc/management.txt b/doc/management.txt
index 1b677be..46b03aa 100644
--- a/doc/management.txt
+++ b/doc/management.txt
@@ -1002,6 +1002,18 @@
      (0 for TCP)
  61. ttime [..BS]: the average total session time in ms over the 1024 last
      requests
+ 62. agent_status [...S]: status of last agent check, one of:
+        UNK     -> unknown
+        INI     -> initializing
+        SOCKERR -> socket error
+        L4OK    -> check passed on layer 4, no upper layers testing enabled
+        L4TOUT  -> layer 1-4 timeout
+        L4CON   -> layer 1-4 connection problem, for example
+                   "Connection refused" (tcp rst) or "No route to host" (icmp)
+        L7OK    -> agent reported "up"
+        L7STS   -> agent reported "fail", "stop", or "down"
+ 63. agent_code [...S]: numeric code reported by agent if any (unused for now)
+ 64. agent_duration [...S]: time in ms taken to finish last check
 
 
 9.2. Unix Socket commands
diff --git a/src/dumpstats.c b/src/dumpstats.c
index b7b5680..f3c2beb 100644
--- a/src/dumpstats.c
+++ b/src/dumpstats.c
@@ -322,6 +322,9 @@
 	ST_F_CTIME,
 	ST_F_RTIME,
 	ST_F_TTIME,
+	ST_F_AGENT_STATUS,
+	ST_F_AGENT_CODE,
+	ST_F_AGENT_DURATION,
 
 	/* must always be the last one */
 	ST_F_TOTAL_FIELDS
@@ -394,6 +397,9 @@
 	[ST_F_CTIME]          = "ctime",
 	[ST_F_RTIME]          = "rtime",
 	[ST_F_TTIME]          = "ttime",
+	[ST_F_AGENT_STATUS]   = "agent_status",
+	[ST_F_AGENT_CODE]     = "agent_code",
+	[ST_F_AGENT_DURATION] = "agent_duration",
 };
 
 /* one line of stats */
@@ -3746,6 +3752,23 @@
 			stats[ST_F_CHECK_DURATION] = mkf_u64(FN_DURATION, sv->check.duration);
 	}
 
+	if ((sv->agent.state & (CHK_ST_ENABLED|CHK_ST_PAUSED)) == CHK_ST_ENABLED) {
+		const char *fld_chksts;
+
+		fld_chksts = chunk_newstr(out);
+		chunk_strcat(out, "* "); // for check in progress
+		chunk_strcat(out, get_check_status_info(sv->agent.status));
+		if (!(sv->agent.state & CHK_ST_INPROGRESS))
+			fld_chksts += 2; // skip "* "
+		stats[ST_F_AGENT_STATUS] = mkf_str(FN_OUTPUT, fld_chksts);
+
+		if (sv->agent.status >= HCHK_STATUS_L57DATA)
+			stats[ST_F_AGENT_CODE] = mkf_u32(FN_OUTPUT, sv->agent.code);
+
+		if (sv->agent.status >= HCHK_STATUS_CHECKED)
+			stats[ST_F_AGENT_DURATION] = mkf_u64(FN_DURATION, sv->agent.duration);
+	}
+
 	/* http response: 1xx, 2xx, 3xx, 4xx, 5xx, other */
 	if (px->mode == PR_MODE_HTTP) {
 		stats[ST_F_HRSP_1XX]   = mkf_u64(FN_COUNTER, sv->counters.p.http.rsp[1]);
@@ -3941,7 +3964,7 @@
 			chunk_appendf(&trash, "%s MAINT", human_time(stats[ST_F_LASTCHG].u.u32, 1));
 		}
 		else if (memcmp(field_str(stats, ST_F_STATUS), "DOWN", 4) == 0 &&
-			 (ref->agent.state & CHK_ST_ENABLED) && !(sv->agent.health)) {
+			 stats[ST_F_AGENT_STATUS].type && !(sv->agent.health)) {
 			/* DOWN (agent) */
 			chunk_appendf(&trash, "%s ", human_time(stats[ST_F_LASTCHG].u.u32, 1));
 			chunk_appendf(&trash, srv_hlt_st[1], "GCC: your -Werror=format-security is bogus, annoying, and hides real bugs, I don't thank you, really!");
@@ -3955,17 +3978,16 @@
 		}
 
 		if (memcmp(field_str(stats, ST_F_STATUS), "DOWN", 4) == 0 &&
-		    ((sv->agent.state & (CHK_ST_ENABLED|CHK_ST_PAUSED)) == CHK_ST_ENABLED) && !(sv->agent.health)) {
+		    stats[ST_F_AGENT_STATUS].type && !(sv->agent.health)) {
 			chunk_appendf(&trash,
-			              "</td><td class=ac><u> %s%s",
-			              (sv->agent.state & CHK_ST_INPROGRESS) ? "* " : "",
-			              get_check_status_info(sv->agent.status));
+			              "</td><td class=ac><u> %s",
+			              field_str(stats, ST_F_AGENT_STATUS));
 
-			if (sv->agent.status >= HCHK_STATUS_L57DATA)
-				chunk_appendf(&trash, "/%d", sv->agent.code);
+			if (stats[ST_F_AGENT_CODE].type)
+				chunk_appendf(&trash, "/%d", stats[ST_F_AGENT_CODE].u.u32);
 
-			if (sv->agent.status >= HCHK_STATUS_CHECKED && sv->agent.duration >= 0)
-				chunk_appendf(&trash, " in %lums", sv->agent.duration);
+			if (stats[ST_F_AGENT_DURATION].type && stats[ST_F_AGENT_DURATION].u.u64 >= 0)
+				chunk_appendf(&trash, " in %lums", (long)stats[ST_F_AGENT_DURATION].u.u64);
 
 			chunk_appendf(&trash, "<div class=tips>%s",
 				      get_check_status_description(sv->agent.status));