mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-04-22 13:35:03 -05:00
Roman Pompejus's patch (heavily hacked) for parametric log file
names with date, time and hostname automatically embedded. [originally from svn r1255]
This commit is contained in:
parent
b5dcdf7fc8
commit
d27684019b
84
terminal.c
84
terminal.c
@ -201,6 +201,7 @@ static void deselect(void);
|
|||||||
/* log session to file stuff ... */
|
/* log session to file stuff ... */
|
||||||
static FILE *lgfp = NULL;
|
static FILE *lgfp = NULL;
|
||||||
static void logtraffic(unsigned char c, int logmode);
|
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.
|
* 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 */
|
/* open log file append/overwrite mode */
|
||||||
void logfopen(void)
|
void logfopen(void)
|
||||||
{
|
{
|
||||||
char buf[256];
|
char buf[256];
|
||||||
time_t t;
|
time_t t;
|
||||||
struct tm *tm;
|
struct tm tm;
|
||||||
char writemod[4];
|
char writemod[4];
|
||||||
|
|
||||||
if (!cfg.logtype)
|
if (!cfg.logtype)
|
||||||
return;
|
return;
|
||||||
sprintf(writemod, "wb"); /* default to rewrite */
|
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) {
|
if (lgfp) {
|
||||||
int i;
|
int i;
|
||||||
fclose(lgfp);
|
fclose(lgfp);
|
||||||
i = askappend(cfg.logfilename);
|
i = askappend(currlogfilename);
|
||||||
if (i == 1)
|
if (i == 1)
|
||||||
writemod[0] = 'a'; /* set append mode */
|
writemod[0] = 'a'; /* set append mode */
|
||||||
else if (i == 0) { /* cancelled */
|
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 */
|
if (lgfp) { /* enter into event log */
|
||||||
sprintf(buf, "%s session log (%s mode) to file : ",
|
sprintf(buf, "%s session log (%s mode) to file : ",
|
||||||
(writemod[0] == 'a') ? "Appending" : "Writing new",
|
(writemod[0] == 'a') ? "Appending" : "Writing new",
|
||||||
(cfg.logtype == LGTYP_ASCII ? "ASCII" :
|
(cfg.logtype == LGTYP_ASCII ? "ASCII" :
|
||||||
cfg.logtype == LGTYP_DEBUG ? "raw" : "<ukwn>"));
|
cfg.logtype == LGTYP_DEBUG ? "raw" : "<ukwn>"));
|
||||||
/* Make sure we do not exceed the output buffer size */
|
/* Make sure we do not exceed the output buffer size */
|
||||||
strncat(buf, cfg.logfilename, 128);
|
strncat(buf, currlogfilename, 128);
|
||||||
buf[strlen(buf)] = '\0';
|
buf[strlen(buf)] = '\0';
|
||||||
logevent(buf);
|
logevent(buf);
|
||||||
|
|
||||||
/* --- write header line iinto log file */
|
/* --- write header line into log file */
|
||||||
fputs("=~=~=~=~=~=~=~=~=~=~=~= PuTTY log ", lgfp);
|
fputs("=~=~=~=~=~=~=~=~=~=~=~= PuTTY log ", lgfp);
|
||||||
time(&t);
|
strftime(buf, 24, "%Y.%m.%d %H:%M:%S", &tm);
|
||||||
tm = localtime(&t);
|
|
||||||
strftime(buf, 24, "%Y.%m.%d %H:%M:%S", tm);
|
|
||||||
fputs(buf, lgfp);
|
fputs(buf, lgfp);
|
||||||
fputs(" =~=~=~=~=~=~=~=~=~=~=~=\r\n", lgfp);
|
fputs(" =~=~=~=~=~=~=~=~=~=~=~=\r\n", lgfp);
|
||||||
}
|
}
|
||||||
@ -3389,3 +3401,57 @@ void logfclose(void)
|
|||||||
lgfp = NULL;
|
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":<hostname> "&&":&
|
||||||
|
*/
|
||||||
|
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';
|
||||||
|
}
|
||||||
|
@ -315,14 +315,14 @@ void checkbox(struct ctlpos *cp, char *text, int id)
|
|||||||
/*
|
/*
|
||||||
* A single standalone static text control.
|
* 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;
|
RECT r;
|
||||||
|
|
||||||
r.left = GAPBETWEEN;
|
r.left = GAPBETWEEN;
|
||||||
r.top = cp->ypos;
|
r.top = cp->ypos;
|
||||||
r.right = cp->width;
|
r.right = cp->width;
|
||||||
r.bottom = STATICHEIGHT;
|
r.bottom = STATICHEIGHT * lines;
|
||||||
cp->ypos += r.bottom + GAPBETWEEN;
|
cp->ypos += r.bottom + GAPBETWEEN;
|
||||||
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, id);
|
doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, id);
|
||||||
}
|
}
|
||||||
|
5
windlg.c
5
windlg.c
@ -259,6 +259,7 @@ enum { IDCX_ABOUT =
|
|||||||
IDC_LGFSTATIC,
|
IDC_LGFSTATIC,
|
||||||
IDC_LGFEDIT,
|
IDC_LGFEDIT,
|
||||||
IDC_LGFBUTTON,
|
IDC_LGFBUTTON,
|
||||||
|
IDC_LGFEXPLAIN,
|
||||||
IDC_LSTATXIST,
|
IDC_LSTATXIST,
|
||||||
IDC_LSTATXOVR,
|
IDC_LSTATXOVR,
|
||||||
IDC_LSTATXAPN,
|
IDC_LSTATXAPN,
|
||||||
@ -907,6 +908,8 @@ static void create_controls(HWND hwnd, int dlgtype, int panel)
|
|||||||
editbutton(&cp, "Log &file name:",
|
editbutton(&cp, "Log &file name:",
|
||||||
IDC_LGFSTATIC, IDC_LGFEDIT, "Bro&wse...",
|
IDC_LGFSTATIC, IDC_LGFEDIT, "Bro&wse...",
|
||||||
IDC_LGFBUTTON);
|
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,
|
radiobig(&cp,
|
||||||
"What to do if the log file already &exists:",
|
"What to do if the log file already &exists:",
|
||||||
IDC_LSTATXIST, "Always overwrite it", IDC_LSTATXOVR,
|
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);
|
IDC_BELLOVLTSTATIC, IDC_BELLOVLT, 20);
|
||||||
statictext(&cp,
|
statictext(&cp,
|
||||||
"The bell is re-enabled after a few seconds of silence.",
|
"The bell is re-enabled after a few seconds of silence.",
|
||||||
IDC_BELLOVLEXPLAIN);
|
1, IDC_BELLOVLEXPLAIN);
|
||||||
staticedit(&cp, "Seconds of &silence required", IDC_BELLOVLSSTATIC,
|
staticedit(&cp, "Seconds of &silence required", IDC_BELLOVLSSTATIC,
|
||||||
IDC_BELLOVLS, 20);
|
IDC_BELLOVLS, 20);
|
||||||
endbox(&cp);
|
endbox(&cp);
|
||||||
|
@ -52,7 +52,7 @@ void radioline(struct ctlpos *cp, char *text, int id, int nacross, ...);
|
|||||||
void bareradioline(struct ctlpos *cp, int nacross, ...);
|
void bareradioline(struct ctlpos *cp, int nacross, ...);
|
||||||
void radiobig(struct ctlpos *cp, char *text, int id, ...);
|
void radiobig(struct ctlpos *cp, char *text, int id, ...);
|
||||||
void checkbox(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,
|
void staticbtn(struct ctlpos *cp, char *stext, int sid,
|
||||||
char *btext, int bid);
|
char *btext, int bid);
|
||||||
void static2btn(struct ctlpos *cp, char *stext, int sid,
|
void static2btn(struct ctlpos *cp, char *stext, int sid,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user