From: <ri...@us...> - 2009-05-26 14:14:37
|
Revision: 8863 http://bacula.svn.sourceforge.net/bacula/?rev=8863&view=rev Author: ricozz Date: 2009-05-26 13:44:08 +0000 (Tue, 26 May 2009) Log Message: ----------- ebl Apply Steve Polyack patch to add DirSourceAddress and FDSourceAddress directives. That permits to choose the outgoing interface. Modified Paths: -------------- trunk/bacula/src/dird/dird_conf.c trunk/bacula/src/dird/dird_conf.h trunk/bacula/src/dird/fd_cmds.c trunk/bacula/src/dird/msgchan.c trunk/bacula/src/filed/filed_conf.c trunk/bacula/src/filed/filed_conf.h trunk/bacula/src/filed/job.c trunk/bacula/src/lib/bnet.c trunk/bacula/src/lib/bsock.c trunk/bacula/src/lib/bsock.h trunk/bacula/src/lib/lib.h trunk/bacula/technotes Modified: trunk/bacula/src/dird/dird_conf.c =================================================================== --- trunk/bacula/src/dird/dird_conf.c 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/src/dird/dird_conf.c 2009-05-26 13:44:08 UTC (rev 8863) @@ -112,6 +112,7 @@ {"dirport", store_addresses_port, ITEM(res_dir.DIRaddrs), 0, ITEM_DEFAULT, 9101}, {"diraddress", store_addresses_address, ITEM(res_dir.DIRaddrs), 0, ITEM_DEFAULT, 9101}, {"diraddresses",store_addresses, ITEM(res_dir.DIRaddrs), 0, ITEM_DEFAULT, 9101}, + {"dirsourceaddress",store_addresses_address, ITEM(res_dir.DIRsrc_addr), 0, ITEM_DEFAULT, 0}, {"queryfile", store_dir, ITEM(res_dir.query_file), 0, ITEM_REQUIRED, 0}, {"workingdirectory", store_dir, ITEM(res_dir.working_directory), 0, ITEM_REQUIRED, 0}, {"plugindirectory", store_dir, ITEM(res_dir.plugin_directory), 0, 0, 0}, @@ -1079,6 +1080,9 @@ if (res->res_dir.DIRaddrs) { free_addresses(res->res_dir.DIRaddrs); } + if (res->res_dir.DIRsrc_addr) { + free_addresses(res->res_dir.DIRsrc_addr); + } if (res->res_dir.tls_ctx) { free_tls_context(res->res_dir.tls_ctx); } Modified: trunk/bacula/src/dird/dird_conf.h =================================================================== --- trunk/bacula/src/dird/dird_conf.h 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/src/dird/dird_conf.h 2009-05-26 13:44:08 UTC (rev 8863) @@ -106,6 +106,7 @@ public: RES hdr; dlist *DIRaddrs; + dlist *DIRsrc_addr; /* address to source connections from */ char *password; /* Password for UA access */ char *query_file; /* SQL query file */ char *working_directory; /* WorkingDirectory */ Modified: trunk/bacula/src/dird/fd_cmds.c =================================================================== --- trunk/bacula/src/dird/fd_cmds.c 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/src/dird/fd_cmds.c 2009-05-26 13:44:08 UTC (rev 8863) @@ -80,7 +80,7 @@ int connect_to_file_daemon(JCR *jcr, int retry_interval, int max_retry_time, int verbose) { - BSOCK *fd; + BSOCK *fd = new_bsock(); char ed1[30]; utime_t heart_beat; @@ -94,8 +94,14 @@ char name[MAX_NAME_LENGTH + 100]; bstrncpy(name, _("Client: "), sizeof(name)); bstrncat(name, jcr->client->name(), sizeof(name)); - fd = bnet_connect(jcr, retry_interval, max_retry_time, heart_beat, - name, jcr->client->address, NULL, jcr->client->FDport, verbose); + + fd->set_source_address(director->DIRsrc_addr); + if (!fd->connect(jcr,retry_interval,max_retry_time, heart_beat, name, jcr->client->address, + NULL, jcr->client->FDport, verbose)) { + fd->destroy(); + fd = NULL; + } + if (fd == NULL) { set_jcr_job_status(jcr, JS_ErrorTerminated); return 0; Modified: trunk/bacula/src/dird/msgchan.c =================================================================== --- trunk/bacula/src/dird/msgchan.c 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/src/dird/msgchan.c 2009-05-26 13:44:08 UTC (rev 8863) @@ -76,7 +76,7 @@ bool connect_to_storage_daemon(JCR *jcr, int retry_interval, int max_retry_time, int verbose) { - BSOCK *sd; + BSOCK *sd = new_bsock(); STORE *store; utime_t heart_beat; @@ -102,9 +102,13 @@ */ Dmsg2(100, "bnet_connect to Storage daemon %s:%d\n", store->address, store->SDport); - sd = bnet_connect(jcr, retry_interval, max_retry_time, heart_beat, - _("Storage daemon"), store->address, - NULL, store->SDport, verbose); + sd->set_source_address(director->DIRsrc_addr); + if (!sd->connect(jcr, retry_interval, max_retry_time, heart_beat, _("Storage daemon"), + store->address, NULL, store->SDport, verbose)) { + sd->destroy(); + sd = NULL; + } + if (sd == NULL) { return false; } Modified: trunk/bacula/src/filed/filed_conf.c =================================================================== --- trunk/bacula/src/filed/filed_conf.c 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/src/filed/filed_conf.c 2009-05-26 13:44:08 UTC (rev 8863) @@ -91,6 +91,7 @@ {"fdport", store_addresses_port, ITEM(res_client.FDaddrs), 0, ITEM_DEFAULT, 9102}, {"fdaddress", store_addresses_address, ITEM(res_client.FDaddrs), 0, ITEM_DEFAULT, 9102}, {"fdaddresses", store_addresses, ITEM(res_client.FDaddrs), 0, ITEM_DEFAULT, 9102}, + {"fdsourceaddress", store_addresses_address, ITEM(res_client.FDsrc_addr), 0, ITEM_DEFAULT, 0}, {"workingdirectory", store_dir, ITEM(res_client.working_directory), 0, ITEM_REQUIRED, 0}, {"piddirectory", store_dir, ITEM(res_client.pid_directory), 0, ITEM_REQUIRED, 0}, @@ -267,6 +268,9 @@ if (res->res_client.FDaddrs) { free_addresses(res->res_client.FDaddrs); } + if (res->res_client.FDsrc_addr) { + free_addresses(res->res_client.FDsrc_addr); + } if (res->res_client.pki_keypair_file) { free(res->res_client.pki_keypair_file); Modified: trunk/bacula/src/filed/filed_conf.h =================================================================== --- trunk/bacula/src/filed/filed_conf.h 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/src/filed/filed_conf.h 2009-05-26 13:44:08 UTC (rev 8863) @@ -76,6 +76,7 @@ struct CLIENT { RES hdr; dlist *FDaddrs; + dlist *FDsrc_addr; /* address to source connections from */ char *working_directory; char *pid_directory; char *subsys_directory; Modified: trunk/bacula/src/filed/job.c =================================================================== --- trunk/bacula/src/filed/job.c 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/src/filed/job.c 2009-05-26 13:44:08 UTC (rev 8863) @@ -1371,7 +1371,7 @@ int stored_port; /* storage daemon port */ int enable_ssl; /* enable ssl to sd */ BSOCK *dir = jcr->dir_bsock; - BSOCK *sd; /* storage daemon bsock */ + BSOCK *sd = new_bsock(); /* storage daemon bsock */ Dmsg1(100, "StorageCmd: %s", dir->msg); if (sscanf(dir->msg, storaddr, &jcr->stored_addr, &stored_port, &enable_ssl) != 3) { @@ -1382,8 +1382,14 @@ Dmsg3(110, "Open storage: %s:%d ssl=%d\n", jcr->stored_addr, stored_port, enable_ssl); /* Open command communications with Storage daemon */ /* Try to connect for 1 hour at 10 second intervals */ - sd = bnet_connect(jcr, 10, (int)me->SDConnectTimeout, me->heartbeat_interval, - _("Storage daemon"), jcr->stored_addr, NULL, stored_port, 1); + + sd->set_source_address(me->FDsrc_addr); + if (!sd->connect(jcr, 10, (int)me->SDConnectTimeout, me->heartbeat_interval, + _("Storage daemon"), jcr->stored_addr, NULL, stored_port, 1)) { + sd->destroy(); + sd = NULL; + } + if (sd == NULL) { Jmsg(jcr, M_FATAL, 0, _("Failed to connect to Storage daemon: %s:%d\n"), jcr->stored_addr, stored_port); Modified: trunk/bacula/src/lib/bnet.c =================================================================== --- trunk/bacula/src/lib/bnet.c 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/src/lib/bnet.c 2009-05-26 13:44:08 UTC (rev 8863) @@ -702,6 +702,9 @@ if (osock->host()) { bsock->set_host(bstrdup(osock->host())); } + if (osock->src_addr) { + bsock->src_addr = New( IPADDR( *(osock->src_addr)) ); + } bsock->set_duped(); return bsock; } Modified: trunk/bacula/src/lib/bsock.c =================================================================== --- trunk/bacula/src/lib/bsock.c 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/src/lib/bsock.c 2009-05-26 13:44:08 UTC (rev 8863) @@ -162,6 +162,26 @@ } /* + * Copy the address from the configuration dlist that gets passed in + */ +void BSOCK::set_source_address(dlist *src_addr_list) +{ + IPADDR *addr = NULL; + + // delete the object we already have, if it's allocated + if (src_addr) { + free( src_addr); + src_addr = NULL; + } + + if (src_addr_list) { + addr = (IPADDR*) src_addr_list->first(); + src_addr = New( IPADDR(*addr)); + } +} + + +/* * Open a TCP connection to the server * Returns NULL * Returns BSOCK * pointer on success @@ -208,6 +228,19 @@ ipaddr->get_family(), ipaddr->get_port_host_order(), be.bstrerror()); continue; } + + /* Bind to the source address if it is set */ + if (src_addr) { + if (bind(sockfd, src_addr->get_sockaddr(), src_addr->get_sockaddr_len()) < 0) { + berrno be; + save_errno = errno; + *fatal = 1; + Pmsg2(000, _("Source address bind error. proto=%d. ERR=%s\n"), + src_addr->get_family(), be.bstrerror() ); + continue; + } + } + /* * Keep socket from timing out from inactivity */ @@ -885,6 +918,10 @@ free(m_host); m_host = NULL; } + if (src_addr) { + free(src_addr); + src_addr = NULL; + } free(this); } Modified: trunk/bacula/src/lib/bsock.h =================================================================== --- trunk/bacula/src/lib/bsock.h 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/src/lib/bsock.h 2009-05-26 13:44:08 UTC (rev 8863) @@ -89,6 +89,7 @@ FILE *m_spool_fd; /* spooling file */ struct sockaddr client_addr; /* client's IP address */ struct sockaddr_in peer_addr; /* peer's IP address */ + IPADDR *src_addr; /* IP address to source connections from */ /* methods -- in bsock.c */ void init(); @@ -116,6 +117,7 @@ TLS_CONTEXT *tls_ctx, char *msg, int msglen); bool set_locking(); /* in bsock.c */ void clear_locking(); /* in bsock.c */ + void set_source_address(dlist *src_addr_list); /* Inline functions */ void set_jcr(JCR *jcr) { m_jcr = jcr; }; Modified: trunk/bacula/src/lib/lib.h =================================================================== --- trunk/bacula/src/lib/lib.h 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/src/lib/lib.h 2009-05-26 13:44:08 UTC (rev 8863) @@ -53,6 +53,7 @@ #include "lex.h" #include "parse_conf.h" #include "tls.h" +#include "address_conf.h" #include "bsock.h" #include "workq.h" #ifndef HAVE_FNMATCH @@ -67,7 +68,6 @@ #include "bpipe.h" #include "attr.h" #include "var.h" -#include "address_conf.h" #include "guid_to_name.h" #include "protos.h" Modified: trunk/bacula/technotes =================================================================== --- trunk/bacula/technotes 2009-05-26 13:19:14 UTC (rev 8862) +++ trunk/bacula/technotes 2009-05-26 13:44:08 UTC (rev 8863) @@ -2,6 +2,9 @@ General: +26May09 +ebl Apply Steve Polyack patch to add DirSourceAddress and FDSourceAddress + directives. That permits to choose the outgoing interface. 25May09 mvw Allow acl and xattr to be explicitly enabled and fail the configure if we are asked to enable acl or xattr support and the OS doesn't support This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |