This simplifies the addresss reading code a little by scanning
it directly into 4 32bit unsigned integers which are then converted
into network byte order.

The former construction of scaning the address into 8 strings, each
representing 16bits, and then using sfprintf to write these into
a buffer as integers seems a little bit akward to me.

===================================================================
--- heartbeat-ipv6addr.orig/resources/OCF/IPv6addr.c    2007-04-11 
17:30:37.000000000 +0900
+++ heartbeat-ipv6addr/resources/OCF/IPv6addr.c 2007-04-11 17:33:10.000000000 
+0900
@@ -428,12 +428,11 @@
 scan_if(struct in6_addr* addr_target, int* plen_target, int use_mask)
 {
        FILE *f;
-       char addr6[40];
        static char devname[21]="";
        struct in6_addr addr;
        struct in6_addr mask;
        unsigned int plen, scope, dad_status, if_idx;
-       char addr6p[8][5];
+       unsigned int addr6p[4];
 
        /* open /proc/net/if_inet6 file */
        if ((f = fopen(IF_INET6, "r")) == NULL) {
@@ -441,20 +440,19 @@
        }
 
        /* Loop for each entry */
-       while ( fscanf(f,"%4s%4s%4s%4s%4s%4s%4s%4s %02x %02x %02x %02x %20s\n",
-                       addr6p[0], addr6p[1], addr6p[2], addr6p[3],
-                       addr6p[4], addr6p[5], addr6p[6], addr6p[7],
-                       &if_idx, &plen, &scope, &dad_status, devname) == 13){
+       while ( fscanf(f,"%08x%08x%08x%08x %02x %02x %02x %02x %20s\n",
+                       &addr6p[0], &addr6p[1], &addr6p[2], &addr6p[3],
+                       &if_idx, &plen, &scope, &dad_status, devname) == 9){
 
                int             i;
                int             n;
                int             s;
                gboolean        same = TRUE;
 
-               sprintf(addr6, "%s:%s:%s:%s:%s:%s:%s:%s",
-                       addr6p[0], addr6p[1], addr6p[2], addr6p[3],
-                       addr6p[4], addr6p[5], addr6p[6], addr6p[7]);
-       
+               for (i = 0; i < 4; i++) {
+                       addr.s6_addr32[i] = htonl(addr6p[i]);
+               }
+
                /* Only Global address entry would be considered.
                 * maybe change?
                 */
@@ -470,9 +468,6 @@
                }
                *plen_target = plen;
                
-               /* Convert string to sockaddr_in6 */
-               inet_pton(AF_INET6, addr6, &addr);
-
                /* Make the mask based on prefix length */
                memset(mask.s6_addr, 0xff, 16);
                if (use_mask && plen < 128) {

--

-- 
Horms
  H: http://www.vergenet.net/~horms/
  W: http://www.valinux.co.jp/en/

_______________________________________________________
Linux-HA-Dev: [EMAIL PROTECTED]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/

Reply via email to