📄 semisc.c
字号:
/* * This file is part of the Seyon, Copyright (c) 1992-1993 by Muhammad M. * Saggaf. All rights reserved. * * See the file COPYING (1-COPYING) or the manual page seyon(1) for a full * statement of rights and permissions for this program. */#include <X11/Intrinsic.h>#include <X11/StringDefs.h>#include <X11/Xaw/Dialog.h>#include <signal.h>#include <sys/types.h>#include <sys/wait.h>#include "seyon.h"#include "SeDecl.h"#include "SeSig.h"extern int scriptToMainPipe[];extern pid_t readProcPid;void SendBreak(), terminal_refresh(), LocalShell(), ToggleCapture(), kill_handler(), DivertFile(), DoDivertFile(), ExecDivertFile(), RunScript(), DoRunScript(), ExecScript();char captureFile[REG_BUF];Boolean capture = False;FILE *cfp;voidTopMisc(widget) Widget widget;{ void DialogDisplayFile(), DialogEditFile(), DialogRunScript(); Widget popup, mBox, uBox, lBox, toggle; ErrorIfBusy(); XtVaSetValues(widget, XtNsensitive, False, NULL); popup = AddSimplePopup("misc", widget); XtAddCallback(popup, XtNdestroyCallback, SetSensitiveOn, widget); mBox = SeAddPaned("mBox", popup); uBox = SeAddBox("uBox", mBox); lBox = SeAddBox("lBox", mBox); SeAddButton("break", uBox, SendBreak); SeAddButton("refresh", uBox, terminal_refresh); SeAddButton("suspend", uBox, LocalShell); toggle = SeAddToggle("capture", uBox, ToggleCapture); SeAddButton("divert", uBox, DivertFile); AddButton("script", uBox, DialogRunScript, NULL); AddButton("editFile", uBox, DialogEditFile, NULL); AddButton("displayFile", uBox, DialogDisplayFile, NULL); AddButton("dismiss", lBox, DestroyShell, NULL); SeSetUnsetToggle(toggle, capture); PositionShell(popup, widget, SHELLPOS_HWFH); XtPopup(popup, XtGrabNone);}voidSendBreak(widget) Widget widget;{ ErrorIfBusy(); send_break(); SeyonMessage("BREAK Sent to Remote Host");}voidterminal_refresh(widget) Widget widget;{ ErrorIfBusy(); RestartTerminal(); SeyonMessage("Terminal Process Refreshed");}voidLocalShell(widget) Widget widget;{ ErrorIfBusy(); ShellCommand(""); SeyonMessage("Terminal Suspended");}voidToggleCapture(widget) Widget widget;{ ErrorIfBusy(); DoToggleCapture(); SeSetUnsetToggle(widget, capture); RestartTerminal();}BooleanDoToggleCapture(){ if (capture) { fclose(cfp); capture = False; SeyonMessage("Capture Turned OFF"); } else { if ((cfp = fopen(captureFile, "a")) == NULL) { SeyonMessagef("Unable to Open Capture File `%s'", captureFile, "", ""); return False; } else { capture = True; SeyonMessage("Capture Turned ON"); } } return True;}/* * DivertFile: uploads a text file. */voidDivertFile(widget) Widget widget;{ ErrorIfBusy(); SePopupDialogGetStringE("divert_name", widget, DoDivertFile, NULL, NULL, True);}voiddivert_action_ok(widget) Widget widget;{ DoDivertFile(widget);}voidDoDivertFile(widget) Widget widget;{ Widget dialog = XtParent(widget); String file_name; file_name = XawDialogGetValueString(dialog); DestroyShell(dialog); ExecDivertFile(XtParent(GetShell(widget)), file_name);}voiddivert_handler(#if NeedFunctionPrototypes int signo, XtPointer client_data#endif){#if defined(SUNOS_3) || defined(Mips) union wait status;#else int status;#endif if (wait(&status) < 0) {SePError("Divert wait failed"); return;} XoAppIgnoreSignal(app_con, SIGCHLD);#if defined(SUNOS_3) || defined(Mips) switch (status.w_retcode) {#else switch (WEXITSTATUS(status)) {#endif case 0: SeyonMessage("Text Upload Successful"); break; case 10: SeyonMessage("Text Upload Canceled"); break; } inhibit_child = False; PostProcessPrep();}voidkilldivert_handler(#if NeedFunctionPrototypes int signo#endif){ signal(SIGTERM, SIG_IGN); if (readProcPid && kill(readProcPid, SIGTERM) == 0) while(wait((int*)0) < 0); exit(10);}voidExecDivertFile(widget, file_name) Widget widget; String file_name;{ char fullname[REG_BUF]; FILE *fp; int c; expand_fname(file_name, fullname); if ((fp = fopen(fullname, "r")) == NULL) { SeyonMessagef("Unable to Open File `%s'", file_name, "", ""); PopupError("errFileAccess", widget); return; } inhibit_child = True; SeyonMessagef("Uploading Text File '%s'...", file_name, "", ""); PreProcessPrep(); XoAppAddSignal(app_con, SIGCHLD, divert_handler, NULL); if ((w_child_pid = SeFork()) == 0) { signal(SIGTERM, killdivert_handler); if ((readProcPid = SeFork()) == 0) PortToTty(); while ((c = getc(fp)) != EOF) { send_tbyte(c); if (c == '\r' || c == '\n') usleep(MDELAY); } fclose(fp); if (readProcPid && kill(readProcPid, SIGTERM) == 0) while(wait((int*)0) < 0); exit(0); }}/* * run a script */voidScriptHandler(#if NeedFunctionPrototypes int signo, XtPointer client_data#endif){ int TerminalRefreshParameters();#if defined(SUNOS_3) || defined(Mips) union wait status;#else int status;#endif if (wait(&status) < 0) {SePError("Script wait failed"); return;} XoAppRemoveSignal(XtWidgetToApplicationContext(topLevel), SIGCHLD);#if defined(SUNOS_3) || defined(Mips) switch (status.w_retcode) {#else switch (WEXITSTATUS(status)) {#endif case 0: SeyonMessage("Script Completed"); break; case 1: SeyonMessage("Script Execution Failed"); break; case 10: SeyonMessage("Script Canceled by User"); get_modem_attr(); break; } inhibit_child = False; PostProcessPrep(); TerminalRefreshParameters(); }voidKillScriptHandler(#if NeedFunctionPrototypes int signo#endif){ int PutParameters(); signal(SIGTERM, SIG_IGN); PutParameters(scriptToMainPipe); exit(10);}voidRunScript(parent, scriptName) Widget parent; /* Not used. Can be NULL */ String scriptName;{ int PutParameters(); int scriptRet; ErrorIfBusy(); inhibit_child = True; SeyonMessage(FmtString("Running Script ``%s''...", scriptName, "", "")); PreProcessPrep(); XoAppAddSignal(XtWidgetToApplicationContext(topLevel), SIGCHLD, ScriptHandler, NULL); if ((w_child_pid = SeFork()) == 0) { signal(SIGTERM, KillScriptHandler); scriptRet = (int)do_script(scriptName); PutParameters(scriptToMainPipe); exit(scriptRet ? 0 : 1); }}voidDialogRunScript(widget) Widget widget;{ void GetValueByPopup(); ErrorIfBusy(); linkflag = 0; GetValueByPopup(widget, "dialogScriptName", RunScript);}void ExecExit(){ s_exit();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -