Revert "bpo-32221: makeipaddr(): remove interface part + speedup (GH-4724)" (#5394)

This reverts commit 47c0b1f7d4115e6f15e6776c1f91d28e7d96fe0c.
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 30afe81..5fe2431 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -1094,33 +1094,25 @@
 }
 
 
-/* Convert IPv4 sockaddr to a Python str. */
+/* Create a string object representing an IP address.
+   This is always a string of the form 'dd.dd.dd.dd' (with variable
+   size numbers). */
 
 static PyObject *
-make_ipv4_addr(const struct sockaddr_in *addr)
+makeipaddr(struct sockaddr *addr, int addrlen)
 {
-    char buf[INET_ADDRSTRLEN];
-    if (inet_ntop(AF_INET, &addr->sin_addr, buf, sizeof(buf)) == NULL) {
-        PyErr_SetFromErrno(PyExc_OSError);
+    char buf[NI_MAXHOST];
+    int error;
+
+    error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,
+        NI_NUMERICHOST);
+    if (error) {
+        set_gaierror(error);
         return NULL;
     }
     return PyUnicode_FromString(buf);
 }
 
-#ifdef ENABLE_IPV6
-/* Convert IPv6 sockaddr to a Python str. */
-
-static PyObject *
-make_ipv6_addr(const struct sockaddr_in6 *addr)
-{
-    char buf[INET6_ADDRSTRLEN];
-    if (inet_ntop(AF_INET6, &addr->sin6_addr, buf, sizeof(buf)) == NULL) {
-        PyErr_SetFromErrno(PyExc_OSError);
-        return NULL;
-    }
-    return PyUnicode_FromString(buf);
-}
-#endif
 
 #ifdef USE_BLUETOOTH
 /* Convert a string representation of a Bluetooth address into a numeric
@@ -1185,10 +1177,11 @@
 
     case AF_INET:
     {
-        const struct sockaddr_in *a = (const struct sockaddr_in *)addr;
-        PyObject *addrobj = make_ipv4_addr(a);
+        struct sockaddr_in *a;
+        PyObject *addrobj = makeipaddr(addr, sizeof(*a));
         PyObject *ret = NULL;
         if (addrobj) {
+            a = (struct sockaddr_in *)addr;
             ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));
             Py_DECREF(addrobj);
         }
@@ -1232,10 +1225,11 @@
 #ifdef ENABLE_IPV6
     case AF_INET6:
     {
-        const struct sockaddr_in6 *a = (const struct sockaddr_in6 *)addr;
-        PyObject *addrobj = make_ipv6_addr(a);
+        struct sockaddr_in6 *a;
+        PyObject *addrobj = makeipaddr(addr, sizeof(*a));
         PyObject *ret = NULL;
         if (addrobj) {
+            a = (struct sockaddr_in6 *)addr;
             ret = Py_BuildValue("OiII",
                                 addrobj,
                                 ntohs(a->sin6_port),
@@ -5042,14 +5036,14 @@
 socket_gethostbyname(PyObject *self, PyObject *args)
 {
     char *name;
-    struct sockaddr_in addrbuf;
+    sock_addr_t addrbuf;
     PyObject *ret = NULL;
 
     if (!PyArg_ParseTuple(args, "et:gethostbyname", "idna", &name))
         return NULL;
-    if (setipaddr(name, (struct sockaddr *)&addrbuf,  sizeof(addrbuf), AF_INET) < 0)
+    if (setipaddr(name, SAS2SA(&addrbuf),  sizeof(addrbuf), AF_INET) < 0)
         goto finally;
-    ret = make_ipv4_addr(&addrbuf);
+    ret = makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));
 finally:
     PyMem_Free(name);
     return ret;
@@ -5151,7 +5145,7 @@
             sin.sin_len = sizeof(sin);
 #endif
             memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));
-            tmp = make_ipv4_addr(&sin);
+            tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));
 
             if (pch == h->h_addr_list && alen >= sizeof(sin))
                 memcpy((char *) addr, &sin, sizeof(sin));
@@ -5168,7 +5162,8 @@
             sin6.sin6_len = sizeof(sin6);
 #endif
             memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));
-            tmp = make_ipv6_addr(&sin6);
+            tmp = makeipaddr((struct sockaddr *)&sin6,
+                sizeof(sin6));
 
             if (pch == h->h_addr_list && alen >= sizeof(sin6))
                 memcpy((char *) addr, &sin6, sizeof(sin6));
@@ -5939,11 +5934,14 @@
     Py_buffer packed_ip;
     const char* retval;
 #ifdef ENABLE_IPV6
-    char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN)];
+    char ip[Py_MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];
 #else
-    char ip[INET_ADDRSTRLEN];
+    char ip[INET_ADDRSTRLEN + 1];
 #endif
 
+    /* Guarantee NUL-termination for PyUnicode_FromString() below */
+    memset((void *) &ip[0], '\0', sizeof(ip));
+
     if (!PyArg_ParseTuple(args, "iy*:inet_ntop", &af, &packed_ip)) {
         return NULL;
     }
@@ -5971,7 +5969,6 @@
         return NULL;
     }
 
-    /* inet_ntop guarantee NUL-termination of resulting string. */
     retval = inet_ntop(af, packed_ip.buf, ip, sizeof(ip));
     PyBuffer_Release(&packed_ip);
     if (!retval) {