guile-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

guile/guile-core/libguile ChangeLog socket.c


From: Gary Houston
Subject: guile/guile-core/libguile ChangeLog socket.c
Date: Sat, 21 Apr 2001 12:10:15 -0700

CVSROOT:        /cvs
Module name:    guile
Changes by:     Gary Houston <> 01/04/21 12:10:15

Modified files:
        guile-core/libguile: ChangeLog socket.c 

Log message:
        * socket.c (FLIP_NET_HOST_128): new macro.
        (scm_fill_sockaddr): use new macro.
        (scm_addr_vector): completed IPv6 address support.  added const
        to the address parameter.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/guile/guile-core/libguile/ChangeLog.diff?cvsroot=OldCVS&tr1=1.1361&tr2=1.1362&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/guile/guile-core/libguile/socket.c.diff?cvsroot=OldCVS&tr1=1.69&tr2=1.70&r1=text&r2=text

Patches:
Index: guile/guile-core/libguile/ChangeLog
diff -u guile/guile-core/libguile/ChangeLog:1.1361 
guile/guile-core/libguile/ChangeLog:1.1362
--- guile/guile-core/libguile/ChangeLog:1.1361  Fri Apr 20 12:22:47 2001
+++ guile/guile-core/libguile/ChangeLog Sat Apr 21 12:10:15 2001
@@ -1,3 +1,10 @@
+2001-04-21  Gary Houston  <address@hidden>
+
+       * socket.c (FLIP_NET_HOST_128): new macro.
+       (scm_fill_sockaddr): use new macro.
+       (scm_addr_vector): completed IPv6 address support.  added const
+       to the address parameter.
+
 2001-04-20  Gary Houston  <address@hidden>
 
        * socket.c (scm_fill_sockaddr): call htons for sin6_port.
@@ -5,7 +12,7 @@
        is defined.
        (scm_addr_vector): use a switch instead of multiple if statements.
        Add support for IPv6 (incomplete) .
-       MAX_ADDR_SIZE: increase to size of struct sockaddr_in if needed.
+       MAX_ADDR_SIZE: increase to size of struct sockaddr_in6 if needed.
 
 2001-04-20  Dirk Herrmann  <address@hidden>
 
Index: guile/guile-core/libguile/socket.c
diff -u guile/guile-core/libguile/socket.c:1.69 
guile/guile-core/libguile/socket.c:1.70
--- guile/guile-core/libguile/socket.c:1.69     Fri Apr 20 12:22:47 2001
+++ guile/guile-core/libguile/socket.c  Sat Apr 21 12:10:15 2001
@@ -366,6 +366,24 @@
 }
 #undef FUNC_NAME
 
+/* flip a 128 bit IPv6 address between host and network order.  */
+#ifdef WORDS_BIGENDIAN
+#define FLIP_NET_HOST_128(addr)
+#else
+#define FLIP_NET_HOST_128(addr)\
+{\
+  int i;\
+  \
+  for (i = 0; i < 8; i++)\
+    {\
+      char c = (addr)[i];\
+      \
+      (addr)[i] = (addr)[15 - i];\
+      (addr)[15 - i] = c;\
+    }\
+}
+#endif
+
 SCM_DEFINE (scm_shutdown, "shutdown", 2, 0, 0,
           (SCM sock, SCM how),
            "Sockets can be closed simply by using @code{close-port}. The\n"
@@ -484,21 +502,10 @@
          }
        else
          {
-           scm_sizet i;
-
            memset (soka->sin6_addr.s6_addr, 0, 16);
            memcpy (soka->sin6_addr.s6_addr, SCM_BDIGITS (address), 
                    SCM_NUMDIGS (address) * (SCM_BITSPERDIG / 8));
-#ifndef WORDS_BIGENDIAN
-           /* flip to network order.  */
-           for (i = 0; i < 8; i++)
-             {
-               char c = soka->sin6_addr.s6_addr[i];
-               
-               soka->sin6_addr.s6_addr[i] = soka->sin6_addr.s6_addr[15 - i];
-               soka->sin6_addr.s6_addr[15 - i] = c;
-             }
-#endif
+           FLIP_NET_HOST_128 (soka->sin6_addr.s6_addr);
          }
        soka->sin6_port = htons (port);
        soka->sin6_flowinfo = flowinfo;
@@ -662,7 +669,7 @@
 
 /* Put the components of a sockaddr into a new SCM vector.  */
 static SCM
-scm_addr_vector (struct sockaddr *address, const char *proc)
+scm_addr_vector (const struct sockaddr *address, const char *proc)
 {
   short int fam = address->sa_family;
   SCM result;
@@ -672,7 +679,7 @@
     {
     case AF_INET:
       {
-       struct sockaddr_in *nad = (struct sockaddr_in *) address;
+       const struct sockaddr_in *nad = (struct sockaddr_in *) address;
 
        result = scm_c_make_vector (3, SCM_UNSPECIFIED);
        ve = SCM_VELTS (result);
@@ -684,13 +691,44 @@
 #ifdef AF_INET6
     case AF_INET6:
       {
-       struct sockaddr_in6 *nad = (struct sockaddr_in6 *) address;
+       const struct sockaddr_in6 *nad = (struct sockaddr_in6 *) address;
+       int big_digits = 128 / SCM_BITSPERDIG;
+       int bytes_per_dig = SCM_BITSPERDIG / 8;
+       char addr[16];
+       char *ptr = addr;
+       SCM scm_addr;
+
+       memcpy (addr, nad->sin6_addr.s6_addr, 16);
+       /* get rid of leading zeros.  */ 
+       while (big_digits > 0)
+         {
+           long test = 0;
+
+           memcpy (&test, ptr, bytes_per_dig);
+           if (test != 0)
+             break;
+           ptr += bytes_per_dig;
+           big_digits--;
+         }
+       FLIP_NET_HOST_128 (addr);
+       if (big_digits * bytes_per_dig <= sizeof (unsigned long))
+         {
+           /* this is just so that we use INUM where possible.  */
+           unsigned long l_addr;
+
+           memcpy (&l_addr, addr, sizeof (unsigned long));
+           scm_addr = scm_ulong2num (l_addr);
+         }
+       else
+         {
+           scm_addr = scm_mkbig (big_digits, 0);
+           memcpy (SCM_BDIGITS (scm_addr), addr, big_digits * bytes_per_dig);
+         }
 
        result = scm_c_make_vector (5, SCM_UNSPECIFIED);
        ve = SCM_VELTS (result);
        ve[0] = scm_ulong2num ((unsigned long) fam);
-       /* FIXME */
-       ve[1] = SCM_INUM0;
+       ve[1] = scm_addr;
        ve[2] = scm_ulong2num ((unsigned long) ntohs (nad->sin6_port));
        ve[3] = scm_ulong2num ((unsigned long) nad->sin6_flowinfo);
 #ifdef HAVE_SIN6_SCOPE_ID
@@ -704,7 +742,7 @@
 #ifdef HAVE_UNIX_DOMAIN_SOCKETS
     case AF_UNIX:
       {
-       struct sockaddr_un *nad = (struct sockaddr_un *) address;
+       const struct sockaddr_un *nad = (struct sockaddr_un *) address;
 
        result = scm_c_make_vector (2, SCM_UNSPECIFIED);
        ve = SCM_VELTS (result);



reply via email to

[Prev in Thread] Current Thread [Next in Thread]