set_jcr(jcr);
}
+/*
+ * 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
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
*/
}
if ((stat = pthread_mutex_init(&m_mutex, NULL)) != 0) {
berrno be;
- Jmsg(m_jcr, M_FATAL, 0, _("Could not init bsock mutex. ERR=%s\n"),
+ Qmsg(m_jcr, M_FATAL, 0, _("Could not init bsock mutex. ERR=%s\n"),
be.bstrerror(stat));
return false;
}
size_t nbytes;
ssize_t last = 0, size = 0;
int count = 0;
+ JCR *jcr = get_jcr();
rewind(m_spool_fd);
size += sizeof(int32_t);
msglen = ntohl(pktsiz);
if (msglen > 0) {
- if (msglen > (int32_t) sizeof_pool_memory(msg)) {
+ if (msglen > (int32_t)sizeof_pool_memory(msg)) {
msg = realloc_pool_memory(msg, msglen + 1);
}
nbytes = fread(msg, 1, msglen, m_spool_fd);
- if (nbytes != (size_t) msglen) {
+ if (nbytes != (size_t)msglen) {
berrno be;
Dmsg2(400, "nbytes=%d msglen=%d\n", nbytes, msglen);
Qmsg1(get_jcr(), M_FATAL, 0, _("fread attr spool error. ERR=%s\n"),
}
}
send();
+ if (jcr && job_canceled(jcr)) {
+ return false;
+ }
}
update_attr_spool_size(tsize - last);
if (ferror(m_spool_fd)) {
- berrno be;
- Qmsg1(get_jcr(), M_FATAL, 0, _("fread attr spool error. ERR=%s\n"),
- be.bstrerror());
+ Qmsg(jcr, M_FATAL, 0, _("fread attr spool I/O error.\n"));
return false;
}
return true;
/* Get current flags */
if ((oflags = fcntl(m_fd, F_GETFL, 0)) < 0) {
berrno be;
- Jmsg1(get_jcr(), M_ABORT, 0, _("fcntl F_GETFL error. ERR=%s\n"), be.bstrerror());
+ Qmsg1(get_jcr(), M_ABORT, 0, _("fcntl F_GETFL error. ERR=%s\n"), be.bstrerror());
}
/* Set O_NONBLOCK flag */
if ((fcntl(m_fd, F_SETFL, oflags|O_NONBLOCK)) < 0) {
berrno be;
- Jmsg1(get_jcr(), M_ABORT, 0, _("fcntl F_SETFL error. ERR=%s\n"), be.bstrerror());
+ Qmsg1(get_jcr(), M_ABORT, 0, _("fcntl F_SETFL error. ERR=%s\n"), be.bstrerror());
}
m_blocking = 0;
/* Get current flags */
if ((oflags = fcntl(m_fd, F_GETFL, 0)) < 0) {
berrno be;
- Jmsg1(get_jcr(), M_ABORT, 0, _("fcntl F_GETFL error. ERR=%s\n"), be.bstrerror());
+ Qmsg1(get_jcr(), M_ABORT, 0, _("fcntl F_GETFL error. ERR=%s\n"), be.bstrerror());
}
/* Set O_NONBLOCK flag */
if ((fcntl(m_fd, F_SETFL, oflags & ~O_NONBLOCK)) < 0) {
berrno be;
- Jmsg1(get_jcr(), M_ABORT, 0, _("fcntl F_SETFL error. ERR=%s\n"), be.bstrerror());
+ Qmsg1(get_jcr(), M_ABORT, 0, _("fcntl F_SETFL error. ERR=%s\n"), be.bstrerror());
}
m_blocking = 1;
#ifndef HAVE_WIN32
if ((fcntl(m_fd, F_SETFL, flags)) < 0) {
berrno be;
- Jmsg1(get_jcr(), M_ABORT, 0, _("fcntl F_SETFL error. ERR=%s\n"), be.bstrerror());
+ Qmsg1(get_jcr(), M_ABORT, 0, _("fcntl F_SETFL error. ERR=%s\n"), be.bstrerror());
}
m_blocking = (flags & O_NONBLOCK) ? true : false;
* 0 if timeout
* -1 if error
*/
-int BSOCK::wait_data(int sec)
+int BSOCK::wait_data(int sec, int usec)
{
fd_set fdset;
struct timeval tv;
FD_SET((unsigned)m_fd, &fdset);
for (;;) {
tv.tv_sec = sec;
- tv.tv_usec = 0;
+ tv.tv_usec = usec;
switch (select(m_fd + 1, &fdset, NULL, NULL, &tv)) {
case 0: /* timeout */
b_errno = 0;
/*
* As above, but returns on interrupt
*/
-int BSOCK::wait_data_intr(int sec)
+int BSOCK::wait_data_intr(int sec, int usec)
{
fd_set fdset;
struct timeval tv;
+ if (this == NULL) {
+ return -1;
+ }
FD_ZERO(&fdset);
FD_SET((unsigned)m_fd, &fdset);
tv.tv_sec = sec;
- tv.tv_usec = 0;
+ tv.tv_usec = usec;
switch (select(m_fd + 1, &fdset, NULL, NULL, &tv)) {
case 0: /* timeout */
b_errno = 0;
free(m_host);
m_host = NULL;
}
+ if (src_addr) {
+ free(src_addr);
+ src_addr = NULL;
+ }
free(this);
}
bsnprintf(msg, msglen, _("Authorization problem with Director at \"%s:%d\"\n"
"Most likely the passwords do not agree.\n"
"If you are using TLS, there may have been a certificate validation error during the TLS handshake.\n"
- "Please see http://www.bacula.org/rel-manual/faq.html#AuthorizationErrors for help.\n"),
+ "Please see http://www.bacula.org/en/rel-manual/Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000 for help.\n"),
dir->host(), dir->port());
return false;
}