#define INADDR_NONE -1
#endif
-#ifndef ENODATA /* not defined on BSD systems */
-#define ENODATA EPIPE
-#endif
-
#ifdef HAVE_WIN32
#define socketRead(fd, buf, len) recv(fd, buf, len, 0)
#define socketWrite(fd, buf, len) send(fd, buf, len, 0)
bsock->suppress_error_msgs = flag;
}
-
-/*
- * Transmit spooled data now to a BSOCK
- */
-int bnet_despool_to_bsock(BSOCK * bsock, void update_attr_spool_size(ssize_t size),
- ssize_t tsize)
-{
- int32_t pktsiz;
- size_t nbytes;
- ssize_t last = 0, size = 0;
- int count = 0;
-
- rewind(bsock->spool_fd);
- while (fread((char *)&pktsiz, 1, sizeof(int32_t), bsock->spool_fd) ==
- sizeof(int32_t)) {
- size += sizeof(int32_t);
- bsock->msglen = ntohl(pktsiz);
- if (bsock->msglen > 0) {
- if (bsock->msglen > (int32_t) sizeof_pool_memory(bsock->msg)) {
- bsock->msg = realloc_pool_memory(bsock->msg, bsock->msglen + 1);
- }
- nbytes = fread(bsock->msg, 1, bsock->msglen, bsock->spool_fd);
- if (nbytes != (size_t) bsock->msglen) {
- berrno be;
- Dmsg2(400, "nbytes=%d msglen=%d\n", nbytes, bsock->msglen);
- Qmsg1(bsock->jcr(), M_FATAL, 0, _("fread attr spool error. ERR=%s\n"),
- be.strerror());
- update_attr_spool_size(tsize - last);
- return 0;
- }
- size += nbytes;
- if ((++count & 0x3F) == 0) {
- update_attr_spool_size(size - last);
- last = size;
- }
- }
- bnet_send(bsock);
- }
- update_attr_spool_size(tsize - last);
- if (ferror(bsock->spool_fd)) {
- berrno be;
- Qmsg1(bsock->jcr(), M_FATAL, 0, _("fread attr spool error. ERR=%s\n"),
- be.strerror());
- return 0;
- }
- return 1;
-}
-
-
/*
* Send a message over the network. The send consists of
* two network packets. The first is sends a 32 bit integer containing
return bsock->send();
}
-#ifdef xxx
-bool bnet_send(BSOCK * bsock)
-{
- int32_t rc;
- int32_t pktsiz;
-
- if (bsock->errors || bsock->terminated || bsock->msglen > 1000000) {
- return false;
- }
- pktsiz = htonl((int32_t)bsock->msglen);
- /* send int32_t containing size of data packet */
- bsock->timer_start = watchdog_time; /* start timer */
- bsock->timed_out = 0;
- rc = write_nbytes(bsock, (char *)&pktsiz, sizeof(int32_t));
- bsock->timer_start = 0; /* clear timer */
- if (rc != sizeof(int32_t)) {
- if (bsock->msglen == BNET_TERMINATE) { /* if we were terminating */
- bsock->terminated = 1;
- return false; /* ignore any errors */
- }
- bsock->errors++;
- if (errno == 0) {
- bsock->b_errno = EIO;
- } else {
- bsock->b_errno = errno;
- }
- if (rc < 0) {
- if (!bsock->suppress_error_msgs && !bsock->timed_out) {
- Qmsg4(bsock->jcr(), M_ERROR, 0,
- _("Write error sending len to %s:%s:%d: ERR=%s\n"), bsock->who,
- bsock->host(), bsock->port(), bnet_strerror(bsock));
- }
- } else {
- Qmsg5(bsock->jcr(), M_ERROR, 0,
- _("Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"),
- sizeof(int32_t), bsock->who(),
- bsock->host(), bsock->port(), rc);
- }
- return false;
- }
-
- bsock->out_msg_no++; /* increment message number */
- if (bsock->msglen <= 0) { /* length only? */
- return true; /* yes, no data */
- }
-
- /* send data packet */
- bsock->timer_start = watchdog_time; /* start timer */
- bsock->timed_out = 0;
- rc = write_nbytes(bsock, bsock->msg, bsock->msglen);
- bsock->timer_start = 0; /* clear timer */
- if (rc != bsock->msglen) {
- bsock->errors++;
- if (errno == 0) {
- bsock->b_errno = EIO;
- } else {
- bsock->b_errno = errno;
- }
- if (rc < 0) {
- if (!bsock->suppress_error_msgs) {
- Qmsg5(bsock->jcr(), M_ERROR, 0,
- _("Write error sending %d bytes to %s:%s:%d: ERR=%s\n"),
- bsock->msglen, bsock->who(),
- bsock->host(), bsock->port(), bnet_strerror(bsock));
- }
- } else {
- Qmsg5(bsock->jcr(), M_ERROR, 0,
- _("Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"),
- bsock->msglen, bsock->who(), bsock->host(),
- bsock->port(), rc);
- }
- return false;
- }
- return true;
-}
-#endif
/*
* Establish a TLS connection -- server side
* certificate's CN. Otherwise, we use standard host/CN matching. */
if (verify_list) {
if (!tls_postconnect_verify_cn(tls, verify_list)) {
- Qmsg1(bsock->jcr, M_FATAL, 0, _("TLS certificate verification failed."
+ Qmsg1(bsock->jcr(), M_FATAL, 0, _("TLS certificate verification failed."
" Peer certificate did not match a required commonName\n"),
- bsock->host);
+ bsock->host());
goto err;
}
} else {
return false;
}
#else
+
bool bnet_tls_server(TLS_CONTEXT *ctx, BSOCK * bsock, alist *verify_list)
{
Jmsg(bsock->jcr(), M_ABORT, 0, _("TLS enabled but not configured.\n"));
return false;
}
-bool bnet_tls_client(TLS_CONTEXT *ctx, BSOCK * bsock, alist *verify_list, int verify_hostname)
+
+bool bnet_tls_client(TLS_CONTEXT *ctx, BSOCK * bsock, alist *verify_list)
{
Jmsg(bsock->jcr(), M_ABORT, 0, _("TLS enable but not configured.\n"));
return false;
}
+
#endif /* HAVE_TLS */
/*
* Returns BSOCK * pointer on success
*
*/
-static BSOCK *bnet_open(JCR * jcr, const char *name, char *host, char *service,
- int port, int *fatal)
+static BSOCK *bnet_open(JCR *jcr, const char *name, char *host, char *service,
+ int port, utime_t heart_beat, int *fatal)
{
int sockfd = -1;
dlist *addr_list;
Qmsg1(jcr, M_WARNING, 0, _("Cannot set SO_KEEPALIVE on socket: %s\n"),
be.strerror());
}
+#if defined(TCP_KEEPIDLE)
+ if (heart_beat) {
+ int opt = heart_beat
+ if (setsockopt(sockfd, IPPROTO_IP, TCP_KEEPIDLE, (sockopt_val_t)&opt, sizeof(opt)) < 0) {
+ berrno be;
+ Qmsg1(jcr, M_WARNING, 0, _("Cannot set SO_KEEPIDLE on socket: %s\n"),
+ be.strerror());
+ }
+ }
+#endif
+
/* connect to server */
if (connect(sockfd, ipaddr->get_sockaddr(), ipaddr->get_sockaddr_len()) < 0) {
save_errno = errno;
* Try to connect to host for max_retry_time at retry_time intervals.
*/
BSOCK *bnet_connect(JCR * jcr, int retry_interval, utime_t max_retry_time,
+ utime_t heart_beat,
const char *name, char *host, char *service, int port,
int verbose)
{
time_t begin_time = time(NULL);
time_t now;
- for (i = 0; (bsock = bnet_open(jcr, name, host, service, port, &fatal)) == NULL;
+ for (i = 0; (bsock = bnet_open(jcr, name, host, service, port, heart_beat, &fatal)) == NULL;
i -= retry_interval) {
berrno be;
if (fatal || (jcr && job_canceled(jcr))) {
uint32_t dbuf_size, start_size;
#if defined(IP_TOS) && defined(IPTOS_THROUGHPUT)
int opt;
-
opt = IPTOS_THROUGHPUT;
- setsockopt(bs->fd, IPPROTO_IP, IP_TOS, (sockopt_val_t) & opt, sizeof(opt));
+ setsockopt(bs->fd, IPPROTO_IP, IP_TOS, (sockopt_val_t)&opt, sizeof(opt));
#endif
if (size != 0) {