Roman Pompejus's patch (heavily hacked) for parametric log file
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 9 Sep 2001 09:58:20 +0000 (09:58 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 9 Sep 2001 09:58:20 +0000 (09:58 +0000)
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
winctrls.c
windlg.c
winstuff.h

index 5b8a183..9fc1787 100644 (file)
@@ -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" : "<ukwn>"));
        /* 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":<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';
+}
index 72550d0..eb082f3 100644 (file)
@@ -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);
 }
index f15e385..7726438 100644 (file)
--- 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);
index ccb246b..21560ba 100644 (file)
@@ -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,