From 66ee282adab99e6ef6ab7e09700611c89d87c97c Mon Sep 17 00:00:00 2001 From: simon Date: Sun, 9 Sep 2001 09:58:20 +0000 Subject: [PATCH] Roman Pompejus's patch (heavily hacked) for parametric log file names with date, time and hostname automatically embedded. git-svn-id: svn://svn.tartarus.org/sgt/putty@1255 cda61777-01e9-0310-a592-d414129be87e --- terminal.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------- winctrls.c | 4 +-- windlg.c | 5 +++- winstuff.h | 2 +- 4 files changed, 82 insertions(+), 13 deletions(-) diff --git a/terminal.c b/terminal.c index 5b8a1838..9fc1787b 100644 --- a/terminal.c +++ b/terminal.c @@ -201,6 +201,7 @@ static void deselect(void); /* log session to file stuff ... */ static FILE *lgfp = NULL; static void logtraffic(unsigned char c, int logmode); +static void xlatlognam(char *d, char *s, char *hostname, struct tm *tm); /* * Resize a line to make it `cols' columns wide. @@ -3336,22 +3337,35 @@ void logtraffic(unsigned char c, int logmode) } } +void settimstr(char *ta, int no_sec); +char *subslfcode(char *dest, char *src, char *dstrt); +char *stpncpy(char *dst, const char *src, size_t maxlen); +char timdatbuf[20]; +char currlogfilename[FILENAME_MAX]; + /* open log file append/overwrite mode */ void logfopen(void) { char buf[256]; time_t t; - struct tm *tm; + struct tm tm; char writemod[4]; if (!cfg.logtype) return; sprintf(writemod, "wb"); /* default to rewrite */ - lgfp = fopen(cfg.logfilename, "r"); /* file already present? */ + + time(&t); + tm = *localtime(&t); + + /* substitute special codes in file name */ + xlatlognam(currlogfilename,cfg.logfilename,cfg.host, &tm); + + lgfp = fopen(currlogfilename, "r"); /* file already present? */ if (lgfp) { int i; fclose(lgfp); - i = askappend(cfg.logfilename); + i = askappend(currlogfilename); if (i == 1) writemod[0] = 'a'; /* set append mode */ else if (i == 0) { /* cancelled */ @@ -3361,22 +3375,20 @@ void logfopen(void) } } - lgfp = fopen(cfg.logfilename, writemod); + lgfp = fopen(currlogfilename, writemod); if (lgfp) { /* enter into event log */ 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" : "")); /* Make sure we do not exceed the output buffer size */ - strncat(buf, cfg.logfilename, 128); + strncat(buf, currlogfilename, 128); buf[strlen(buf)] = '\0'; logevent(buf); - /* --- write header line iinto log file */ + /* --- write header line into log file */ fputs("=~=~=~=~=~=~=~=~=~=~=~= PuTTY log ", lgfp); - time(&t); - tm = localtime(&t); - strftime(buf, 24, "%Y.%m.%d %H:%M:%S", tm); + strftime(buf, 24, "%Y.%m.%d %H:%M:%S", &tm); fputs(buf, lgfp); fputs(" =~=~=~=~=~=~=~=~=~=~=~=\r\n", lgfp); } @@ -3389,3 +3401,57 @@ void logfclose(void) lgfp = NULL; } } + +/* + * 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) { + char buf[10], *bufp; + int size; + char *ds = d; /* save start pos. */ + int len = FILENAME_MAX-1; + + while (*s) { + /* Let (bufp, len) be the string to append. */ + bufp = buf; /* don't usually override this */ + if (*s == '&') { + char c; + s++; + if (*s) switch (c = *s++, tolower(c)) { + case 'y': + size = strftime(buf, sizeof(buf), "%Y", tm); + break; + case 'm': + size = strftime(buf, sizeof(buf), "%m", tm); + break; + case 'd': + size = strftime(buf, sizeof(buf), "%d", tm); + break; + case 't': + size = strftime(buf, sizeof(buf), "%H%M%S", tm); + break; + case 'h': + bufp = hostname; + size = strlen(bufp); + break; + default: + buf[0] = '&'; + size = 1; + if (c != '&') + buf[size++] = c; + } + } else { + buf[0] = *s++; + size = 1; + } + if (size > len) + size = len; + memcpy(d, bufp, size); + d += size; + len -= size; + } + *d = '\0'; +} diff --git a/winctrls.c b/winctrls.c index 72550d0e..eb082f3a 100644 --- a/winctrls.c +++ b/winctrls.c @@ -315,14 +315,14 @@ void checkbox(struct ctlpos *cp, char *text, int id) /* * A single standalone static text control. */ -void statictext(struct ctlpos *cp, char *text, int id) +void statictext(struct ctlpos *cp, char *text, int lines, int id) { RECT r; r.left = GAPBETWEEN; r.top = cp->ypos; r.right = cp->width; - r.bottom = STATICHEIGHT; + r.bottom = STATICHEIGHT * lines; cp->ypos += r.bottom + GAPBETWEEN; doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, id); } diff --git a/windlg.c b/windlg.c index f15e385d..77264386 100644 --- a/windlg.c +++ b/windlg.c @@ -259,6 +259,7 @@ enum { IDCX_ABOUT = IDC_LGFSTATIC, IDC_LGFEDIT, IDC_LGFBUTTON, + IDC_LGFEXPLAIN, IDC_LSTATXIST, IDC_LSTATXOVR, IDC_LSTATXAPN, @@ -907,6 +908,8 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) editbutton(&cp, "Log &file name:", IDC_LGFSTATIC, IDC_LGFEDIT, "Bro&wse...", IDC_LGFBUTTON); + statictext(&cp, "(Log file name can contain &&Y, &&M, &&D for date," + " &&T for time, and &&H for host name)", 2, IDC_LGFEXPLAIN); radiobig(&cp, "What to do if the log file already &exists:", IDC_LSTATXIST, "Always overwrite it", IDC_LSTATXOVR, @@ -973,7 +976,7 @@ static void create_controls(HWND hwnd, int dlgtype, int panel) IDC_BELLOVLTSTATIC, IDC_BELLOVLT, 20); statictext(&cp, "The bell is re-enabled after a few seconds of silence.", - IDC_BELLOVLEXPLAIN); + 1, IDC_BELLOVLEXPLAIN); staticedit(&cp, "Seconds of &silence required", IDC_BELLOVLSSTATIC, IDC_BELLOVLS, 20); endbox(&cp); diff --git a/winstuff.h b/winstuff.h index ccb246bd..21560ba9 100644 --- a/winstuff.h +++ b/winstuff.h @@ -52,7 +52,7 @@ void radioline(struct ctlpos *cp, char *text, int id, int nacross, ...); void bareradioline(struct ctlpos *cp, int nacross, ...); void radiobig(struct ctlpos *cp, char *text, int id, ...); void checkbox(struct ctlpos *cp, char *text, int id); -void statictext(struct ctlpos *cp, char *text, int id); +void statictext(struct ctlpos *cp, char *text, int lines, int id); void staticbtn(struct ctlpos *cp, char *stext, int sid, char *btext, int bid); void static2btn(struct ctlpos *cp, char *stext, int sid, -- 2.11.0