]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/address_conf.c
kes Add dynamic dll entry point for SHGetFolderPath to Win32 code.
[bacula/bacula] / bacula / src / lib / address_conf.c
index 3b692025d849d534c2dee855ed957245e767b8d4..b79ae3b487d2361daf2d2e913ff68bb8aa14f286 100644 (file)
@@ -1,29 +1,37 @@
 /*
  *   Configuration file parser for IP-Addresse ipv4 and ipv6
  *
- *     Written by Meno Abels, June MMIIII
+ *     Written by Meno Abels, June MMIV
  *
  *     Version $Id$
  */
 /*
-   Copyright (C) 2004 Kern Sibbald and John Walker
+   Bacula® - The Network Backup Solution
 
-   This program is free software; you can redistribute it and/or
-   modify it under the terms of the GNU General Public License as
-   published by the Free Software Foundation; either version 2 of
-   the License, or (at your option) any later version.
+   Copyright (C) 2004-2006 Free Software Foundation Europe e.V.
 
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   The main author of Bacula is Kern Sibbald, with contributions from
+   many others, a complete list can be found in the file AUTHORS.
+   This program is Free Software; you can redistribute it and/or
+   modify it under the terms of version two of the GNU General Public
+   License as published by the Free Software Foundation plus additions
+   that are listed in the file LICENSE.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.
 
-   You should have received a copy of the GNU General Public
-   License along with this program; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
-   MA 02111-1307, USA.
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
 
- */
+   Bacula® is a registered trademark ofJohn Walker.
+   The licensor of Bacula is the Free Software Foundation Europe
+   (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
+   Switzerland, email:ftf@fsfeurope.org.
+*/
 
 
 #include "bacula.h"
@@ -35,7 +43,7 @@
 #endif
 
 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);
+                const char *hostname_str, const char *port_str, char **errstr);
 
 
 IPADDR::IPADDR(const IPADDR &src) : type(src.type)
@@ -59,6 +67,7 @@ IPADDR::IPADDR(int af) : type(R_EMPTY)
      Emsg1(M_ERROR_TERM, 0, _("Only ipv4 is supported (%d)\n"), af);
   }
 #endif
+  memset(&saddrbuf, 0, sizeof(saddrbuf));
   saddr  = &saddrbuf.dontuse;
   saddr4 = &saddrbuf.dontuse4;
 #ifdef HAVE_IPV6
@@ -185,8 +194,8 @@ const char *IPADDR::get_address(char *outputbuf, int outlen)
 #ifdef HAVE_INET_NTOP
 # ifdef HAVE_IPV6
    inet_ntop(saddr->sa_family, saddr->sa_family == AF_INET ?
-             (void*)&(saddr4->sin_addr) : (void*)&(saddr6->sin6_addr),
-             outputbuf, outlen);
+              (void*)&(saddr4->sin_addr) : (void*)&(saddr6->sin6_addr),
+              outputbuf, outlen);
 # else
    inet_ntop(saddr->sa_family, (void*)&(saddr4->sin_addr), outputbuf, outlen);
 # endif
@@ -200,14 +209,14 @@ 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());
+            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() == 0) {
+   if (!addrs || addrs->size() == 0) {
       bstrncpy(buf, "", blen);
       return buf;
    }
@@ -217,7 +226,7 @@ const char *build_addresses_str(dlist *addrs, char *buf, int blen)
       char tmp[1024];
       int len = bsnprintf(work, blen, "%s", p->build_address_str(tmp, sizeof(tmp)));
       if (len < 0)
-        break;
+         break;
       work += len;
       blen -= len;
    }
@@ -231,12 +240,20 @@ const char *get_first_address(dlist * addrs, char *outputbuf, int outlen)
 
 int get_first_port_net_order(dlist * addrs)
 {
-   return ((IPADDR *)(addrs->first()))->get_port_net_order();
+   if (!addrs) {
+      return 0;
+   } else {
+      return ((IPADDR *)(addrs->first()))->get_port_net_order();
+   }
 }
 
 int get_first_port_host_order(dlist * addrs)
 {
-   return ((IPADDR *)(addrs->first()))->get_port_host_order();
+   if (!addrs) {
+      return 0;
+   } else {
+      return ((IPADDR *)(addrs->first()))->get_port_host_order();
+   }
 }
 
 void init_default_addresses(dlist **out, int port)
@@ -250,7 +267,7 @@ void init_default_addresses(dlist **out, int port)
 }
 
 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)
+                const char *hostname_str, const char *port_str, char **errstr)
 {
    IPADDR *iaddr;
    IPADDR *jaddr;
@@ -265,22 +282,22 @@ static int add_address(dlist **out, IPADDR::i_type type, unsigned short defaultp
    }
 
    type = (type == IPADDR::R_SINGLE_PORT
-          || type == IPADDR::R_SINGLE_ADDR) ? IPADDR::R_SINGLE : type;
+           || type == IPADDR::R_SINGLE_ADDR) ? IPADDR::R_SINGLE : type;
    if (type != IPADDR::R_DEFAULT) {
       IPADDR *def = 0;
       foreach_dlist(iaddr, addrs) {
-        if (iaddr->get_type() == IPADDR::R_DEFAULT) {
-           def = iaddr;
-        } else if (iaddr->get_type() != type) {
-           *errstr = (char *)malloc(1024);
-           bsnprintf(*errstr, 1023,
-                     "the old style addresses cannot be mixed with new style");
-           return 0;
-        }
+         if (iaddr->get_type() == IPADDR::R_DEFAULT) {
+            def = iaddr;
+         } else if (iaddr->get_type() != type) {
+            *errstr = (char *)malloc(1024);
+            bsnprintf(*errstr, 1023,
+                      _("the old style addresses cannot be mixed with new style"));
+            return 0;
+         }
       }
       if (def) {
-        addrs->remove(def);
-        delete def;
+         addrs->remove(def);
+         delete def;
       }
    }
 
@@ -290,16 +307,16 @@ static int add_address(dlist **out, IPADDR::i_type type, unsigned short defaultp
    } else {
       int pnum = atol(port_str);
       if (0 < pnum && pnum < 0xffff) {
-        port = htons(pnum);
+         port = htons(pnum);
       } else {
-        struct servent *s = getservbyname(port_str, "tcp");
-        if (s) {
-           port = s->s_port;
-        } else {
-           *errstr = (char *)malloc(1024);
-           bsnprintf(*errstr, 1023, "can't resolve service(%s)", port_str);
-           return 0;
-        }
+         struct servent *s = getservbyname(port_str, "tcp");
+         if (s) {
+            port = s->s_port;
+         } else {
+            *errstr = (char *)malloc(1024);
+            bsnprintf(*errstr, 1023, _("can't resolve service(%s)"), port_str);
+            return 0;
+         }
       }
    }
 
@@ -307,46 +324,46 @@ static int add_address(dlist **out, IPADDR::i_type type, unsigned short defaultp
    hostaddrs = bnet_host2ipaddrs(hostname_str, family, &myerrstr);
    if (!hostaddrs) {
       *errstr = (char *)malloc(1024);
-      bsnprintf(*errstr, 1023, "can't resolve hostname(%s) %s", hostname_str,
-               myerrstr);
+      bsnprintf(*errstr, 1023, _("can't resolve hostname(%s) %s"), hostname_str,
+                myerrstr);
       return 0;
    }
 
    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->set_type(type);
-        addr->set_port_net(defaultport);
-        addr->set_addr_any();
-        addrs->append(addr);
+         addr = New(IPADDR(family));
+         addr->set_type(type);
+         addr->set_port_net(defaultport);
+         addr->set_addr_any();
+         addrs->append(addr);
       }
       if (intype == IPADDR::R_SINGLE_PORT) {
-        addr->set_port_net(port);
+         addr->set_port_net(port);
       }
       if (intype == IPADDR::R_SINGLE_ADDR) {
-        addr->copy_addr((IPADDR *) (hostaddrs->first()));
+         addr->copy_addr((IPADDR *) (hostaddrs->first()));
       }
    } else {
       foreach_dlist(iaddr, hostaddrs) {
-        IPADDR *clone;
-        /* 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()))
-               {
-              goto skip;          /* no price */
-           }
-        }
-        clone = New(IPADDR(*iaddr));
-        clone->set_type(type);
-        clone->set_port_net(port);
-        addrs->append(clone);
+         IPADDR *clone;
+         /* 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()))
+                {
+               goto skip;          /* no price */
+            }
+         }
+         clone = New(IPADDR(*iaddr));
+         clone->set_type(type);
+         clone->set_port_net(port);
+         addrs->append(clone);
        skip:
-        continue;
+         continue;
       }
    }
    free_addresses(hostaddrs);
