+ SCM_VALIDATE_INUM_COPY (1, family, af);
+ SCM_ASSERT_RANGE (1, family, af == AF_INET || af == AF_INET6);
+ SCM_VALIDATE_STRING_COPY (2, address, src);
+ rv = inet_pton (af, src, dst);
+ if (rv == -1)
+ SCM_SYSERROR;
+ else if (rv == 0)
+ SCM_MISC_ERROR ("Bad address", SCM_EOL);
+ if (af == AF_INET)
+ return scm_ulong2num (ntohl (*(uint32_t *) dst));
+ else
+ return ipv6_net_to_num ((char *) dst);
+}
+#undef FUNC_NAME
+#endif
+
+#ifdef HAVE_INET_NTOP
+SCM_DEFINE (scm_inet_ntop, "inet-ntop", 2, 0, 0,
+ (SCM family, SCM address),
+ "Convert a network address into a printable string.\n"
+ "Note that unlike the C version of this function,\n"
+ "the input is an integer with normal host byte ordering.\n"
+ "@var{family} can be @code{AF_INET} or @code{AF_INET6}. E.g.,\n\n"
+ "@lisp\n"
+ "(inet-ntop AF_INET 2130706433) @result{} \"127.0.0.1\"\n"
+ "(inet-ntop AF_INET6 (- (expt 2 128) 1)) @result{}\n"
+ "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff\n"
+ "@end lisp")
+#define FUNC_NAME s_scm_inet_ntop
+{
+ int af;
+#ifdef INET6_ADDRSTRLEN
+ char dst[INET6_ADDRSTRLEN];
+#else
+ char dst[46];
+#endif
+ char addr6[16];
+
+ SCM_VALIDATE_INUM_COPY (1, family, af);
+ SCM_ASSERT_RANGE (1, family, af == AF_INET || af == AF_INET6);
+ if (af == AF_INET)
+ *(uint32_t *) addr6 = htonl (SCM_NUM2ULONG (2, address));
+ else
+ {
+ VALIDATE_INET6 (2, address);
+ ipv6_num_to_net (address, addr6);
+ }
+ if (inet_ntop (af, &addr6, dst, sizeof dst) == NULL)
+ SCM_SYSERROR;
+ return scm_makfrom0str (dst);
+}
+#undef FUNC_NAME
+#endif
+
+#endif /* HAVE_IPV6 */
+
+SCM_SYMBOL (sym_socket, "socket");
+
+#define SCM_SOCK_FD_TO_PORT(fd) scm_fdes_to_port (fd, "r+0", sym_socket)