+#ifdef HAVE_STRUCT_SOCKADDR_IN
+int
+Mono_Posix_FromSockaddrIn (struct Mono_Posix_SockaddrIn *from, struct sockaddr_in *to)
+{
+ _cnm_return_val_if_overflow (unsigned short, from->sin_port, -1);
+
+ memset (to, 0, sizeof(*to));
+
+ to->sin_port = from->sin_port;
+ if (Mono_Posix_FromInAddr (&from->sin_addr, &to->sin_addr) != 0) {
+ return -1;
+ }
+
+ return 0;
+}
+#endif /* ndef HAVE_STRUCT_SOCKADDR_IN */
+
+
+#ifdef HAVE_STRUCT_SOCKADDR_IN
+int
+Mono_Posix_ToSockaddrIn (struct sockaddr_in *from, struct Mono_Posix_SockaddrIn *to)
+{
+ _cnm_return_val_if_overflow (unsigned short, from->sin_port, -1);
+
+ memset (to, 0, sizeof(*to));
+
+ to->sin_port = from->sin_port;
+ if (Mono_Posix_ToInAddr (&from->sin_addr, &to->sin_addr) != 0) {
+ return -1;
+ }
+
+ return 0;
+}
+#endif /* ndef HAVE_STRUCT_SOCKADDR_IN */
+
+
+#if defined(HAVE_STRUCT_SOCKADDR_IN6) && !defined(HOST_WIN32)
+int
+Mono_Posix_FromSockaddrIn6 (struct Mono_Posix_SockaddrIn6 *from, struct sockaddr_in6 *to)
+{
+ _cnm_return_val_if_overflow (unsigned short, from->sin6_port, -1);
+ _cnm_return_val_if_overflow (unsigned int, from->sin6_flowinfo, -1);
+ _cnm_return_val_if_overflow (unsigned int, from->sin6_scope_id, -1);
+
+ memset (to, 0, sizeof(*to));
+
+ to->sin6_port = from->sin6_port;
+ to->sin6_flowinfo = from->sin6_flowinfo;
+ if (Mono_Posix_FromIn6Addr (&from->sin6_addr, &to->sin6_addr) != 0) {
+ return -1;
+ }
+ to->sin6_scope_id = from->sin6_scope_id;
+
+ return 0;
+}
+#endif /* ndef HAVE_STRUCT_SOCKADDR_IN6 */
+
+
+#if defined(HAVE_STRUCT_SOCKADDR_IN6) && !defined(HOST_WIN32)
+int
+Mono_Posix_ToSockaddrIn6 (struct sockaddr_in6 *from, struct Mono_Posix_SockaddrIn6 *to)
+{
+ _cnm_return_val_if_overflow (unsigned short, from->sin6_port, -1);
+ _cnm_return_val_if_overflow (unsigned int, from->sin6_flowinfo, -1);
+ _cnm_return_val_if_overflow (unsigned int, from->sin6_scope_id, -1);
+
+ memset (to, 0, sizeof(*to));
+
+ to->sin6_port = from->sin6_port;
+ to->sin6_flowinfo = from->sin6_flowinfo;
+ if (Mono_Posix_ToIn6Addr (&from->sin6_addr, &to->sin6_addr) != 0) {
+ return -1;
+ }
+ to->sin6_scope_id = from->sin6_scope_id;
+
+ return 0;
+}
+#endif /* ndef HAVE_STRUCT_SOCKADDR_IN6 */
+
+
+int Mono_Posix_FromSockaddrType (int x, int *r)
+{
+ *r = 0;
+ if (x == Mono_Posix_SockaddrType_Invalid)
+#ifdef Invalid
+ {*r = Invalid; return 0;}
+#else /* def Invalid */
+ {errno = EINVAL; return -1;}
+#endif /* ndef Invalid */
+ if (x == Mono_Posix_SockaddrType_MustBeWrapped)
+#ifdef MustBeWrapped
+ {*r = MustBeWrapped; return 0;}
+#else /* def MustBeWrapped */
+ {errno = EINVAL; return -1;}
+#endif /* ndef MustBeWrapped */
+ if (x == Mono_Posix_SockaddrType_Sockaddr)
+#ifdef Sockaddr
+ {*r = Sockaddr; return 0;}
+#else /* def Sockaddr */
+ {errno = EINVAL; return -1;}
+#endif /* ndef Sockaddr */
+ if (x == Mono_Posix_SockaddrType_SockaddrIn)
+#ifdef SockaddrIn
+ {*r = SockaddrIn; return 0;}
+#else /* def SockaddrIn */
+ {errno = EINVAL; return -1;}
+#endif /* ndef SockaddrIn */
+ if (x == Mono_Posix_SockaddrType_SockaddrIn6)
+#ifdef SockaddrIn6
+ {*r = SockaddrIn6; return 0;}
+#else /* def SockaddrIn6 */
+ {errno = EINVAL; return -1;}
+#endif /* ndef SockaddrIn6 */
+ if (x == Mono_Posix_SockaddrType_SockaddrStorage)
+#ifdef SockaddrStorage
+ {*r = SockaddrStorage; return 0;}
+#else /* def SockaddrStorage */
+ {errno = EINVAL; return -1;}
+#endif /* ndef SockaddrStorage */
+ if (x == Mono_Posix_SockaddrType_SockaddrUn)
+#ifdef SockaddrUn
+ {*r = SockaddrUn; return 0;}
+#else /* def SockaddrUn */
+ {errno = EINVAL; return -1;}
+#endif /* ndef SockaddrUn */
+ if (x == 0)
+ return 0;
+ errno = EINVAL; return -1;
+}
+
+int Mono_Posix_ToSockaddrType (int x, int *r)
+{
+ *r = 0;
+ if (x == 0)
+ return 0;
+#ifdef Invalid
+ if (x == Invalid)
+ {*r = Mono_Posix_SockaddrType_Invalid; return 0;}
+#endif /* ndef Invalid */
+#ifdef MustBeWrapped
+ if (x == MustBeWrapped)
+ {*r = Mono_Posix_SockaddrType_MustBeWrapped; return 0;}
+#endif /* ndef MustBeWrapped */
+#ifdef Sockaddr
+ if (x == Sockaddr)
+ {*r = Mono_Posix_SockaddrType_Sockaddr; return 0;}
+#endif /* ndef Sockaddr */
+#ifdef SockaddrIn
+ if (x == SockaddrIn)
+ {*r = Mono_Posix_SockaddrType_SockaddrIn; return 0;}
+#endif /* ndef SockaddrIn */
+#ifdef SockaddrIn6
+ if (x == SockaddrIn6)
+ {*r = Mono_Posix_SockaddrType_SockaddrIn6; return 0;}
+#endif /* ndef SockaddrIn6 */
+#ifdef SockaddrStorage
+ if (x == SockaddrStorage)
+ {*r = Mono_Posix_SockaddrType_SockaddrStorage; return 0;}
+#endif /* ndef SockaddrStorage */
+#ifdef SockaddrUn
+ if (x == SockaddrUn)
+ {*r = Mono_Posix_SockaddrType_SockaddrUn; return 0;}
+#endif /* ndef SockaddrUn */
+ errno = EINVAL; return -1;
+}
+