@@ -358,25 +375,25 @@ static int add_address(dlist **out, IPADDR::i_type type, unsigned short defaultp
  *   positiv
  *   = { ip = { addr = 1.2.3.4; port = 1205; } ipv4 = { addr = 1.2.3.4; port = http; } }
  *   = { ip = {
- *        addr = 1.2.3.4; port = 1205; }
+ *         addr = 1.2.3.4; port = 1205; }
  *     ipv4 = {
- *        addr = 1.2.3.4; port = http; }
+ *         addr = 1.2.3.4; port = http; }
  *     ipv6 = {
- *      addr = 1.2.3.4;
- *      port = 1205;
+ *       addr = 1.2.3.4;
+ *       port = 1205;
  *     }
  *     ip = {
- *      addr = 1.2.3.4
- *      port = 1205
+ *       addr = 1.2.3.4
+ *       port = 1205
  *     }
  *     ip = {
- *      addr = 1.2.3.4
+ *       addr = 1.2.3.4
  *     }
  *     ip = {
- *      addr = 2001:220:222::2
+ *       addr = 2001:220:222::2
  *     }
  *     ip = {
- *      addr = bluedot.thun.net
+ *       addr = bluedot.thun.net
  (     }
  *   }
  *   negativ
@@ -405,90 +422,90 @@ void store_addresses(LEX * lc, RES_ITEM * item, int index, int pass)
    }
    do {
       if (!(token == T_UNQUOTED_STRING || token == T_IDENTIFIER)) {
-        scan_err1(lc, _("Expected a string, got: %s"), lc->str);
+         scan_err1(lc, _("Expected a string, got: %s"), lc->str);
       }
       if (strcasecmp("ip", lc->str) == 0 || strcasecmp("ipv4", lc->str) == 0) {
-        family = AF_INET;
+         family = AF_INET;
       }
 #ifdef HAVE_IPV6
       else if (strcasecmp("ipv6", lc->str) == 0) {
-        family = AF_INET6;
+         family = AF_INET6;
       } else {
-        scan_err1(lc, _("Expected a string [ip|ipv4|ipv6], got: %s"), lc->str);
+         scan_err1(lc, _("Expected a string [ip|ipv4|ipv6], got: %s"), lc->str);
       }
 #else
       else {
-        scan_err1(lc, _("Expected a string [ip|ipv4], got: %s"), lc->str);
+         scan_err1(lc, _("Expected a string [ip|ipv4], got: %s"), lc->str);
       }
 #endif
       token = lex_get_token(lc, T_SKIP_EOL);
       if (token != T_EQUALS) {
-        scan_err1(lc, _("Expected a equal =, got: %s"), lc->str);
+         scan_err1(lc, _("Expected a equal =, got: %s"), lc->str);
       }
       token = lex_get_token(lc, T_SKIP_EOL);
       if (token != T_BOB) {
-        scan_err1(lc, _("Expected a block beginn { , got: %s"), lc->str);
+         scan_err1(lc, _("Expected a block begin { , got: %s"), lc->str);
       }
       token = lex_get_token(lc, T_SKIP_EOL);
       exist = EMPTYLINE;
       port_str[0] = hostname_str[0] = '\0';
       do {
-        if (token != T_IDENTIFIER) {
-           scan_err1(lc, _("Expected a identifier [addr|port], got: %s"), lc->str);
-        }
-        if (strcasecmp("port", lc->str) == 0) {
-           next_line = PORTLINE;
-           if (exist & PORTLINE) {
-              scan_err0(lc, _("Only one port per address block"));
-           }
-           exist |= PORTLINE;
-        } else if (strcasecmp("addr", lc->str) == 0) {
-           next_line = ADDRLINE;
-           if (exist & ADDRLINE) {
-              scan_err0(lc, _("Only one addr per address block"));
-           }
-           exist |= ADDRLINE;
-        } else {
-           scan_err1(lc, _("Expected a identifier [addr|port], got: %s"), lc->str);
-        }
-        token = lex_get_token(lc, T_SKIP_EOL);
-        if (token != T_EQUALS) {
-           scan_err1(lc, _("Expected a equal =, got: %s"), lc->str);
-        }
-        token = lex_get_token(lc, T_SKIP_EOL);
-        switch (next_line) {
-        case PORTLINE:
-           if (!
-               (token == T_UNQUOTED_STRING || token == T_NUMBER
-                || token == T_IDENTIFIER)) {
-              scan_err1(lc, _("Expected a number or a string, got: %s"), lc->str);
-           }
-           bstrncpy(port_str, lc->str, sizeof(port_str));
-           break;
-        case ADDRLINE:
-           if (!(token == T_UNQUOTED_STRING || token == T_IDENTIFIER)) {
-              scan_err1(lc, _("Expected an IP number or a hostname, got: %s"),
-                        lc->str);
-           }
-           bstrncpy(hostname_str, lc->str, sizeof(hostname_str));
-           break;
-        case EMPTYLINE:
-           scan_err0(lc, _("State machine missmatch"));
-           break;
-        }
-        token = lex_get_token(lc, T_SKIP_EOL);
+         if (token != T_IDENTIFIER) {
+            scan_err1(lc, _("Expected a identifier [addr|port], got: %s"), lc->str);
+         }
+         if (strcasecmp("port", lc->str) == 0) {
+            next_line = PORTLINE;
+            if (exist & PORTLINE) {
+               scan_err0(lc, _("Only one port per address block"));
+            }
+            exist |= PORTLINE;
+         } else if (strcasecmp("addr", lc->str) == 0) {
+            next_line = ADDRLINE;
+            if (exist & ADDRLINE) {
+               scan_err0(lc, _("Only one addr per address block"));
+            }
+            exist |= ADDRLINE;
+         } else {
+            scan_err1(lc, _("Expected a identifier [addr|port], got: %s"), lc->str);
+         }
+         token = lex_get_token(lc, T_SKIP_EOL);
+         if (token != T_EQUALS) {
+            scan_err1(lc, _("Expected a equal =, got: %s"), lc->str);
+         }
+         token = lex_get_token(lc, T_SKIP_EOL);
+         switch (next_line) {
+         case PORTLINE:
+            if (!
+                (token == T_UNQUOTED_STRING || token == T_NUMBER
+                 || token == T_IDENTIFIER)) {
+               scan_err1(lc, _("Expected a number or a string, got: %s"), lc->str);
+            }
+            bstrncpy(port_str, lc->str, sizeof(port_str));
+            break;
+         case ADDRLINE:
+            if (!(token == T_UNQUOTED_STRING || token == T_IDENTIFIER)) {
+               scan_err1(lc, _("Expected an IP number or a hostname, got: %s"),
+                         lc->str);
+            }
+            bstrncpy(hostname_str, lc->str, sizeof(hostname_str));
+            break;
+         case EMPTYLINE:
+            scan_err0(lc, _("State machine missmatch"));
+            break;
+         }
+         token = lex_get_token(lc, T_SKIP_EOL);
       } while (token == T_IDENTIFIER);
       if (token != T_EOB) {
-        scan_err1(lc, _("Expected a end of block }, got: %s"), lc->str);
+         scan_err1(lc, _("Expected a end of block }, got: %s"), lc->str);
       }
 
       char *errstr;
       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);
