]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/address_conf.c
!!! I didn't run the regression tests.!!!
[bacula/bacula] / bacula / src / lib / address_conf.c
index d978b18fc2fdc14fde9c4b6c81c4d155099d6be4..884c8d3e74d2c2e0ff35b1b3964dc558d175aa9b 100644 (file)
 
 #include "bacula.h"
 
+static int add_address(dlist **out, IPADDR::i_type type, unsigned short defaultport, int family,
+               const char *hostname_str, const char *port_str, char **errstr);
+
+
 IPADDR::IPADDR(const IPADDR &src) : type(src.type)
 {
   memcpy(&buf, &src.buf, sizeof(buf));
@@ -41,7 +45,7 @@ IPADDR::IPADDR(const IPADDR &src) : type(src.type)
 IPADDR::IPADDR(int af) : type(R_EMPTY)
 {
   if (!(af  == AF_INET6 || af  == AF_INET)) {
-       Emsg1(M_ERROR_TERM, 0, _("Only ipv4 and ipv6 are supported(%d)\n"), af);
+     Emsg1(M_ERROR_TERM, 0, _("Only ipv4 and ipv6 are supported(%d)\n"), af);
   }
   saddr  = &buf.dontuse;
   saddr4 = &buf.dontuse4; 
@@ -50,11 +54,11 @@ IPADDR::IPADDR(int af) : type(R_EMPTY)
 #endif
   saddr->sa_family = af;
   if (af  == AF_INET) {
-       saddr4->sin_port = 0xffff;
+     saddr4->sin_port = 0xffff;
   }
 #ifdef HAVE_IPV6
   else {
-       saddr6->sin6_port = 0xffff;
+     saddr6->sin6_port = 0xffff;
   }
 #endif
 #ifdef HAVE_SA_LEN
@@ -64,98 +68,102 @@ IPADDR::IPADDR(int af) : type(R_EMPTY)
   saddr->sa_len = sizeof(sockaddr_in);
 #endif
 #endif
-  set_addr_any(); 
+   set_addr_any(); 
 } 
 
 void IPADDR::set_type(i_type o)
 {
-  type = o;
+   type = o;
 }
 
 IPADDR::i_type IPADDR::get_type() const
 {
-  return type;
+   return type;
 }
 
-unsigned short IPADDR::get_port() const
+unsigned short IPADDR::get_port_net_order() const
 {
- unsigned short port = 0;
- if (saddr->sa_family == AF_INET) {
-   port = saddr4->sin_port;
- }
  unsigned short port = 0;
  if (saddr->sa_family == AF_INET) {
+      port = saddr4->sin_port;
  }
 #ifdef HAVE_IPV6
- else {
-   port = saddr6->sin6_port;
- }
  else {
+      port = saddr6->sin6_port;
  }
 #endif
-  return port;
+    return port;
 }
 
-void IPADDR::set_port(unsigned short port)
+void IPADDR::set_port_net(unsigned short port)
 {
- if (saddr->sa_family == AF_INET) {
-   saddr4->sin_port = port;
- }
  if (saddr->sa_family == AF_INET) {
+      saddr4->sin_port = port;
  }
 #ifdef HAVE_IPV6
- else {
-   saddr6->sin6_port = port;
- }
  else {
+      saddr6->sin6_port = port;
  }
 #endif
 }
 
 int IPADDR::get_family() const
 {
-  return saddr->sa_family;
+    return saddr->sa_family;
 }      
 
 struct sockaddr *IPADDR::get_sockaddr()
 {
-  return saddr;
+   return saddr;
 }
 
 int IPADDR::get_sockaddr_len()
 {
-  return saddr->sa_family == AF_INET ? sizeof(*saddr4) : sizeof(*saddr6);
+#ifdef HAVE_IPV6
+   return saddr->sa_family == AF_INET ? sizeof(*saddr4) : sizeof(*saddr6);
+#else
+   return sizeof(*saddr4);
+#endif
 }
 void IPADDR::copy_addr(IPADDR *src)
 {
-  if (saddr->sa_family == AF_INET) {
-    saddr4->sin_addr.s_addr = src->saddr4->sin_addr.s_addr;
-  }
+   if (saddr->sa_family == AF_INET) {
+      saddr4->sin_addr.s_addr = src->saddr4->sin_addr.s_addr;
+   }
 #ifdef HAVE_IPV6
-  else {
-    saddr6->sin6_addr = src->saddr6->sin6_addr;
-  }
+   else {
+      saddr6->sin6_addr = src->saddr6->sin6_addr;
+   }
 #endif
 } 
 
 void IPADDR::set_addr_any()
 {
-  if (saddr->sa_family == AF_INET) {
-    saddr4->sin_addr.s_addr = INADDR_ANY;
-  }
+   if (saddr->sa_family == AF_INET) {
+      saddr4->sin_addr.s_addr = INADDR_ANY;
+   }
 #ifdef HAVE_IPV6
-  else {
-    saddr6->sin6_addr= in6addr_any;
-  }
+   else {
+     saddr6->sin6_addr= in6addr_any;
+   }
 #endif
 }
 
 void IPADDR::set_addr4(struct in_addr *ip4)
 { 
-  if (saddr->sa_family != AF_INET) {
-     Emsg1(M_ERROR_TERM, 0, _("It was tried to assign a ipv6 address to a ipv4(%d)\n"), saddr->sa_family);
-  }
-  saddr4->sin_addr = *ip4;
+   if (saddr->sa_family != AF_INET) {
+      Emsg1(M_ERROR_TERM, 0, _("It was tried to assign a ipv6 address to a ipv4(%d)\n"), saddr->sa_family);
+   }
+   saddr4->sin_addr = *ip4;
 }
 
 #ifdef HAVE_IPV6
 void IPADDR::set_addr6(struct in6_addr *ip6)
 { 
-  if (saddr->sa_family != AF_INET6) {
-     Emsg1(M_ERROR_TERM, 0, _("It was tried to assign a ipv4 address to a ipv6(%d)\n"), saddr->sa_family);
-  }
-  saddr6->sin6_addr = *ip6;
+   if (saddr->sa_family != AF_INET6) {
+      Emsg1(M_ERROR_TERM, 0, _("It was tried to assign a ipv4 address to a ipv6(%d)\n"), saddr->sa_family);
+   }
+   saddr6->sin6_addr = *ip6;
 }
 #endif
 
@@ -163,35 +171,41 @@ const char *IPADDR::get_address(char *outputbuf, int outlen)
 {
    outputbuf[0] = '\0';
 #if defined(HAVE_INET_NTOP) && defined(HAVE_IPV6)
-   inet_ntop(saddr->sa_family, 
-                        saddr->sa_family == AF_INET ?
-                                (void*)&(saddr4->sin_addr) : (void*)&(saddr6->sin6_addr),
-                        outputbuf,
-                        outlen);
+   inet_ntop(saddr->sa_family, saddr->sa_family == AF_INET ?
+             (void*)&(saddr4->sin_addr) : (void*)&(saddr6->sin6_addr),
+             outputbuf, outlen);
 #else
-   strcpy(outputbuf, inet_ntoa(saddr4->sin_addr));
+   bstrncpy(outputbuf, inet_ntoa(saddr4->sin_addr), outlen);
 #endif
    return outputbuf;
 }
 
+const char *IPADDR::build_address_str(char *buf, int blen) 
+{
+   char tmp[1024];
+   bsnprintf(buf, blen, "host[%s:%s:%hu] ",
+            get_family() == AF_INET ? "ipv4" : "ipv6",
+           get_address(tmp, sizeof(tmp) - 1), get_port_host_order());
+   return buf;
+}
 
 const char *build_addresses_str(dlist *addrs, char *buf, int blen) 
 {
-      if (!addrs->size()) {
-         bstrncpy(buf, "", blen);
-         return buf;
-      }
-      char *work = buf;
-      IPADDR *p;
-      foreach_dlist(p, addrs) {
-         char tmp[1024];
-         int len = snprintf(work, blen, "%s", p->build_address_str(tmp, sizeof(tmp)));
-         if (len < 0)
-            break;
-         work += len;
-         blen -= len;
-      }
+   if (!addrs->size()) {
+      bstrncpy(buf, "", blen);
       return buf;
+   }
+   char *work = buf;
+   IPADDR *p;
+   foreach_dlist(p, addrs) {
+      char tmp[1024];
+      int len = bsnprintf(work, blen, "%s", p->build_address_str(tmp, sizeof(tmp)));
+      if (len < 0)
+        break;
+      work += len;
+      blen -= len;
+   }
+   return buf;
 }
 
 const char *get_first_address(dlist * addrs, char *outputbuf, int outlen)
@@ -199,9 +213,14 @@ const char *get_first_address(dlist * addrs, char *outputbuf, int outlen)
    return ((IPADDR *)(addrs->first()))->get_address(outputbuf, outlen);
 }
 
