New journal event "output"
Redundant information, but incredibly useful when you want to figure out what happened without a (still nonexistent) journal replay tool. The redundancy could help making a journal replay tool more robust. To enable, set econfig key keep_journal to at least 2. Output events are *not* flushed to disk immediately.
This commit is contained in:
parent
f04d1ae032
commit
4785662587
5 changed files with 68 additions and 4 deletions
|
@ -89,6 +89,9 @@ EMPCFBOTH("port", loginport, char *, NSC_STRING, KM_INTERNAL,
|
|||
"TCP port the server will bind")
|
||||
EMPCFBOTH("keep_journal", keep_journal, int, NSC_INT, KM_INTERNAL,
|
||||
"Enable journal log file")
|
||||
EMPCF_COMMENT("# 0 - Disabled\n"
|
||||
"# 1 - Enabled, player output suppressed\n"
|
||||
"# 2 - Enabled, log everything (big; rotating & compressing advised)\n")
|
||||
EMPCFBOTH("post_crash_dump_hook", post_crash_dump_hook, char *, NSC_STRING, KM_INTERNAL,
|
||||
"Shell command run right after a crash dump, in the game's data directory")
|
||||
EMPCFBOTH("privname", privname, char *, NSC_STRING, 0,
|
||||
|
|
|
@ -33,12 +33,15 @@
|
|||
#ifndef JOURNAL_H
|
||||
#define JOURNAL_H
|
||||
|
||||
#include "types.h"
|
||||
|
||||
int journal_startup(void);
|
||||
void journal_shutdown(void);
|
||||
int journal_reopen(void);
|
||||
void journal_login(void);
|
||||
void journal_logout(void);
|
||||
void journal_prng(unsigned);
|
||||
void journal_output(struct player *, int, char *);
|
||||
void journal_input(char *);
|
||||
void journal_command(char *);
|
||||
void journal_update(int);
|
||||
|
|
|
@ -48,6 +48,7 @@ struct nchrstr;
|
|||
struct nstr_item;
|
||||
struct nstr_sect;
|
||||
struct nukstr;
|
||||
struct player;
|
||||
struct plist;
|
||||
struct plnstr;
|
||||
struct range;
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
* logout CNUM
|
||||
* command NAME
|
||||
* input INPUT
|
||||
* output THREAD ID OUTPUT
|
||||
* update ETU
|
||||
*/
|
||||
|
||||
|
@ -69,6 +70,7 @@ static void journal_entry_start(char *fmt, ...)
|
|||
ATTRIBUTE((format (printf, 1, 2)));
|
||||
static void journal_entry(char *fmt, ...)
|
||||
ATTRIBUTE((format (printf, 1, 2)));
|
||||
static void journal_output_start(struct player *, int);
|
||||
|
||||
static FILE *
|
||||
journal_open(void)
|
||||
|
@ -118,10 +120,12 @@ journal_entry_pr(char *s, size_t n)
|
|||
}
|
||||
|
||||
static void
|
||||
journal_entry_end(void)
|
||||
journal_entry_end(int newline, int flush)
|
||||
{
|
||||
if (!journal)
|
||||
return;
|
||||
if (!newline)
|
||||
fputc('\\', journal);
|
||||
fputc('\n', journal);
|
||||
fflush(journal);
|
||||
if (ferror(journal)) {
|
||||
|
@ -138,7 +142,7 @@ journal_entry(char *fmt, ...)
|
|||
va_start(ap, fmt);
|
||||
journal_entry_vstart(fmt, ap);
|
||||
va_end(ap);
|
||||
journal_entry_end();
|
||||
journal_entry_end(1, 1);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -202,12 +206,59 @@ journal_logout(void)
|
|||
journal_entry("logout %d", player->cnum);
|
||||
}
|
||||
|
||||
void
|
||||
journal_output(struct player *pl, int id, char *output)
|
||||
{
|
||||
static char buf[1024];
|
||||
static char *bp = buf;
|
||||
static struct player *bpl;
|
||||
static int bid;
|
||||
char *s, *e;
|
||||
|
||||
if (keep_journal < 2)
|
||||
return;
|
||||
|
||||
if (bp != buf && (pl != bpl || id != bid)) {
|
||||
journal_output_start(bpl, bid);
|
||||
journal_entry_pr(buf, bp - buf);
|
||||
journal_entry_end(0, 0);
|
||||
bp = buf;
|
||||
}
|
||||
|
||||
for (s = output; (e = strchr(s, '\n')); s = e + 1) {
|
||||
journal_output_start(pl, id);
|
||||
journal_entry_pr(buf, bp - buf);
|
||||
journal_entry_pr(s, e - s);
|
||||
journal_entry_end(1, 0);
|
||||
bp = buf;
|
||||
}
|
||||
e = strchr(s, 0);
|
||||
if (bp + (e - s) <= buf + sizeof(buf)) {
|
||||
memcpy(bp, s, e - s);
|
||||
bp += e - s;
|
||||
bpl = pl;
|
||||
bid = id;
|
||||
} else {
|
||||
journal_output_start(pl, id);
|
||||
journal_entry_pr(buf, bp - buf);
|
||||
journal_entry_pr(s, e - s);
|
||||
journal_entry_end(0, 0);
|
||||
bp = buf;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
journal_output_start(struct player *pl, int id)
|
||||
{
|
||||
journal_entry_start("output %s %d ", empth_name(pl->proc), id);
|
||||
}
|
||||
|
||||
void
|
||||
journal_input(char *input)
|
||||
{
|
||||
journal_entry_start("input ");
|
||||
journal_entry_pr(input, -1);
|
||||
journal_entry_end();
|
||||
journal_entry_end(1, 1);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
* Dave Pare, 1986, 1989
|
||||
* Steve McClure, 1998-2000
|
||||
* Ron Koenderink, 2005
|
||||
* Markus Armbruster, 2005-2009
|
||||
* Markus Armbruster, 2005-2011
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -55,6 +55,7 @@
|
|||
#include "com.h"
|
||||
#include "empio.h"
|
||||
#include "file.h"
|
||||
#include "journal.h"
|
||||
#include "misc.h"
|
||||
#include "nat.h"
|
||||
#include "player.h"
|
||||
|
@ -124,6 +125,7 @@ pr_id(struct player *p, int id, char *format, ...)
|
|||
|
||||
if (p->curid >= 0) {
|
||||
io_puts(p->iop, "\n");
|
||||
journal_output(p, p->curid, "\n");
|
||||
p->curid = -1;
|
||||
}
|
||||
va_start(ap, format);
|
||||
|
@ -222,6 +224,8 @@ pr_player(struct player *pl, int id, char *buf)
|
|||
char *bp;
|
||||
int len;
|
||||
|
||||
journal_output(pl, id, buf);
|
||||
|
||||
bp = buf;
|
||||
while (*bp != '\0') {
|
||||
if (pl->curid != -1 && pl->curid != id) {
|
||||
|
@ -263,6 +267,8 @@ upr_player(struct player *pl, int id, char *buf)
|
|||
char printbuf[2];
|
||||
char ch;
|
||||
|
||||
journal_output(pl, id, buf);
|
||||
|
||||
printbuf[0] = '\0';
|
||||
printbuf[1] = '\0';
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue