OSDN Git Service

Upgrade to mksh 50c.
authorElliott Hughes <enh@google.com>
Mon, 6 Oct 2014 18:30:44 +0000 (11:30 -0700)
committerElliott Hughes <enh@google.com>
Mon, 6 Oct 2014 21:01:54 +0000 (14:01 -0700)
Bug: 17814343

(cherry picked from commit 56b517d46cdf4f6ccd6b62b207110e2afc3db30b)

Change-Id: Ib116fa73e720b9a918afa9538ff22b69345ba3bf

16 files changed:
Android.mk
Makefrag.inc
src/Build.sh
src/check.pl
src/check.t
src/dot.mkshrc
src/edit.c
src/eval.c
src/exec.c
src/funcs.c
src/jobs.c
src/main.c
src/mirhash.h
src/mksh.1
src/sh.h
src/var.c

index 8f910a1..48a6867 100644 (file)
@@ -1,18 +1,18 @@
 # Copyright © 2010, 2013
-#      Thorsten Glaser <t.glaser@tarent.de>
+#    Thorsten Glaser <t.glaser@tarent.de>
 # This file is provided under the same terms as mksh.
 
-LOCAL_PATH:=           $(call my-dir)
+LOCAL_PATH := $(call my-dir)
 
 
 # /system/etc/mkshrc
 
 include $(CLEAR_VARS)
 
-LOCAL_MODULE:=         mkshrc
-LOCAL_MODULE_CLASS:=   ETC
-LOCAL_MODULE_PATH:=    $(TARGET_OUT)/etc
-LOCAL_SRC_FILES:=      $(LOCAL_MODULE)
+LOCAL_MODULE := mkshrc
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT)/etc
+LOCAL_SRC_FILES := $(LOCAL_MODULE)
 include $(BUILD_PREBUILT)
 
 
@@ -24,50 +24,61 @@ LOCAL_MODULE := sh
 LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
 
 # mksh source files
-LOCAL_SRC_FILES:=      src/lalloc.c src/edit.c src/eval.c src/exec.c \
-                       src/expr.c src/funcs.c src/histrap.c src/jobs.c \
-                       src/lex.c src/main.c src/misc.c src/shf.c \
-                       src/syn.c src/tree.c src/var.c
-
-LOCAL_SYSTEM_SHARED_LIBRARIES:= libc
-
-LOCAL_C_INCLUDES:=     $(LOCAL_PATH)/src
-# additional flags first, then from Makefrag.inc: CFLAGS, CPPFLAGS
-LOCAL_CFLAGS:=         -DMKSHRC_PATH=\"/system/etc/mkshrc\" \
-                       -DMKSH_DEFAULT_EXECSHELL=\"/system/bin/sh\" \
-                       -DMKSH_DEFAULT_TMPDIR=\"/data/local\" \
-               -Wno-deprecated-declarations \
-               -fno-asynchronous-unwind-tables -fwrapv \
-               -DDEBUG_LEAKS -DMKSH_ASSUME_UTF8 -DMKSH_CONSERVATIVE_FDS \
-               -DMKSH_DONT_EMIT_IDSTRING -DMKSH_NOPWNAM -DMKSH_BUILDSH \
-               -D_GNU_SOURCE -DSETUID_CAN_FAIL_WITH_EAGAIN \
-               -DHAVE_ATTRIBUTE_BOUNDED=0 -DHAVE_ATTRIBUTE_FORMAT=1 \
-               -DHAVE_ATTRIBUTE_NORETURN=1 \
-               -DHAVE_ATTRIBUTE_PURE=1 \
-               -DHAVE_ATTRIBUTE_UNUSED=1 \
-               -DHAVE_ATTRIBUTE_USED=1 -DHAVE_SYS_TIME_H=1 -DHAVE_TIME_H=1 \
-               -DHAVE_BOTH_TIME_H=1 -DHAVE_SYS_BSDTYPES_H=0 \
-               -DHAVE_SYS_FILE_H=1 -DHAVE_SYS_MKDEV_H=0 -DHAVE_SYS_MMAN_H=1 \
-               -DHAVE_SYS_PARAM_H=1 -DHAVE_SYS_RESOURCE_H=1 \
-               -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_SYSMACROS_H=1 \
-               -DHAVE_BSTRING_H=0 -DHAVE_GRP_H=1 -DHAVE_LIBGEN_H=1 \
-               -DHAVE_LIBUTIL_H=0 -DHAVE_PATHS_H=1 -DHAVE_STDINT_H=1 \
-               -DHAVE_STRINGS_H=1 -DHAVE_TERMIOS_H=1 -DHAVE_ULIMIT_H=0 \
-               -DHAVE_VALUES_H=0 -DHAVE_CAN_INTTYPES=1 -DHAVE_CAN_UCBINTS=1 \
-               -DHAVE_CAN_INT8TYPE=1 -DHAVE_CAN_UCBINT8=1 -DHAVE_RLIM_T=1 \
-               -DHAVE_SIG_T=1 -DHAVE_SYS_ERRLIST=0 -DHAVE_SYS_SIGNAME=1 \
-               -DHAVE_SYS_SIGLIST=1 -DHAVE_FLOCK=1 -DHAVE_LOCK_FCNTL=1 \
-               -DHAVE_GETRUSAGE=1 \
-               -DHAVE_GETSID=1 \
-               -DHAVE_GETTIMEOFDAY=1 -DHAVE_KILLPG=1 \
-               -DHAVE_MEMMOVE=1 -DHAVE_MKNOD=0 -DHAVE_MMAP=1 -DHAVE_NICE=1 \
-               -DHAVE_REVOKE=0 -DHAVE_SETLOCALE_CTYPE=0 \
-               -DHAVE_LANGINFO_CODESET=0 -DHAVE_SELECT=1 -DHAVE_SETRESUGID=1 \
-               -DHAVE_SETGROUPS=1 -DHAVE_STRERROR=1 -DHAVE_STRSIGNAL=0 \
-               -DHAVE_STRLCPY=1 -DHAVE_FLOCK_DECL=1 -DHAVE_REVOKE_DECL=1 \
-               -DHAVE_SYS_ERRLIST_DECL=0 -DHAVE_SYS_SIGLIST_DECL=1 \
-               -DHAVE_PERSISTENT_HISTORY=0 -DMKSH_BUILD_R=501
-
-# check_categories= shell:legacy-no int:32 android convfds no-histfile
+LOCAL_SRC_FILES := \
+    src/lalloc.c src/edit.c src/eval.c src/exec.c \
+    src/expr.c src/funcs.c src/histrap.c src/jobs.c \
+    src/lex.c src/main.c src/misc.c src/shf.c \
+    src/syn.c src/tree.c src/var.c
+
+LOCAL_SYSTEM_SHARED_LIBRARIES := libc
+
+LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
+
+# Additional flags first...
+LOCAL_CFLAGS += \
+    -DMKSHRC_PATH=\"/system/etc/mkshrc\" \
+    -DMKSH_DEFAULT_EXECSHELL=\"/system/bin/sh\" \
+    -DMKSH_DEFAULT_TMPDIR=\"/data/local\" \
+
+# ...then from Makefrag.inc: CFLAGS...
+LOCAL_CFLAGS += \
+    -Wno-deprecated-declarations \
+    -fno-asynchronous-unwind-tables \
+    -fno-strict-aliasing \
+    -fstack-protector -fwrapv \
+
+# ...and CPPFLAGS.
+LOCAL_CFLAGS += \
+    -DDEBUG_LEAKS -DMKSH_ASSUME_UTF8 -DMKSH_CONSERVATIVE_FDS \
+    -DMKSH_DONT_EMIT_IDSTRING -DMKSH_NOPWNAM -DMKSH_BUILDSH \
+    -D_GNU_SOURCE -DSETUID_CAN_FAIL_WITH_EAGAIN \
+    -DHAVE_ATTRIBUTE_BOUNDED=0 -DHAVE_ATTRIBUTE_FORMAT=1 \
+    -DHAVE_ATTRIBUTE_NORETURN=1 \
+    -DHAVE_ATTRIBUTE_PURE=1 \
+    -DHAVE_ATTRIBUTE_UNUSED=1 \
+    -DHAVE_ATTRIBUTE_USED=1 -DHAVE_SYS_TIME_H=1 -DHAVE_TIME_H=1 \
+    -DHAVE_BOTH_TIME_H=1 -DHAVE_SYS_BSDTYPES_H=0 \
+    -DHAVE_SYS_FILE_H=1 -DHAVE_SYS_MKDEV_H=0 -DHAVE_SYS_MMAN_H=1 \
+    -DHAVE_SYS_PARAM_H=1 -DHAVE_SYS_RESOURCE_H=1 \
+    -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_SYSMACROS_H=1 \
+    -DHAVE_BSTRING_H=0 -DHAVE_GRP_H=1 -DHAVE_LIBGEN_H=1 \
+    -DHAVE_LIBUTIL_H=0 -DHAVE_PATHS_H=1 -DHAVE_STDINT_H=1 \
+    -DHAVE_STRINGS_H=1 -DHAVE_TERMIOS_H=1 -DHAVE_ULIMIT_H=0 \
+    -DHAVE_VALUES_H=0 -DHAVE_CAN_INTTYPES=1 -DHAVE_CAN_UCBINTS=1 \
+    -DHAVE_CAN_INT8TYPE=1 -DHAVE_CAN_UCBINT8=1 -DHAVE_RLIM_T=1 \
+    -DHAVE_SIG_T=1 -DHAVE_SYS_ERRLIST=0 -DHAVE_SYS_SIGNAME=1 \
+    -DHAVE_SYS_SIGLIST=1 -DHAVE_FLOCK=1 -DHAVE_LOCK_FCNTL=1 \
+    -DHAVE_GETRUSAGE=1 \
+    -DHAVE_GETSID=1 \
+    -DHAVE_GETTIMEOFDAY=1 \
+    -DHAVE_ISSETUGID=0 \
+    -DHAVE_KILLPG=1 \
+    -DHAVE_MEMMOVE=1 -DHAVE_MKNOD=0 -DHAVE_MMAP=1 -DHAVE_NICE=1 \
+    -DHAVE_REVOKE=0 -DHAVE_SETLOCALE_CTYPE=0 \
+    -DHAVE_LANGINFO_CODESET=0 -DHAVE_SELECT=1 -DHAVE_SETRESUGID=1 \
+    -DHAVE_SETGROUPS=1 -DHAVE_STRERROR=1 -DHAVE_STRSIGNAL=0 \
+    -DHAVE_STRLCPY=1 -DHAVE_FLOCK_DECL=1 -DHAVE_REVOKE_DECL=1 \
+    -DHAVE_SYS_ERRLIST_DECL=0 -DHAVE_SYS_SIGLIST_DECL=1 \
+    -DHAVE_PERSISTENT_HISTORY=0 -DMKSH_BUILD_R=503
 
 include $(BUILD_EXECUTABLE)
