MINOR: stats: report the total number of warnings issued

Now in "show info" we have a TotalWarnings field that reports the total
number of warnings issued since the process started. It's also reported
in the the stats page next to the uptime.
diff --git a/include/haproxy/errors.h b/include/haproxy/errors.h
index 81a4b2f..c102fed 100644
--- a/include/haproxy/errors.h
+++ b/include/haproxy/errors.h
@@ -68,6 +68,7 @@
 void usermsgs_clr(const char *prefix);
 int usermsgs_empty(void);
 const char *usermsgs_str(void);
+extern uint tot_warnings;
 
 /************ Error reporting functions ***********/
 
diff --git a/include/haproxy/stats-t.h b/include/haproxy/stats-t.h
index 5a46d30..b15ca86 100644
--- a/include/haproxy/stats-t.h
+++ b/include/haproxy/stats-t.h
@@ -343,6 +343,7 @@
 	INF_POOL_USED_BYTES,
 	INF_START_TIME_SEC,
 	INF_TAINTED,
+	INF_WARNINGS,
 
 	/* must always be the last one */
 	INF_TOTAL_FIELDS
diff --git a/src/errors.c b/src/errors.c
index da10c2f..2e9d6af 100644
--- a/src/errors.c
+++ b/src/errors.c
@@ -20,6 +20,7 @@
 /* A global buffer used to store all startup alerts/warnings. It will then be
  * retrieve on the CLI. */
 struct ring *startup_logs = NULL;
+uint tot_warnings = 0;
 #ifdef USE_SHM_OPEN
 static struct ring *shm_startup_logs = NULL;
 #endif
@@ -450,6 +451,7 @@
 	va_list argp;
 
 	warned |= WARN_ANY;
+	HA_ATOMIC_INC(&tot_warnings);
 
 	if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE) ||
 	    !(global.mode & MODE_STARTING)) {
diff --git a/src/stats.c b/src/stats.c
index dae6921..eab75ee 100644
--- a/src/stats.c
+++ b/src/stats.c
@@ -156,6 +156,7 @@
 	[INF_CUM_LOG_MSGS]                   = { .name = "CumRecvLogs",                 .desc = "Total number of log messages received by log-forwarding listeners on this worker process since started" },
 	[INF_BUILD_INFO]                     = { .name = "Build info",                  .desc = "Build info" },
 	[INF_TAINTED]                        = { .name = "Tainted",                     .desc = "Experimental features used" },
+	[INF_WARNINGS]                       = { .name = "TotalWarnings",               .desc = "Total warnings issued" },
 };
 
 const struct name_desc stat_fields[ST_F_TOTAL_FIELDS] = {
@@ -3600,7 +3601,7 @@
 	              "<h3>&gt; General process information</h3>\n"
 	              "<table border=0><tr><td align=\"left\" nowrap width=\"1%%\">\n"
 	              "<p><b>pid = </b> %d (process #%d, nbproc = %d, nbthread = %d)<br>\n"
-	              "<b>uptime = </b> %dd %dh%02dm%02ds<br>\n"
+	              "<b>uptime = </b> %dd %dh%02dm%02ds; warnings = %u<br>\n"
 	              "<b>system limits:</b> memmax = %s%s; ulimit-n = %d<br>\n"
 	              "<b>maxsock = </b> %d; <b>maxconn = </b> %d; <b>maxpipes = </b> %d<br>\n"
 	              "current conns = %d; current pipes = %d/%d; conn rate = %d/sec; bit rate = %.3f %cbps<br>\n"
@@ -3636,6 +3637,7 @@
 	              pid, 1, 1, global.nbthread,
 	              up / 86400, (up % 86400) / 3600,
 	              (up % 3600) / 60, (up % 60),
+	              HA_ATOMIC_LOAD(&tot_warnings),
 	              global.rlimit_memmax ? ultoa(global.rlimit_memmax) : "unlimited",
 	              global.rlimit_memmax ? " MB" : "",
 	              global.rlimit_nofile,
@@ -4737,6 +4739,7 @@
 	info[INF_CUM_LOG_MSGS]                   = mkf_u32(FN_COUNTER, cum_log_messages);
 
 	info[INF_TAINTED]                        = mkf_str(FO_STATUS, chunk_newstr(out));
+	info[INF_WARNINGS]                       = mkf_u32(FN_COUNTER, HA_ATOMIC_LOAD(&tot_warnings));
 	chunk_appendf(out, "%#x", get_tainted());
 
 	return 1;