summaryrefslogtreecommitdiff
path: root/pico/osdep/shell.c
diff options
context:
space:
mode:
authorEduardo Chappa <echappa@gmx.com>2013-02-03 00:59:38 -0700
committerEduardo Chappa <echappa@gmx.com>2013-02-03 00:59:38 -0700
commit094ca96844842928810f14844413109fc6cdd890 (patch)
treee60efbb980f38ba9308ccb4fb2b77b87bbc115f3 /pico/osdep/shell.c
downloadalpine-094ca96844842928810f14844413109fc6cdd890.tar.xz
Initial Alpine Version
Diffstat (limited to 'pico/osdep/shell.c')
-rw-r--r--pico/osdep/shell.c171
1 files changed, 171 insertions, 0 deletions
diff --git a/pico/osdep/shell.c b/pico/osdep/shell.c
new file mode 100644
index 00000000..cdb701dd
--- /dev/null
+++ b/pico/osdep/shell.c
@@ -0,0 +1,171 @@
+#if !defined(lint) && !defined(DOS)
+static char rcsid[] = "$Id: shell.c 807 2007-11-09 01:21:33Z hubert@u.washington.edu $";
+#endif
+
+/*
+ * ========================================================================
+ * Copyright 2006-2007 University of Washington
+ * Copyright 2013 Eduardo Chappa
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * ========================================================================
+ */
+
+
+#include <system.h>
+#include <general.h>
+
+#include "../estruct.h"
+#include "../mode.h"
+#include "../pico.h"
+#include "../edef.h"
+#include "../efunc.h"
+#include "../keydefs.h"
+
+#include "tty.h"
+#include "signals.h"
+
+#ifdef _WINDOWS
+#include "mswin.h"
+#endif
+
+#include "shell.h"
+
+
+
+/* internal prototypes */
+#ifdef SIGCONT
+RETSIGTYPE rtfrmshell(int);
+#endif
+
+
+
+#ifdef SIGTSTP
+/*
+ * bktoshell - suspend and wait to be woken up
+ */
+int
+bktoshell(int f, int n)
+{
+ UCS z = CTRL | 'Z';
+
+ if(!(gmode&MDSSPD)){
+ unknown_command(z);
+ return(FALSE);
+ }
+
+ if(Pmaster){
+ if(!Pmaster->suspend){
+ unknown_command(z);
+ return(FALSE);
+ }
+
+ if((*Pmaster->suspend)() == NO_OP_COMMAND){
+ int rv;
+
+ if(km_popped){
+ term.t_mrow = 2;
+ curwp->w_ntrows -= 2;
+ }
+
+ clearcursor();
+ mlerase();
+ rv = (*Pmaster->showmsg)('x');
+ ttresize();
+ picosigs();
+ if(rv) /* Did showmsg corrupt the display? */
+ pico_refresh(0, 1); /* Yes, repaint */
+
+ mpresf = 1;
+ if(km_popped){
+ term.t_mrow = 0;
+ curwp->w_ntrows += 2;
+ }
+ }
+ else{
+ ttresize();
+ pclear(0, term.t_nrow);
+ pico_refresh(0, 1);
+ }
+
+ return(TRUE);
+ }
+
+ if(gmode&MDSPWN){
+ char *shell;
+ int dummy;
+
+ vttidy();
+ movecursor(0, 0);
+ (*term.t_eeop)();
+ printf("\n\n\nUse \"exit\" to return to Pi%s\n",
+ (gmode & MDBRONLY) ? "lot" : "co");
+ system((shell = (char *)getenv("SHELL")) ? shell : "/bin/csh");
+ rtfrmshell(dummy); /* fixup tty */
+ }
+ else {
+ movecursor(term.t_nrow-1, 0);
+ peeol();
+ movecursor(term.t_nrow, 0);
+ peeol();
+ movecursor(term.t_nrow, 0);
+ printf("\n\n\nUse \"fg\" to return to Pi%s\n",
+ (gmode & MDBRONLY) ? "lot" : "co");
+ ttclose();
+ movecursor(term.t_nrow, 0);
+ peeol();
+ (*term.t_flush)();
+
+ signal(SIGCONT, rtfrmshell); /* prepare to restart */
+ signal(SIGTSTP, SIG_DFL); /* prepare to stop */
+ kill(0, SIGTSTP);
+ }
+
+ return(TRUE);
+}
+#else
+#ifdef _WINDOWS
+int
+bktoshell(int f, int n)
+{
+ UCS z = CTRL | 'Z';
+
+ if(!(gmode&MDSSPD)){
+ unknown_command(z);
+ return(FALSE);
+ }
+ if(Pmaster){
+ if(!Pmaster->suspend){
+ unknown_command(z);
+ return(FALSE);
+ }
+ (*Pmaster->suspend)();
+ return(TRUE);
+ }
+
+ mswin_minimize();
+ return(TRUE);
+}
+#endif /* _WINDOWS */
+
+#endif /* SIGTSTP */
+
+#ifdef SIGCONT
+/*
+ * rtfrmshell - back from shell, fix modes and return
+ */
+RETSIGTYPE
+rtfrmshell(int sig)
+{
+ signal(SIGCONT, SIG_DFL);
+ ttopen();
+ ttresize();
+ pclear(0, term.t_nrow);
+ pico_refresh(0, 1);
+}
+#endif /* SIGCONT */