MINOR: ring: ring_cast_from_area() cast from an allocated area

Cast an unified ring + storage area to a ring from area, without
reinitializing the data buffer. Reinitialize the waiters and the lock.

It helps retrieving a previously allocated ring, from an mmap for
example.
diff --git a/include/haproxy/ring.h b/include/haproxy/ring.h
index bab18c6..d6c527c 100644
--- a/include/haproxy/ring.h
+++ b/include/haproxy/ring.h
@@ -30,6 +30,7 @@
 
 struct ring *ring_new(size_t size);
 struct ring *ring_make_from_area(void *area, size_t size);
+struct ring *ring_cast_from_area(void *area);
 void ring_init(struct ring *ring, void* area, size_t size);
 struct ring *ring_resize(struct ring *ring, size_t size);
 void ring_free(struct ring *ring);
diff --git a/src/ring.c b/src/ring.c
index da987c5..91157a9 100644
--- a/src/ring.c
+++ b/src/ring.c
@@ -99,6 +99,25 @@
 	return ring;
 }
 
+/* Cast an unified ring + storage area to a ring from <area>, without
+ * reinitializing the data buffer.
+ *
+ * Reinitialize the waiters and the lock.
+ */
+struct ring *ring_cast_from_area(void *area)
+{
+	struct ring *ring = NULL;
+
+	ring = area;
+	ring->buf.area = area + sizeof(*ring);
+
+	HA_RWLOCK_INIT(&ring->lock);
+	LIST_INIT(&ring->waiters);
+	ring->readers_count = 0;
+
+	return ring;
+}
+
 /* Resizes existing ring <ring> to <size> which must be larger, without losing
  * its contents. The new size must be at least as large as the previous one or
  * no change will be performed. The pointer to the ring is returned on success,