blob: 422148afa790c4a2d6670f2917af9554a563e848 [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2000-2001,2005 Silicon Graphics, Inc.
* All Rights Reserved.
*/
#include "libxfs.h"
#include <stdarg.h>
#include "command.h"
#include "output.h"
#include "sig.h"
#include "malloc.h"
#include "init.h"
static int log_f(int argc, char **argv);
static const cmdinfo_t log_cmd =
{ "log", NULL, log_f, 0, 2, 0, N_("[stop|start <filename>]"),
N_("start or stop logging to a file"), NULL };
int dbprefix;
static FILE *log_file;
static char *log_file_name;
int
dbprintf(const char *fmt, ...)
{
va_list ap;
int i;
if (seenint())
return 0;
va_start(ap, fmt);
blockint();
i = 0;
if (dbprefix)
i += printf("%s: ", fsdevice);
i += vprintf(fmt, ap);
unblockint();
va_end(ap);
if (log_file) {
va_start(ap, fmt);
vfprintf(log_file, fmt, ap);
va_end(ap);
}
return i;
}
static int
log_f(
int argc,
char **argv)
{
if (argc == 1) {
if (log_file)
dbprintf(_("logging to %s\n"), log_file_name);
else
dbprintf(_("no log file\n"));
} else if (argc == 2 && strcmp(argv[1], "stop") == 0) {
if (log_file) {
xfree(log_file_name);
fclose(log_file);
log_file = NULL;
} else
dbprintf(_("no log file\n"));
} else if (argc == 3 && strcmp(argv[1], "start") == 0) {
if (log_file)
dbprintf(_("already logging to %s\n"), log_file_name);
else {
log_file = fopen(argv[2], "a");
if (log_file == NULL)
dbprintf(_("can't open %s for writing\n"),
argv[2]);
else
log_file_name = xstrdup(argv[1]);
}
} else
dbprintf(_("bad log command, ignored\n"));
return 0;
}
void
logprintf(const char *fmt, ...)
{
va_list ap;
if (log_file) {
va_start(ap, fmt);
(void)vfprintf(log_file, fmt, ap);
va_end(ap);
}
}
void
output_init(void)
{
add_command(&log_cmd);
}