-int get_first_port(dlist * addrs)
+int get_first_port_net_order(dlist * addrs)
 {
-   return ((IPADDR *)(addrs->first()))->get_port();
+   return ((IPADDR *)(addrs->first()))->get_port_net_order();                            
+}
+
+int get_first_port_host_order(dlist * addrs)
+{
+   return ((IPADDR *)(addrs->first()))->get_port_host_order();                           
 }
 
 static int skip_to_next_not_eol(LEX * lc)
@@ -215,7 +234,7 @@ static int skip_to_next_not_eol(LEX * lc)
 }
 
 
-void init_default_addresses(dlist ** out, int port)
+void init_default_addresses(dlist **out, int port)
 {
    char *errstr;
    unsigned short sport = port;
@@ -225,7 +244,7 @@ void init_default_addresses(dlist ** out, int port)
    }
 }
 
-int add_address(dlist ** out, IPADDR::i_type type, unsigned short defaultport, int family,
+static int add_address(dlist **out, IPADDR::i_type type, unsigned short defaultport, int family,
                const char *hostname_str, const char *port_str, char **errstr)
 {
    IPADDR *iaddr;
@@ -234,10 +253,10 @@ int add_address(dlist ** out, IPADDR::i_type type, unsigned short defaultport, i
    unsigned short port;
    IPADDR::i_type intype = type;
 
-   dlist *addrs = (dlist *) (*(out));
+   dlist *addrs = (dlist *)(*(out));
    if (!addrs) {
       IPADDR *tmp = 0;
-      addrs = *out = new dlist(tmp, &tmp->link);
+      addrs = *out = New(dlist(tmp, &tmp->link));
    }
 
    type = (type == IPADDR::R_SINGLE_PORT
@@ -291,16 +310,16 @@ int add_address(dlist ** out, IPADDR::i_type type, unsigned short defaultport, i
    if (intype == IPADDR::R_SINGLE_PORT || intype == IPADDR::R_SINGLE_ADDR) {
       IPADDR *addr;
       if (addrs->size()) {
-        addr = (IPADDR *) addrs->first();
+        addr = (IPADDR *)addrs->first();
       } else {
-        addr = new IPADDR(family);
+        addr = New(IPADDR(family)); 
         addr->set_type(type);
-        addr->set_port(defaultport);
+        addr->set_port_net(defaultport);
         addr->set_addr_any();
         addrs->append(addr);
       }
       if (intype == IPADDR::R_SINGLE_PORT) {
-        addr->set_port(port);
+        addr->set_port_net(port);
       }
       if (intype == IPADDR::R_SINGLE_ADDR) {
         addr->copy_addr((IPADDR *) (hostaddrs->first()));
@@ -311,15 +330,15 @@ int add_address(dlist ** out, IPADDR::i_type type, unsigned short defaultport, i
         /* for duplicates */
         foreach_dlist(jaddr, addrs) {
            if (iaddr->get_sockaddr_len() == jaddr->get_sockaddr_len() &&
-            !memcmp(iaddr->get_sockaddr(), jaddr->get_sockaddr(), 
-                    iaddr->get_sockaddr_len()))
+           !memcmp(iaddr->get_sockaddr(), jaddr->get_sockaddr(), 
+                   iaddr->get_sockaddr_len()))
                {
               goto skip;          /* no price */
            }
         }
-        clone = new IPADDR(*iaddr);
+        clone = New(IPADDR(*iaddr)); 
         clone->set_type(type);
-        clone->set_port(port);
+        clone->set_port_net(port);
         addrs->append(clone);
        skip:
         continue;
@@ -338,6 +357,8 @@ void store_addresses(LEX * lc, RES_ITEM * item, int index, int pass)
    char port_str[128];
    int family = 0;
 
+    
+
    /*
     *   =  { [[ip|ipv4|ipv6] = { [[addr|port] = [^ ]+[\n;]+] }]+ }
     *  or my tests
@@ -457,13 +478,12 @@ void store_addresses(LEX * lc, RES_ITEM * item, int index, int pass)
       }
 
       char *errstr;
-      if (!add_address
-         ((dlist **) (item->value), IPADDR::R_MULTIPLE, htons(item->default_value),
-          family, hostname_str, port_str, &errstr)) {
-         scan_err3(lc, _("Can't add hostname(%s) and port(%s) to addrlist (%s)"),
+      if (pass == 1 && !add_address((dlist **)(item->value), IPADDR::R_MULTIPLE, 
+              htons(item->default_value), family, hostname_str, port_str, &errstr)) {
+           scan_err3(lc, _("Can't add hostname(%s) and port(%s) to addrlist (%s)"),
                   hostname_str, port_str, errstr);
-        free(errstr);
-      }
+          free(errstr);
+        }
       token = skip_to_next_not_eol(lc);
    } while ((token == T_IDENTIFIER || token == T_UNQUOTED_STRING));
    if (token != T_EOB) {
@@ -473,12 +493,13 @@ void store_addresses(LEX * lc, RES_ITEM * item, int index, int pass)
 
 void store_addresses_address(LEX * lc, RES_ITEM * item, int index, int pass)
 {
+
    int token = lex_get_token(lc, T_ALL);
    if (!(token == T_UNQUOTED_STRING || token == T_NUMBER || token == T_IDENTIFIER)) {
       scan_err1(lc, _("Expected a hostname or ipnummer, got: %s"), lc->str);
    }
    char *errstr;
-   if (!add_address((dlist **) (item->value), IPADDR::R_SINGLE_ADDR,
+   if (pass == 1 && !add_address((dlist **) (item->value), IPADDR::R_SINGLE_ADDR,
                    htons(item->default_value), AF_INET, lc->str, 0, &errstr)) {
       scan_err2(lc, _("can't add port (%s) to (%s)"), lc->str, errstr);
       free(errstr);
@@ -492,7 +513,7 @@ void store_addresses_port(LEX * lc, RES_ITEM * item, int index, int pass)
       scan_err1(lc, _("Expected a port nummer or string, got: %s"), lc->str);
    }
    char *errstr;
-   if (!add_address((dlist **) (item->value), IPADDR::R_SINGLE_PORT,
+   if (pass == 1 && !add_address((dlist **)(item->value), IPADDR::R_SINGLE_PORT,
                    htons(item->default_value), AF_INET, 0, lc->str, &errstr)) {
       scan_err2(lc, _("can't add port (%s) to (%s)"), lc->str, errstr);
       free(errstr);
@@ -509,6 +530,31 @@ void free_addresses(dlist * addrs)
    delete addrs;
 }
 
+int sockaddr_get_port_net_order(const struct sockaddr *client_addr)
+{
+       /* MA BUG 6 remove ifdefs */
+       if (client_addr->sa_family == AF_INET) {
+               return ((struct sockaddr_in *)client_addr)->sin_port;
+       }
+       else {
+               return ((struct sockaddr_in6 *)client_addr)->sin6_port;
+       }
+       return -1;
+}
 
-
+int  sockaddr_to_ascii(const struct sockaddr *sa, char *buf, int len)
+{
+#ifdef HAVE_INET_NTOP
+   /* MA Bug 5 the problem was that i mixed up sockaddr and in_addr */
+   inet_ntop(sa->sa_family,
+                        sa->sa_family == AF_INET ? 
+                               (void*)&(((struct sockaddr_in*)sa)->sin_addr) :
+                               (void*)&(((struct sockaddr_in6*)sa)->sin6_addr),
+                        buf,
+                        sa->sa_family == AF_INET ?  sizeof(in_addr) : sizeof(in6_addr));
+#else
+   bstrncpy(buf, inet_ntoa(((struct sockaddr_in *)sa)->sin_addr), len);
+#endif
+   return 1;
+}