Use multiple addresses, if present, on Mac and Windows
authorDanilo Almeida <dalmeida@mit.edu>
Sat, 21 Aug 1999 15:12:50 +0000 (15:12 +0000)
committerDanilo Almeida <dalmeida@mit.edu>
Sat, 21 Aug 1999 15:12:50 +0000 (15:12 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@11701 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/krb5/os/ChangeLog
src/lib/krb5/os/localaddr.c

index 16363aed36cc82921077fa1f498fc8d2f3845fbc..fdb17983094db34d597342bf995618ba712ec4e2 100644 (file)
@@ -1,3 +1,8 @@
+1999-08-21  Danilo Almeida  <dalmeida@mit.edu>
+
+       * localaddr.c (krb5_os_localaddr): Use multiple addresses, if
+       present, on Mac and Windows.
+
 1999-08-10     Alexandra Ellwood       <lxs@mit.edu>
 
        * changepw.c (krb5_change_password):
index f55c35c7899b2a63b0afe84dbccd5f2672a4bb15..9b64ad19ba65d6656397d0e3641a78869894cd95 100644 (file)
@@ -294,12 +294,11 @@ KRB5_DLLIMP krb5_error_code KRB5_CALLCONV
 krb5_os_localaddr (krb5_context context, krb5_address ***addr) {
     char host[64];                              /* Name of local machine */
     struct hostent *hostrec;
-    int err;
-
-    *addr = calloc (2, sizeof (krb5_address *));
-    if (*addr == NULL)
-        return ENOMEM;
+    int err, count, i;
+    krb5_address ** paddr;
 
+    *addr = 0;
+    paddr = 0;
     err = 0;
     
     if (gethostname (host, sizeof(host))) {
@@ -319,27 +318,55 @@ krb5_os_localaddr (krb5_context context, krb5_address ***addr) {
                    return err;
     }
 
-    (*addr)[0] = calloc (1, sizeof(krb5_address));
-    if ((*addr)[0] == NULL) {
-        free (*addr);
-        return ENOMEM;
+    for (count = 0; hostrec->h_addr_list[count]; count++);
+
+
+    paddr = (krb5_address **)malloc(sizeof(krb5_address *) * (count+1));
+    if (!paddr) {
+        err = ENOMEM;
+        goto cleanup;
+    }
+
+    memset(addr, 0, sizeof(krb5_address *) * (count+1));
+
+    for (i = 0; i < count; i++)
+    {
+        paddr[i] = (krb5_address *)malloc(sizeof(krb5_address));
+        if (paddr[i] == NULL) {
+            err = ENOMEM;
+            goto cleanup;
+        }
+
+        paddr[i]->magic = KV5M_ADDRESS;
+        paddr[i]->addrtype = hostrec->h_addrtype;
+        paddr[i]->length = hostrec->h_length;
+        paddr[i]->contents = (unsigned char *)malloc(paddr[i]->length);
+        if (!paddr[i]->contents) {
+            err = ENOMEM;
+            goto cleanup;
+        }
+        memcpy(paddr[i]->contents,
+               hostrec->h_addr_list[i],
+               paddr[i]->length);
     }
-    (*addr)[0]->magic = KV5M_ADDRESS;
-    (*addr)[0]->addrtype = hostrec->h_addrtype;
-    (*addr)[0]->length = hostrec->h_length;
-    (*addr)[0]->contents = (unsigned char *)malloc((*addr)[0]->length);
-    if (!(*addr)[0]->contents) {
-        free((*addr)[0]);
-        free(*addr);
-        return ENOMEM;
-    } else {
-        memcpy ((*addr)[0]->contents,
-                hostrec->h_addr,
-                (*addr)[0]->length);
+
+ cleanup:
+    if (err) {
+        if (paddr) {
+            for (i = 0; i < count; i++)
+            {
+                if (paddr[i]) {
+                    if (paddr[i]->contents)
+                        free(paddr[i]->contents);
+                    free(paddr[i]);
+                }
+            }
+            free(paddr);
+        }
     }
-       /* FIXME, deal with the case where gethostent returns multiple addrs */
+    else
+        *addr = paddr;
 
-    return(0);
+    return(err);
 }
 #endif
-