]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg: fix encoding/decoding sockaddr_storage on DARWIN/FreeBSD
authorYan, Zheng <zyan@redhat.com>
Sun, 5 Jul 2015 07:31:27 +0000 (15:31 +0800)
committerKefu Chai <kchai@redhat.com>
Mon, 31 Aug 2015 08:00:21 +0000 (16:00 +0800)
sockaddr_storage on DARWIN/FreeBSD is different from sockaddr_storage
on Linux. sockaddr_storage on DARWIN/FreeBSD includes a ss_len field.
Besides, Its ss_len and ss_family fields are 'unsigned char'.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/msg/msg_types.h

index 62deacffffa58a6eddc8ff40a098b035de703d32..bf668e034731b79bbc4140ad39d158b71992fc3b 100644 (file)
@@ -156,14 +156,21 @@ namespace std {
  */
 static inline void encode(const sockaddr_storage& a, bufferlist& bl) {
   struct sockaddr_storage ss = a;
-#if !defined(__FreeBSD__)
+#if defined(DARWIN) || defined(__FreeBSD__)
+  unsigned short *ss_family = reinterpret_cast<unsigned short*>(&ss);
+  *ss_family = htons(a.ss_family);
+#else
   ss.ss_family = htons(ss.ss_family);
 #endif
   ::encode_raw(ss, bl);
 }
 static inline void decode(sockaddr_storage& a, bufferlist::iterator& bl) {
   ::decode_raw(a, bl);
-#if !defined(__FreeBSD__)
+#if defined(DARWIN) || defined(__FreeBSD__)
+  unsigned short *ss_family = reinterpret_cast<unsigned short *>(&a);
+  a.ss_family = ntohs(*ss_family);
+  a.ss_len = 0;
+#else
   a.ss_family = ntohs(a.ss_family);
 #endif
 }