Squashed 'third_party/rawrtc/re/' content from commit f3163ce8b

Change-Id: I6a235e6ac0f03269d951026f9d195da05c40fdab
git-subtree-dir: third_party/rawrtc/re
git-subtree-split: f3163ce8b526a13b35ef71ce4dd6f43585064d8a
diff --git a/include/re_sa.h b/include/re_sa.h
new file mode 100644
index 0000000..4492922
--- /dev/null
+++ b/include/re_sa.h
@@ -0,0 +1,63 @@
+/**
+ * @file re_sa.h  Interface to Socket Address
+ *
+ * Copyright (C) 2010 Creytiv.com
+ */
+#if defined(WIN32)
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#else
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#endif
+
+
+struct pl;
+
+/** Socket Address flags */
+enum sa_flag {
+	SA_ADDR      = 1<<0,
+	SA_PORT      = 1<<1,
+	SA_ALL       = SA_ADDR | SA_PORT
+};
+
+/** Defines a Socket Address */
+struct sa {
+	union {
+		struct sockaddr sa;
+		struct sockaddr_in in;
+#ifdef HAVE_INET6
+		struct sockaddr_in6 in6;
+#endif
+		uint8_t padding[28];
+	} u;
+	socklen_t len;
+};
+
+void     sa_init(struct sa *sa, int af);
+int      sa_set(struct sa *sa, const struct pl *addr, uint16_t port);
+int      sa_set_str(struct sa *sa, const char *addr, uint16_t port);
+void     sa_set_in(struct sa *sa, uint32_t addr, uint16_t port);
+void     sa_set_in6(struct sa *sa, const uint8_t *addr, uint16_t port);
+int      sa_set_sa(struct sa *sa, const struct sockaddr *s);
+void     sa_set_port(struct sa *sa, uint16_t port);
+int      sa_decode(struct sa *sa, const char *str, size_t len);
+
+int      sa_af(const struct sa *sa);
+uint32_t sa_in(const struct sa *sa);
+void     sa_in6(const struct sa *sa, uint8_t *addr);
+int      sa_ntop(const struct sa *sa, char *buf, int size);
+uint16_t sa_port(const struct sa *sa);
+bool     sa_isset(const struct sa *sa, int flag);
+uint32_t sa_hash(const struct sa *sa, int flag);
+
+void     sa_cpy(struct sa *dst, const struct sa *src);
+bool     sa_cmp(const struct sa *l, const struct sa *r, int flag);
+
+bool     sa_is_linklocal(const struct sa *sa);
+bool     sa_is_loopback(const struct sa *sa);
+bool     sa_is_any(const struct sa *sa);
+
+struct re_printf;
+int      sa_print_addr(struct re_printf *pf, const struct sa *sa);