-       }
+               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);
+        }
       token = scan_to_next_not_eol(lc);
    } while ((token == T_IDENTIFIER || token == T_UNQUOTED_STRING));
    if (token != T_EOB) {
@@ -501,11 +518,11 @@ void store_addresses_address(LEX * lc, RES_ITEM * item, int index, int pass)
 
    int token = lex_get_token(lc, T_SKIP_EOL);
    if (!(token == T_UNQUOTED_STRING || token == T_NUMBER || token == T_IDENTIFIER)) {
-      scan_err1(lc, _("Expected a hostname or IP nummer, got: %s"), lc->str);
+      scan_err1(lc, _("Expected an IP number or a hostname, got: %s"), lc->str);
    }
    char *errstr;
    if (pass == 1 && !add_address((dlist **) (item->value), IPADDR::R_SINGLE_ADDR,
-                   htons(item->default_value), AF_INET, lc->str, 0, &errstr)) {
+                    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);
    }
@@ -519,7 +536,7 @@ void store_addresses_port(LEX * lc, RES_ITEM * item, int index, int pass)
    }
    char *errstr;
    if (pass == 1 && !add_address((dlist **)(item->value), IPADDR::R_SINGLE_PORT,
-                   htons(item->default_value), AF_INET, 0, lc->str, &errstr)) {
+                    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);
    }
@@ -568,13 +585,13 @@ char *sockaddr_to_ascii(const struct sockaddr *sa, char *buf, int len)
    /* MA Bug 5 the problem was that i mixed up sockaddr and in_addr */
    inet_ntop(sa->sa_family,
 # ifdef HAVE_IPV6
-            sa->sa_family == AF_INET ? 
-                (void*)&(((struct sockaddr_in*)sa)->sin_addr) :
-                (void*)&(((struct sockaddr_in6*)sa)->sin6_addr),
+             sa->sa_family == AF_INET ? 
+                 (void*)&(((struct sockaddr_in*)sa)->sin_addr) :
+                 (void*)&(((struct sockaddr_in6*)sa)->sin6_addr),
 # else
-                (void*)&(((struct sockaddr_in*)sa)->sin_addr) :
+                 (void*)&(((struct sockaddr_in*)sa)->sin_addr),
 # endif /* HAVE_IPV6 */
-            buf, len);
+             buf, len);
 #else
    bstrncpy(buf, inet_ntoa(((struct sockaddr_in *)sa)->sin_addr), len);
 #endif