summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLucas De Marchi <lucas.demarchi@profusion.mobi>2012-04-26 18:36:01 +0200
committerKay Sievers <kay@vrfy.org>2012-04-29 19:14:05 +0200
commitc4326aa4af424ada8ab9e6fe77035db1cf222ffa (patch)
tree14f47bfbae8c0da4212ee22ad73f1bbeeee9e0bc /src
parentlibudev: prefix log macros with 'udev_' (diff)
downloadsystemd-c4326aa4af424ada8ab9e6fe77035db1cf222ffa.tar.xz
systemd-c4326aa4af424ada8ab9e6fe77035db1cf222ffa.zip
util: introduce container_of() macro
This macro comes from kernel and it's useful for unwrapping structs inside another one. The generated code is actually the same to the one where this logic is used in udev, but using this macro is much cleaner and less error prone.
Diffstat (limited to 'src')
-rw-r--r--src/shared/util.h11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/shared/util.h b/src/shared/util.h
index 17ffd19f55..0246dfd826 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -59,6 +59,17 @@ typedef struct dual_timestamp {
#define USEC_PER_MONTH (2629800ULL*USEC_PER_SEC)
#define USEC_PER_YEAR (31557600ULL*USEC_PER_SEC)
+/*
+ * container_of - cast a member of a structure out to the containing structure
+ * @ptr: the pointer to the member.
+ * @type: the type of the container struct this is embedded in.
+ * @member: the name of the member within the struct.
+ *
+ */
+#define container_of(ptr, type, member) ({ \
+ const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+ (type *)( (char *)__mptr - offsetof(type,member) );})
+
/* What is interpreted as whitespace? */
#define WHITESPACE " \t\n\r"
#define NEWLINE "\n\r"