MEDIUM: improve config check return codes

When checking a configuration file using "-c -f xxx", sometimes it is
reported that a config is valid while it will later fail (eg: no enabled
listener). Instead, let's improve the return values :
  - return 0 if config is 100% OK
  - return 1 if config has errors
  - return 2 if config is OK but no listener nor peer is enabled
diff --git a/src/cfgparse.c b/src/cfgparse.c
index 6fa549a..73b7f71 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -5574,12 +5574,6 @@
 		proxy = next;
 	}
 
-	if ((curproxy = proxy) == NULL) {
-		Alert("config : no <listen> line. Nothing to do !\n");
-		err_code |= ERR_ALERT | ERR_FATAL;
-		goto out;
-	}
-
 	while (curproxy != NULL) {
 		struct switching_rule *rule;
 		struct sticking_rule *mrule;
diff --git a/src/haproxy.c b/src/haproxy.c
index 363f306..66cf18f 100644
--- a/src/haproxy.c
+++ b/src/haproxy.c
@@ -548,8 +548,24 @@
 	}
 
 	if (global.mode & MODE_CHECK) {
-		qfprintf(stdout, "Configuration file is valid\n");
-		exit(0);
+		struct peers *pr;
+		struct proxy *px;
+
+		for (pr = peers; pr; pr = pr->next)
+			if (pr->peers_fe)
+				break;
+
+		for (px = proxy; px; px = px->next)
+			if (px->state == PR_STNEW && px->listen)
+				break;
+
+		if (pr || px) {
+			/* At least one peer or one listener has been found */
+			qfprintf(stdout, "Configuration file is valid\n");
+			exit(0);
+		}
+		qfprintf(stdout, "Configuration file has no error but will not start (no listener) => exit(2).\n");
+		exit(2);
 	}
 
 	global_listener_queue_task = task_new();