joe-3.1jupp38.tgz origtgz jupp-3_1_38
authormirabilos <t.glaser@tarent.de>
Sun, 11 Nov 2018 19:36:57 +0000 (20:36 +0100)
committermirabilos <mirabilos@evolvis.org>
Sun, 11 Nov 2018 19:36:57 +0000 (20:36 +0100)
20 files changed:
NEWS
autoconf.h.in
b.c
configure
configure.ac
install-sh
main.c
queue.c
queue.h
syntax.c
tab.c
termcap.c
tty.c
tw.c
ublock.c
utils.c
utils.h
vfile.c
vfile.h
w.c

diff --git a/NEWS b/NEWS
index 645b267..b836600 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,17 @@
-$MirOS: contrib/code/jupp/NEWS,v 1.129 2018/10/20 16:19:00 tg Exp $
+$MirOS: contrib/code/jupp/NEWS,v 1.130 2018/11/11 18:56:00 tg Exp $
 -------------------------------------------------------------------
 
+jupp-current
+
+- …
+
+JOE 3.1jupp38
+
+- fix issues pointed out by Coverity
+- musl says to not use <sys/termios.h>
+- fix opening files like +DESC
+- update autoconf infrastructure
+
 JOE 3.1jupp37
 
 - fix syntax highlighting for Assembly and Java™: string termination
index 188245d..40ad953 100644 (file)
@@ -1,4 +1,4 @@
-/* autoconf.h.in.  Generated from configure.ac by autoheader 2.61-MirPorts-2.  */
+/* autoconf.h.in.  Generated from configure.ac by autoheader 2.61-MirPorts-3.  */
 
 /* Define to 1 if `TIOCGWINSZ' requires <sys/ioctl.h>. */
 #undef GWINSZ_IN_SYS_IOCTL
 /* Define to 1 if you have the <sys/stat.h> header file. */
 #undef HAVE_SYS_STAT_H
 
-/* Define to 1 if you have the <sys/termios.h> header file. */
-#undef HAVE_SYS_TERMIOS_H
-
 /* Define to 1 if you have the <sys/termio.h> header file. */
 #undef HAVE_SYS_TERMIO_H
 
 /* Define to 1 if you have the <sys/wait.h> header file. */
 #undef HAVE_SYS_WAIT_H
 
-/* Define to 1 if you have the <termios.h> header file. */
-#undef HAVE_TERMIOS_H
-
 /* Define to 1 if you have the <termio.h> header file. */
 #undef HAVE_TERMIO_H
 
diff --git a/b.c b/b.c
index 2d598ad..7107220 100644 (file)
--- a/b.c
+++ b/b.c
@@ -9,7 +9,7 @@
 #include "config.h"
 #include "types.h"
 
-__RCSID("$MirOS: contrib/code/jupp/b.c,v 1.39 2018/06/28 01:18:32 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/b.c,v 1.40 2018/11/11 18:15:37 tg Exp $");
 
 #include <unistd.h>
 #include <sys/stat.h>
@@ -2045,10 +2045,8 @@ bload(const unsigned char *s)
                fi = fopen((char *)n, "r");
                if (!fi)
                        nowrite = 0;
-               if (fi) {
-                       fstat(fileno(fi),&sbuf);
+               else if (!fstat(fileno(fi), &sbuf))
                        mod_time = sbuf.st_mtime;
-               }
        }
 #if HAVE_BACKSLASH_PATHS
        joesep(n);
@@ -2340,12 +2338,14 @@ int bsavefd(P *p, int fd, long int size)
  * same name as buffer or is about to get this name).
  */
 
-int bsave(P *p, unsigned char *s, long int size, int flag)
+int
+bsave(P *p, unsigned char *s, long int size, int flag)
 {
        FILE *f;
        long skip, amnt;
        struct stat sbuf;
        int norm = 0;
+       char closemethod;
 
        s = parsens(s, &skip, &amnt);
 
@@ -2356,17 +2356,22 @@ int bsave(P *p, unsigned char *s, long int size, int flag)
                nescape(maint->t);
                ttclsn();
                f = popen((char *)(s + 1), "w");
-       } else if (s[0] == '>' && s[1] == '>')
+               closemethod = 2;
+       } else if (s[0] == '>' && s[1] == '>') {
                f = fopen((char *)(s + 2), "a");
-       else if (!strcmp(s, "-")) {
+               closemethod = 1;
+       } else if (!strcmp(s, "-")) {
                nescape(maint->t);
                ttclsn();
                f = stdout;
-       } else if (skip || amnt != LONG_MAX)
+               closemethod = 3;
+       } else if (skip || amnt != LONG_MAX) {
                f = fopen((char *)s, "r+");
-       else {
+               closemethod = 1;
+       } else {
                f = fopen((char *)s, "w");
                norm = 1;
+               closemethod = 1;
        }
 #if HAVE_BACKSLASH_PATHS
        joesep(s);
@@ -2396,12 +2401,18 @@ int bsave(P *p, unsigned char *s, long int size, int flag)
        }
 
  err:
-       if (s[0] == '!')
-               pclose(f);
-       else if (strcmp(s, "-"))
+       switch (closemethod) {
+       case 1:
                fclose(f);
-       else
+               break;
+       case 2:
+               pclose(f);
+               break;
+       case 3:
+               /* do not close stdout */
                fflush(f);
+               break;
+       }
 
        /* Update orignal date of file */
        /* If it's not named, it's about to be */
index 0d7b5d5..5b8e466 100644 (file)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61-MirPorts-2 for joe 3.1jupp37.
+# Generated by GNU Autoconf 2.61-MirPorts-3 for joe 3.1jupp38.
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
 # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
@@ -572,8 +572,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='joe'
 PACKAGE_TARNAME='joe'
-PACKAGE_VERSION='3.1jupp37'
-PACKAGE_STRING='joe 3.1jupp37'
+PACKAGE_VERSION='3.1jupp38'
+PACKAGE_STRING='joe 3.1jupp38'
 PACKAGE_BUGREPORT=''
 
 ac_unique_file="b.c"
