/*
Bacula® - The Network Backup Solution
- Copyright (C) 2002-2009 Free Software Foundation Europe e.V.
+ Copyright (C) 2002-2010 Free Software Foundation Europe e.V.
The main author of Bacula is Kern Sibbald, with contributions from
many others, a complete list can be found in the file AUTHORS.
/* Forward referenced functions */
-static bool die_or_dump_cmd(UAContext *ua, const char *cmd);
+static bool admin_cmds(UAContext *ua, const char *cmd);
static bool jobscmd(UAContext *ua, const char *cmd);
static bool filesetscmd(UAContext *ua, const char *cmd);
static bool clientscmd(UAContext *ua, const char *cmd);
{ NT_(".backups"), backupscmd, NULL, false},
{ NT_(".clients"), clientscmd, NULL, true},
{ NT_(".defaults"), defaultscmd, NULL, false},
- { NT_(".die"), die_or_dump_cmd, NULL, false},
- { NT_(".dump"), die_or_dump_cmd, NULL, false},
- { NT_(".exit"), dot_quit_cmd, NULL, false},
+ { NT_(".die"), admin_cmds, NULL, false},
+ { NT_(".dump"), admin_cmds, NULL, false},
+ { NT_(".exit"), admin_cmds, NULL, false},
{ NT_(".filesets"), filesetscmd, NULL, false},
{ NT_(".help"), dot_help_cmd, NULL, false},
{ NT_(".jobs"), jobscmd, NULL, true},
}
/*
- * Create segmentation fault or dump memory
+ * .die (seg fault)
+ * .dump (sm_dump)
+ * .exit (no arg => .quit)
*/
-static bool die_or_dump_cmd(UAContext *ua, const char *cmd)
+static bool admin_cmds(UAContext *ua, const char *cmd)
{
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
STORE *store=NULL;
CLIENT *client=NULL;
bool dir=false;
bool do_deadlock=false;
- const char *remote_cmd="sm_dump";
+ const char *remote_cmd;
int i;
JCR *jcr = NULL;
int a;
- if (!strncmp(ua->argk[0], ".die", 4)) {
+ if (strncmp(ua->argk[0], ".die", 4) == 0) {
if (find_arg(ua, "deadlock") > 0) {
- do_deadlock=true;
+ do_deadlock = true;
remote_cmd = ".die deadlock";
} else {
remote_cmd = ".die";
}
+ } else if (strncmp(ua->argk[0], ".dump", 5) == 0) {
+ remote_cmd = "sm_dump";
+ } else if (strncmp(ua->argk[0], ".exit", 5) == 0) {
+ remote_cmd = "exit";
+ } else {
+ ua->error_msg(_("Unknown command: %s\n"), ua->argk[0]);
+ return true;
}
/* General debug? */
for (i=1; i<ua->argc; i++) {
if (strcasecmp(ua->argk[i], "dir") == 0 ||
strcasecmp(ua->argk[i], "director") == 0) {
- ua->send_msg(_("The Director will segment fault.\n"));
- a = jcr->JobId; /* ref NULL pointer */
- jcr->JobId = 1000; /* another ref NULL pointer */
- return 1;
+ dir = true;
}
if (strcasecmp(ua->argk[i], "client") == 0 ||
strcasecmp(ua->argk[i], "fd") == 0) {
}
if (dir) {
- if (!strncmp(remote_cmd, ".die", 4)) {
+ if (strncmp(remote_cmd, ".die", 4) == 0) {
if (do_deadlock) {
ua->send_msg(_("The Director will generate a deadlock.\n"));
P(mutex);
a = jcr->JobId; /* ref NULL pointer */
jcr->JobId = 1000; /* another ref NULL pointer */
- } else { /* .dump */
+ } else if (strncmp(remote_cmd, ".dump", 5) == 0) {
sm_dump(false, true);
+ } else if (strncmp(remote_cmd, ".exit", 5) == 0) {
+ dot_quit_cmd(ua, cmd);
}
}
return true;
static void set_options(findFOPTS *fo, const char *opts);
static void set_storage_auth_key(JCR *jcr, char *key);
static int sm_dump_cmd(JCR *jcr);
+static int exit_cmd(JCR *jcr);
/* Exported functions */
{"accurate", accurate_cmd, 0},
{"restoreobject", restore_object_cmd, 0},
{"sm_dump", sm_dump_cmd, 0},
+#ifdef DEVELOPER
+ {"exit", exit_cmd, 0},
+#endif
{NULL, NULL} /* list terminator */
};
static int sm_dump_cmd(JCR *jcr)
{
- BSOCK *dir = jcr->dir_bsock;
sm_dump(false, true);
- dir->fsend("2000 sm_dump OK\n");
+ jcr->dir_bsock->fsend("2000 sm_dump OK\n");
return 1;
}
+#ifdef DEVELOPER
+static int exit_cmd(JCR *jcr)
+{
+ jcr->dir_bsock->fsend("2000 exit OK\n");
+ terminate_filed(0);
+ return 0;
+}
+#endif
+
+
/**
* Hello from Director he must identify himself and provide his
* password.