Update to CVS snapshot, for testing
authormirabilos <m@mirbsd.org>
Fri, 1 Dec 2017 21:59:08 +0000 (22:59 +0100)
committermirabilos <m@mirbsd.org>
Fri, 1 Dec 2017 21:59:08 +0000 (22:59 +0100)
cmd.c
configure.ac
i18n.c
jupprc
scrn.c
syntax/conf.jsf.in
tty.c
tty.h
ublock.c
ushell.c

diff --git a/cmd.c b/cmd.c
index 8989fd2..a55acb9 100644 (file)
--- a/cmd.c
+++ b/cmd.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/cmd.c,v 1.17 2017/08/08 21:39:28 tg Exp $ */
+/* $MirOS: contrib/code/jupp/cmd.c,v 1.18 2017/11/18 17:05:50 tg Exp $ */
 /*
  *     Command execution
  *     Copyright
@@ -92,6 +92,17 @@ static int unop(void)
        return (0);
 }
 
+#if !WANT_FORK
+static int
+unommu(BW *bw) {
+       msgnw(bw->parent, US "Sorry, not supported without MMU");
+       return (-1);
+}
+#define ubknd  unommu
+#define ubuild unommu
+#define urun   unommu
+#endif
+
 CMD cmds[] = {
        {US "abendjoe", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uabendjoe, NULL, 0, NULL},
        {US "abort", TYPETW + TYPEPW + TYPEMENU + TYPEQW, uabort, NULL, 0, NULL},
index 56dda7a..e8b6ade 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/configure.ac,v 1.56 2017/08/09 01:00:22 tg Exp $
+# $MirOS: contrib/code/jupp/configure.ac,v 1.57 2017/11/18 16:25:07 tg Exp $
 #-
 # Process this file with autoconf to produce a configure script.
 
@@ -208,6 +208,18 @@ AC_CHECK_FUNCS([alarm mkdir mkstemp putenv setlocale strchr strdup utime setpgid
 AC_CHECK_FUNCS([setitimer sigaction sigvec siginterrupt sigprocmask isatty])
 AC_CHECK_FUNCS([strlcpy strlcat nl_langinfo get_current_dir_name ctime popen])
 
+AC_ARG_ENABLE([fork],
+[  --disable-fork          disable use of fork],
+       use_fork=$enableval, use_fork=yes)
+test x"$use_fork" = x"no" && ac_cv_func_fork=no
+AC_CHECK_FUNCS([fork unsetenv])
+case $use_fork:$ac_cv_func_fork in
+no:*) use_fork=0 ;;
+*:yes) use_fork=1 ;;
+*) use_fork=0 ;;
+esac
+AC_DEFINE_UNQUOTED([WANT_FORK], [$use_fork], [We have fork(2) and want to use it])
+
 AC_CHECK_DECLS([strlcpy, strlcat, popen])
 AC_CHECK_DECLS([ctime], [], [], [AC_INCLUDES_DEFAULT
 #ifdef TIME_WITH_SYS_TIME
diff --git a/i18n.c b/i18n.c
index 10b486e..865d5f4 100644 (file)
--- a/i18n.c
+++ b/i18n.c
@@ -1,7 +1,7 @@
 #if 0
 .if "0" == "1"
 #endif
-/* $MirOS: contrib/code/jupp/i18n.c,v 1.23 2017/08/07 21:38:49 tg Exp $ */
+/* $MirOS: contrib/code/jupp/i18n.c,v 1.24 2017/11/18 12:01:52 tg Exp $ */
 /*
  *     UNICODE/ISO-10646 functions for JOE
  *     Copyright
@@ -38,7 +38,7 @@ static size_t mb_ucsbsearch(const struct mb_ucsrange arr[], size_t elems,
 
 /*
  * Generated from the Unicode Character Database, Version 10.0.0, by
- * MirOS: contrib/code/Snippets/eawparse,v 1.10 2017/07/12 22:47:26 tg Exp $
+ * MirOS: contrib/code/Snippets/eawparse,v 1.12 2017/09/06 16:05:45 tg Exp $
  */
 
 static const struct mb_ucsrange mb_ucs_combining[] = {
@@ -49,16 +49,14 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x05C1, 0x05C2 },
        { 0x05C4, 0x05C5 },
        { 0x05C7, 0x05C7 },