@@ -1229,7 +1229,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures joe 3.1jupp37 to adapt to many kinds of systems.
+\`configure' configures joe 3.1jupp38 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1300,7 +1300,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of joe 3.1jupp37:";;
+     short | recursive ) echo "Configuration of joe 3.1jupp38:";;
    esac
   cat <<\_ACEOF
 
@@ -1398,8 +1398,8 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-joe configure 3.1jupp37
-generated by GNU Autoconf 2.61-MirPorts-2
+joe configure 3.1jupp38
+generated by GNU Autoconf 2.61-MirPorts-3
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
@@ -1412,8 +1412,8 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by joe $as_me 3.1jupp37, which was
-generated by GNU Autoconf 2.61-MirPorts-2.  Invocation command line was
+It was created by joe $as_me 3.1jupp38, which was
+generated by GNU Autoconf 2.61-MirPorts-3.  Invocation command line was
 
   $ $0 $@
 
@@ -2213,7 +2213,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='joe'
- VERSION='3.1jupp37'
+ VERSION='3.1jupp38'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -4849,13 +4849,11 @@ done
 
 
 
-
-
 for ac_header in  \
        sys/dirent.h sys/ioctl.h sys/param.h sys/stat.h sys/termio.h \
-       sys/termios.h sys/time.h sys/types.h sys/wait.h errno.h fcntl.h \
+       sys/time.h sys/types.h sys/wait.h errno.h fcntl.h \
        langinfo.h limits.h locale.h paths.h pty.h pwd.h sgtty.h signal.h \
-       stdlib.h string.h termio.h termios.h time.h unistd.h util.h utime.h \
+       stdlib.h string.h termio.h time.h unistd.h util.h utime.h \
        utmp.h bsd/string.h selinux/context.h selinux/selinux.h \
 
 do
@@ -9540,7 +9538,8 @@ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
 if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  mirsave_CPPFLAGS=$CPPFLAGS
+  mirsave_CPPFLAGS_set=${CPPFLAGS+ja}
+mirsave_CPPFLAGS=$CPPFLAGS
 CPPFLAGS="-D_MIRMAKE_H $CPPFLAGS"
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -9615,11 +9614,18 @@ fi
 
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
+if test x"ja" = x"$mirsave_CPPFLAGS_set"; then
+       CPPFLAGS=$mirsave_CPPFLAGS
+else
+       unset CPPFLAGS
+fi
+unset mirsave_CPPFLAGS_set
+unset mirsave_CPPFLAGS
+
 fi
 ac_res=`eval echo '${'$as_ac_var'}'`
               { echo "$as_me:$LINENO: result: $ac_res" >&5
 echo "${ECHO_T}$ac_res" >&6; }
-CPPFLAGS=$mirsave_CPPFLAGS
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -9650,7 +9656,8 @@ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
 if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  mirsave_CPPFLAGS=$CPPFLAGS
+  mirsave_CPPFLAGS_set=${CPPFLAGS+ja}
+mirsave_CPPFLAGS=$CPPFLAGS
 CPPFLAGS="-D_MIRMAKE_H $CPPFLAGS"
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -9725,11 +9732,18 @@ fi
 
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
+if test x"ja" = x"$mirsave_CPPFLAGS_set"; then
+       CPPFLAGS=$mirsave_CPPFLAGS
+else
+       unset CPPFLAGS
+fi
+unset mirsave_CPPFLAGS_set
+unset mirsave_CPPFLAGS
+
 fi
 ac_res=`eval echo '${'$as_ac_var'}'`
               { echo "$as_me:$LINENO: result: $ac_res" >&5
 echo "${ECHO_T}$ac_res" >&6; }
-CPPFLAGS=$mirsave_CPPFLAGS
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -9752,7 +9766,8 @@ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
 if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  mirsave_CPPFLAGS=$CPPFLAGS
+  mirsave_CPPFLAGS_set=${CPPFLAGS+ja}
+mirsave_CPPFLAGS=$CPPFLAGS
 CPPFLAGS="-D_MIRMAKE_H $CPPFLAGS"
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -9827,11 +9842,18 @@ fi
 
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
+if test x"ja" = x"$mirsave_CPPFLAGS_set"; then
+       CPPFLAGS=$mirsave_CPPFLAGS
+else
+       unset CPPFLAGS
+fi
+unset mirsave_CPPFLAGS_set
+unset mirsave_CPPFLAGS
+
 fi
 ac_res=`eval echo '${'$as_ac_var'}'`
               { echo "$as_me:$LINENO: result: $ac_res" >&5
 echo "${ECHO_T}$ac_res" >&6; }
-CPPFLAGS=$mirsave_CPPFLAGS
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -9854,7 +9876,8 @@ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
 if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  mirsave_CPPFLAGS=$CPPFLAGS
+  mirsave_CPPFLAGS_set=${CPPFLAGS+ja}
+mirsave_CPPFLAGS=$CPPFLAGS
 CPPFLAGS="-D_MIRMAKE_H $CPPFLAGS"
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -9929,11 +9952,18 @@ fi
 
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
+if test x"ja" = x"$mirsave_CPPFLAGS_set"; then
+       CPPFLAGS=$mirsave_CPPFLAGS
+else
+       unset CPPFLAGS
+fi
+unset mirsave_CPPFLAGS_set
+unset mirsave_CPPFLAGS
+
 fi
 ac_res=`eval echo '${'$as_ac_var'}'`
               { echo "$as_me:$LINENO: result: $ac_res" >&5
 echo "${ECHO_T}$ac_res" >&6; }
-CPPFLAGS=$mirsave_CPPFLAGS
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -9954,7 +9984,8 @@ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
 if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  mirsave_CPPFLAGS=$CPPFLAGS
+  mirsave_CPPFLAGS_set=${CPPFLAGS+ja}
+mirsave_CPPFLAGS=$CPPFLAGS
 CPPFLAGS="-D_MIRMAKE_H $CPPFLAGS"
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
+if test x"ja" = x"$mirsave_CPPFLAGS_set"; then
+       CPPFLAGS=$mirsave_CPPFLAGS
+else
+       unset CPPFLAGS
+fi
+unset mirsave_CPPFLAGS_set
+unset mirsave_CPPFLAGS
+
 fi
 ac_res=`eval echo '${'$as_ac_var'}'`
               { echo "$as_me:$LINENO: result: $ac_res" >&5
 echo "${ECHO_T}$ac_res" >&6; }
-CPPFLAGS=$mirsave_CPPFLAGS
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -10061,7 +10099,8 @@ echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
 if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
-  mirsave_CPPFLAGS=$CPPFLAGS
+  mirsave_CPPFLAGS_set=${CPPFLAGS+ja}
+mirsave_CPPFLAGS=$CPPFLAGS
 CPPFLAGS="-D_MIRMAKE_H $CPPFLAGS"
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
+if test x"ja" = x"$mirsave_CPPFLAGS_set"; then
+       CPPFLAGS=$mirsave_CPPFLAGS
+else
+       unset CPPFLAGS
+fi
+unset mirsave_CPPFLAGS_set
+unset mirsave_CPPFLAGS
+
 fi
 ac_res=`eval echo '${'$as_ac_var'}'`
               { echo "$as_me:$LINENO: result: $ac_res" >&5
 echo "${ECHO_T}$ac_res" >&6; }
-CPPFLAGS=$mirsave_CPPFLAGS
 if test `eval echo '${'$as_ac_var'}'` = yes; then
   cat >>confdefs.h <<_ACEOF
 #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
@@ -11062,8 +11108,8 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by joe $as_me 3.1jupp37, which was
-generated by GNU Autoconf 2.61-MirPorts-2.  Invocation command line was
+This file was extended by joe $as_me 3.1jupp38, which was
+generated by GNU Autoconf 2.61-MirPorts-3.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -11115,8 +11161,8 @@ Report bugs to <bug-autoconf@gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-joe config.status 3.1jupp37
-configured by $0, generated by GNU Autoconf 2.61-MirPorts-2,
+joe config.status 3.1jupp38
+configured by $0, generated by GNU Autoconf 2.61-MirPorts-3,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
 Copyright (C) 2006 Free Software Foundation, Inc.
index ee833b3..164673b 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/configure.ac,v 1.73 2018/10/20 16:19:00 tg Exp $
+# $MirOS: contrib/code/jupp/configure.ac,v 1.74 2018/11/11 18:20:51 tg Exp $
 #-
 # Process this file with autoconf to produce a configure script.
 
@@ -6,7 +6,7 @@
 AC_PREREQ(2.54)
 
 #### Here's the only place where to change version number ####
-AC_INIT(joe, 3.1jupp37)
+AC_INIT(joe, 3.1jupp38)
 #### But see main.c for the Copyright (c) owner and year! ####
 AC_CONFIG_SRCDIR([b.c])
 
@@ -156,9 +156,9 @@ AC_SUBST(jrcafter)
 
 AC_CHECK_HEADERS([ \
        sys/dirent.h sys/ioctl.h sys/param.h sys/stat.h sys/termio.h \
-       sys/termios.h sys/time.h sys/types.h sys/wait.h errno.h fcntl.h \
+       sys/time.h sys/types.h sys/wait.h errno.h fcntl.h \
        langinfo.h limits.h locale.h paths.h pty.h pwd.h sgtty.h signal.h \
-       stdlib.h string.h termio.h termios.h time.h unistd.h util.h utime.h \
+       stdlib.h string.h termio.h time.h unistd.h util.h utime.h \
        utmp.h bsd/string.h selinux/context.h selinux/selinux.h \
 ])
 AC_HEADER_DIRENT
index 99eb0d5..af20f84 100644 (file)
@@ -1,10 +1,10 @@
 #!/bin/sh
-# $MirOS: contrib/code/jupp/install-sh,v 1.8 2008/05/13 16:13:39 tg Exp $
-# $miros: contrib/gnu/aux/install-sh,v 1.13 2008/05/02 23:01:38 tg Exp $
+# $MirOS: contrib/code/jupp/install-sh,v 1.9 2018/11/11 18:45:41 tg Exp $
+# $miros: contrib/gnu/aux/install-sh,v 1.14 2018/11/11 18:42:46 tg Exp $
 #-
 # install - install a program, script, or datafile
 
-scriptversion=2006-12-25.00
+scriptversion=2018-03-11.20; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -38,17 +38,18 @@ scriptversion=2006-12-25.00
 # FSF changes to this file are in the public domain.
 #
 # Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
+# 'make' implicit rules from creating a file called install from it
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
+tab='  '
 nl='
 '
-IFS=" ""       $nl"
+IFS=" $tab$nl"
 
-# set DOITPROG to echo to test this script
+# Set DOITPROG to "echo" to test this script.
 
 # Don't use :- since 4.3BSD and earlier shells don't like it.
 doit=${DOITPROG-}
@@ -72,7 +73,7 @@ rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
 posix_glob='?'
-initialize_posix_glob='
+initialise_posix_glob='
   test "$posix_glob" != "?" || {
     if (set -f) 2>/dev/null; then
       posix_glob=
@@ -100,7 +101,7 @@ dir_arg=
 dst_arg=
 
 copy_on_change=false
-no_target_directory=
+is_target_a_directory=possibly
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -140,42 +141,57 @@ while test $# -ne 0; do
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-       shift;;
+        shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-       case $mode in
-         *' '* | *'    '* | *'
-'*       | *'*'* | *'?'* | *'['*)
-           echo "$0: invalid mode: $mode" >&2
-           exit 1;;
-       esac
-       shift;;
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
 
     -o) chowncmd="$chownprog $2"
-       shift;;
+        shift;;
 
     -s) stripcmd=$stripprog;;
 
-    -t) dst_arg=$2
-       shift;;
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
 
-    -T) no_target_directory=true;;
+    -T) is_target_a_directory=never;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    --)        shift
-       break;;
+    --) shift
+        break;;
 
-    -*)        echo "$0: invalid option: $1" >&2
-       exit 1;;
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
 
     *)  break;;
   esac
   shift
 done
 
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
@@ -189,6 +205,10 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
     fi
     shift # arg
     dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
   done
 fi
 
@@ -197,13 +217,26 @@ if test $# -eq 0; then
     echo "$0: no input file specified." >&2
     exit 1
   fi
-  # It's OK to call `install-sh -d' without argument.
+  # It's OK to call 'install-sh -d' without argument.
   # This can happen when creating conditional directories.
   exit 0
 fi
 
 if test -z "$dir_arg"; then
-  trap '(exit $?); exit' 1 2 13 15
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
 
   # Set umask so as not to create temps with too-generous modes.
   # However, 'strip' requires both read and write access to temps.
@@ -214,16 +247,16 @@ if test -z "$dir_arg"; then
 
     *[0-7])
       if test -z "$stripcmd"; then
-       u_plus_rw=
+        u_plus_rw=
       else
-       u_plus_rw='% 200'
+        u_plus_rw='% 200'
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
-       u_plus_rw=
+        u_plus_rw=
       else
-       u_plus_rw=,u+rw
+        u_plus_rw=,u+rw
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
@@ -231,9 +264,9 @@ fi
 
 for src
 do
-  # Protect names starting with `-'.
+  # Protect names problematic for 'test' and other utilities.
   case $src in
-    -*) src=./$src;;
+    -* | [=\(\)!]) src=./$src;;
   esac
 
   if test -n "$dir_arg"; then
@@ -255,22 +288,20 @@ do
       echo "$0: no destination specified." >&2
       exit 1
     fi
-
     dst=$dst_arg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst;;
-    esac
 
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
+    # If destination is a directory, append the input filename.
     if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-       echo "$0: $dst_arg: Is a directory" >&2
-       exit 1
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
       fi
       dstdir=$dst
-      dst=$dstdir/`basename "$src"`
+      dstbase=${src##*/}
+      case $dst in
+       */) dst=$dst$dstbase;;
+       *)  dst=$dst/$dstbase;;
+      esac
       dstdir_status=0
     else
       # Prefer dirname, but fall back on a substitute if dirname fails.
@@ -305,79 +336,93 @@ do
     fi
   fi
 
+  case $dstdir in
+    */) dstdirslash=$dstdir;;
+    *)  dstdirslash=$dstdir/;;
+  esac
+
   obsolete_mkdir_used=false
 
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-       # Create intermediate dirs using mode 755 as modified by the umask.
-       # This is like FreeBSD 'install' as of 1997-10-28.
-       umask=`umask`
-       case $stripcmd.$umask in
-         # Optimize common cases.
-         *[2367][2367]) mkdir_umask=$umask;;
-         .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-         *[0-7])
-           mkdir_umask=`expr $umask + 22 \
-             - $umask % 100 % 40 + $umask % 20 \
-             - $umask % 10 % 4 + $umask % 2
-           `;;
-         *) mkdir_umask=$umask,go-w;;
-       esac
-
-       # With -d, create the new directory with the user-specified mode.
-       # Otherwise, rely on $mkdir_umask.
-       if test -n "$dir_arg"; then
-         mkdir_mode=-m$mode
-       else
-         mkdir_mode=
-       fi
-
-       posix_mkdir=false
-       case $umask in
-         *[123567][0-7][0-7])
-           # POSIX mkdir -p sets u+wx bits regardless of umask, which
-           # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-           ;;
-         *)
-           tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-           trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-           if (umask $mkdir_umask &&
-               exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-           then
-             if test -z "$dir_arg" || {
-                  # Check for POSIX incompatibilities with -m.
-                  # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-                  # other-writeable bit of parent directory when it shouldn't.
-                  # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-                  ls_ld_tmpdir=`ls -ld "$tmpdir"`
-                  case $ls_ld_tmpdir in
-                    d????-?r-*) different_mode=700;;
-                    d????-?--*) different_mode=755;;
-                    *) false;;
-                  esac &&
-                  $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-                    ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-                    test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-                  }
-                }
-             then posix_mkdir=:
-             fi
-             rmdir "$tmpdir/d" "$tmpdir"
-           else
-             # Remove any dirs left behind by ancient mkdir implementations.
-             rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-           fi
-           trap '' 0;;
-       esac;;
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # Note that $RANDOM variable is not portable (e.g. dash);  Use it
+            # here however when possible just to lower collision chance.
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # Because "mkdir -p" follows existing symlinks and we likely work
+            # directly in world-writable /tmp, make sure that the '$tmpdir'
+            # directory is successfully created first before we actually test
+            # 'mkdir -p' feature.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
     esac
 
     if
       $posix_mkdir && (
-       umask $mkdir_umask &&
-       $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
       )
     then :
     else
@@ -387,12 +432,12 @@ do
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
-       /*) prefix='/';;
-       -*) prefix='./';;
-       *)  prefix='';;
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
       esac
 
-      eval "$initialize_posix_glob"
+      eval "$initialise_posix_glob"
 
       oIFS=$IFS
       IFS=/
@@ -406,34 +451,34 @@ do
 
       for d
       do
-       test -z "$d" && continue
-
-       prefix=$prefix$d
-       if test -d "$prefix"; then
-         prefixes=
-       else
-         if $posix_mkdir; then
-           (umask=$mkdir_umask &&
-            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-           # Don't fail if two instances are running concurrently.
-           test -d "$prefix" || exit 1
-         else
-           case $prefix in
-             *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-             *) qprefix=$prefix;;
-           esac
-           prefixes="$prefixes '$qprefix'"
-         fi
-       fi
-       prefix=$prefix/
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
       done
 
       if test -n "$prefixes"; then
-       # Don't fail if two instances are running concurrently.
-       (umask $mkdir_umask &&
-        eval "\$doit_exec \$mkdirprog $prefixes") ||
-         test -d "$dstdir" || exit 1
-       obsolete_mkdir_used=true
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
       fi
     fi
   fi
@@ -446,8 +491,8 @@ do
   else
 
     # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
+    dsttmp=${dstdirslash}_inst.$$_
+    rmtmp=${dstdirslash}_rm.$$_
 
     # Trap to clean up those temp files at exit.
     trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
@@ -468,10 +513,10 @@ do
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"    2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
 
-       eval "$initialize_posix_glob" &&
+       eval "$initialise_posix_glob" &&
        $posix_glob set -f &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
@@ -489,24 +534,24 @@ do
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
-       # Now remove or move aside any old file at destination location.
-       # We try this two ways since rm can't unlink itself on some
-       # systems and the destination file might be busy for other
-       # reasons.  In this case, the final cleanup might fail but the new
-       # file should still install successfully.
-       {
-         test ! -f "$dst" ||
-         $doit $rmcmd -f "$dst" 2>/dev/null ||
-         { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-           { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-         } ||
-         { echo "$0: cannot unlink or rename $dst" >&2
-           (exit 1); exit 1
-         }
-       } &&
-
-       # Now rename the file to the real destination.
-       $doit $mvcmd "$dsttmp" "$dst"
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
       }
     fi || exit 1
 
@@ -515,8 +560,9 @@ do
 done
 
 # Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
+# eval: (add-hook 'before-save-hook 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
 # End:
diff --git a/main.c b/main.c
index 488a454..6d85b0f 100644 (file)
--- a/main.c
+++ b/main.c
@@ -32,7 +32,7 @@
 #include "config.h"
 #include "types.h"
 
-__RCSID("$MirOS: contrib/code/jupp/main.c,v 1.43 2018/01/07 20:32:46 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/main.c,v 1.45 2018/11/11 18:51:26 tg Exp $");
 
 #include <fcntl.h>
 #include <string.h>
@@ -73,6 +73,8 @@ const char null[] = "";
 extern unsigned char *cygwin32_cmdline(void);
 #endif
 
+#define is_ofsopt(ap) (0[ap] == '+' && 1[ap] >= '0' && 1[ap] <= '9')
+
 /* Make windows follow cursor */
 
 void dofollows(void)
@@ -326,7 +328,7 @@ main_init(int argc, char **argv, char **envp, SCRN **np)
        vmem = vtmp();
 
        for (c = 1, backopt = 0; argv[c]; ++c)
