mDNS: Upgrading the container_of.h that was backported from src/common in master
authorSaverio Proto <zioproto@gmail.com>
Thu, 10 May 2012 07:50:03 +0000 (09:50 +0200)
committerSaverio Proto <zioproto@gmail.com>
Mon, 13 Aug 2012 17:37:39 +0000 (19:37 +0200)
A newer version is present in master and this commit makes the upgrade

lib/mdns/src/container_of.h

index 7ad3a29..ca3150c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * PacketBB handler library (see RFC 5444)
- * Copyright (c) 2010 Henning Rogge <henning.rogge@fkie.fraunhofer.de>
+ * Copyright (c) 2010 Henning Rogge <hrogge@googlemail.com>
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #ifndef CONTAINER_OF_H_
 #define CONTAINER_OF_H_
 
-#include "stddef.h"
+#include <stddef.h>
 
-#ifndef container_of
+/* allow compilation with c99 mode */
+#ifndef typeof
+#define typeof(x) __typeof__(x)
+#endif
 
 /**
  * casts an embedded node of a list/tree into the surrounding struct
+ * this macro returns bad results if ptr is NULL
  * @param ptr pointer to node
  * @param type data type of surrounding struct
  * @param member name of node inside struct
  * @return pointer to surrounding struct
  */
 #define container_of(ptr, type, member) ((type *)( (char *)(ptr) - offsetof(type,member) ))
-#endif
+
+/**
+ * Helper function for NULL safe container_of macro
+ */
+static inline void *
+__container_of_if_notnull(void *ptr, size_t offset) {
+  return ptr == NULL ? NULL : (((char *)ptr) - offset);
+}
+
+/**
+ * casts an embedded node of a list/tree into the surrounding struct
+ * this macro returns bad results if ptr is NULL
+ * @param ptr pointer to node
+ * @param type data type of surrounding struct
+ * @param member name of node inside struct
+ * @return pointer to surrounding struct
+ */
+#define container_of_if_notnull(ptr, type, member) ((type *)__container_of_if_notnull(ptr, offsetof(type, member)))
 
 #endif /* CONTAINER_OF_H_ */