index 4866e94..b7a35bd 100644 (file)
@@ -1,4 +1,4 @@
-# Makefile fragment for building mksh R50 2014/06/29
+# Makefile fragment for building mksh R50 2014/10/03
 
 PROG=          mksh
 MAN=           mksh.1
@@ -8,11 +8,11 @@ OBJS_BP=       lalloc.o eval.o exec.o expr.o funcs.o histrap.o jobs.o lex.o main.o mi
 INDSRCS=       emacsfn.h rlimits.opt sh.h sh_flags.opt var_spec.h
 NONSRCS_INST=  dot.mkshrc $(MAN)
 NONSRCS_NOINST=        Build.sh Makefile Rebuild.sh check.pl check.t test.sh
-CC=            /huge-ssd/aosp-arm64/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/*-gcc
-CFLAGS=                 -fno-exceptions -Wno-multichar -fpic -fPIE -ffunction-sections -fdata-sections -funwind-tables -fstack-protector -Wa,--noexecstack -Werror=format-security -fno-short-enums -Wno-unused-but-set-variable -fno-builtin-sin -fno-strict-volatile-bitfields -Wno-psabi -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -g -Wstrict-aliasing=2 -fgcse-after-reload -frerun-cse-after-loop -frename-registers -Os -fomit-frame-pointer -fno-strict-aliasing -Wno-deprecated-declarations -fno-asynchronous-unwind-tables -fstack-protector-strong -fwrapv
-CPPFLAGS=      -I. -I'../src'  -isystem /huge-ssd/aosp-arm64/bionic/libc/arch-arm64/include -isystem /huge-ssd/aosp-arm64/bionic/libc/include -isystem /huge-ssd/aosp-arm64/bionic/libc/kernel/uapi -isystem /huge-ssd/aosp-arm64/bionic/libc/kernel/uapi/asm-arm64 -isystem /huge-ssd/aosp-arm64/bionic/libm/include -isystem /huge-ssd/aosp-arm64/bionic/libm/include/arm64 -D_FORTIFY_SOURCE=2 -include /huge-ssd/aosp-arm64/build/core/combo/include/arch/linux-arm64/AndroidConfig.h -I/huge-ssd/aosp-arm64/build/core/combo/include/arch/linux-arm64/ -DANDROID -DNDEBUG -UDEBUG -DDEBUG_LEAKS -DMKSH_ASSUME_UTF8 -DMKSH_CONSERVATIVE_FDS -DMKSH_DONT_EMIT_IDSTRING -DMKSH_NOPWNAM -DMKSH_BUILDSH -D_GNU_SOURCE -DSETUID_CAN_FAIL_WITH_EAGAIN -DHAVE_ATTRIBUTE_BOUNDED=0 -DHAVE_ATTRIBUTE_FORMAT=1 -DHAVE_ATTRIBUTE_NORETURN=1 -DHAVE_ATTRIBUTE_PURE=1 -DHAVE_ATTRIBUTE_UNUSED=1 -DHAVE_ATTRIBUTE_USED=1 -DHAVE_SYS_TIME_H=1 -DHAVE_TIME_H=1 -DHAVE_BOTH_TIME_H=1 -DHAVE_SYS_BSDTYPES_H=0 -DHAVE_SYS_FILE_H=1 -DHAVE_SYS_MKDEV_H=0 -DHAVE_SYS_MMAN_H=1 -DHAVE_SYS_PARAM_H=1 -DHAVE_SYS_RESOURCE_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_SYSMACROS_H=1 -DHAVE_BSTRING_H=0 -DHAVE_GRP_H=1 -DHAVE_LIBGEN_H=1 -DHAVE_LIBUTIL_H=0 -DHAVE_PATHS_H=1 -DHAVE_STDINT_H=1 -DHAVE_STRINGS_H=1 -DHAVE_TERMIOS_H=1 -DHAVE_ULIMIT_H=0 -DHAVE_VALUES_H=0 -DHAVE_CAN_INTTYPES=1 -DHAVE_CAN_UCBINTS=1 -DHAVE_CAN_INT8TYPE=1 -DHAVE_CAN_UCBINT8=1 -DHAVE_RLIM_T=1 -DHAVE_SIG_T=1 -DHAVE_SYS_ERRLIST=0 -DHAVE_SYS_SIGNAME=1 -DHAVE_SYS_SIGLIST=1 -DHAVE_FLOCK=1 -DHAVE_LOCK_FCNTL=1 -DHAVE_GETRUSAGE=1 -DHAVE_GETSID=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_KILLPG=1 -DHAVE_MEMMOVE=1 -DHAVE_MKNOD=0 -DHAVE_MMAP=1 -DHAVE_NICE=1 -DHAVE_REVOKE=0 -DHAVE_SETLOCALE_CTYPE=0 -DHAVE_LANGINFO_CODESET=0 -DHAVE_SELECT=1 -DHAVE_SETRESUGID=1 -DHAVE_SETGROUPS=1 -DHAVE_STRERROR=1 -DHAVE_STRSIGNAL=0 -DHAVE_STRLCPY=1 -DHAVE_FLOCK_DECL=1 -DHAVE_REVOKE_DECL=1 -DHAVE_SYS_ERRLIST_DECL=0 -DHAVE_SYS_SIGLIST_DECL=1 -DHAVE_PERSISTENT_HISTORY=0 -DMKSH_BUILD_R=501
-LDFLAGS=        -nostdlib -Bdynamic -fPIE -pie -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined /huge-ssd/aosp-arm64/out/target/product/generic_arm64/obj/lib/crtbegin_dynamic.o
-LIBS=           -L/huge-ssd/aosp-arm64/out/target/product/generic_arm64/obj/lib -Wl,-rpath-link=/huge-ssd/aosp-arm64/out/target/product/generic_arm64/obj/lib -Wl,--no-whole-archive /huge-ssd/aosp-arm64/out/target/product/generic_arm64/obj/STATIC_LIBRARIES/libcompiler_rt-extras_intermediates/libcompiler_rt-extras.a -lc /huge-ssd/aosp-arm64/out/target/product/generic_arm64/obj/lib/crtend_android.o
+CC=            /huge-ssd/aosp-x86_64/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.8/bin/*-gcc
+CFLAGS=                 -fno-exceptions -Wno-multichar -fpic -fPIE -ffunction-sections -fdata-sections -funwind-tables -fstack-protector -Wa,--noexecstack -Werror=format-security -fno-short-enums -Wno-unused-but-set-variable -fno-builtin-sin -fno-strict-volatile-bitfields -Wno-psabi -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -g -Wstrict-aliasing=2 -fgcse-after-reload -frerun-cse-after-loop -frename-registers -Os -fomit-frame-pointer -fno-strict-aliasing -Wno-deprecated-declarations -fno-asynchronous-unwind-tables -fwrapv
+CPPFLAGS=      -I. -I'../src'  -isystem /huge-ssd/aosp-x86_64/bionic/libc/arch-x86/include -isystem /huge-ssd/aosp-x86_64/bionic/libc/include -isystem /huge-ssd/aosp-x86_64/bionic/libc/kernel/uapi -isystem /huge-ssd/aosp-x86_64/bionic/libc/kernel/uapi/asm-x86 -isystem /huge-ssd/aosp-x86_64/bionic/libm/include -isystem /huge-ssd/aosp-x86_64/bionic/libm/include/x86 -D_FORTIFY_SOURCE=2 -I/huge-ssd/aosp-x86_64/build/core/combo/include/arch/linux-x86/ -DANDROID -DNDEBUG -UDEBUG -DDEBUG_LEAKS -DMKSH_ASSUME_UTF8 -DMKSH_CONSERVATIVE_FDS -DMKSH_DONT_EMIT_IDSTRING -DMKSH_NOPWNAM -DMKSH_BUILDSH -D_GNU_SOURCE -DSETUID_CAN_FAIL_WITH_EAGAIN -DHAVE_ATTRIBUTE_BOUNDED=0 -DHAVE_ATTRIBUTE_FORMAT=1 -DHAVE_ATTRIBUTE_NORETURN=1 -DHAVE_ATTRIBUTE_PURE=1 -DHAVE_ATTRIBUTE_UNUSED=1 -DHAVE_ATTRIBUTE_USED=1 -DHAVE_SYS_TIME_H=1 -DHAVE_TIME_H=1 -DHAVE_BOTH_TIME_H=1 -DHAVE_SYS_BSDTYPES_H=0 -DHAVE_SYS_FILE_H=1 -DHAVE_SYS_MKDEV_H=0 -DHAVE_SYS_MMAN_H=1 -DHAVE_SYS_PARAM_H=1 -DHAVE_SYS_RESOURCE_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_SYSMACROS_H=1 -DHAVE_BSTRING_H=0 -DHAVE_GRP_H=1 -DHAVE_LIBGEN_H=1 -DHAVE_LIBUTIL_H=0 -DHAVE_PATHS_H=1 -DHAVE_STDINT_H=1 -DHAVE_STRINGS_H=1 -DHAVE_TERMIOS_H=1 -DHAVE_ULIMIT_H=0 -DHAVE_VALUES_H=0 -DHAVE_CAN_INTTYPES=1 -DHAVE_CAN_UCBINTS=1 -DHAVE_CAN_INT8TYPE=1 -DHAVE_CAN_UCBINT8=1 -DHAVE_RLIM_T=1 -DHAVE_SIG_T=1 -DHAVE_SYS_ERRLIST=0 -DHAVE_SYS_SIGNAME=1 -DHAVE_SYS_SIGLIST=1 -DHAVE_FLOCK=1 -DHAVE_LOCK_FCNTL=1 -DHAVE_GETRUSAGE=1 -DHAVE_GETSID=1 -DHAVE_GETTIMEOFDAY=1 -DHAVE_ISSETUGID=0 -DHAVE_KILLPG=1 -DHAVE_MEMMOVE=1 -DHAVE_MKNOD=0 -DHAVE_MMAP=1 -DHAVE_NICE=1 -DHAVE_REVOKE=0 -DHAVE_SETLOCALE_CTYPE=0 -DHAVE_LANGINFO_CODESET=0 -DHAVE_SELECT=1 -DHAVE_SETRESUGID=1 -DHAVE_SETGROUPS=1 -DHAVE_STRERROR=1 -DHAVE_STRSIGNAL=0 -DHAVE_STRLCPY=1 -DHAVE_FLOCK_DECL=1 -DHAVE_REVOKE_DECL=1 -DHAVE_SYS_ERRLIST_DECL=0 -DHAVE_SYS_SIGLIST_DECL=1 -DHAVE_PERSISTENT_HISTORY=0 -DMKSH_BUILD_R=503
+LDFLAGS=        -nostdlib -Bdynamic -fPIE -pie -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined /huge-ssd/aosp-x86_64/out/target/product/generic_x86_64/obj/lib/crtbegin_dynamic.o
+LIBS=           -L/huge-ssd/aosp-x86_64/out/target/product/generic_x86_64/obj/lib -Wl,-rpath-link=/huge-ssd/aosp-x86_64/out/target/product/generic_x86_64/obj/lib -Wl,--no-whole-archive /huge-ssd/aosp-x86_64/out/target/product/generic_x86_64/obj/STATIC_LIBRARIES/libcompiler_rt-extras_intermediates/libcompiler_rt-extras.a -lc /huge-ssd/aosp-x86_64/out/target/product/generic_x86_64/obj/lib/crtend_android.o
 
 .depend $(OBJS_BP): rlimits.gen sh_flags.gen
 rlimits.gen: ../src/Build.sh ../src/rlimits.opt
index 8ef6cb6..ce6c127 100644 (file)
@@ -1,5 +1,5 @@
 #!/bin/sh
-srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.662 2014/06/29 10:56:08 tg Exp $'
+srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.668 2014/10/03 17:32:07 tg Exp $'
 #-
 # Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
 #              2011, 2012, 2013, 2014
@@ -1784,7 +1784,7 @@ else
                #define EXTERN
                #define MKSH_INCLUDES_ONLY
                #include "sh.h"
-               __RCSID("$MirOS: src/bin/mksh/Build.sh,v 1.662 2014/06/29 10:56:08 tg Exp $");
+               __RCSID("$MirOS: src/bin/mksh/Build.sh,v 1.668 2014/10/03 17:32:07 tg Exp $");
                int main(void) { printf("Hello, World!\n"); return (isatty(0)); }
 EOF
        case $cm in
@@ -1904,6 +1904,11 @@ ac_test gettimeofday <<-'EOF'
        int main(void) { struct timeval tv; return (gettimeofday(&tv, NULL)); }
 EOF
 
+ac_test issetugid <<-'EOF'
+       #include <unistd.h>
+       int main(void) { return (issetugid()); }
+EOF
+
 ac_test killpg <<-'EOF'
        #include <signal.h>
        int main(int ac, char *av[]) { return (av[0][killpg(123, ac)]); }
@@ -2273,6 +2278,7 @@ mksh_cfg= NSIG
        sigs="ABRT FPE ILL INT SEGV TERM ALRM BUS CHLD CONT HUP KILL PIPE QUIT"
        sigs="$sigs STOP TSTP TTIN TTOU USR1 USR2 POLL PROF SYS TRAP URG VTALRM"
        sigs="$sigs XCPU XFSZ INFO WINCH EMT IO DIL LOST PWR SAK CLD IOT RESV"
+       sigs="$sigs STKFLT UNUSED"
        test 1 = $HAVE_CPP_DD && test $NSIG -gt 1 && sigs="$sigs "`vq \
            "$CPP $CFLAGS $CPPFLAGS $NOWARN -dD conftest.c" | \
            grep '[      ]SIG[A-Z0-9][A-Z0-9]*[  ]' | \
@@ -2310,7 +2316,7 @@ addsrcs '!' HAVE_STRLCPY strlcpy.c
 addsrcs USE_PRINTF_BUILTIN printf.c
 test 1 = "$USE_PRINTF_BUILTIN" && add_cppflags -DMKSH_PRINTF_BUILTIN
 test 1 = "$HAVE_CAN_VERB" && CFLAGS="$CFLAGS -verbose"
-add_cppflags -DMKSH_BUILD_R=501
+add_cppflags -DMKSH_BUILD_R=503
 
 $e $bi$me: Finished configuration testing, now producing output.$ao
 
@@ -2620,7 +2626,7 @@ MKSH_DISABLE_TTY_WARNING  shut up warning about ctty if OS cant be fixed
 MKSH_DONT_EMIT_IDSTRING                omit RCS IDs from binary
 MKSH_MIDNIGHTBSD01ASH_COMPAT   set -o sh: additional compatibility quirk
 MKSH_NOPROSPECTOFWORK          disable jobs, co-processes, etc. (do not use)
-MKSH_NOPWNAM                   skip PAM calls, for -static on eglibc, Solaris
+MKSH_NOPWNAM                   skip PAM calls, for -static on glibc or Solaris
 MKSH_NO_CMDLINE_EDITING                disable command line editing code entirely
 MKSH_NO_DEPRECATED_WARNING     omit warning when deprecated stuff is run
 MKSH_NO_EXTERNAL_CAT           omit hack to skip cat builtin when flags passed
@@ -2647,7 +2653,7 @@ $ (sh Build.sh -r -c lto && ./test.sh -f) 2>&1 | tee log
 Copy dot.mkshrc to /etc/skel/.mkshrc; install mksh into $prefix/bin; or
 /bin; install the manpage, if omitting the -r flag a catmanpage is made
 using $NROFF. Consider using a forward script as /etc/skel/.mkshrc like
-https://www.mirbsd.org/cvs.cgi/contrib/hosted/tg/deb/mksh/debian/.mkshrc?rev=HEAD
+http://anonscm.debian.org/cgit/collab-maint/mksh.git/plain/debian/.mkshrc
 and put dot.mkshrc as /etc/mkshrc so users need not keep up their HOME.
 
 EOD
index e71564d..d688509 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: src/bin/mksh/check.pl,v 1.36 2014/06/09 13:25:50 tg Exp $
+# $MirOS: src/bin/mksh/check.pl,v 1.37 2014/08/19 07:43:32 tg Exp $
 # $OpenBSD: th,v 1.1 2013/12/02 20:39:44 millert Exp $
 #-
 # Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2011,
@@ -348,6 +348,7 @@ if ($tot_failed || $tot_passed) {
     print " ($nifailed ignored)" if $nifailed;
     print " ($nxfailed unexpected)" if $nxfailed;
     print " (as expected)" if $nfailed && !$nxfailed && !$nifailed;
+    print " ($nfailed expected)" if $nfailed && ($nxfailed || $nifailed);
     print "\nTotal passed: $tot_passed";
     print " ($nxpassed unexpected)" if $nxpassed;
     print "\n";
index 6db4f3a..9c86afd 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: src/bin/mksh/check.t,v 1.654 2014/06/29 11:28:26 tg Exp $
+# $MirOS: src/bin/mksh/check.t,v 1.659 2014/10/03 17:32:09 tg Exp $
 # OpenBSD src/regress/bin/ksh updated: 2013/12/02 20:39:44
 #-
 # Copyright © 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
@@ -27,7 +27,7 @@
 # http://www.freebsd.org/cgi/cvsweb.cgi/src/tools/regression/bin/test/regress.sh?rev=HEAD
 
 expected-stdout:
-       @(#)MIRBSD KSH R50 2014/06/29
+       @(#)MIRBSD KSH R50 2014/10/03
 description:
        Check version of shell.
 stdin:
@@ -36,7 +36,7 @@ name: KSH_VERSION
 category: shell:legacy-no
 ---
 expected-stdout:
-       @(#)LEGACY KSH R50 2014/06/29
+       @(#)LEGACY KSH R50 2014/10/03
 description:
        Check version of legacy shell.
 stdin:
@@ -3733,6 +3733,400 @@ stdin:
 expected-stdout:
         <1> <shift> <1> <2>
 ---
+name: IFS-subst-3
+description:
+       Check leading IFS non-whitespace after trim does make a field
+stdin:
+       showargs() { for i; do echo -n " <$i>"; done; echo; }
+       IFS=:
+       showargs 1 ${-+:foo:bar}
+expected-stdout:
+        <1> <> <foo> <bar>
+---
+name: IFS-subst-4-1
+description:
+       reported by mikeserv
+stdin:
+       a='space divded  argument
+       here'
+       IFS=\  ; set -- $a
+       IFS= ; q="$*" ; nq=$*
+       printf '<%s>\n' "$*" $* "$q" "$nq"
+       [ "$q" = "$nq" ] && echo =true || echo =false
+expected-stdout:
+       <spacedivdedargument
+       here>
+       <space>
+       <divded>
+       <argument
+       here>
+       <spacedivdedargument
+       here>
+       <spacedivdedargument
+       here>
+       =true
+---
+name: IFS-subst-4-2
+description:
+       extended testsuite based on problem by mikeserv
+stdin:
+       a='space divded  argument
+       here'
+       IFS=\  ; set -- $a
+       IFS= ; q="$@" ; nq=$@
+       printf '<%s>\n' "$*" $* "$q" "$nq"
+       [ "$q" = "$nq" ] && echo =true || echo =false
+expected-stdout:
+       <spacedivdedargument
+       here>
+       <space>
+       <divded>
+       <argument
+       here>
+       <space divded argument
+       here>
+       <space divded argument
+       here>
+       =true
+---
+name: IFS-subst-4-3
+description:
+       extended testsuite based on problem by mikeserv
+stdin:
+       a='space divded  argument
+       here'
+       IFS=\ ; set -- $a; IFS=
+       qs="$*"
+       nqs=$*
+       qk="$@"
+       nqk=$@
+       printf '= qs '; printf '<%s>\n' "$qs"
+       printf '=nqs '; printf '<%s>\n' "$nqs"
+       printf '= qk '; printf '<%s>\n' "$qk"
+       printf '=nqk '; printf '<%s>\n' "$nqk"
+       printf '~ qs '; printf '<%s>\n' "$*"
+       printf '~nqs '; printf '<%s>\n' $*
+       printf '~ qk '; printf '<%s>\n' "$@"
+       printf '~nqk '; printf '<%s>\n' $@
+expected-stdout:
+       = qs <spacedivdedargument
+       here>
+       =nqs <spacedivdedargument
+       here>
+       = qk <space divded argument
+       here>
+       =nqk <space divded argument
+       here>
+       ~ qs <spacedivdedargument
+       here>
+       ~nqs <space>
+       <divded>
+       <argument
+       here>
+       ~ qk <space>
+       <divded>
+       <argument
+       here>
+       ~nqk <space>
+       <divded>
+       <argument
+       here>
+---
+name: IFS-subst-4-4
+description:
+       extended testsuite based on problem by mikeserv
+stdin:
+       a='space divded  argument
+       here'
+       IFS=\ ; set -- $a; IFS=
+       qs="$*"
+       printf '= qs '; printf '<%s>\n' "$qs"
+       printf '~ qs '; printf '<%s>\n' "$*"
+       nqs=$*
+       printf '=nqs '; printf '<%s>\n' "$nqs"
+       printf '~nqs '; printf '<%s>\n' $*
+       qk="$@"
+       printf '= qk '; printf '<%s>\n' "$qk"
+       printf '~ qk '; printf '<%s>\n' "$@"
+       nqk=$@
+       printf '=nqk '; printf '<%s>\n' "$nqk"
+       printf '~nqk '; printf '<%s>\n' $@
+expected-stdout:
+       = qs <spacedivdedargument
+       here>
+       ~ qs <spacedivdedargument
+       here>
+       =nqs <spacedivdedargument
+       here>
+       ~nqs <space>
+       <divded>
+       <argument
+       here>
+       = qk <space divded argument
+       here>
+       ~ qk <space>
+       <divded>
+       <argument
+       here>
+       =nqk <space divded argument
+       here>
+       ~nqk <space>
+       <divded>
+       <argument
+       here>
+---
+name: IFS-subst-4-4p
+description:
+       extended testsuite based on problem by mikeserv
+stdin:
+       a='space divded  argument
+       here'
+       IFS=\ ; set -- $a; IFS=
+       unset v
+       qs=${v:-"$*"}
+       printf '= qs '; printf '<%s>\n' "$qs"
+       printf '~ qs '; printf '<%s>\n' ${v:-"$*"}
+       nqs=${v:-$*}
+       printf '=nqs '; printf '<%s>\n' "$nqs"
+       printf '~nqs '; printf '<%s>\n' ${v:-$*}
+       qk=${v:-"$@"}
+       printf '= qk '; printf '<%s>\n' "$qk"
+       printf '~ qk '; printf '<%s>\n' ${v:-"$@"}
+       nqk=${v:-$@}
+       printf '=nqk '; printf '<%s>\n' "$nqk"
+       printf '~nqk '; printf '<%s>\n' ${v:-$@}
+expected-stdout:
+       = qs <spacedivdedargument
+       here>
+       ~ qs <spacedivdedargument
+       here>
+       =nqs <spacedivdedargument
+       here>
+       ~nqs <space>
+       <divded>
+       <argument
+       here>
+       = qk <space divded argument
+       here>
+       ~ qk <space>
+       <divded>
+       <argument
+       here>
+       =nqk <space divded argument
+       here>
+       ~nqk <space>
+       <divded>
+       <argument
+       here>
+---
+name: IFS-subst-4-5
+description:
+       extended testsuite based on problem by mikeserv
+stdin:
+       a='space divded  argument
+       here'
+       IFS=\ ; set -- $a; IFS=,
+       qs="$*"
+       printf '= qs '; printf '<%s>\n' "$qs"
+       printf '~ qs '; printf '<%s>\n' "$*"
+       nqs=$*
+       printf '=nqs '; printf '<%s>\n' "$nqs"
+       printf '~nqs '; printf '<%s>\n' $*
+       qk="$@"
+       printf '= qk '; printf '<%s>\n' "$qk"
+       printf '~ qk '; printf '<%s>\n' "$@"
+       nqk=$@
+       printf '=nqk '; printf '<%s>\n' "$nqk"
+       printf '~nqk '; printf '<%s>\n' $@
+expected-stdout:
+       = qs <space,divded,argument
+       here>
+       ~ qs <space,divded,argument
+       here>
+       =nqs <space,divded,argument
+       here>
+       ~nqs <space>
+       <divded>
+       <argument
+       here>
+       = qk <space divded argument
+       here>
+       ~ qk <space>
+       <divded>
+       <argument
+       here>
+       =nqk <space divded argument
+       here>
+       ~nqk <space>
+       <divded>
+       <argument
+       here>
+---
+name: IFS-subst-4-5p
+description:
+       extended testsuite based on problem by mikeserv
+stdin:
+       a='space divded  argument
+       here'
+       IFS=\ ; set -- $a; IFS=,
+       unset v
+       qs=${v:-"$*"}
+       printf '= qs '; printf '<%s>\n' "$qs"
+       printf '~ qs '; printf '<%s>\n' ${v:-"$*"}
+       nqs=${v:-$*}
+       printf '=nqs '; printf '<%s>\n' "$nqs"
+       printf '~nqs '; printf '<%s>\n' ${v:-$*}
+       qk=${v:-"$@"}
+       printf '= qk '; printf '<%s>\n' "$qk"
+       printf '~ qk '; printf '<%s>\n' ${v:-"$@"}
+       nqk=${v:-$@}
+       printf '=nqk '; printf '<%s>\n' "$nqk"
+       printf '~nqk '; printf '<%s>\n' ${v:-$@}
+expected-stdout:
+       = qs <space,divded,argument
+       here>
+       ~ qs <space,divded,argument
+       here>
+       =nqs <space,divded,argument
+       here>
+       ~nqs <space>
+       <divded>
+       <argument
+       here>
+       = qk <space divded argument
+       here>
+       ~ qk <space>
+       <divded>
+       <argument
+       here>
+       =nqk <space divded argument
+       here>
+       ~nqk <space>
+       <divded>
+       <argument
+       here>
+---
+name: IFS-subst-5
+description:
+       extended testsuite based on IFS-subst-3
+       differs slightly from ksh93:
+       - omit trailing field in a3zna, a7ina (unquoted $@ expansion)
+       - has extra middle fields in b5ins, b7ina (IFS_NWS unquoted expansion)
+       differs slightly from bash:
+       - omit leading field in a5ins, a7ina (IFS_NWS unquoted expansion)
+       differs slightly from zsh:
+       - differs in assignment, not expansion; probably zsh bug
+       - has extra middle fields in b5ins, b7ina (IFS_NWS unquoted expansion)
+       'emulate sh' zsh has extra fields in
+       - a5ins (IFS_NWS unquoted $*)
+       - b5ins, matching mksh’s
+stdin:
+       "$__progname" -c 'IFS=; set -- "" 2 ""; printf "[%s]\n" $*; x=$*; printf "<%s>\n" "$x"'
+       echo '=a1zns'
+       "$__progname" -c 'IFS=; set -- "" 2 ""; printf "[%s]\n" "$*"; x="$*"; printf "<%s>\n" "$x"'
+       echo '=a2zqs'
+       "$__progname" -c 'IFS=; set -- "" 2 ""; printf "[%s]\n" $@; x=$@; printf "<%s>\n" "$x"'
+       echo '=a3zna'
+       "$__progname" -c 'IFS=; set -- "" 2 ""; printf "[%s]\n" "$@"; x="$@"; printf "<%s>\n" "$x"'
+       echo '=a4zqa'
+       "$__progname" -c 'IFS=,; set -- "" 2 ""; printf "[%s]\n" $*; x=$*; printf "<%s>\n" "$x"'
+       echo '=a5ins'
+       "$__progname" -c 'IFS=,; set -- "" 2 ""; printf "[%s]\n" "$*"; x="$*"; printf "<%s>\n" "$x"'
+       echo '=a6iqs'
+       "$__progname" -c 'IFS=,; set -- "" 2 ""; printf "[%s]\n" $@; x=$@; printf "<%s>\n" "$x"'
+       echo '=a7ina'
+       "$__progname" -c 'IFS=,; set -- "" 2 ""; printf "[%s]\n" "$@"; x="$@"; printf "<%s>\n" "$x"'
+       echo '=a8iqa'
+       "$__progname" -c 'IFS=; set -- A B "" "" C; printf "[%s]\n" $*; x=$*; printf "<%s>\n" "$x"'
+       echo '=b1zns'
+       "$__progname" -c 'IFS=; set -- A B "" "" C; printf "[%s]\n" "$*"; x="$*"; printf "<%s>\n" "$x"'
+       echo '=b2zqs'
+       "$__progname" -c 'IFS=; set -- A B "" "" C; printf "[%s]\n" $@; x=$@; printf "<%s>\n" "$x"'
+       echo '=b3zna'
+       "$__progname" -c 'IFS=; set -- A B "" "" C; printf "[%s]\n" "$@"; x="$@"; printf "<%s>\n" "$x"'
+       echo '=b4zqa'
+       "$__progname" -c 'IFS=,; set -- A B "" "" C; printf "[%s]\n" $*; x=$*; printf "<%s>\n" "$x"'
+       echo '=b5ins'
+       "$__progname" -c 'IFS=,; set -- A B "" "" C; printf "[%s]\n" "$*"; x="$*"; printf "<%s>\n" "$x"'
+       echo '=b6iqs'
+       "$__progname" -c 'IFS=,; set -- A B "" "" C; printf "[%s]\n" $@; x=$@; printf "<%s>\n" "$x"'
+       echo '=b7ina'
+       "$__progname" -c 'IFS=,; set -- A B "" "" C; printf "[%s]\n" "$@"; x="$@"; printf "<%s>\n" "$x"'
+       echo '=b8iqa'
+expected-stdout:
+       [2]
+       <2>
+       =a1zns
+       [2]
+       <2>
+       =a2zqs
+       [2]
+       < 2 >
+       =a3zna
+       []
+       [2]
+       []
+       < 2 >
+       =a4zqa
+       [2]
+       <,2,>
+       =a5ins
+       [,2,]
+       <,2,>
+       =a6iqs
+       [2]
+       < 2 >
+       =a7ina
+       []
+       [2]
+       []
+       < 2 >
+       =a8iqa
+       [A]
+       [B]
+       [C]
+       <ABC>
+       =b1zns
+       [ABC]
+       <ABC>
+       =b2zqs
+       [A]
+       [B]
+       [C]
+       <A B   C>
+       =b3zna
+       [A]
+       [B]
+       []
+       []
+       [C]
+       <A B   C>
+       =b4zqa
+       [A]
+       [B]
+       []
+       []
+       [C]
+       <A,B,,,C>
+       =b5ins
+       [A,B,,,C]
+       <A,B,,,C>
+       =b6iqs
+       [A]
+       [B]
+       []
+       []
+       [C]
+       <A B   C>
+       =b7ina
+       [A]
+       [B]
+       []
+       []
+       [C]
+       <A B   C>
+       =b8iqa
+---
 name: IFS-arith-1
 description:
        http://austingroupbugs.net/view.php?id=832
@@ -7791,6 +8185,17 @@ stdin:
 expected-stdout:
        <1> <> <2> <> <+> <> <3> <> <+> <> .
 ---
+name: varexpand-null-3
+description:
+       Ensure concatenating behaviour matches other shells
+       although the line 2<> is probably wrong? XNULLSUB case.
+stdin:
+       x=; printf "1<%s>\n" "$x$@"
+       set A; printf "2<%s>\n" "${@:+}"
+expected-stdout:
+       1<>
+       2<>
+---
 name: print-funny-chars
 description:
        Check print builtin's capability to output designated characters
index 99cc9a1..233a10c 100644 (file)
@@ -1,5 +1,5 @@
 # $Id$
-# $MirOS: src/bin/mksh/dot.mkshrc,v 1.88 2014/01/11 18:09:39 tg Exp $
+# $MirOS: src/bin/mksh/dot.mkshrc,v 1.89 2014/07/28 21:45:44 tg Exp $
 #-
 # Copyright (c) 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010,
 #              2011, 2012, 2013, 2014
@@ -242,20 +242,23 @@ function pushd {
 
 # pager (not control character safe)
 function smores {
-       local dummy line llen curlin=0
-
-       cat "$@" | while IFS= read -r line; do
-               llen=${%line}
-               (( llen == -1 )) && llen=${#line}
-               (( llen = llen ? (llen + COLUMNS - 1) / COLUMNS : 1 ))
-               if (( (curlin += llen) >= LINES )); then
-                       print -n -- '\033[7m--more--\033[0m'
-                       read -u1 dummy
-                       [[ $dummy = [Qq]* ]] && return 0
-                       curlin=$llen
-               fi
-               print -r -- "$line"
-       done
+       (
+               set +m
+               cat "$@" |&
+               trap "rv=\$?; kill $! >/dev/null 2>&1; exit \$rv" EXIT
+               while IFS= read -pr line; do
+                       llen=${%line}
+                       (( llen == -1 )) && llen=${#line}
+                       (( llen = llen ? (llen + COLUMNS - 1) / COLUMNS : 1 ))
+                       if (( (curlin += llen) >= LINES )); then
+                               print -n -- '\033[7m--more--\033[0m'
+                               read -u1 || exit $?
+                               [[ $REPLY = [Qq]* ]] && exit 0
+                               curlin=$llen
+                       fi
+                       print -r -- "$line"
+               done
+       )
 }
 
 # base64 encoder and decoder, RFC compliant, NUL safe
index 2459db7..ee5ed5c 100644 (file)
@@ -28,7 +28,7 @@
 
 #ifndef MKSH_NO_CMDLINE_EDITING
 
-__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.275 2014/01/05 21:57:24 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.276 2014/07/13 11:34:28 tg Exp $");
 
 /*
  * in later versions we might use libtermcap for this, but since external
@@ -1628,7 +1628,7 @@ x_zots(char *str)
        int adj = x_adj_done;
 
        x_lastcp();
-       while (*str && str < xlp && adj == x_adj_done)
+       while (*str && str < xlp && x_col < xx_cols && adj == x_adj_done)
                x_zotc3(&str);
 }
 
index 62a2fad..3bf183c 100644 (file)
@@ -23,7 +23,7 @@
 
 #include "sh.h"
 
-__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.150 2014/06/09 11:16:07 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.152 2014/10/03 17:32:11 tg Exp $");
 
 /*
  * string expansion
@@ -244,8 +244,8 @@ expand(
                internal_errorf("expand(NULL)");
        /* for alias, readonly, set, typeset commands */
        if ((f & DOVACHECK) && is_wdvarassign(ccp)) {
-               f &= ~(DOVACHECK|DOBLANK|DOGLOB|DOTILDE);
-               f |= DOASNTILDE;
+               f &= ~(DOVACHECK | DOBLANK | DOGLOB | DOTILDE);
+               f |= DOASNTILDE | DOASNFIELD;
        }
        if (Flag(FNOGLOB))
                f &= ~DOGLOB;