-               if (argv[c][0] == '+' && argv[c][1]) {
+               if (is_ofsopt(argv[c])) {
                        if (!backopt)
                                backopt = c;
                } else if (argv[c][0] == '-' && argv[c][1]) {
@@ -341,6 +343,8 @@ main_init(int argc, char **argv, char **envp, SCRN **np)
 
                        if (!orphan || !opened) {
                                bw = wmktw(maint, b);
+                               if (!bw)
+                                       goto wmktw_failed;
                                if (er)
                                        msgnwt(bw->parent, msgs[-er]);
                        } else
@@ -354,7 +358,7 @@ main_init(int argc, char **argv, char **envp, SCRN **np)
 
                                        old_context = bw->o.context;
                                        while (backopt != c) {
-                                               if (argv[backopt][0] == '+') {
+                                               if (is_ofsopt(argv[backopt])) {
                                                        lnum = ustol(argv[backopt] + 1, NULL, USTOL_TRIM | USTOL_EOS);
                                                        ++backopt;
                                                } else {
@@ -400,6 +404,11 @@ main_init(int argc, char **argv, char **envp, SCRN **np)
        } else {
                BW *bw = wmktw(maint, bfind(UC ""));
 
+               if (!bw) {
+ wmktw_failed:
+                       fprintf(stderr, "maint->h < 1, cannot happen\n");
+                       return (1);
+               }
                if (bw->o.mnew)
                        exemac(bw->o.mnew);
        }
diff --git a/queue.c b/queue.c
index 1b01c12..e2658ba 100644 (file)
--- a/queue.c
+++ b/queue.c
@@ -8,7 +8,7 @@
 #include "config.h"
 #include "types.h"
 
-__RCSID("$MirOS: contrib/code/jupp/queue.c,v 1.5 2017/12/08 02:00:40 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/queue.c,v 1.6 2018/11/11 18:15:37 tg Exp $");
 
 #include <stdlib.h>
 
@@ -19,17 +19,18 @@ void *QUEUE;
 void *ITEM;
 void *LAST;
 
-void *alitem(void *list, int itemsize)
+void *
+alitem(void *list, size_t itemsize)
 {
        STDITEM *freelist = (STDITEM *)list;
 
        if (qempty(STDITEM, link, freelist)) {
-               STDITEM *i = malloc(itemsize * 16);
-               STDITEM *z = (STDITEM *)((unsigned char *)i + itemsize * 16);
+               size_t num = 16;
+               unsigned char *i = malloc(itemsize * num);
 
-               while (i != z) {
+               while (num--) {
                        enquef(STDITEM, link, freelist, i);
-                       i = (STDITEM *)((unsigned char *)i + itemsize);
+                       i += itemsize;
                }
        }
        return (void *)deque_f(STDITEM, link, freelist->link.prev);
diff --git a/queue.h b/queue.h
index 97798a0..e052c38 100644 (file)
--- a/queue.h
+++ b/queue.h
@@ -9,7 +9,7 @@
 #define _JOE_QUEUE 1
 
 #ifdef EXTERN_B_C
-__IDSTRING(rcsid_queue_h, "$MirOS: contrib/code/jupp/queue.h,v 1.6 2017/12/06 23:17:34 tg Exp $");
+__IDSTRING(rcsid_queue_h, "$MirOS: contrib/code/jupp/queue.h,v 1.7 2018/11/11 18:15:37 tg Exp $");
 #endif
 
 extern void *ITEM;
@@ -120,7 +120,7 @@ extern void *LAST;
        (type *)ITEM \
        )
 
-void *alitem(void *list, int itemsize);
+void *alitem(void *list, size_t itemsize);
 void frchn(void *list, void *ch);
 
 #endif
index 9d1a2a3..54d482d 100644 (file)
--- a/syntax.c
+++ b/syntax.c
@@ -9,7 +9,7 @@
 #include "config.h"
 #include "types.h"
 
-__RCSID("$MirOS: contrib/code/jupp/syntax.c,v 1.24 2018/01/07 23:51:35 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/syntax.c,v 1.25 2018/11/11 18:15:38 tg Exp $");
 
 #include <stdlib.h>
 #include <string.h>
@@ -352,7 +352,6 @@ struct high_syntax *load_dfa(const unsigned char *name)
                        if (!c) {
                        } else if (c=='"' || c=='*') {
                                if (state) {
-                                       struct high_cmd *cmd;
                                        if (!parse_field(&p, UC "*")) {
                                                int z;
                                                for(z=0;z!=256;++z)
@@ -376,10 +375,11 @@ struct high_syntax *load_dfa(const unsigned char *name)
                                                }
                                        }
                                        /* Create command */
-                                       cmd = calloc(1, sizeof(struct high_cmd));
                                        parse_ws(&p,'#');
                                        if(!parse_ident(&p,bf,255)) {
+                                               struct high_cmd *cmd = calloc(1, sizeof(struct high_cmd));
                                                int z;
+
                                                cmd->new_state = find_state(syntax,bf);
 
                                                /* Parse options */
diff --git a/tab.c b/tab.c
index a24e40a..23b9c89 100644 (file)
--- a/tab.c
+++ b/tab.c
@@ -8,7 +8,7 @@
 #include "config.h"
 #include "types.h"
 
-__RCSID("$MirOS: contrib/code/jupp/tab.c,v 1.13 2017/12/20 23:49:06 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/tab.c,v 1.14 2018/11/11 18:15:38 tg Exp $");
 
 #include <sys/stat.h>
 #include <stdlib.h>
@@ -80,9 +80,11 @@ static int get_entries(TAB *tab, int prv)
        tab->type = malloc(tab->len);
        for (a = 0; a != tab->len; a++) {
                struct stat buf;
-               mset(&buf, 0, sizeof(struct stat));
 
-               stat((char *)(files[a]), &buf);
+               if (stat((char *)(files[a]), &buf)) {
+                       tab->type[a] = 0;
+                       continue;
+               }
                if ((int)buf.st_ino == prv)
                        which = a;
                if ((buf.st_mode & S_IFMT) == S_IFDIR)
@@ -141,11 +143,8 @@ static unsigned char **treload(TAB *tab,MENU *m, BW *bw, int flg,int *defer)
 
        if ((which = get_entries(tab, tab->prv)) < 0)
                return 0;
-       if (tab->path && tab->path[0])
-               stat((char *)tab->path, &buf);
-       else
-               stat(".", &buf);
-       tab->prv = buf.st_ino;
+       tab->prv = stat((tab->path && tab->path[0]) ? (char *)tab->path : ".",
+           &buf) ? 0 : buf.st_ino;
        if (!flg)
                which = 0;
 
index d74e86e..d279eb1 100644 (file)
--- a/termcap.c
+++ b/termcap.c
@@ -8,7 +8,7 @@
 #include "config.h"
 #include "types.h"
 
-__RCSID("$MirOS: contrib/code/jupp/termcap.c,v 1.25 2017/12/20 22:22:45 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/termcap.c,v 1.26 2018/11/11 18:15:38 tg Exp $");
 
 #include <sys/stat.h>
 #include <stdlib.h>
@@ -233,9 +233,9 @@ CAP *getcap(unsigned char *name, unsigned int baud, void (*out) (unsigned char *
        if (f) {
                struct stat buf, buf1;
 
-               fstat(fileno(f), &buf);
-               fstat(fileno(f1), &buf1);
-               if (buf.st_mtime > buf1.st_mtime)
+               if (fstat(fileno(f), &buf) || fstat(fileno(f1), &buf1))
+                       fprintf(stderr, "cannot stat termcap index\n");
+               else if (buf.st_mtime > buf1.st_mtime)
                        idx = findidx(f, name);
                else
                        fprintf(stderr, "%s is out of date\n", idxname);
diff --git a/tty.c b/tty.c
index a92fc91..72d44fe 100644 (file)
--- a/tty.c
+++ b/tty.c
@@ -8,7 +8,7 @@
 #include "config.h"
 #include "types.h"
 
-__RCSID("$MirOS: contrib/code/jupp/tty.c,v 1.36 2018/01/06 00:28:33 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/tty.c,v 1.38 2018/11/11 18:20:51 tg Exp $");
 
 #ifdef HAVE_SYS_PARAM_H
 #include <sys/param.h>
@@ -33,20 +33,13 @@ int idleout = 1;
  * tty interface the system uses and what type of system
  * we actually have.
  */
-#ifdef HAVE_POSIX_TERMIOS
-#  include <termios.h>
-# ifdef HAVE_SYS_TERMIOS_H
-#  include <sys/termios.h>
-# endif
-#else
-#  ifdef HAVE_SYSV_TERMIO
-#    include <termio.h>
-#    include <sys/termio.h>
-#  else
-#   ifdef HAVE_SGTTY_H
-#    include <sgtty.h>
-#   endif
-#  endif
+#if defined(HAVE_POSIX_TERMIOS)
+#include <termios.h>
+#elif defined(HAVE_SYSV_TERMIO)
+#include <termio.h>
+#include <sys/termio.h>
+#elif defined(HAVE_SGTTY_H)
+#include <sgtty.h>
 #endif
 
 #ifdef HAVE_OPENPTY
@@ -559,14 +552,21 @@ int ttflsh(void)
        if (!have && !leave) {
 #if WANT_FORK
                if (ackkbd != -1) {
+                       ssize_t r;
+
                        fcntl(mpxfd, F_SETFL, O_NDELAY);
-                       if (read(mpxfd, &pack, sizeof(struct packet) - 1024) > 0) {
-                               fcntl(mpxfd, F_SETFL, 0);
-                               joe_read(mpxfd, pack.data, pack.size);
-                               have = 1;
-                               tty_accept = pack.ch;
-                       } else
-                               fcntl(mpxfd, F_SETFL, 0);
+                       r = read(mpxfd, &pack, 1);
+                       fcntl(mpxfd, F_SETFL, 0);
+                       if (r == 1) {
+                               r = sizeof(struct packet) - 1024 - 1;
+                               if (joe_readex(mpxfd, (US &pack) + 1, r) == r &&
+                                   pack.size >= 0 && pack.size <= 1024 &&
+                                   joe_readex(mpxfd, pack.data,
+                                   pack.size) == pack.size) {
+                                       have = 1;
+                                       tty_accept = pack.ch;
+                               }
+                       }
                } else
 #endif
                  {
@@ -594,9 +594,6 @@ static time_t last_time;
 
 int ttgetc(void)
 {
-#if WANT_FORK
-       int stat_;
-#endif
        time_t new_time;
 
        tickon();
@@ -621,21 +618,24 @@ int ttgetc(void)
        }
 #if WANT_FORK
        if (ackkbd != -1) {
-               if (!have) {    /* Wait for input */
-                       stat_ = read(mpxfd, &pack, sizeof(struct packet) - 1024);
-
-                       if (pack.size && stat_ > 0) {
-                               joe_read(mpxfd, pack.data, pack.size);
-                       } else if (stat_ < 1) {
+               ssize_t r;
+               if (!have) {
+                       /* wait for input */
+                       r = sizeof(struct packet) - 1024;
+
+                       if (joe_readex(mpxfd, &pack, r) != r ||
+                           pack.size < 0 || pack.size > 1024 ||
+                           joe_readex(mpxfd, pack.data,
+                           pack.size) != pack.size) {
                                if (winched || ticked)
                                        goto loop;
-                               else
-                                       ttsig(0);
+                               ttsig(0);
                        }
                        tty_accept = pack.ch;
                }
                have = 0;
-               if (pack.who) { /* Got bknd input */
+               if (pack.who) {
+                       /* got background input */
                        if (tty_accept != NO_MORE_DATA) {
                                if (pack.who->func) {
                                        pack.who->func(pack.who->object, pack.data, pack.size);
@@ -644,28 +644,22 @@ int ttgetc(void)
                        } else
                                mpxdied(pack.who);
                        goto loop;
+               } else if (tty_accept != NO_MORE_DATA) {
+                       tickoff();
+                       return tty_accept;
                } else {
-                       if (tty_accept != NO_MORE_DATA) {
-                               tickoff();
-                               return tty_accept;
-                       }
-                       else {
-                               tickoff();
-                               ttsig(0);
-                               return 0;
-                       }
+                       tickoff();
+                       ttsig(0);
+                       return 0;
                }
        }
 #endif
        if (have) {
                have = 0;
-       } else {
-               if (read(fileno(termin), &havec, 1) < 1) {
-                       if (winched || ticked)
-                               goto loop;
-                       else
-                               ttsig(0);
-               }
+       } else if (read(fileno(termin), &havec, 1) < 1) {
+               if (winched || ticked)
+                       goto loop;
+               ttsig(0);
        }
        tickoff();
        return havec;
@@ -1075,8 +1069,11 @@ mpxmk(int *ptyfd, const unsigned char *cmd, unsigned char **args,
        }
        m->ackfd = fds[1];
 
-       /* Fixes cygwin console bug: if you fork() with inverse video he assumes you want
-        * ESC [ 0 m to keep it in inverse video from then on. */
+       /*
+        * Fixes cygwin console bug: if you fork() with inverse video
+        * it assumes you want ESC [ 0 m to keep it in inverse video
+        * from then on.
+        */
        set_attr(maint->t,0);
 
        /* Flush output */
@@ -1103,10 +1100,12 @@ mpxmk(int *ptyfd, const unsigned char *cmd, unsigned char **args,
 
        /* Create processes... */
        if (!(m->kpid = fork())) {
-               /* This process copies data from shell to joe */
-               /* After each packet it sends to joe it waits for
-                  an acknowledgement from joe so that it can not get
-                  too far ahead with buffering */
+               /*
+                * This process copies data from shell to joe.
+                * After each packet it sends to joe it waits for
+                * an acknowledgement from joe so that it can not get
+                * too far ahead with buffering.
+                */
 
                /* Close joe side of pipes */
                close(fds[1]);
@@ -1119,15 +1118,19 @@ mpxmk(int *ptyfd, const unsigned char *cmd, unsigned char **args,
 
                if (!(pid = fork())) {
                        /* This process becomes the shell */
+                       unsigned char **env;
+
                        signrm(0);
 
                        /* Close pty (we only need tty) */
                        close(*ptyfd);
 
-                       /* All of this stuff is for disassociating ourself from
-                          controlling tty (session leader) and starting a new
-                          session.  This is the most non-portable part of UNIX- second
-                          only to pty/tty pair creation. */
+                       /*
+                        * All of this stuff is for dissociating ourself from
+                        * the controlling tty (session leader) and starting a
+                        * new session. This is the most non-portable part of
+                        * UNIX — second only to pty/tty pair creation.
+                        */
 #ifndef HAVE_LOGIN_TTY
 
 #ifdef TIOCNOTTY
@@ -1135,7 +1138,8 @@ mpxmk(int *ptyfd, const unsigned char *cmd, unsigned char **args,
                        ioctl(x, TIOCNOTTY, 0);
 #endif
 
-                       setsid();       /* I think you do setprgp(0,0) on systems with no setsid() */
+                       /* I think you do setprgp(0,0) on systems with no setsid() */
+                       setsid();
 #ifndef _MINIX
 /* http://mail-index.netbsd.org/pkgsrc-bugs/2011/06/13/msg043281.html */
 #ifndef SETPGRP_VOID
@@ -1147,13 +1151,15 @@ mpxmk(int *ptyfd, const unsigned char *cmd, unsigned char **args,
 
 #endif
                        /* Close all fds */
-                       for (x = 0; x != 32; ++x)
-                               close(x);       /* Yes, this is quite a kludge... all in the
-                                                  name of portability */
+                       for (x = 0; x != 32; ++x) {
+                               /* Yes, this is quite a kludge... */
+                               /* All in the name of portability */
+                               close(x);
+                       }
 
-                       /* Open the TTY */
-                       if ((x = open((char *)name, O_RDWR)) != -1) {   /* Standard input */
-                               unsigned char **env = newenv(mainenv, UC "TERM=");
+                       /* Open the TTY as standard input */
+                       if ((x = open((char *)name, O_RDWR)) != -1) {
+                               env = newenv(mainenv, UC "TERM=");
 
 #ifdef HAVE_LOGIN_TTY
                                login_tty(x);
@@ -1175,8 +1181,12 @@ mpxmk(int *ptyfd, const unsigned char *cmd, unsigned char **args,
                                 */
 #endif
 
-                               /* We could probably have a special TTY set-up for JOE, but for now
-                                * we'll just use the TTY setup for the TTY was was run on */
+                               /*
+                                * We could probably have a special TTY
+                                * setup for JOE, but for now we'll just
+                                * use the TTY setup for the TTY was was
+                                * run on.
+                                */
 #ifdef HAVE_POSIX_TERMIOS
                                tcsetattr(0, TCSADRAIN, &oldterm);
 #else
diff --git a/tw.c b/tw.c
index 73b4afd..fbcd718 100644 (file)
--- a/tw.c
+++ b/tw.c
@@ -8,7 +8,7 @@
 #include "config.h"
 #include "types.h"
 
-__RCSID("$MirOS: contrib/code/jupp/tw.c,v 1.22 2018/06/26 20:23:35 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/tw.c,v 1.23 2018/11/11 18:15:38 tg Exp $");
 
 #include <stdlib.h>
 #include <string.h>
@@ -740,6 +740,8 @@ BW *wmktw(SCREEN *t, B *b)
        TW *tw;
 
        w = wcreate(t, &watomtw, NULL, NULL, NULL, t->h, NULL, NULL);
+       if (!w)
+               return (NULL);
        wfit(w->t);
        w->object.bw = bw = bwmk(w, b, 0);
        bw->object = tw = malloc(sizeof(TW));
index c9f2071..aa2fb7e 100644 (file)
--- a/ublock.c
+++ b/ublock.c
@@ -8,7 +8,7 @@
 #include "config.h"
 #include "types.h"
 
-__RCSID("$MirOS: contrib/code/jupp/ublock.c,v 1.31 2018/01/07 20:32:47 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/ublock.c,v 1.32 2018/11/11 18:15:39 tg Exp $");
 
 #include <sys/wait.h>
 #include <stdlib.h>
@@ -973,10 +973,11 @@ static int dofilt(BW *bw, unsigned char *s, void *object, int *notify)
                return (-1);
        }
        if ((tf = mktmp(NULL, &fw)) == NULL) {
+               msgnw(bw->parent, UC "Cannot create temporary file");
+ lseekoops:
                close(fr[0]);
                close(fr[1]);
                vsrm(s);
-               msgnw(bw->parent, UC "Cannot create temporary file");
                return (-1);
        }
        unlink((char *)tf);
@@ -991,7 +992,11 @@ static int dofilt(BW *bw, unsigned char *s, void *object, int *notify)
                bsavefd(tmp->bof, fw, tmp->eof->byte);
        } else
                bsavefd(markb, fw, markk->byte - markb->byte);
-       lseek(fw, (off_t)0, SEEK_SET);
+       if (lseek(fw, (off_t)0, SEEK_SET) < 0) {
+               msgnw(bw->parent, UC "lseek failed");
+               close(fw);
+               goto lseekoops;
+       }
 #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";
diff --git a/utils.c b/utils.c
index 93bc288..c3d4272 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -8,7 +8,7 @@
  */
 #include "config.h"
 
-__RCSID("$MirOS: contrib/code/jupp/utils.c,v 1.10 2018/01/06 00:28:34 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/utils.c,v 1.11 2018/11/11 18:15:39 tg Exp $");
 
 #include <errno.h>
 #include <stdlib.h>
@@ -42,7 +42,8 @@ signed long int long_min(signed long int a, signed long int b)
 }
 
 /* Versions of 'read' and 'write' which automatically retry when interrupted */
-ssize_t joe_read(int fd, void *buf, size_t size)
+ssize_t
+joe_read(int fd, void *buf, size_t size)
 {
        ssize_t rt;
 
@@ -52,7 +53,8 @@ ssize_t joe_read(int fd, void *buf, size_t size)
        return rt;
 }
 
-ssize_t joe_write(int fd, void *buf, size_t size)
+ssize_t
+joe_write(int fd, const void *buf, size_t size)
 {
        ssize_t rt;
 
@@ -62,6 +64,49 @@ ssize_t joe_write(int fd, void *buf, size_t size)
        return rt;
 }
 
+/* Similarily, read and write an exact amount (up to EOF) */
+ssize_t
+joe_readex(int fd, void *buf_, size_t size)
+{
+       unsigned char *buf = buf_;
+       ssize_t rv = 0, z;
+
+       while (size) {
+               if ((z = read(fd, buf, size)) < 0) {
+                       if (errno == EINTR)
+                               continue;
+                       return (rv ? /* fucked up since we got some */ -2 : -1);
+               }
+               if (z == 0)
+                       break;
+               rv += z;
+               buf += z;
+               size -= z;
+       }
+       return (rv);
+}
+
+#if 0 /* unused */
+ssize_t
+joe_writex(int fd, const void *buf_, size_t size)
+{
+       const unsigned char *buf = buf_;
+       ssize_t rv = 0, z;
+
+       while (size) {
+               if ((z = write(fd, buf, size)) < 0) {
+                       if (errno == EINTR)
+                               continue;
+                       return (rv ? /* fucked up since we got some */ -2 : -1);
+               }
+               rv += z;
+               buf += z;
+               size -= z;
+       }
+       return (rv);
+}
+#endif
+
 #ifndef SIG_ERR
 #define SIG_ERR ((sighandler_t) -1)
 #endif
diff --git a/utils.h b/utils.h
index 54514db..e1d71b5 100644 (file)
--- a/utils.h
+++ b/utils.h
@@ -11,7 +11,7 @@
 #define _JOE_UTILS_H 1
 
 #ifdef EXTERN_B_C
-__IDSTRING(rcsid_utils_h, "$MirOS: contrib/code/jupp/utils.h,v 1.12 2018/01/06 00:28:35 tg Exp $");
+__IDSTRING(rcsid_utils_h, "$MirOS: contrib/code/jupp/utils.h,v 1.14 2018/11/11 18:20:52 tg Exp $");
 #endif
 
 #include <signal.h>
@@ -26,7 +26,12 @@ signed long long_min(signed long a, signed long b);
 
 /* Versions of 'read' and 'write' which automatically retry when interrupted */
 ssize_t joe_read(int fd, void *buf, size_t siz);
-ssize_t joe_write(int fd, void *buf, size_t siz);
+ssize_t joe_write(int fd, const void *buf, size_t siz);
+
+/* Similarily, read and write an exact amount (up to EOF) */
+ssize_t joe_readex(int, void *, size_t);
+ssize_t joe_writex(int, const void *, size_t);
+/* these return -2 if the error occurs after bytes had been processed */
 
 #ifndef HAVE_SIGHANDLER_T
 typedef RETSIGTYPE (*sighandler_t)(int);
@@ -66,7 +71,8 @@ void tty_xonoffbaudrst(void);
 long ustol(void *, void **, int);
 long ustolb(void *, void **, long, long, int);
 
-#define USTOC_MAX      4 /* arbitrary, but at least 4 */
+/* arbitrary, but at least 4 */
+#define USTOC_MAX      4
 
 size_t ustoc_hex(const void *, int *, size_t);
 size_t ustoc_oct(const void *, int *, size_t);
diff --git a/vfile.c b/vfile.c
index d5a1643..209f8e4 100644 (file)
--- a/vfile.c
+++ b/vfile.c
@@ -8,7 +8,7 @@
 #include "config.h"
 #include "types.h"
 
-__RCSID("$MirOS: contrib/code/jupp/vfile.c,v 1.16 2018/01/07 20:32:48 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/vfile.c,v 1.17 2018/11/11 18:15:39 tg Exp $");
 
 #include <sys/stat.h>
 #include <fcntl.h>
@@ -18,6 +18,7 @@ __RCSID("$MirOS: contrib/code/jupp/vfile.c,v 1.16 2018/01/07 20:32:48 tg Exp $")
 #include "blocks.h"
 #include "queue.h"
 #include "path.h"
+#include "tty.h"
 #include "utils.h"
 #include "vfile.h"
 #include "vs.h"
@@ -42,6 +43,7 @@ void vflsh(void)
        long last;
        VFILE *vfile;
        int x;
+       const char *wtf;
 
        for (vfile = vfiles.link.next; vfile != &vfiles; vfile = vfile->link.next) {
                last = -1;
@@ -60,7 +62,19 @@ void vflsh(void)
                                    vfile->fd ? NULL : &vfile->fd);
                        if (!vfile->fd)
                                vfile->fd = open((char *)(vfile->name), O_RDWR);
-                       lseek(vfile->fd, addr, 0);
+                       if (vfile->fd < 0) {
+                               wtf = "open";
+                               goto eek;
+                       }
+                       if (lseek(vfile->fd, addr, 0) < 0) {
+                               /* should not happen, what now? */
+                               wtf = "lseek";
+                               close(vfile->fd);
+ eek:
+                               vfile->fd = 0;
+                               fprintf(stderr, "\nvfile %s failed! \n", wtf);
+                               continue;
+                       }
                        if (addr + PGSIZE > vsize(vfile)) {
                                joe_write(vfile->fd, vlowest->data, vsize(vfile) - addr);
                                vfile->size = vsize(vfile);
@@ -76,12 +90,17 @@ void vflsh(void)
        }
 }
 
-void vflshf(VFILE *vfile)
+/* write changed pages for a specific file to the disk */
+static void vflshf(VFILE *vfile);
+
+static void
+vflshf(VFILE *vfile)
 {
        VPAGE *vp;
        VPAGE *vlowest;
        long addr;
        int x;
+       const char *wtf;
 
  loop:
        addr = LONG_MAX;
@@ -96,10 +115,22 @@ void vflshf(VFILE *vfile)
                if (!vfile->name)
                        vfile->name = mktmp(NULL,
                            vfile->fd ? NULL : &vfile->fd);
-               if (!vfile->fd) {
+               if (!vfile->fd)
                        vfile->fd = open((char *)(vfile->name), O_RDWR);
+               if (vfile->fd < 0) {
+                       wtf = "open";
+                       goto eek;
+               }
+               if (lseek(vfile->fd, addr, 0) < 0) {
+                       /* should not happen, what now? */
+                       wtf = "lseek";
+                       close(vfile->fd);
+ eek:
+                       vfile->fd = 0;
+                       fprintf(stderr, "\nvfile %s failed! \n", wtf);
+                       /* only called from vclose via main, maybe harmless? */
+                       return;
                }
-               lseek(vfile->fd, addr, 0);
                if (addr + PGSIZE > vsize(vfile)) {
                        joe_write(vfile->fd, vlowest->data, vsize(vfile) - addr);
                        vfile->size = vsize(vfile);
@@ -203,10 +234,17 @@ unsigned char *vlock(VFILE *vfile, unsigned long addr)
        htab[((addr >> LPGSIZE) + (unsigned long)vfile) & (HTSIZE - 1)] = vp;
 
        if (addr < (unsigned long)vfile->size) {
-               if (!vfile->fd) {
-                       vfile->fd = open((char *)(vfile->name), O_RDWR);
+               if (!vfile->fd && (vfile->fd = open((char *)(vfile->name),
+                   O_RDWR)) < 0)
+                       vfile->fd = 0;
+               if (!vfile->fd || lseek(vfile->fd, addr, 0) < 0) {
+                       static char washere = 0;
+
+                       if (!washere++)
+                               ttabrt(0, "vlock: open or lseek failed");
+                       if (write(2, "vlock: open or lseek failed twice\n", 26)) {}
+                       exit(1);
                }
-               lseek(vfile->fd, addr, 0);
                if (addr + PGSIZE > (unsigned long)vfile->size) {
                        joe_read(vfile->fd, vp->data, vfile->size - addr);
                        mset(vp->data + vfile->size - addr, 0, PGSIZE - (int) (vfile->size - addr));
diff --git a/vfile.h b/vfile.h
index 1e689b0..af47a50 100644 (file)
--- a/vfile.h
+++ b/vfile.h
@@ -9,7 +9,7 @@
 #define _JOE_VFILE_H 1
 
 #ifdef EXTERN
-__IDSTRING(rcsid_vfile_h, "$MirOS: contrib/code/jupp/vfile.h,v 1.7 2017/12/06 21:17:05 tg Exp $");
+__IDSTRING(rcsid_vfile_h, "$MirOS: contrib/code/jupp/vfile.h,v 1.8 2018/11/11 18:15:39 tg Exp $");
 #endif
 
 /* Additions:
@@ -67,13 +67,6 @@ void vclose(VFILE *vfile);
 
 void vflsh(void);
 
-/* void vflshf(VFILE *vfile);
- *
- * Write changed pages for a specific file to the disk
- */
-
-void vflshf(VFILE *vfile);
-
 /* char *vlock(VFILE *vfile,long addr);
  *
  * Translate virtual address to physical address.  'addr' does not have
diff --git a/w.c b/w.c
index 42d1ea9..12ab279 100644 (file)
--- a/w.c
+++ b/w.c
@@ -8,7 +8,7 @@
 #include "config.h"
 #include "types.h"
 
-__RCSID("$MirOS: contrib/code/jupp/w.c,v 1.13 2017/12/20 22:52:11 tg Exp $");
+__RCSID("$MirOS: contrib/code/jupp/w.c,v 1.14 2018/11/11 18:15:39 tg Exp $");
 
 #include <stdlib.h>
 
@@ -592,11 +592,12 @@ W *wcreate(SCREEN *t, WATOM *watom, W *where, W *target, W *original, int height
        new->msgb = NULL;
        new->msgt = NULL;
        /* Set window's target and family */
-/* was:        if (new->win = target) {        which may be mistyped == */
-       if ((new->win = target) != NULL) {      /* A subwindow */
+       if ((new->win = target) != NULL) {
+               /* a subwindow */
                new->main = target->main;
                new->fixed = height;
-       } else {                /* A parent window */
+       } else {
+               /* a parent window */
                new->main = new;
                new->fixed = 0;
        }