/*
Bacula(R) - The Network Backup Solution
- Copyright (C) 2000-2015 Kern Sibbald
- Copyright (C) 2000-2014 Free Software Foundation Europe e.V.
+ Copyright (C) 2000-2018 Kern Sibbald
The original author of Bacula is Kern Sibbald, with contributions
from many others, a complete list can be found in the file AUTHORS.
Public License, v3.0 ("AGPLv3") and some additional permissions and
terms pursuant to its AGPLv3 Section 7.
- This notice must be preserved when any source code is
+ This notice must be preserved when any source code is
conveyed and/or propagated.
Bacula(R) is a registered trademark of Kern Sibbald.
} while (nwritten == -1 && errno == EINTR);
/*
* If connection is non-blocking, we will get EAGAIN, so
- * use select() to keep from consuming all the CPU
+ * use select()/poll to keep from consuming all the CPU
* and try again.
*/
if (nwritten == -1 && errno == EAGAIN) {
- fd_set fdset;
- struct timeval tv;
-
- FD_ZERO(&fdset);
- FD_SET((unsigned)bsock->m_fd, &fdset);
- tv.tv_sec = 1;
- tv.tv_usec = 0;
- select(bsock->m_fd + 1, NULL, &fdset, NULL, &tv);
+ fd_wait_data(bsock->m_fd, WAIT_WRITE, 1, 0);
continue;
}
if (nwritten <= 0) {
static char buf[30];
switch (msglen) {
case BNET_EOD:
- return "BNET_EOD"; /* end of data stream */
+ return "BNET_EOD"; /* End of data stream, new data may follow */
case BNET_EOD_POLL:
- return "BNET_EOD_POLL";
+ return "BNET_EOD_POLL"; /* End of data and poll all in one */
case BNET_STATUS:
- return "BNET_STATUS";
+ return "BNET_STATUS"; /* Send full status */
case BNET_TERMINATE:
- return "BNET_TERMINATE"; /* terminate connection */
+ return "BNET_TERMINATE"; /* Conversation terminated, doing close() */
case BNET_POLL:
- return "BNET_POLL";
+ return "BNET_POLL"; /* Poll request, I'm hanging on a read */
case BNET_HEARTBEAT:
- return "BNET_HEARTBEAT";
+ return "BNET_HEARTBEAT"; /* Heartbeat Response requested */
case BNET_HB_RESPONSE:
- return "BNET_HB_RESPONSE";
+ return "BNET_HB_RESPONSE"; /* Only response permited to HB */
+ case BNET_BTIME:
+ return "BNET_BTIME"; /* Send UTC btime */
+ case BNET_BREAK:
+ return "BNET_BREAK"; /* Stop current command -- ctl-c */
+ case BNET_START_SELECT:
+ return "BNET_START_SELECT"; /* Start of a selection list */
+ case BNET_END_SELECT:
+ return "BNET_END_SELECT"; /* End of a select list */
+ case BNET_INVALID_CMD:
+ return "BNET_INVALID_CMD"; /* Invalid command sent */
+ case BNET_CMD_FAILED:
+ return "BNET_CMD_FAILED"; /* Command failed */
+ case BNET_CMD_OK:
+ return "BNET_CMD_OK"; /* Command succeeded */
+ case BNET_CMD_BEGIN:
+ return "BNET_CMD_BEGIN"; /* Start command execution */
+ case BNET_MSGS_PENDING:
+ return "BNET_MSGS_PENDING"; /* Messages pending */
+ case BNET_MAIN_PROMPT:
+ return "BNET_MAIN_PROMPT"; /* Server ready and waiting */
+ case BNET_SELECT_INPUT:
+ return "BNET_SELECT_INPUT"; /* Return selection input */
+ case BNET_WARNING_MSG:
+ return "BNET_WARNING_MSG"; /* Warning message */
+ case BNET_ERROR_MSG:
+ return "BNET_ERROR_MSG"; /* Error message -- command failed */
+ case BNET_INFO_MSG:
+ return "BNET_INFO_MSG"; /* Info message -- status line */
+ case BNET_RUN_CMD:
+ return "BNET_RUN_CMD"; /* Run command follows */
+ case BNET_YESNO:
+ return "BNET_YESNO"; /* Request yes no response */
+ case BNET_START_RTREE:
+ return "BNET_START_RTREE"; /* Start restore tree mode */
+ case BNET_END_RTREE:
+ return "BNET_END_RTREE"; /* End restore tree mode */
case BNET_SUB_PROMPT:
- return "BNET_SUB_PROMPT";
+ return "BNET_SUB_PROMPT"; /* Indicate we are at a subprompt */
case BNET_TEXT_INPUT:
- return "BNET_TEXT_INPUT";
+ return "BNET_TEXT_INPUT"; /* Get text input from user */
+ case BNET_EXT_TERMINATE:
+ return "BNET_EXT_TERMINATE"; /* A Terminate condition has been met and
+ already reported somewhere else */
+ case BNET_FDCALLED :
+ return "BNET_FDCALLED"; /* The FD should keep the connection for a new job */
default:
bsnprintf(buf, sizeof(buf), _("Unknown sig %d"), (int)msglen);
return buf;
}
/* Initialize internal socket structure.
- * This probably should be done in net_open
+ * This probably should be done in bsock.c
*/
-BSOCK *init_bsock(JCR * jcr, int sockfd, const char *who, const char *host, int port,
- struct sockaddr *client_addr)
+BSOCK *init_bsock(JCR *jcr, int sockfd, const char *who,
+ const char *host, int port, struct sockaddr *client_addr)
{
- Dmsg3(100, "who=%s host=%s port=%d\n", who, host, port);
+ Dmsg4(100, "socket=%d who=%s host=%s port=%d\n", sockfd, who, host, port);
BSOCK *bsock = (BSOCK *)malloc(sizeof(BSOCK));
- memset(bsock, 0, sizeof(BSOCK));
+ bmemzero(bsock, sizeof(BSOCK));
+ bsock->m_master=bsock; /* don't use set_master() here */
bsock->m_fd = sockfd;
bsock->tls = NULL;
bsock->errors = 0;
bsock->m_blocking = 1;
bsock->pout_msg_no = &bsock->out_msg_no;
+ bsock->uninstall_send_hook_cb();
bsock->msg = get_pool_memory(PM_BSOCK);
+ bsock->cmsg = get_pool_memory(PM_BSOCK);
bsock->errmsg = get_pool_memory(PM_MESSAGE);
bsock->set_who(bstrdup(who));
bsock->set_host(bstrdup(host));
bsock->set_port(port);
- memset(&bsock->peer_addr, 0, sizeof(bsock->peer_addr));
+ bmemzero(&bsock->peer_addr, sizeof(bsock->peer_addr));
memcpy(&bsock->client_addr, client_addr, sizeof(bsock->client_addr));
bsock->timeout = BSOCK_TIMEOUT;
bsock->set_jcr(jcr);
osock->set_locking();
memcpy(bsock, osock, sizeof(BSOCK));
bsock->msg = get_pool_memory(PM_BSOCK);
+ bsock->cmsg = get_pool_memory(PM_BSOCK);
bsock->errmsg = get_pool_memory(PM_MESSAGE);
if (osock->who()) {
bsock->set_who(bstrdup(osock->who()));
bsock->src_addr = New( IPADDR( *(osock->src_addr)) );
}
bsock->set_duped();
+ bsock->set_master(osock);
return bsock;
}