DEV: haring: add a new option "-r" to automatically repair broken files

In case a file-backed ring was not properly synced before being dumped,
the output can look bogus due to the head pointer not being perfectly
up to date. In this case, passing "-r" will make haring automatically
skip entries not starting with a zero, and resynchronize with the rest
of the messages.

This should be backported to 2.6.
diff --git a/dev/haring/haring.c b/dev/haring/haring.c
index 27e03ee..53352cb 100644
--- a/dev/haring/haring.c
+++ b/dev/haring/haring.c
@@ -37,6 +37,7 @@
 
 int force = 0; // force access to a different layout
 int lfremap = 0; // remap LF in traces
+int repair = 0; // repair file
 
 
 /* display the message and exit with the code */
@@ -61,6 +62,7 @@
 	    "options :\n"
 	    "  -f           : force accessing a non-matching layout for 'ring struct'\n"
 	    "  -l           : replace LF in contents with CR VT\n"
+	    "  -r           : \"repair\" corrupted file (actively search for message boundaries)\n"
 	    "\n"
 	    "", arg0);
 }
@@ -146,6 +148,14 @@
 		 * stop before the end.
 		 */
 		while (ofs + 1 < b_data(&buf)) {
+			if (unlikely(repair && *b_peek(&buf, ofs))) {
+				/* in repair mode we consider that we could have landed
+				 * in the middle of a message so we skip all bytes till
+				 * the next zero.
+				 */
+				ofs++;
+				continue;
+			}
 			cnt = 1;
 			len = b_peek_varint(&buf, ofs + cnt, &msg_len);
 			if (!len)
@@ -219,6 +229,8 @@
 			force = 1;
 		else if (strcmp(argv[0], "-l") == 0)
 			lfremap = 1;
+		else if (strcmp(argv[0], "-r") == 0)
+			repair = 1;
 		else if (strcmp(argv[0], "--") == 0)
 			break;
 		else