* Requests are any message that does not begin with a digit.
* In affect, they are commands.
*
+ * Version $Id$
*/
/*
Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker
* to the appropriate handler. If the message is
* in any other format, it will be returned.
*
+ * E.g. any message beginning with a digit will be returned.
+ * any message beginning with Jmsg will be processed.
+ *
*/
-int32_t bget_msg(BSOCK *bs, int rtn)
+int bget_dirmsg(BSOCK *bs)
{
int32_t n;
char Job[MAX_NAME_LENGTH];
for (;;) {
n = bnet_recv(bs);
- Dmsg2(120, "bget_msg %d: %s\n", n, bs->msg);
+ Dmsg2(120, "bget_dirmsg %d: %s\n", n, bs->msg);
- if (n < 0) {
- return n; /* error return */
+ if (is_bnet_stop(bs)) {
+ return n; /* error or terminate */
}
- if (n == 0) { /* handle signal */
- /* 0 return from bnet_recv() => network signal */
+ if (n == BNET_SIGNAL) { /* handle signal */
+ /* BNET_SIGNAL (-1) return from bnet_recv() => network signal */
switch (bs->msglen) {
- case BNET_EOF: /* deprecated */
- case BNET_EOD: /* end of data */
- return 0;
- case BNET_EOD_POLL:
- bnet_fsend(bs, OK_msg); /* send response */
- return 0; /* end of data */
- case BNET_TERMINATE:
- bs->terminated = 1;
- return 0;
- case BNET_POLL:
- bnet_fsend(bs, OK_msg); /* send response */
- break;
- case BNET_HEARTBEAT:
- bnet_sig(bs, BNET_HB_RESPONSE);
- break;
- case BNET_STATUS:
- /* *****FIXME***** Implement */
- bnet_fsend(bs, "Status OK\n");
- bnet_sig(bs, BNET_EOD);
- break;
- default:
- Emsg1(M_WARNING, 0, _("bget_msg: unknown signal %d\n"), bs->msglen);
- return 0;
+ case BNET_EOD: /* end of data */
+ return n;
+ case BNET_EOD_POLL:
+ bnet_fsend(bs, OK_msg);/* send response */
+ return n; /* end of data */
+ case BNET_TERMINATE:
+ bs->terminated = 1;
+ return n;
+ case BNET_POLL:
+ bnet_fsend(bs, OK_msg); /* send response */
+ break;
+ case BNET_HEARTBEAT:
+// encode_time(time(NULL), Job);
+// Dmsg1(100, "%s got heartbeat.\n", Job);
+ break;
+ case BNET_HB_RESPONSE:
+ break;
+ case BNET_STATUS:
+ /* *****FIXME***** Implement more completely */
+ bnet_fsend(bs, "Status OK\n");
+ bnet_sig(bs, BNET_EOD);
+ break;
+ case BNET_BTIME: /* send Bacula time */
+ char ed1[50];
+ bnet_fsend(bs, "btime %s\n", edit_uint64(get_current_btime(),ed1));
+ break;
+ default:
+ Emsg1(M_WARNING, 0, _("bget_dirmsg: unknown bnet signal %d\n"), bs->msglen);
+ return n;
}
continue;
}
/* Handle normal data */
- if (ISDIGIT(bs->msg[0])) { /* response? */
+ if (n > 0 && B_ISDIGIT(bs->msg[0])) { /* response? */
return n; /* yes, return it */
}
Emsg1(M_ERROR, 0, _("Job not found: %s\n"), bs->msg);
continue;
}
+ Dmsg1(200, "Getmsg got jcr 0x%x\n", jcr);
/* Skip past "Jmsg Job=nnn" */
if (!(msg=find_msg_start(bs->msg))) {
* CatReq Job=nn Catalog-Request-Message
*/
if (bs->msg[0] == 'C') { /* Catalog request */
- Dmsg1(120, "Catalog req: %s", bs->msg);
+ Dmsg2(120, "Catalog req jcr 0x%x: %s", jcr, bs->msg);
catalog_request(jcr, bs, msg);
+ Dmsg1(200, "Calling freejcr 0x%x\n", jcr);
free_jcr(jcr);
continue;
}
if (bs->msg[0] == 'U') { /* Catalog update */
+ Dmsg2(120, "Catalog upd jcr 0x%x: %s", jcr, bs->msg);
catalog_update(jcr, bs, msg);
+ Dmsg1(200, "Calling freejcr 0x%x\n", jcr);
free_jcr(jcr);
continue;
}
* Returns: 0 on failure
* 1 on success
*/
-int response(BSOCK *fd, char *resp, char *cmd)
+int response(JCR *jcr, BSOCK *fd, char *resp, char *cmd, e_prtmsg prtmsg)
{
int n;
- if (fd->errors) {
+ if (is_bnet_error(fd)) {
return 0;
}
- if ((n = bget_msg(fd, 0)) > 0) {
- Dmsg0(10, fd->msg);
+ if ((n = bget_dirmsg(fd)) >= 0) {
+ Dmsg0(110, fd->msg);
if (strcmp(fd->msg, resp) == 0) {
return 1;
}
- Emsg3(M_FATAL, 0, _("<filed: bad response to %s command: wanted %s got: %s\n"),
- cmd, resp, fd->msg);
+ if (prtmsg == DISPLAY_ERROR) {
+ Jmsg(jcr, M_FATAL, 0, _("FD gave bad response to %s command: wanted %s got: %s\n"),
+ cmd, resp, fd->msg);
+ }
return 0;
}
- Emsg2(M_FATAL, 0, _("<filed: Socket error from Filed on %s command: ERR=%s\n"),
+ Jmsg(jcr, M_FATAL, 0, _("Socket error from Filed on %s command: ERR=%s\n"),
cmd, bnet_strerror(fd));
return 0;
}