X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/382908adb0d45df6bb519e8838e5aa91fb7434c7..9ec95c23db58dac88a48fae594ea978c148d1c61:/logging.c diff --git a/logging.c b/logging.c index 9e8b9f83..f32e9cae 100644 --- a/logging.c +++ b/logging.c @@ -10,11 +10,12 @@ /* log session to file stuff ... */ struct LogContext { FILE *lgfp; - char currlogfilename[FILENAME_MAX]; + Filename currlogfilename; void *frontend; + Config cfg; }; -static void xlatlognam(char *d, char *s, char *hostname, struct tm *tm); +static void xlatlognam(Filename *d, Filename s, char *hostname, struct tm *tm); /* * Log session traffic. @@ -22,8 +23,8 @@ static void xlatlognam(char *d, char *s, char *hostname, struct tm *tm); void logtraffic(void *handle, unsigned char c, int logmode) { struct LogContext *ctx = (struct LogContext *)handle; - if (cfg.logtype > 0) { - if (cfg.logtype == logmode) { + if (ctx->cfg.logtype > 0) { + if (ctx->cfg.logtype == logmode) { /* deferred open file from pgm start? */ if (!ctx->lgfp) logfopen(ctx); @@ -42,14 +43,14 @@ void logtraffic(void *handle, unsigned char c, int logmode) * platforms. Platforms which don't have a meaningful stderr can * just avoid defining FLAG_STDERR. */ -void log_eventlog(void *handle, char *event) +void log_eventlog(void *handle, const char *event) { struct LogContext *ctx = (struct LogContext *)handle; if ((flags & FLAG_STDERR) && (flags & FLAG_VERBOSE)) { fprintf(stderr, "%s\n", event); fflush(stderr); } - if (cfg.logtype != LGTYP_PACKETS) + if (ctx->cfg.logtype != LGTYP_PACKETS) return; if (!ctx->lgfp) logfopen(ctx); @@ -67,7 +68,7 @@ void log_packet(void *handle, int direction, int type, int i, j; char dumpdata[80], smalldata[5]; - if (cfg.logtype != LGTYP_PACKETS) + if (ctx->cfg.logtype != LGTYP_PACKETS) return; if (!ctx->lgfp) logfopen(ctx); @@ -104,7 +105,7 @@ void logfopen(void *handle) if (ctx->lgfp) return; - if (!cfg.logtype) + if (!ctx->cfg.logtype) return; sprintf(writemod, "wb"); /* default to rewrite */ @@ -112,23 +113,26 @@ void logfopen(void *handle) tm = *localtime(&t); /* substitute special codes in file name */ - xlatlognam(ctx->currlogfilename, cfg.logfilename,cfg.host, &tm); + xlatlognam(&ctx->currlogfilename, ctx->cfg.logfilename,ctx->cfg.host, &tm); - ctx->lgfp = fopen(ctx->currlogfilename, "r"); /* file already present? */ + ctx->lgfp = f_open(ctx->currlogfilename, "r"); /* file already present? */ if (ctx->lgfp) { int i; fclose(ctx->lgfp); - i = askappend(ctx->frontend, ctx->currlogfilename); + if (ctx->cfg.logxfovr != LGXF_ASK) { + i = ((ctx->cfg.logxfovr == LGXF_OVR) ? 2 : 1); + } else + i = askappend(ctx->frontend, ctx->currlogfilename); if (i == 1) writemod[0] = 'a'; /* set append mode */ else if (i == 0) { /* cancelled */ ctx->lgfp = NULL; - cfg.logtype = 0; /* disable logging */ + ctx->cfg.logtype = 0; /* disable logging */ return; } } - ctx->lgfp = fopen(ctx->currlogfilename, writemod); + ctx->lgfp = f_open(ctx->currlogfilename, writemod); if (ctx->lgfp) { /* enter into event log */ /* --- write header line into log file */ fputs("=~=~=~=~=~=~=~=~=~=~=~= PuTTY log ", ctx->lgfp); @@ -138,11 +142,11 @@ void logfopen(void *handle) sprintf(buf, "%s session log (%s mode) to file: ", (writemod[0] == 'a') ? "Appending" : "Writing new", - (cfg.logtype == LGTYP_ASCII ? "ASCII" : - cfg.logtype == LGTYP_DEBUG ? "raw" : - cfg.logtype == LGTYP_PACKETS ? "SSH packets" : "")); + (ctx->cfg.logtype == LGTYP_ASCII ? "ASCII" : + ctx->cfg.logtype == LGTYP_DEBUG ? "raw" : + ctx->cfg.logtype == LGTYP_PACKETS ? "SSH packets" : "")); /* Make sure we do not exceed the output buffer size */ - strncat(buf, ctx->currlogfilename, 128); + strncat(buf, filename_to_str(&ctx->currlogfilename), 128); buf[strlen(buf)] = '\0'; logevent(ctx->frontend, buf); } @@ -157,24 +161,60 @@ void logfclose(void *handle) } } -void *log_init(void *frontend) +void *log_init(void *frontend, Config *cfg) { - struct LogContext *ctx = smalloc(sizeof(struct LogContext)); + struct LogContext *ctx = snew(struct LogContext); ctx->lgfp = NULL; ctx->frontend = frontend; + ctx->cfg = *cfg; /* STRUCTURE COPY */ return ctx; } +void log_free(void *handle) +{ + struct LogContext *ctx = (struct LogContext *)handle; + + logfclose(ctx); + sfree(ctx); +} + +void log_reconfig(void *handle, Config *cfg) +{ + struct LogContext *ctx = (struct LogContext *)handle; + int reset_logging; + + if (!filename_equal(ctx->cfg.logfilename, cfg->logfilename) || + ctx->cfg.logtype != cfg->logtype) + reset_logging = TRUE; + else + reset_logging = FALSE; + + if (reset_logging) + logfclose(ctx); + + ctx->cfg = *cfg; /* STRUCTURE COPY */ + + if (reset_logging) + logfopen(ctx); +} + /* * translate format codes into time/date strings * and insert them into log file name * * "&Y":YYYY "&m":MM "&d":DD "&T":hhmm "&h": "&&":& */ -static void xlatlognam(char *d, char *s, char *hostname, struct tm *tm) { +static void xlatlognam(Filename *dest, Filename src, + char *hostname, struct tm *tm) { char buf[10], *bufp; int size; - int len = FILENAME_MAX-1; + char buffer[FILENAME_MAX]; + int len = sizeof(buffer)-1; + char *d; + const char *s; + + d = buffer; + s = filename_to_str(&src); while (*s) { /* Let (bufp, len) be the string to append. */ @@ -217,4 +257,6 @@ static void xlatlognam(char *d, char *s, char *hostname, struct tm *tm) { len -= size; } *d = '\0'; + + *dest = filename_from_str(buffer); }