-       { 0x0600, 0x0605 },
        { 0x0610, 0x061A },
        { 0x061C, 0x061C },
        { 0x064B, 0x065F },
        { 0x0670, 0x0670 },
-       { 0x06D6, 0x06DD },
+       { 0x06D6, 0x06DC },
        { 0x06DF, 0x06E4 },
        { 0x06E7, 0x06E8 },
        { 0x06EA, 0x06ED },
-       { 0x070F, 0x070F },
        { 0x0711, 0x0711 },
        { 0x0730, 0x074A },
        { 0x07A6, 0x07B0 },
@@ -68,7 +66,8 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x0825, 0x0827 },
        { 0x0829, 0x082D },
        { 0x0859, 0x085B },
-       { 0x08D4, 0x0902 },
+       { 0x08D4, 0x08E1 },
+       { 0x08E3, 0x0902 },
        { 0x093A, 0x093A },
        { 0x093C, 0x093C },
        { 0x0941, 0x0948 },
@@ -267,7 +266,6 @@ static const struct mb_ucsrange mb_ucs_combining[] = {
        { 0x1107F, 0x11081 },
        { 0x110B3, 0x110B6 },
        { 0x110B9, 0x110BA },
-       { 0x110BD, 0x110BD },
        { 0x11100, 0x11102 },
        { 0x11127, 0x1112B },
        { 0x1112D, 0x11134 },
diff --git a/jupprc b/jupprc
index a2100bc..2c7499c 100644 (file)
--- a/jupprc
+++ b/jupprc
 *.jsf
 -syntax conf
 
- === flex
-*.l
--syntax lex
-
  === LISP
 *.lisp
 -syntax lisp
 *.el
 -syntax lisp
 
- === M4
-*.m4
--syntax m4
-
  === Make
 *akefile
 -syntax conf
 -encoding utf8
 -syntax xml
 
- === yacc
-*.y
--syntax yacc
-
  #HOOK#3102 filename matching
 
 {Basic
 \i \i^F next word     ^QD end of line  ^K/ pipe ^QY >line ^O  options  \u\bFILE\b\u       \i \i
 \i \i\u\bSEARCH\b\u           ^QR top of file  ^KB begin          \u\bBUFFER\b\u       ^KE new    \i \i
 \i \i^QF find first   ^QC end of file  ^KK end            ^U undo      ^KR import \i \i
-\i \i^L  find next    ^QO byte offset  ^KD reformat       ^^ redo      ^KW export \i \i
+\i \i^L  find next    ^QP prev. place  ^KD reformat       ^^ redo      ^KW export \i \i
 }
 
 {Windows
 \i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \i
-\i \i^KO Split the window in half          ^KE Load file into new window          \i \i
-\i \i^KG Make current window bigger        ^KT Make current window smaller        \i \i
-\i \i^KN Go to the window below            ^KP Go to the window above             \i \i
-\i \i^KQ Eliminate the current window      ^KI Show all windows / Show one window \i \i
-\i \i^K; Run a ctags search                ^K- Edit scratch buffer in new window  \i \i
+\i \i^KO split the window in half          ^KE load file into new window          \i \i
+\i \i^KG make current window bigger        ^KT make current window smaller        \i \i
+\i \i^KN go to the window below            ^KP go to the window above             \i \i
+\i \i^KQ eliminate the current window      ^KI show all windows / show one window \i \i
+\i \i^K; run a ctags search                ^K- edit scratch buffer in new window  \i \i
 \i \i Note: some commands (^KE ^K; ^K-) hide the current window; use ^KI/^KN then \i \i
-\i \i\u\bSpecial help for XON/XOFF aware terminals:\b\u                                   \i \i
+\i \i  \u\bSpecial help for XON/XOFF aware terminals:\b\u                                 \i \i
 \i \i You can use \b^[q\b and \b^[s\b instead of \b^Q\b and \b^S\b to initiate a command.         \i \i
 }
 
 {Advanced
 \i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \i
 \i \i\u\bMACROS\b\u       \u\bMISC\b\u         \u\bSCROLL\b\u      \u\bSHELL\b\u       \u\bGOTO\b\u        \u\bI-SEARCH\b\u       \i \i
-\i \i^[( Record   ^Q? status   ^Q. Right   ^K' Window  ^QB to ^KB  ^[R Backwards  \i \i
-\i \i^[) Stop     ^QQ repeat   ^Q, Left    ^[! Command ^QK to ^KK  ^[S Forwards   \i \i
-\i \i^[? Query    ^QM Math     \u\bCharSEARCH\b\u  \u\bQUOTE\b\u       \u\bDELETE\b\u      \u\bBOOKMARKS\b\u      \i \i
-\i \i^[D Dump     ^[H Message  ^QH forwrd   ` Ctrl-    ^[Y yank    ^K 0-9 Set     \i \i
-\i \i^[ 0-9 Play  ^N  Play #0  ^QG backwd  ^P Meta-    ^[O word<   ^Q 0-9 Goto    \i \i
+\i \i^[( record   ^Q? status   ^Q. right   ^K' window  ^QB to ^KB  ^[R backwards  \i \i
+\i \i^[) stop     ^QQ repeat   ^Q, left    ^[! command ^QK to ^KK  ^[S forwards   \i \i
+\i \i^[? query    ^QM math     \u\bCharSEARCH\b\u  \u\bQUOTE\b\u       \u\bDELETE\b\u      \u\bBOOKMARKS\b\u      \i \i
+\i \i^[D dump     ^[H message  ^QH forwrd   ` Ctrl-    ^[Y yank    ^K 0-9 define  \i \i
+\i \i^[ 0-9 play  ^N  play #0  ^QG backwd  ^P Meta-    ^[O word<   ^Q 0-9 goto    \i \i
 \i \i \u\bIn math mode,\b\u use 0xCAFE for hex. All ops are floating point internally.    \i \i
 \i \i \u\bPredefined variables:\b\u byte col height line lines top width                  \i \i
 }
 {Programs
 \i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \i
 \i \i\u\bGOTO\b\u                               \u\bCOMPILING\b\u                    \u\bSLIDING\b\u      \i \i
-\i \i^Q] matching brace, ^Q[ reverse    ^[C compile & parse errors   ^W up        \i \i
-\i \i^Q= merge conflict marker          ^[E parse errors             ^Z down      \i \i
-\i \i^Q- to column number  \u\bINDENT\b\u       ^KF save, compile & upload to NXT brick   \i \i
-\i \i^QI to line number    ^K. more     \u\bGOTO AFTER COMPILING\b\u         \u\bINSERT MATH\b\u  \i \i
-\i \i^QP previous place    ^K, less     ^[N previous error           ^[# equation \i \i
-\i \i^K= next place        ^KA centre   ^[M next error      \u\bSPECIAL\b\u  ^[= result   \i \i
-\i \i                      ^K] kill whitespace at EOL       ^[- jupp command line \i \i
+\i \i^Q= next merge conflict marker     ^[C compile & parse errors   ^W up        \i \i
+\i \i^Q] next matching brace            ^[E parse errors             ^Z down      \i \i
+\i \i^Q[ previous   "   "  \u\bINDENT\b\u       ^KF save, compile & upload to NXT brick   \i \i
+\i \i^Q- to column number  ^K. more     \u\bGOTO AFTER COMPILING\b\u         \u\bINSERT MATH\b\u  \i \i
+\i \i^QI to line number    ^K, less     ^[N previous error           ^[# equation \i \i
+\i \i^QO to byte offset    ^KA centre   ^[M next error      \u\bSPECIAL\b\u  ^[= result   \i \i
+\i \i^K= next place        ^K] kill whitespace at EOL/EOF   ^[- jupp command line \i \i
 }
 
 {Search
 \i   Help Screen    turn off with ^J     prev. screen ^[,    next screen ^[.     \i
-\i \i\u\bSpecial search sequences:\b\u                                                    \i \i
-\i \i    \\^  \\$  matches beg./end of line       \\?     match any single char      \i \i
-\i \i    \\<  \\>  matches beg./end of word       \\*     match 0 or more chars      \i \i
-\i \i    \\c     matches balanced C expression   \\\\     matches a \\                \i \i
-\i \i    \\[..]  matches one of a set            \\n     matches a newline          \i \i
-\i \i    \\+     matches 0 or more of the character which follows the \\+           \i \i
-\i \i\u\bSpecial replace sequences:\b\u                                                   \i \i
-\i \i    \\&     replaced with text which matched search string                    \i \i
-\i \i    \\0 - 9 replaced with text which matched \bN\bth \\*, \\?, \\c, \\+, or \\[..]     \i \i
-\i \i    \\\\     replaced with \\                 \\n     replaced with newline      \i \i
+\i \i \u\bSpecial search sequences:\b\u                                                   \i \i
+\i \i  \\^  \\$  matches beg./end of line         \\?     match any single char      \i \i
+\i \i  \\<  \\>  matches beg./end of word         \\*     match 0 or more chars      \i \i
+\i \i  \\c      matches balanced C expression    \\\\     matches a backslash (\\)    \i \i
+\i \i  \\[a-z]  matches one of a set             \\n     matches a newline          \i \i
+\i \i  \\+      matches 0 or more of the character which follows the \\+            \i \i
+\i \i \u\bSpecial replace sequences:\b\u                                                  \i \i
+\i \i  \\\\      replaced with a backslash (\\)    \\n     replaced with a newline    \i \i
+\i \i  \\&      replaced with the text which matched the search string             \i \i
+\i \i  \\0 - 9  replaced with text which matched \bN\bth \\?, \\*, \\c, \\[a-z] or \\+      \i \i
 }
 
 {Names
 \i \i go to \uhttp://sf.net/projects/joe-editor/\u for upstream bug reports. JUPP 2.8 \i \i
 \i \i for DOS compiled by A. Totlis, packed with LHarc 2.13; JUPP 3.x for UNIX\d(R)\d \i \i
 \i \i at \uhttp://mirbsd.de/jupp\u and by \bThorsten "\dmirabilos\d" Glaser <\utg@mirbsd.org\u>\b \i \i
-\i \i @(#) jupprc 2017-08-08; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \i \i
+\i \i @(#) jupprc 2017-11-31; 3.1; autoCR-LF; UTF-8 via locale; per-file encoding \i \i
 }
 
  #HOOK#3103 additional help screens
@@ -595,7 +583,7 @@ keymap,"prompt",rtn                 ^D
 :def freedroidz splitw,prevw,scratch,"nbc-Output",rtn,nextw,save,markk,bol,markb,prevw,prevw,blkcpy,nextw,nextw,rtn,prevw,eol,"'",bol,qrepl,"'",rtn,rtn,"'\\\\''",rtn,"r",backs,backs,backs,bol,"LC_ALL=C; export LC_ALL; fn='",eol,rtn,"p=--posix; sed $p -e q </dev/null >/dev/null 2>&1 || p=; fns=$(echo \"$fn\" | sed $p -e 's\ 1[^^]\ 1[&]\ 1g; s\ 1\\^\ 1\\\\^\ 1g'); (case $fn in",rtn,"*.nxc) ;;",rtn,"*) echo '==> Error: filename not *.nxc'; exit ;;",rtn,"esac",rtn,"echo \"Compiling $fn\"",rtn,"nbc -sm- -d \"$fn\" 2>&1; x=$?",rtn,"if test $x = 0; then echo '==> OK'; else echo '==> Error code:' $x; fi",rtn,") | tr '\\n' '\ 1' | sed $p -e 's!\ 1# *\\([^\ 1]*\\)\ 1File \"[^\"]*/\\('\"$fns\"'\\)\" ; line \\([0-9]*\\)\ 1!\ 1\\2:\\3: \\1\ 1!g' -e 's!\ 1#\\([^\ 1]*\\)\ 1File \"\\([^\"]*\\)\" ; line \\([0-9]*\\)\ 1!\ 1\\2:\\3: \\1\ 1!g' | tr '\ 1' '\\n'",rtn,nmark,filt,"sh",rtn,rtn,"Press ^KQ to close this window!",rtn,parserr
 :def docompile edit,rtn,filt,query,parserr
  #HOOK#3105 main keybindings
-bof,qrepl,"\\[",quote,"i",quote,"k",quote,"l",quote,"m ]\\+\\[",quote,"i",quote,"k",quote,"l",quote,"m ]\\$",rtn,rtn,rtn,"r",eof       ^K ]
+eof," ",bof,qrepl,"\\[",quote,"i",quote,"k",quote,"l",quote,"m ]\\+\\[",quote,"i",quote,"k",quote,"l",quote,"m ]\\$",rtn,rtn,rtn,"r",eof,ffirst,"\\[^\\n]",rtn,"b",rtn,rtarw,rtn,markb,rtn,eof,markk,blkdel    ^K ]
 ffirst,"\\^\\[<>=]\\[<>=]\\[<>=]\\[<>=]\\[<>=]\\[<>=]\\[<>=]\\[ \\n]",rtn,rtn,ltarw                                                    ^Q =
 begin_marking,uparw,toggle_marking     ^[ [ 1 ; 2 A
 begin_marking,dnarw,toggle_marking     ^[ [ 1 ; 2 B
diff --git a/scrn.c b/scrn.c
index 68c27c9..e51c02f 100644 (file)
--- a/scrn.c
+++ b/scrn.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/scrn.c,v 1.26 2017/08/08 16:09:43 tg Exp $ */
+/* $MirOS: contrib/code/jupp/scrn.c,v 1.27 2017/11/18 16:02:04 tg Exp $ */
 /*
  *     Device independant TTY interface for JOE
  *     Copyright
@@ -661,7 +661,7 @@ SCRN *nopen(CAP *cap)
                goto ok;
        leave = 1;
        ttclose();
-       signrm();
+       signrm(0);
 #ifdef DEBUG
        /* these are strings, but I do not know if %s is appropriate -mirabilos */
         fprintf(stderr,"cm=%d ch=%d cv=%d ho=%d lf=%d DO=%d ll=%d up=%d UP=%d cr=%d\n",
index a96c412..5918118 100644 (file)
@@ -1,6 +1,11 @@
-# $MirOS: contrib/code/jupp/syntax/conf.jsf.in,v 1.2 2008/05/13 16:17:44 tg Exp $
+# $MirOS: contrib/code/jupp/syntax/conf.jsf.in,v 1.4 2017/12/01 00:55:40 tg Exp $
 #-
 # JOE syntax highlight file for typical UNIX configuration files
+#
+# Currently used for configure.ac (shell-ish), jsf files themselves,
+# Makefile.am (Makefile-ish) and ?akefile. We probably should create
+# a proper Makefile jsf to split off this, supporting proper quoting
+# rules and perhaps even highlighting wrong whitespace.
 
 =Idle
 =Comment       green
 :idle Idle
        *               idle
        "#"             comment         recolor=-1
+       "'"             string_sq       recolor=-1
        "\""            string          recolor=-1
+       "\\"            escape          recolor=-1
 
 :comment Comment
        *               comment
        "\n"            idle
 
+:escape Escape
+       *               idle
+
 :string String
        *               string
        "\""            idle
        "\\"            string_escape   recolor=-1
+       "\n"            idle
 
 :string_escape Escape
        *               string
-       "\n"            string          recolor=-2
+
+:string_sq String
+       *               string_sq
+       "\'"            idle
+       "\n"            idle
diff --git a/tty.c b/tty.c
index 82b1c57..04a8069 100644 (file)
--- a/tty.c
+++ b/tty.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/tty.c,v 1.24 2017/08/08 16:12:04 tg Exp $ */
+/* $MirOS: contrib/code/jupp/tty.c,v 1.28 2017/11/18 17:08:44 tg Exp $ */
 /*
  *     UNIX Tty and Process interface
  *     Copyright
@@ -203,6 +203,7 @@ static int ttymode = 0;
 /* Signal state flag.  1 for joe, 0 for normal */
 static int ttysig = 0;
 
+#if WANT_FORK
 /* Stuff for shell windows */
 
 static pid_t kbdpid;           /* PID of kbd client */
@@ -222,6 +223,7 @@ struct packet {
 } pack;
 
 MPX asyncs[NPROC];
+#endif
 
 /* Set signals for JOE */
 void sigjoe(void)
@@ -236,11 +238,12 @@ void sigjoe(void)
 }
 
 /* Restore signals for exiting */
-void signrm(void)
+void signrm(int inchild)
 {
        if (!ttysig)
                return;
-       ttysig = 0;
+       if (!inchild)
+               ttysig = 0;
        joe_set_signal(SIGHUP, SIG_DFL);
        joe_set_signal(SIGTERM, SIG_DFL);
        joe_set_signal(SIGINT, SIG_DFL);
@@ -260,7 +263,7 @@ void ttopen(void)
 void ttclose(void)
 {
        ttclsn();
-       signrm();
+       signrm(0);
 }
 
 static volatile sig_atomic_t winched = 0;
@@ -547,6 +550,7 @@ int ttflsh(void)
                obufp = 0;
        }
 
+#if WANT_FORK
        /* Ack previous packet */
        if (ackkbd != -1 && tty_accept != NO_MORE_DATA && !have) {
                unsigned char c = 0;
@@ -557,10 +561,12 @@ int ttflsh(void)
                        joe_write(ackkbd, &c, 1);
                tty_accept = NO_MORE_DATA;
        }
+#endif
 
        /* Check for typeahead or next packet */
 
        if (!have && !leave) {
+#if WANT_FORK
                if (ackkbd != -1) {
                        fcntl(mpxfd, F_SETFL, O_NDELAY);
                        if (read(mpxfd, &pack, sizeof(struct packet) - 1024) > 0) {
@@ -570,7 +576,9 @@ int ttflsh(void)
                                tty_accept = pack.ch;
                        } else
                                fcntl(mpxfd, F_SETFL, 0);
-               } else {
+               } else
+#endif
+                 {
                        /* Set terminal input to non-blocking */
                        fcntl(fileno(termin), F_SETFL, O_NDELAY);
 
@@ -587,7 +595,9 @@ int ttflsh(void)
 
 /* Read next character from input */
 
-void mpxdied(MPX *m);
+#if WANT_FORK
+static void mpxdied(MPX *m);
+#endif
 
 static time_t last_time;
 
@@ -616,6 +626,7 @@ int ttgetc(void)
                ttflsh();
                tickon();
        }
+#if WANT_FORK
        if (ackkbd != -1) {
                if (!have) {    /* Wait for input */
                        stat_ = read(mpxfd, &pack, sizeof(struct packet) - 1024);
@@ -652,6 +663,7 @@ int ttgetc(void)
                        }
                }
        }
+#endif
        if (have) {
                have = 0;
        } else {
@@ -707,30 +719,45 @@ void ttgtsz(int *x, int *y)
 #endif
 }
 
-void ttshell(unsigned char *cmd)
+#ifndef SIGTSTP
+/* void ttshell(char *s);  Run a shell command or if 's' is zero, run a
+ * sub-shell
+ */
+static void ttshell PARAMS((unsigned char *cmd));
+static const char shmsg[] =
+    "You are at the command shell.  Type 'exit' to return\n";
+
+#if WANT_FORK
+#define v_or_fork() fork()
+#else
+#define v_or_fork() vfork()
+#endif
+
+static void ttshell(unsigned char *cmd)
 {
        int x, omode = ttymode;
        const char *sh;
 
        sh = getushell();
        ttclsn();
-       if ((x = fork()) != 0) {
-               if (x != -1)
-                       wait(NULL);
-               if (omode)
-                       ttopnn();
-       } else {
-               signrm();
+       if (!(x = v_or_fork())) {
+               signrm(1);
                if (cmd)
                        execl(sh, sh, "-c", cmd, NULL);
                else {
-                       fprintf(stderr, "You are at the command shell.  Type 'exit' to return\n");
+                       write(2, shmsg, sizeof(shmsg) - 1);
                        execl(sh, sh, NULL);
                }
                _exit(0);
        }
+       if (x != -1)
+               wait(NULL);
+       if (omode)
+               ttopnn();
 }
+#endif
 
+#if WANT_FORK
 /* Create keyboard task */
 
 static int mpxresume(void)
@@ -776,6 +803,7 @@ static void mpxsusp(void)
                close(ackkbd);
        }
 }
+#endif
 
 /* We used to leave the keyboard copy task around during suspend, but
    Cygwin gets confused when two processes are waiting for input and you
@@ -790,19 +818,24 @@ void ttsusp(void)
 
 #ifdef SIGTSTP
        omode = ttymode;
+#if WANT_FORK
        mpxsusp();
+#endif
        ttclsn();
        fprintf(stderr, "You have suspended the program.  Type 'fg' to return\n");
        kill(0, SIGTSTP);
        if (omode)
                ttopnn();
+#if WANT_FORK
        if (ackkbd!= -1)
                mpxresume();
+#endif
 #else
        ttshell(NULL);
 #endif
 }
 
+#if WANT_FORK
 /* Stuff for asynchronous I/O multiplexing.  We do not use streams or
    select() because joe needs to work on versions of UNIX which predate
    these calls.  Instead, when there is multiple async sources, we use
@@ -836,6 +869,7 @@ static void mpxend(void)
        if (have)
                havec = pack.ch;
 }
+#endif
 
 /* Get a pty/tty pair.  Returns open pty in 'ptyfd' and returns tty name
  * string in static buffer or NULL if couldn't get a pair.
@@ -1005,6 +1039,7 @@ static unsigned char **newenv(unsigned char **old, unsigned char *s)
 
 /* Create a shell process */
 
+#if WANT_FORK
 MPX *mpxmk(int *ptyfd, const unsigned char *cmd, unsigned char **args, void (*func) (/* ??? */), void *object, void (*die) (/* ??? */), void *dieobj)
 {
        unsigned char buf[80];
@@ -1086,7 +1121,7 @@ MPX *mpxmk(int *ptyfd, const unsigned char *cmd, unsigned char **args, void (*fu
 
                if (!(pid = fork())) {
                        /* This process becomes the shell */
-                       signrm();
+                       signrm(0);
 
                        /* Close pty (we only need tty) */
                        close(*ptyfd);
@@ -1220,7 +1255,7 @@ MPX *mpxmk(int *ptyfd, const unsigned char *cmd, unsigned char **args, void (*fu
        return m;
 }
 
-void mpxdied(MPX *m)
+static void mpxdied(MPX *m)
 {
        if (!--nmpx)
                mpxend();
@@ -1231,6 +1266,7 @@ void mpxdied(MPX *m)
        m->func = NULL;
        edupd(1);
 }
+#endif
 
 void
 tty_xonoffbaudrst(void)
diff --git a/tty.h b/tty.h
index 124bfa6..44376c3 100644 (file)
--- a/tty.h
+++ b/tty.h
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/tty.h,v 1.6 2013/10/31 20:05:43 tg Exp $ */
+/* $MirOS: contrib/code/jupp/tty.h,v 1.8 2017/11/18 16:43:08 tg Exp $ */
 /*
  *     TTY interface header file
  *     Copyright
@@ -92,11 +92,6 @@ extern unsigned char *obuf;
  */
 void ttputs PARAMS((unsigned char *s));
 
-/* void ttshell(char *s);  Run a shell command or if 's' is zero, run a
- * sub-shell
- */
-void ttshell PARAMS((unsigned char *cmd));
-
 /* void ttsusp(void);  Suspend the process, or if the UNIX can't do it, call
  * ttshell(NULL)
  */
@@ -167,9 +162,9 @@ void ttgtsz PARAMS((int *x, int *y));
  */
 void sigjoe PARAMS((void));
 
-/* void signrm(void);  Set above signals back to their default values.
+/* void signrm(int inchild);  Set above signals back to their default values.
  */
-void signrm PARAMS((void));
+void signrm PARAMS((int));
 
 /* MPX *mpxmk(int fd,int pid,
  *             void (*func)(),void *object,
index fb0733e..01d6220 100644 (file)
--- a/ublock.c
+++ b/ublock.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/ublock.c,v 1.10 2013/08/19 22:04:15 tg Exp $ */
+/* $MirOS: contrib/code/jupp/ublock.c,v 1.14 2017/11/18 16:30:21 tg Exp $ */
 /*
  *     Highlighted block functions
  *     Copyright
@@ -939,6 +939,12 @@ int doinsf(BW *bw, unsigned char *s, void *object, int *notify)
 
 static int filtflg = 0;
 
+#if WANT_FORK
+#define v_or_fork() fork()
+#else
+#define v_or_fork() vfork()
+#endif
+
 /*
  * This isn't optimal, but until the home-brewn VM system is removed
  * it is the best we can do: we cannot use bsavefd() in a concurrent
@@ -955,6 +961,10 @@ static int dofilt(BW *bw, unsigned char *s, void *object, int *notify)
        int fw;
        int flg = 0;
        unsigned char *tf;
+       const char *sh;
+#if defined(HAVE_PUTENV) && (WANT_FORK || defined(HAVE_UNSETENV))
+       unsigned char *fname;
+#endif
 
        if (notify)
                *notify = 1;
@@ -990,13 +1000,20 @@ static int dofilt(BW *bw, unsigned char *s, void *object, int *notify)
        } else
                bsavefd(markb, fw, markk->byte - markb->byte);
        lseek(fw, (off_t)0, SEEK_SET);
-       if (!fork()) {
-               const char *sh;
-#ifdef HAVE_PUTENV
-               unsigned char           *fname, *name;
-               unsigned        len;
+#if defined(HAVE_PUTENV) && (WANT_FORK || defined(HAVE_UNSETENV))
+       fname = vsncpy(NULL, 0, sc("JOE_FILENAME="));
+       tf = bw->b->name ? bw->b->name : (unsigned char *)"Unnamed";
+       fname = vsncpy(sv(fname), sz(tf));
+#if !WANT_FORK
+       putenv((char *)fname);
+#endif
 #endif
-               signrm();
+       sh = getushell();
+       if (!v_or_fork()) {
+#if defined(HAVE_PUTENV) && WANT_FORK
+               putenv((char *)fname);
+#endif
+               signrm(1);
                close(0);
                close(1);
                close(2);
@@ -1007,20 +1024,17 @@ static int dofilt(BW *bw, unsigned char *s, void *object, int *notify)
                close(fw);
                close(fr[1]);
                close(fr[0]);
-#ifdef HAVE_PUTENV
-               fname = vsncpy(NULL, 0, sc("JOE_FILENAME="));
-               name = bw->b->name ? bw->b->name : (unsigned char *)"Unnamed";
-               if((len = slen(name)) >= 512)   /* limit filename length */
-                       len = 512;
-               fname = vsncpy(sv(fname), name, len);
-               putenv((char *)fname);
-#endif
-               sh = getushell();
                execl(sh, sh, "-c", s, NULL);
                _exit(0);
        }
        close(fr[1]);
        close(fw);
+#if defined(HAVE_PUTENV) && (WANT_FORK || defined(HAVE_UNSETENV))
+#if !WANT_FORK
+       unsetenv("JOE_FILENAME");
+#endif
+       vsrm(fname);
+#endif
        if (square) {
                B *tmp;
                long width = markk->xcol - markb->xcol;
index f8e9c08..7627644 100644 (file)
--- a/ushell.c
+++ b/ushell.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/ushell.c,v 1.4 2012/12/30 18:18:07 tg Exp $ */
+/* $MirOS: contrib/code/jupp/ushell.c,v 1.6 2017/11/18 17:05:51 tg Exp $ */
 /*
  *     Shell-window functions
  *     Copyright
@@ -108,16 +108,9 @@ static void cdata(B *b, unsigned char *dat, int siz)
        cfollow(b,byte);
 }
 
+#if WANT_FORK
 static int doushell(BW *bw, unsigned char *cmd, int *notify, int build)
 {
-#ifdef __MSDOS__
-       if (notify) {
-               *notify = 1;
-       }
-       varm(s);
-       msgnw(bw->parent, "Sorry, no sub-processes in DOS (yet)");
-       return -1;
-#else
        MPX *m;
        unsigned char **s;
        unsigned char *u;
@@ -154,7 +147,6 @@ static int doushell(BW *bw, unsigned char *cmd, int *notify, int build)
                bw->b->pid = m->pid;
        }
        return 0;
-#endif
 }
 
 int ubknd(BW *bw)
@@ -203,6 +195,7 @@ int ubuild(BW *bw)
                        return 0;
                return -1;
 }
+#endif
 
 /* Kill program */