X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=bacula%2Fsrc%2Fdird%2Fgetmsg.c;h=f0da7debfbd79db3172c7801ee6ee33e38c6aa51;hb=9f9219844777d0ffa3182869d0d2a778e51984ef;hp=b37abe299977a7e2f54fde66c21b685b4f493d06;hpb=1ef84681d13d0c355d6ae78579d2afe1c8d8d0e2;p=bacula%2Fbacula diff --git a/bacula/src/dird/getmsg.c b/bacula/src/dird/getmsg.c index b37abe2999..f0da7debfb 100644 --- a/bacula/src/dird/getmsg.c +++ b/bacula/src/dird/getmsg.c @@ -18,9 +18,10 @@ * 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 + Copyright (C) 2000-2004 Kern Sibbald and John Walker This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -59,8 +60,11 @@ static char OK_msg[] = "1000 OK\n"; * 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]; @@ -71,44 +75,50 @@ int32_t bget_msg(BSOCK *bs, int rtn) 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 */ } @@ -125,6 +135,7 @@ int32_t bget_msg(BSOCK *bs, int rtn) 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))) { @@ -162,13 +173,16 @@ int32_t bget_msg(BSOCK *bs, int rtn) * 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; } @@ -200,23 +214,25 @@ static char *find_msg_start(char *msg) * 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, _("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, _("