+
+/*
+ * Send to Director
+ */
+static void sendit(const char *msg, int len, STATUS_PKT *sp)
+{
+ BSOCK *bs = sp->bs;
+ if (bs) {
+ memcpy(bs->msg, msg, len+1);
+ bs->msglen = len+1;
+ bs->send();
+ } else {
+ sp->callback(msg, len, sp->context);
+ }
+}
+
+static void sendit(const char *msg, int len, void *sp)
+{
+ sendit(msg, len, (STATUS_PKT *)sp);
+}
+
+static void sendit(POOL_MEM &msg, int len, STATUS_PKT *sp)
+{
+ BSOCK *bs = sp->bs;
+ if (bs) {
+ memcpy(bs->msg, msg.c_str(), len+1);
+ bs->msglen = len+1;
+ bs->send();
+ } else {
+ sp->callback(msg.c_str(), len, sp->context);
+ }
+}
+
+
+/*
+ * Status command from Director
+ */
+bool status_cmd(JCR *jcr)
+{
+ BSOCK *dir = jcr->dir_bsock;
+ STATUS_PKT sp;
+
+ dir->fsend("\n");
+ sp.bs = dir;
+ output_status(&sp);
+ dir->signal(BNET_EOD);
+ return true;
+}
+
+/*
+ * .status command from Director
+ */
+bool qstatus_cmd(JCR *jcr)
+{
+ BSOCK *dir = jcr->dir_bsock;
+ POOL_MEM cmd;
+ JCR *njcr;
+ s_last_job* job;
+ STATUS_PKT sp;
+
+ sp.bs = dir;
+ if (sscanf(dir->msg, qstatus, cmd.c_str()) != 1) {
+ pm_strcpy(jcr->errmsg, dir->msg);
+ Jmsg1(jcr, M_FATAL, 0, _("Bad .status command: %s\n"), jcr->errmsg);
+ dir->fsend(_("3900 Bad .status command, missing argument.\n"));
+ dir->signal(BNET_EOD);
+ return false;
+ }
+ unbash_spaces(cmd);
+
+ Dmsg1(200, "cmd=%s\n", cmd.c_str());
+
+ if (strcmp(cmd.c_str(), "current") == 0) {
+ dir->fsend(OKqstatus, cmd.c_str());
+ foreach_jcr(njcr) {
+ if (njcr->JobId != 0) {
+ dir->fsend(DotStatusJob, njcr->JobId, njcr->JobStatus, njcr->JobErrors);
+ }
+ }
+ endeach_jcr(njcr);
+ } else if (strcmp(cmd.c_str(), "last") == 0) {
+ dir->fsend(OKqstatus, cmd.c_str());
+ if ((last_jobs) && (last_jobs->size() > 0)) {
+ job = (s_last_job*)last_jobs->last();
+ dir->fsend(DotStatusJob, job->JobId, job->JobStatus, job->Errors);
+ }
+ } else if (strcasecmp(cmd.c_str(), "header") == 0) {
+ sp.api = true;
+ list_status_header(&sp);
+ } else if (strcasecmp(cmd.c_str(), "running") == 0) {
+ sp.api = true;
+ list_running_jobs(&sp);
+ } else if (strcasecmp(cmd.c_str(), "waitreservation") == 0) {
+ sp.api = true;
+ list_jobs_waiting_on_reservation(&sp);
+ } else if (strcasecmp(cmd.c_str(), "devices") == 0) {
+ sp.api = true;
+ list_devices(&sp);
+ } else if (strcasecmp(cmd.c_str(), "volumes") == 0) {
+ sp.api = true;
+ list_volumes(sendit, &sp);
+ } else if (strcasecmp(cmd.c_str(), "spooling") == 0) {
+ sp.api = true;
+ list_spool_stats(sendit, &sp);
+ } else if (strcasecmp(cmd.c_str(), "terminated") == 0) {
+ sp.api = true;
+ list_terminated_jobs(&sp);
+ } else {
+ pm_strcpy(jcr->errmsg, dir->msg);
+ Jmsg1(jcr, M_FATAL, 0, _("Bad .status command: %s\n"), jcr->errmsg);
+ dir->fsend(_("3900 Bad .status command, wrong argument.\n"));
+ dir->signal(BNET_EOD);
+ return false;
+ }
+ dir->signal(BNET_EOD);
+ return true;