/* * ESC [ ... was seen the last time. Process next character. */ static void state2(int c) { short x, y, attr, f; char temp[32]; /* See if a number follows */ if (c >= '0' && c <= '9') { escparms[ptr] = 10*escparms[ptr] + c - '0'; return; } /* Separation between numbers ? */ if (c == ';') { if (ptr < 15) ptr++; return; } /* ESC [ ? sequence */ if (escparms[0] == 0 && ptr == 0 && c == '?') { esc_s = 3; return; } /* Process functions with zero, one, two or more arguments */ switch (c) { case 'A': case 'B': case 'C': case 'D': /* Cursor motion */ if ((f = escparms[0]) == 0) f = 1; x = vt_win->curx; y = vt_win->cury; x += f * ((c == 'C') - (c == 'D')); if (x < 0) x = 0; if (x >= vt_win->xs) x = vt_win->xs - 1; if (c == 'B') { /* Down. */ y += f; if (y >= vt_win->ys) y = vt_win->ys - 1; if (y >= newy2 + 1) y = newy2; } if (c == 'A') { /* Up. */ y -= f; if (y < 0) y = 0; if (y <= newy1 - 1) y = newy1; } mc_wlocate(vt_win, x, y); break; case 'X': /* Character erasing (ECH) */ if ((f = escparms[0]) == 0) f = 1; mc_wclrch(vt_win, f); break; case 'K': /* Line erasing */ switch (escparms[0]) { case 0: mc_wclreol(vt_win); break; case 1: mc_wclrbol(vt_win); break; case 2: mc_wclrel(vt_win); break; } break; case 'J': /* Screen erasing */ x = vt_win->color; y = vt_win->attr; if (vt_type == ANSI) { mc_wsetattr(vt_win, XA_NORMAL); mc_wsetfgcol(vt_win, WHITE); mc_wsetbgcol(vt_win, BLACK); } switch (escparms[0]) { case 0: mc_wclreos(vt_win); break; case 1: mc_wclrbos(vt_win); break; case 2: mc_winclr(vt_win); break; } if (vt_type == ANSI) { vt_win->color = x; vt_win->attr = y; } break; case 'n': /* Requests / Reports */ switch(escparms[0]) { case 5: /* Status */ v_termout("\033[0n", 0); break; case 6: /* Cursor Position */ sprintf(temp, "\033[%d;%dR", vt_win->cury + 1, vt_win->curx + 1); v_termout(temp, 0); break; } break; case 'c': /* Identify Terminal Type */ if (vt_type == VT100) { v_termout("\033[?1;2c", 0); break; } v_termout("\033[?c", 0); break; case 'x': /* Request terminal parameters. */ /* Always answers 19200-8N1 no options. */ sprintf(temp, "\033[%c;1;1;120;120;1;0x", escparms[0] == 1 ? '3' : '2'); v_termout(temp, 0); break; case 's': /* Save attributes and cursor position */ savex = vt_win->curx; savey = vt_win->cury; saveattr = vt_win->attr; savecol = vt_win->color; #if TRANSLATE savecharset = vt_charset; savetrans[0] = vt_trans[0]; savetrans[1] = vt_trans[1]; #endif break; case 'u': /* Restore them */ #if TRANSLATE vt_charset = savecharset; vt_trans[0] = savetrans[0]; vt_trans[1] = savetrans[1]; #endif vt_win->color = savecol; /* HACK should use mc_wsetfgcol etc */ mc_wsetattr(vt_win, saveattr); mc_wlocate(vt_win, savex, savey); break; case 'h': ansi_mode(1); break; case 'l': ansi_mode(0); break; case 'H': case 'f': /* Set cursor position */ if ((y = escparms[0]) == 0) y = 1; if ((x = escparms[1]) == 0) x = 1; if (vt_om) y += newy1; mc_wlocate(vt_win, x - 1, y - 1); break; case 'g': /* Clear tab stop(s) */ if (escparms[0] == 0) { x = vt_win->curx; if (x > 159) x = 159; vt_tabs[x / 32] &= ~(1 << x % 32); } if (escparms[0] == 3) for(x = 0; x < 5; x++) vt_tabs[x] = 0; break; case 'm': /* Set attributes */ attr = mc_wgetattr((vt_win)); for (f = 0; f <= ptr; f++) { if (escparms[f] >= 30 && escparms[f] <= 37) mc_wsetfgcol(vt_win, escparms[f] - 30); if (escparms[f] >= 40 && escparms[f] <= 47) mc_wsetbgcol(vt_win, escparms[f] - 40); switch (escparms[f]) { case 0: attr = XA_NORMAL; mc_wsetfgcol(vt_win, vt_fg); mc_wsetbgcol(vt_win, vt_bg); break; case 1: attr |= XA_BOLD; break; case 4: attr |= XA_UNDERLINE; break; case 5: attr |= XA_BLINK; break; case 7: attr |= XA_REVERSE; break; case 22: /* Bold off */ attr &= ~XA_BOLD; break; case 24: /* Not underlined */ attr &=~XA_UNDERLINE; break; case 25: /* Not blinking */ attr &= ~XA_BLINK; break; case 27: /* Not reverse */ attr &= ~XA_REVERSE; break; case 39: /* Default fg color */ mc_wsetfgcol(vt_win, vt_fg); break; case 49: /* Default bg color */ mc_wsetbgcol(vt_win, vt_bg); break; } } mc_wsetattr(vt_win, attr); break; case 'L': /* Insert lines */ if ((x = escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) mc_winsline(vt_win); break; case 'M': /* Delete lines */ if ((x = escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) mc_wdelline(vt_win); break; case 'P': /* Delete Characters */ if ((x = escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) mc_wdelchar(vt_win); break; case '@': /* Insert Characters */ if ((x = escparms[0]) == 0) x = 1; for (f = 0; f < x; f++) mc_winschar(vt_win); break; case 'r': /* Set scroll region */ if ((newy1 = escparms[0]) == 0) newy1 = 1; if ((newy2 = escparms[1]) == 0) newy2 = vt_win->ys; newy1-- ; newy2--; if (newy1 < 0) newy1 = 0; if (newy2 < 0) newy2 = 0; if (newy1 >= vt_win->ys) newy1 = vt_win->ys - 1; if (newy2 >= vt_win->ys) newy2 = vt_win->ys - 1; if (newy1 >= newy2) { newy1 = 0; newy2 = vt_win->ys - 1; } mc_wsetregion(vt_win, newy1, newy2); mc_wlocate(vt_win, 0, newy1); break; case 'i': /* Printing */ case 'y': /* Self test modes */ default: /* IGNORED */ break; } /* Ok, our escape sequence is all done */ esc_s = 0; ptr = 0; memset(escparms, 0, sizeof(escparms)); return; }
/* * Run an external script. * ask = 1 if first ask for confirmation. * s = scriptname, l=loginname, p=password. */ void runscript(int ask, const char *s, const char *l, const char *p) { int status; int n, i; int pipefd[2]; char buf[81]; char scr_lines[5]; char cmdline[128]; struct pollfd fds[2]; char *translated_cmdline; char *ptr; WIN *w; int done = 0; char *msg = _("Same as last"); char *username = _(" A - Username :"******" B - Password :"******" C - Name of script :"), *question = _("Change which setting? (Return to run, ESC to stop)"); if (ask) { w = mc_wopen(10, 5, 70, 10, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1); mc_wtitle(w, TMID, _("Run a script")); mc_wputs(w, "\n"); mc_wprintf(w, "%s %s\n", username, scr_user[0] ? msg : ""); mc_wprintf(w, "%s %s\n", password, scr_passwd[0] ? msg : ""); mc_wprintf(w, "%s %s\n", name_of_script, scr_name); mc_wlocate(w, 4, 5); mc_wputs(w, question); mc_wredraw(w, 1); while (!done) { mc_wlocate(w, mbslen (question) + 5, 5); n = wxgetch(); if (islower(n)) n = toupper(n); switch (n) { case '\r': case '\n': if (scr_name[0] == '\0') { mc_wbell(); break; } mc_wclose(w, 1); done = 1; break; case 27: /* ESC */ mc_wclose(w, 1); return; case 'A': mc_wlocate(w, mbslen (username) + 1, 1); mc_wclreol(w); scr_user[0] = 0; mc_wgets(w, scr_user, 32, 32); break; case 'B': mc_wlocate(w, mbslen (password) + 1, 2); mc_wclreol(w); scr_passwd[0] = 0; mc_wgets(w, scr_passwd, 32, 32); break; case 'C': mc_wlocate(w, mbslen (name_of_script) + 1, 3); mc_wgets(w, scr_name, 32, 32); break; default: break; } } } else { strncpy(scr_user, l, sizeof(scr_user)); strncpy(scr_name, s, sizeof(scr_name)); strncpy(scr_passwd, p, sizeof(scr_passwd)); } sprintf(scr_lines, "%d", (int) lines); /* jl 13.09.97 */ /* Throw away status line if temporary */ if (tempst) { mc_wclose(st, 1); tempst = 0; st = NULL; } scriptname(scr_name); pipe(pipefd); if (mcd(P_SCRIPTDIR) < 0) return; snprintf(cmdline, sizeof(cmdline), "%s %s %s %s", P_SCRIPTPROG, scr_name, logfname, logfname[0]==0? "": homedir); switch (udpid = fork()) { case -1: werror(_("Out of memory: could not fork()")); close(pipefd[0]); close(pipefd[1]); mcd(""); return; case 0: /* Child */ dup2(portfd, 0); dup2(portfd, 1); dup2(pipefd[1], 2); close(pipefd[0]); close(pipefd[1]); for (n = 1; n < _NSIG; n++) signal(n, SIG_DFL); mc_setenv("LOGIN", scr_user); mc_setenv("PASS", scr_passwd); mc_setenv("TERMLIN", scr_lines); /* jl 13.09.97 */ translated_cmdline = translate(cmdline); if (translated_cmdline != NULL) { fastexec(translated_cmdline); free(translated_cmdline); } exit(1); default: /* Parent */ break; } setcbreak(1); /* Cbreak, no echo */ enab_sig(1, 0); /* But enable SIGINT */ signal(SIGINT, udcatch); close(pipefd[1]); /* pipe output from "runscript" program to terminal emulator */ fds[0].fd = pipefd[0]; /* runscript */ fds[0].events = POLLIN; fds[1].fd = STDIN_FILENO; /* stdin */ fds[1].events = POLLIN; script_running = 1; while (script_running && poll(fds, 2, -1) > 0) for (i = 0; i < 2; i++) { if (fds[i].revents & (POLLERR | POLLHUP | POLLNVAL)) script_running = 0; else if ((fds[i].revents & POLLIN) && (n = read(fds[i].fd, buf, sizeof(buf)-1)) > 0) { ptr = buf; while (n--) if (i) vt_send(*ptr++); else vt_out(*ptr++); timer_update(); mc_wflush(); } } /* Collect status, and clean up. */ m_wait(&status); enab_sig(0, 0); signal(SIGINT, SIG_IGN); setcbreak(2); /* Raw, no echo */ close(pipefd[0]); scriptname(""); mcd(""); }