@@ -261,7 +261,7 @@ expand(
        fdo = 0;
        saw_eq = false;
        /* must be 1/0 */
-       tilde_ok = (f & (DOTILDE|DOASNTILDE)) ? 1 : 0;
+       tilde_ok = (f & (DOTILDE | DOASNTILDE)) ? 1 : 0;
        doblank = 0;
        make_magic = false;
        word = (f&DOBLANK) ? IFS_WS : IFS_WORD;
@@ -422,7 +422,7 @@ expand(
                                                print_value_quoted(&shf, str_val(st->var));
                                                x.str = shf_sclose(&shf);
                                                break;
-                                       }
+                                           }
                                        case '0': {
                                                char *beg, *mid, *end, *stg;
                                                mksh_ari_t from = 0, num = -1, flen, finc = 0;
@@ -472,7 +472,7 @@ expand(
                                                        utfincptr(beg, &num);
                                                strndupx(x.str, beg, num, ATEMP);
                                                goto do_CSUBST;
-                                       }
+                                           }
                                        case '/': {
                                                char *s, *p, *d, *sbeg, *end;
                                                char *pat, *rrep;
@@ -616,7 +616,7 @@ expand(
                                                if (rrep != null)
                                                        afree(rrep, ATEMP);
                                                goto do_CSUBST;
-                                       }
+                                           }
                                        case '#':
                                        case '%':
                                                /* ! DOBLANK,DOBRACE,DOTILDE */
@@ -649,7 +649,7 @@ expand(
                                                 * a arithmetic operator.
                                                 */
                                                if (!(x.var->flag & INTEGER))
-                                                       f |= DOASNTILDE|DOTILDE;
+                                                       f |= DOASNTILDE | DOTILDE;
                                                f |= DOTEMP;
                                                /*
                                                 * These will be done after the
@@ -663,6 +663,7 @@ expand(
                                                f |= DOTEMP;
                                                /* FALLTHROUGH */
                                        default:
+                                               word = IFS_WORD;
                                                /* Enable tilde expansion */
                                                tilde_ok = 1;
                                                f |= DOTILDE;
@@ -671,7 +672,7 @@ expand(
                                        /* skip word */
                                        sp += wdscan(sp, CSUBST) - sp;
                                continue;
-                       }
+                           }
                        case CSUBST:
                                /* only get here if expanding word */
  do_CSUBST:
@@ -741,6 +742,7 @@ expand(
                                        if (f & DOBLANK)
                                                doblank++;
                                        st = st->prev;
+                                       word = quote || (!*x.str && (f & DOASNFIELD)) ? IFS_WORD : IFS_WS;
                                        continue;
                                case '?': {
                                        char *s = Xrestpos(ds, dp, st->base);
@@ -749,13 +751,14 @@ expand(
                                            dp == s ?
                                            "parameter null or not set" :
                                            (debunk(s, s, strlen(s) + 1), s));
-                               }
+                                   }
                                case '0':
                                case '/':
                                case 0x100 | '#':
                                case 0x100 | 'Q':
                                        dp = Xrestpos(ds, dp, st->base);
                                        type = XSUB;
