MINOR: obj: provide a safe and an unsafe access to pointed objects

Most of the times, the caller of objt_<type>(ptr) will know that <ptr>
is valid and of the correct type (eg: in an "if" condition). Let's provide
an unsafe variant that does not perform the check again for these usages.
The new functions are called "__objt_<type>".
diff --git a/include/proto/obj_type.h b/include/proto/obj_type.h
index ba5d534..09a5ee4 100644
--- a/include/proto/obj_type.h
+++ b/include/proto/obj_type.h
@@ -2,7 +2,7 @@
  * include/proto/obj_type.h
  * This file contains function prototypes to manipulate object types
  *
- * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu
+ * Copyright (C) 2000-2013 Willy Tarreau - w@1wt.eu
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -32,7 +32,7 @@
 
 static inline enum obj_type obj_type(enum obj_type *t)
 {
-	if (!t || *t > OBJ_TYPE_APPLET)
+	if (!t || *t >= OBJ_TYPE_ENTRIES)
 		return OBJ_TYPE_NONE;
 	return *t;
 }
@@ -48,41 +48,68 @@
 	}
 }
 
+/* Note: for convenience, we provide two versions of each function :
+ *   - __objt_<type> : converts the pointer without any control of its
+ *     value nor type.
+ *   - objt_<type> : same as above except that if the pointer is NULL
+ *     or points to a non-matching type, NULL is returned instead.
+ */
+
+static inline struct listener *__objt_listener(enum obj_type *t)
+{
+	return container_of(t, struct listener, obj_type);
+}
+
 static inline struct listener *objt_listener(enum obj_type *t)
 {
 	if (!t || *t != OBJ_TYPE_LISTENER)
 		return NULL;
-	return container_of(t, struct listener, obj_type);
+	return __objt_listener(t);
+}
+
+static inline struct proxy *__objt_proxy(enum obj_type *t)
+{
+	return container_of(t, struct proxy, obj_type);
 }
 
 static inline struct proxy *objt_proxy(enum obj_type *t)
 {
 	if (!t || *t != OBJ_TYPE_PROXY)
 		return NULL;
-	return container_of(t, struct proxy, obj_type);
+	return __objt_proxy(t);
+}
+
+static inline struct server *__objt_server(enum obj_type *t)
+{
+	return container_of(t, struct server, obj_type);
 }
 
 static inline struct server *objt_server(enum obj_type *t)
 {
 	if (!t || *t != OBJ_TYPE_SERVER)
 		return NULL;
-	return container_of(t, struct server, obj_type);
+	return __objt_server(t);
 }
 
+static inline struct si_applet *__objt_applet(enum obj_type *t)
+{
+	return container_of(t, struct si_applet, obj_type);
+}
+
 static inline struct si_applet *objt_applet(enum obj_type *t)
 {
 	if (!t || *t != OBJ_TYPE_APPLET)
 		return NULL;
-	return container_of(t, struct si_applet, obj_type);
+	return __objt_applet(t);
 }
 
 static inline void *obj_base_ptr(enum obj_type *t)
 {
 	switch (obj_type(t)) {
-	case OBJ_TYPE_LISTENER: return objt_listener(t);
-	case OBJ_TYPE_PROXY:    return objt_proxy(t);
-	case OBJ_TYPE_SERVER:   return objt_server(t);
-	case OBJ_TYPE_APPLET:   return objt_applet(t);
+	case OBJ_TYPE_LISTENER: return __objt_listener(t);
+	case OBJ_TYPE_PROXY:    return __objt_proxy(t);
+	case OBJ_TYPE_SERVER:   return __objt_server(t);
+	case OBJ_TYPE_APPLET:   return __objt_applet(t);
 	default:                return NULL;
 	}
 }
diff --git a/include/types/obj_type.h b/include/types/obj_type.h
index cfb3e34..b27f375 100644
--- a/include/types/obj_type.h
+++ b/include/types/obj_type.h
@@ -2,7 +2,7 @@
  * include/types/obj_type.h
  * This file declares some object types for use in various structures.
  *
- * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu
+ * Copyright (C) 2000-2013 Willy Tarreau - w@1wt.eu
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -37,6 +37,7 @@
 	OBJ_TYPE_PROXY,        /* object is a struct proxy */
 	OBJ_TYPE_SERVER,       /* object is a struct server */
 	OBJ_TYPE_APPLET,       /* object is a struct si_applet */
+	OBJ_TYPE_ENTRIES       /* last one : number of entries */
 };
 
 #endif /* _TYPES_OBJ_TYPE_H */