from_backend() should always be called with len > 0. Only rlogin
[u/mdw/putty] / terminal.c
index 7f6f8bb..d76d734 100644 (file)
@@ -206,10 +206,6 @@ static void erase_lots(int, int, int);
 static void swap_screen(int);
 static void update_sbar(void);
 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.
@@ -1955,11 +1951,107 @@ void term_out(void)
                         * illegal values (eg first arg 1..9) for window changing 
                         * and reports.
                         */
-                       compatibility(VT340TEXT);
                        if (esc_nargs <= 1
                            && (esc_args[0] < 1 || esc_args[0] >= 24)) {
+                           compatibility(VT340TEXT);
                            request_resize(cols, def(esc_args[0], 24));
                            deselect();
+                       } else if (esc_nargs >= 1 &&
+                                  esc_args[0] >= 1 &&
+                                  esc_args[0] < 24) {
+                           compatibility(OTHER);
+
+                           switch (esc_args[0]) {
+                               int x, y, len;
+                               char buf[80], *p;
+                             case 1:
+                               set_iconic(FALSE);
+                               break;
+                             case 2:
+                               set_iconic(TRUE);
+                               break;
+                             case 3:
+                               if (esc_nargs >= 3) {
+                                   move_window(def(esc_args[1], 0),
+                                               def(esc_args[2], 0));
+                               }
+                               break;
+                             case 4:
+                               /* We should resize the window to a given
+                                * size in pixels here, but currently our
+                                * resizing code isn't healthy enough to
+                                * manage it. */
+                               break;
+                             case 5:
+                               set_zorder(TRUE);   /* move to top */
+                               break;
+                             case 6:
+                               set_zorder(FALSE);  /* move to bottom */
+                               break;
+                             case 7:
+                               refresh_window();
+                               break;
+                             case 8:
+                               if (esc_nargs >= 3) {
+                                   request_resize(def(esc_args[2], cfg.width),
+                                                  def(esc_args[1], cfg.height));
+                               }
+                               break;
+                             case 9:
+                               if (esc_nargs >= 2)
+                                   set_zoomed(esc_args[1] ? TRUE : FALSE);
+                               break;
+                             case 11:
+                               ldisc_send(is_iconic() ? "\033[1t" : "\033[2t",
+                                          4, 0);
+                               break;
+                             case 13:
+                               get_window_pos(&x, &y);
+                               len = sprintf(buf, "\033[3;%d;%dt", x, y);
+                               ldisc_send(buf, len, 0);
+                               break;
+                             case 14:
+                               get_window_pixels(&x, &y);
+                               len = sprintf(buf, "\033[4;%d;%dt", x, y);
+                               ldisc_send(buf, len, 0);
+                               break;
+                             case 18:
+                               len = sprintf(buf, "\033[8;%d;%dt",
+                                             rows, cols);
+                               ldisc_send(buf, len, 0);
+                               break;
+                             case 19:
+                               /*
+                                * Hmmm. Strictly speaking we
+                                * should return `the size of the
+                                * screen in characters', but
+                                * that's not easy: (a) window
+                                * furniture being what it is it's
+                                * hard to compute, and (b) in
+                                * resize-font mode maximising the
+                                * window wouldn't change the
+                                * number of characters. *shrug*. I
+                                * think we'll ignore it for the
+                                * moment and see if anyone
+                                * complains, and then ask them
+                                * what they would like it to do.
+                                */
+                               break;
+                             case 20:
+                               p = get_window_title(TRUE);
+                               len = strlen(p);
+                               ldisc_send("\033]L", 3, 0);
+                               ldisc_send(p, len, 0);
+                               ldisc_send("\033\\", 2, 0);
+                               break;
+                             case 21:
+                               p = get_window_title(FALSE);
+                               len = strlen(p);
+                               ldisc_send("\033]l", 3, 0);
+                               ldisc_send(p, len, 0);
+                               ldisc_send("\033\\", 2, 0);
+                               break;
+                           }
                        }
                        break;
                      case 'S':
@@ -3511,6 +3603,8 @@ int term_ldisc(int option)
  */
 int from_backend(int is_stderr, char *data, int len)
 {
+    assert(len > 0);
+
     bufchain_add(&inbuf, data, len);
 
     /*
@@ -3534,138 +3628,3 @@ int from_backend(int is_stderr, char *data, int len)
      */
     return 0;
 }
-
-/*
- * Log session traffic.
- */
-void logtraffic(unsigned char c, int logmode)
-{
-    if (cfg.logtype > 0) {
-       if (cfg.logtype == logmode) {
-           /* deferred open file from pgm start? */
-           if (!lgfp)
-               logfopen();
-           if (lgfp)
-               fputc(c, lgfp);
-       }
-    }
-}
-
-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;
-    char writemod[4];
-
-    if (!cfg.logtype)
-       return;
-    sprintf(writemod, "wb");          /* default to rewrite */
-
-    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(currlogfilename);
-       if (i == 1)
-           writemod[0] = 'a';         /* set append mode */
-       else if (i == 0) {             /* cancelled */
-           lgfp = NULL;
-           cfg.logtype = 0;           /* disable logging */
-           return;
-       }
-    }
-
-    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, currlogfilename, 128);
-       buf[strlen(buf)] = '\0';
-       logevent(buf);
-
-       /* --- write header line into log file */
-       fputs("=~=~=~=~=~=~=~=~=~=~=~= PuTTY log ", lgfp);
-       strftime(buf, 24, "%Y.%m.%d %H:%M:%S", &tm);
-       fputs(buf, lgfp);
-       fputs(" =~=~=~=~=~=~=~=~=~=~=~=\r\n", lgfp);
-    }
-}
-
-void logfclose(void)
-{
-    if (lgfp) {
-       fclose(lgfp);
-       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';
-}