#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));
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;
#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
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
{
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)
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)
}
-void init_default_addresses(dlist ** out, int port)
+void init_default_addresses(dlist **out, int port)
{
char *errstr;
unsigned short sport = 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;
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
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()));
/* 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;
char port_str[128];
int family = 0;
+
+
/*
* = { [[ip|ipv4|ipv6] = { [[addr|port] = [^ ]+[\n;]+] }]+ }
* or my tests
}
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) {
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);
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);
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;
+}