+                                       word = quote || (!*x.str && (f & DOASNFIELD)) ? IFS_WORD : IFS_WS;
                                        if (f & DOBLANK)
                                                doblank++;
                                        st = st->prev;
@@ -795,13 +798,6 @@ expand(
                        type = XBASE;
                        if (f & DOBLANK) {
                                doblank--;
-                               /*
-                                * XXX not really correct:
-                                *      x=; "$x$@"
-                                * should generate a null argument and
-                                *      set A; "${@:+}"
-                                * shouldn't.
-                                */
                                if (dp == Xstring(ds, dp))
                                        word = IFS_WS;
                        }
@@ -825,7 +821,7 @@ expand(
                        if ((c = *x.str++) == '\0') {
                                /*
                                 * force null words to be created so
-                                * set -- '' 2 ''; foo "$@" will do
+                                * set -- "" 2 ""; echo "$@" will do
                                 * the right thing
                                 */
                                if (quote && x.split)
@@ -837,9 +833,21 @@ expand(
                                        continue;
                                }
                                c = ifs0;
+                               if ((f & DOASNFIELD)) {
+                                       /* assignment, do not field-split */
+                                       if (x.split) {
+                                               c = ' ';
+                                               break;
+                                       }
+                                       if (c == 0) {
+                                               continue;
+                                       }
+                               }
                                if (c == 0) {
                                        if (quote && !x.split)
                                                continue;
+                                       if (!quote && word == IFS_WS)
+                                               continue;
                                        /* this is so we don't terminate */
                                        c = ' ';
                                        /* now force-emit a word */
@@ -897,14 +905,14 @@ expand(
                         *      word            |       ws      nws     0
                         *      -----------------------------------
                         *      IFS_WORD                w/WS    w/NWS   w
-                        *      IFS_WS                  -/WS    w/NWS   -
-                        *      IFS_NWS                 -/NWS   w/NWS   w
+                        *      IFS_WS                  -/WS    -/NWS   -
+                        *      IFS_NWS                 -/NWS   w/NWS   -
                         * (w means generate a word)
                         * Note that IFS_NWS/0 generates a word (AT&T ksh
                         * doesn't do this, but POSIX does).
                         */
                        if (word == IFS_WORD ||
-                           (!ctype(c, C_IFSWS) && c && word == IFS_NWS)) {
+                           (word == IFS_NWS && c && !ctype(c, C_IFSWS))) {
  emit_word:
                                *dp++ = '\0';
                                cp = Xclose(ds, dp);
@@ -922,7 +930,8 @@ expand(
                                            strlen(cp) + 1));
                                fdo = 0;
                                saw_eq = false;
-                               tilde_ok = (f & (DOTILDE|DOASNTILDE)) ? 1 : 0;
+                               /* must be 1/0 */
+                               tilde_ok = (f & (DOTILDE | DOASNTILDE)) ? 1 : 0;
                                if (c == 0)
                                        return;
                                Xinit(ds, dp, 128, ATEMP);
@@ -1006,7 +1015,7 @@ expand(
                                         * through the sequence ${A=a=}~
                                         */
                                        if (type == XBASE &&
-                                           (f & (DOTILDE|DOASNTILDE)) &&
+                                           (f & (DOTILDE | DOASNTILDE)) &&
                                            (tilde_ok & 2)) {
                                                const char *tcp;
                                                char *tdp = dp;
index 70ef83d..b60511d 100644 (file)
@@ -23,7 +23,7 @@
 
 #include "sh.h"
 
-__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.132 2014/06/24 18:38:31 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.133 2014/10/03 17:32:11 tg Exp $");
 
 #ifndef MKSH_DEFAULT_EXECSHELL
 #define MKSH_DEFAULT_EXECSHELL "/bin/sh"
@@ -635,7 +635,7 @@ comexec(struct op *t, struct tbl * volatile tp, const char **ap,
        for (i = 0; t->vars[i]; i++) {
                /* do NOT lookup in the new var/fn block just created */
                e->loc = l_expand;
-               cp = evalstr(t->vars[i], DOASNTILDE);
+               cp = evalstr(t->vars[i], DOASNTILDE | DOASNFIELD);
                e->loc = l_assign;
                if (Flag(FXTRACE)) {
                        const char *ccp;
index 77d9494..bb7971e 100644 (file)
@@ -1,5 +1,5 @@
 /*     $OpenBSD: c_ksh.c,v 1.34 2013/12/17 16:37:05 deraadt Exp $      */
-/*     $OpenBSD: c_sh.c,v 1.44 2013/09/04 15:49:18 millert Exp $       */
+/*     $OpenBSD: c_sh.c,v 1.45 2014/08/27 08:26:04 jmc Exp $   */
 /*     $OpenBSD: c_test.c,v 1.18 2009/03/01 20:11:06 otto Exp $        */
 /*     $OpenBSD: c_ulimit.c,v 1.19 2013/11/28 10:33:37 sobrado Exp $   */
 
@@ -38,7 +38,7 @@
 #endif
 #endif
 
-__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.256 2014/06/09 13:25:52 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.258 2014/09/03 19:55:51 tg Exp $");
 
 #if HAVE_KILLPG
 /*
@@ -3643,12 +3643,14 @@ c_cat(const char **wp)
                                break;
                        while (n) {
                                w = write(STDOUT_FILENO, cp, n);
+                               eno = errno;
+                               /* give the user a chance to ^C out */
+                               intrcheck();
                                if (w == -1) {
-                                       if (errno == EINTR)
+                                       if (eno == EINTR)
                                                /* interrupted, try again */
                                                continue;
                                        /* an error occured during writing */
-                                       eno = errno;
                                        bi_errorf("%s: %s", "<stdout>",
                                            cstrerror(eno));
                                        rv = 1;
index 0216a34..18179c1 100644 (file)
@@ -23,7 +23,7 @@
 
 #include "sh.h"
 
-__RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.104 2014/06/10 22:17:09 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.105 2014/10/03 12:32:48 tg Exp $");
 
 #if HAVE_KILLPG
 #define mksh_killpg            killpg
@@ -1339,7 +1339,7 @@ j_sigchld(int sig MKSH_A_UNUSED)
        do {
 #ifndef MKSH_NOPROSPECTOFWORK
                pid = waitpid(-1, &status, (WNOHANG |
-#ifdef WCONTINUED
+#if defined(WCONTINUED) && defined(WIFCONTINUED)
                    WCONTINUED |
 #endif
                    WUNTRACED));
@@ -1381,7 +1381,7 @@ j_sigchld(int sig MKSH_A_UNUSED)
                if (WIFSTOPPED(status))
                        p->state = PSTOPPED;
                else
-#ifdef WIFCONTINUED
+#if defined(WCONTINUED) && defined(WIFCONTINUED)
                  if (WIFCONTINUED(status)) {
                        p->state = j->state = PRUNNING;
                        /* skip check_job(), no-op in this case */
index cc49349..f12d9b9 100644 (file)
@@ -1,6 +1,6 @@
 /*     $OpenBSD: main.c,v 1.54 2013/11/28 10:33:37 sobrado Exp $       */
-/*     $OpenBSD: tty.c,v 1.9 2006/03/14 22:08:01 deraadt Exp $ */
-/*     $OpenBSD: io.c,v 1.23 2013/12/17 16:37:06 deraadt Exp $ */
+/*     $OpenBSD: tty.c,v 1.10 2014/08/10 02:44:26 guenther Exp $       */
+/*     $OpenBSD: io.c,v 1.25 2014/08/11 20:28:47 guenther Exp $        */
 /*     $OpenBSD: table.c,v 1.15 2012/02/19 07:52:30 otto Exp $ */
 
 /*-
@@ -34,7 +34,7 @@
 #include <locale.h>
 #endif
 
-__RCSID("$MirOS: src/bin/mksh/main.c,v 1.280 2014/06/09 12:28:17 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/main.c,v 1.284 2014/10/03 17:19:27 tg Exp $");
 
 extern char **environ;
 
@@ -63,7 +63,7 @@ static const char initsubs[] =
 
 static const char *initcoms[] = {
        Ttypeset, "-r", initvsn, NULL,
-       Ttypeset, "-x", "HOME", "PATH", "RANDOM", "SHELL", NULL,
+       Ttypeset, "-x", "HOME", "PATH", "SHELL", NULL,
        Ttypeset, "-i10", "COLUMNS", "LINES", "SECONDS", "TMOUT", NULL,
        Talias,
        "integer=typeset -i",
@@ -184,7 +184,7 @@ main_init(int argc, const char *argv[], Source **sp, struct block **lp)
        int argi, i;
        Source *s = NULL;
        struct block *l;
-       unsigned char restricted, errexit, utf_flag;
+       unsigned char restricted_shell, errexit, utf_flag;
        char *cp;
        const char *ccp, **wp;
        struct tbl *vp;
@@ -407,7 +407,11 @@ main_init(int argc, const char *argv[], Source **sp, struct block **lp)
        setint_n((vp_pipest = global("PIPESTATUS")), 0, 10);
 
        /* Set this before parsing arguments */
-       Flag(FPRIVILEGED) = (kshuid != ksheuid || kshgid != kshegid) ? 2 : 0;
+       Flag(FPRIVILEGED) = (
+#if HAVE_ISSETUGID
+           issetugid() ||
+#endif
+           kshuid != ksheuid || kshgid != kshegid) ? 2 : 0;
 
        /* this to note if monitor is set on command line (see below) */
 #ifndef MKSH_UNEMPLOYED
@@ -573,7 +577,7 @@ main_init(int argc, const char *argv[], Source **sp, struct block **lp)
        }
 
        /* Disable during .profile/ENV reading */
-       restricted = Flag(FRESTRICTED);
+       restricted_shell = Flag(FRESTRICTED);
        Flag(FRESTRICTED) = 0;
        errexit = Flag(FERREXIT);
        Flag(FERREXIT) = 0;
@@ -603,7 +607,7 @@ main_init(int argc, const char *argv[], Source **sp, struct block **lp)
                        change_flag(FPRIVILEGED, OF_INTERNAL, false);
        }
 
-       if (restricted) {
+       if (restricted_shell) {
                shcomexec(restr_com);
                /* After typeset command... */
                Flag(FRESTRICTED) = 1;
index 481aac0..05729bc 100644 (file)
  * for speed reasons, specified for the regular stable hash, but very
  * much recommended if the actual output value may differ across runs
  * (so is using a random value instead of 0 for the IV).
+ *-
+ * Little quote gem:
+ *     We are looking into it. Changing the core
+ *     hash function in PHP isn't a trivial change
+ *     and will take us some time.
+ * -- Rasmus Lerdorf
  */
 
 #ifndef SYSKERN_MIRHASH_H
@@ -38,7 +44,7 @@
 
 #include <sys/types.h>
 
-__RCSID("$MirOS: src/bin/mksh/mirhash.h,v 1.2 2014/06/29 11:48:05 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/mirhash.h,v 1.3 2014/10/02 19:34:06 tg Exp $");
 
 /*-
  * BAFH itself is defined by the following primitives:
index 19291ce..e2657cb 100644 (file)
@@ -1,5 +1,5 @@
-.\" $MirOS: src/bin/mksh/mksh.1,v 1.336 2014/06/24 20:47:44 tg Exp $
-.\" $OpenBSD: ksh.1,v 1.152 2014/02/12 16:28:13 schwarze Exp $
+.\" $MirOS: src/bin/mksh/mksh.1,v 1.343 2014/10/03 12:35:38 tg Exp $
+.\" $OpenBSD: ksh.1,v 1.153 2014/08/17 07:15:41 jmc Exp $
 .\"-
 .\" Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
 .\"            2010, 2011, 2012, 2013, 2014
@@ -74,7 +74,7 @@
 .\" with -mandoc, it might implement .Mx itself, but we want to
 .\" use our own definition. And .Dd must come *first*, always.
 .\"
-.Dd $Mdocdate: June 24 2014 $
+.Dd $Mdocdate: October 3 2014 $
 .\"
 .\" Check which macro package we use, and do other -mdoc setup.
 .\"
@@ -208,7 +208,7 @@ will execute the command(s) contained in
 .Ar string .
 .It Fl i
 Interactive shell.
-A shell is
+A shell that reads commands from standard input is
 .Dq interactive
 if this
 option is used or if both standard input and standard error are attached
@@ -1232,10 +1232,8 @@ whitespace octets, in combination with zero or one
 whitespace octets, delimit a field.
 As a special case, leading and trailing
 .Ev IFS
-whitespace and trailing
-.Ev IFS
-non-whitespace are stripped (i.e. no leading or trailing empty field
-is created by it); leading
+whitespace is stripped (i.e. no leading or trailing empty field
+is created by it); leading or trailing
 .Pf non- Ev IFS
 whitespace does create an empty field.
 .Pp
@@ -1877,6 +1875,9 @@ This is different from
 .It Ev HISTSIZE
 The number of commands normally stored for history.
 The default is 2047.
+Do not set this value to insanely high values such as 1000000000 because
+.Nm
+can then not allocate enough memory for the history and will not start.
 .It Ev HOME
 The default directory for the
 .Ic cd
@@ -2697,7 +2698,7 @@ Not equal; the result is 0 if both arguments are equal, 1 if not.
 Less than; the result is 1 if the left argument is less than the right, 0 if
 not.
 .It \*(Lt= \*(Gt \*(Gt=
-Less than or equal, greater than or equal, greater than.
+Less than or equal, greater than, greater than or equal.
 See
 .Ic \*(Lt .
 .It \*(Lt\*(Lt\*(Lt \*(Gt\*(Gt\*(Gt
@@ -2711,8 +2712,15 @@ Shift left (right); the result is the left argument with its bits shifted left
 .It + \- * /
 Addition, subtraction, multiplication, and division.
 .It %
-Remainder; the result is the remainder of the division of the left argument by
-the right.
+Remainder; the result is the symmetric remainder of the division of the left
+argument by the right.
+To get the mathematical modulus of
+.Dq a Ic mod No b ,
+use the formula
+.Do
+.Pq a % b + b
+.No % b
+.Dc .
 .It Xo
 .Sm off
 .Aq Ar arg1 ?
@@ -6436,8 +6444,8 @@ foo \*(Ba bar \*(Ba& read \-p baz        # will, however, do so
 .Pp
 .Nm mksh
 provides a consistent set of 32-bit integer arithmetics, both signed
-and unsigned, with defined wraparound and sign of the result of a modulo
-operation, even (defying POSIX) on 64-bit systems.
+and unsigned, with defined wraparound and sign of the result of a
+remainder operation, even (defying POSIX) on 64-bit systems.
 If you require 64-bit integer arithmetics, use
 .Nm lksh Pq legacy mksh
 instead, but be aware that, in POSIX, it's legal for the OS to make
index be716ab..38f849b 100644 (file)
--- a/src/sh.h
+++ b/src/sh.h
 #endif
 
 #ifdef EXTERN
-__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.691 2014/06/29 11:28:28 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.695 2014/10/03 17:32:12 tg Exp $");
 #endif
-#define MKSH_VERSION "R50 2014/06/29"
+#define MKSH_VERSION "R50 2014/10/03"
 
 /* arithmetic types: C implementation */
 #if !HAVE_CAN_INTTYPES
@@ -533,7 +533,7 @@ char *ucstrstr(char *, const char *);
 #define mkssert(e)     do { } while (/* CONSTCOND */ 0)
 #endif
 
-#if (!defined(MKSH_BUILDMAKEFILE4BSD) && !defined(MKSH_BUILDSH)) || (MKSH_BUILD_R != 501)
+#if (!defined(MKSH_BUILDMAKEFILE4BSD) && !defined(MKSH_BUILDSH)) || (MKSH_BUILD_R != 503)
 #error Must run Build.sh to compile this.
 extern void thiswillneverbedefinedIhope(void);
 int
@@ -1396,6 +1396,7 @@ struct ioword {
 #define DOVACHECK BIT(9)       /* var assign check (for typeset, set, etc) */
 #define DOMARKDIRS BIT(10)     /* force markdirs behaviour */
 #define DOTCOMEXEC BIT(11)     /* not an eval flag, used by sh -c hack */
+#define DOASNFIELD BIT(12)     /* is assignment, change field handling */
 
 #define X_EXTRA        20      /* this many extra bytes in X string */
 
index ef114e1..9785f22 100644 (file)
--- a/src/var.c
+++ b/src/var.c
@@ -28,7 +28,7 @@
 #include <sys/sysctl.h>
 #endif
 
-__RCSID("$MirOS: src/bin/mksh/var.c,v 1.180 2014/06/26 20:36:02 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/var.c,v 1.182 2014/10/03 17:20:03 tg Exp $");
 
 /*-
  * Variables
@@ -751,18 +751,18 @@ typeset(const char *var, uint32_t set, uint32_t clr, int field, int base)
                }
                val += len;
        }
-       if (val[0] == '=' || (val[0] == '+' && val[1] == '=')) {
+       if (val[0] == '=') {
                strndupx(tvar, var, val - var, ATEMP);
-               if (*val++ == '+') {
-                       ++val;
-                       vappend = true;
-               }
-       } else if ((val[0] != '\0') || (set & IMPORT)) {
-               /*
-                * must have a = when setting a variable by importing
-                * the original environment, otherwise be empty; we
-                * also end up here when a variable name was invalid
-                */
+               ++val;
+       } else if (set & IMPORT) {
+               /* environment invalid variable name or no assignment */
+               return (NULL);
+       } else if (val[0] == '+' && val[1] == '=') {
+               strndupx(tvar, var, val - var, ATEMP);
+               val += 2;
+               vappend = true;
+       } else if (val[0] != '\0') {
+               /* other invalid variable names (not from environment) */
                return (NULL);
        } else {
                /* just varname with no value part nor equals sign */
@@ -789,8 +789,22 @@ typeset(const char *var, uint32_t set, uint32_t clr, int field, int base)
                }
                /* check target value for being a valid variable name */
                ccp = skip_varname(qval, false);
-               if (ccp == qval)
+               if (ccp == qval) {
+                       if (ksh_isdigit(qval[0])) {
+                               int c;
+
+                               if (getn(qval, &c))
+                                       goto nameref_rhs_checked;
+                       } else if (qval[1] == '\0') switch (qval[0]) {
+                       case '$':
+                       case '!':
+                       case '?':
+                       case '#':
+                       case '-':
+                               goto nameref_rhs_checked;
+                       }
                        errorf("%s: %s", var, "empty nameref target");
+               }
                len = (*ccp == '[') ? array_ref_len(ccp) : 0;
                if (ccp[len]) {
                        /*
@@ -801,6 +815,7 @@ typeset(const char *var, uint32_t set, uint32_t clr, int field, int base)
                        errorf("%s: %s", qval,
                            "nameref target not a valid parameter name");
                }
+ nameref_rhs_checked:
                /* prevent nameref loops */
                while (qval) {
                        if (!strcmp(qval, tvar))