X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/5a16642f8f65648cfe923ecf4b54afa1bb4866df..2ed9fb8a1161813bd21e396475d4810f27fac7eb:/terminal.c diff --git a/terminal.c b/terminal.c index a63d8be8..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. @@ -3082,11 +3083,18 @@ void term_mouse(Mouse_Button b, Mouse_Action a, int x, int y, { pos selpoint; unsigned long *ldata; + int raw_mouse = xterm_mouse && !(cfg.mouse_override && shift); - if (y < 0) + if (y < 0) { y = 0; - if (y >= rows) + if (a == MA_DRAG && !raw_mouse) + term_scroll(0, -1); + } + if (y >= rows) { y = rows - 1; + if (a == MA_DRAG && !raw_mouse) + term_scroll(0, +1); + } if (x < 0) { if (y > 0) { x = cols - 1; @@ -3103,7 +3111,7 @@ void term_mouse(Mouse_Button b, Mouse_Action a, int x, int y, if ((ldata[cols] & LATTR_MODE) != LATTR_NORM) selpoint.x /= 2; - if (xterm_mouse && !(cfg.mouse_override && shift)) { + if (raw_mouse) { int encstate = 0, r, c; char abuf[16]; static int is_down = 0; @@ -3329,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 */ @@ -3354,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); } @@ -3382,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'; +}