/* Forward referenced functions */
-static bool diecmd(UAContext *ua, const char *cmd);
+static bool die_or_dump_cmd(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"), diecmd, 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_(".filesets"), filesetscmd, NULL, false},
{ NT_(".help"), dot_help_cmd, NULL, false},
{ NT_(".bvfs_lsdirs"), dot_bvfs_lsdirs, NULL, true},
{ NT_(".bvfs_lsfiles"),dot_bvfs_lsfiles,NULL, true},
{ NT_(".bvfs_update"), dot_bvfs_update, NULL, true},
- { NT_(".types"), typescmd, NULL, false}
+ { NT_(".types"), typescmd, NULL, false}
};
#define comsize ((int)(sizeof(commands)/sizeof(struct cmdstruct)))
}
#ifdef DEVELOPER
-static void do_storage_die(UAContext *ua, STORE *store, const char *cmd)
+static void do_storage_cmd(UAContext *ua, STORE *store, const char *cmd)
{
BSOCK *sd;
JCR *jcr = ua->jcr;
return;
}
-static void do_client_die(UAContext *ua, CLIENT *client, const char *cmd)
+static void do_client_cmd(UAContext *ua, CLIENT *client, const char *cmd)
{
BSOCK *fd;
}
/*
- * Create segmentation fault
+ * Create segmentation fault or dump memory
*/
-static bool diecmd(UAContext *ua, const char *cmd)
+static bool die_or_dump_cmd(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=".die";
+ const char *remote_cmd="sm_dump";
int i;
JCR *jcr = NULL;
int a;
-
- Dmsg1(120, "diecmd:%s:\n", cmd);
-
- /* General debug? */
- for (i=1; i<ua->argc; i++) {
- if (strcasecmp(ua->argk[i], "deadlock") == 0) {
+ if (!strncmp(ua->argk[0], ".die", 4)) {
+ if (find_arg(ua, "deadlock") > 0) {
do_deadlock=true;
remote_cmd = ".die deadlock";
+ } else {
+ remote_cmd = ".die";
}
+ }
+ /* General debug? */
+ for (i=1; i<ua->argc; i++) {
if (strcasecmp(ua->argk[i], "dir") == 0 ||
strcasecmp(ua->argk[i], "director") == 0) {
dir=true;
}
if (store) {
- do_storage_die(ua, store, remote_cmd);
+ do_storage_cmd(ua, store, remote_cmd);
}
if (client) {
- do_client_die(ua, client, remote_cmd);
+ do_client_cmd(ua, client, remote_cmd);
}
if (dir) {
- if (do_deadlock) {
- ua->send_msg(_("The Director will generate a deadlock.\n"));
- P(mutex);
- P(mutex);
+ if (!strncmp(remote_cmd, ".die", 4)) {
+ if (do_deadlock) {
+ ua->send_msg(_("The Director will generate a deadlock.\n"));
+ P(mutex);
+ P(mutex);
+ }
+ ua->send_msg(_("The Director will segment fault.\n"));
+ a = jcr->JobId; /* ref NULL pointer */
+ jcr->JobId = 1000; /* another ref NULL pointer */
+
+ } else { /* .dump */
+ sm_dump(false, true);
}
- ua->send_msg(_("The Director will segment fault.\n"));
- a = jcr->JobId; /* ref NULL pointer */
- jcr->JobId = 1000; /* another ref NULL pointer */
}
return true;
/*
* Dummy routine for non-development version
*/
-static bool diecmd(UAContext *ua, const char *cmd)
+static bool die_or_dump_cmd(UAContext *ua, const char *cmd)
{
return true;
}
static int restore_object_cmd(JCR *jcr);
static int set_options(findFOPTS *fo, const char *opts);
static void set_storage_auth_key(JCR *jcr, char *key);
+static int sm_dump_cmd(JCR *jcr);
/* Exported functions */
{"Run", runscript_cmd, 0},
{"accurate", accurate_cmd, 0},
{"restoreobject", restore_object_cmd, 0},
+ {"sm_dump", sm_dump_cmd, 0},
{NULL, NULL} /* list terminator */
};
return NULL;
}
+static int sm_dump_cmd(JCR *jcr)
+{
+ BSOCK *dir = jcr->dir_bsock;
+ sm_dump(false, true);
+ dir->fsend("2000 sm_dump OK\n");
+ return 1;
+}
+
/**
* Hello from Director he must identify himself and provide his
* password.