Upgrade to mksh 50c.

Bug: 17814343

(cherry picked from commit 56b517d46c)

Change-Id: Ib116fa73e720b9a918afa9538ff22b69345ba3bf
This commit is contained in:
Elliott Hughes 2014-10-06 11:30:44 -07:00
parent 1bd2f37e63
commit b4542e99ca
16 changed files with 621 additions and 150 deletions

View 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_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_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
LOCAL_C_INCLUDES := $(LOCAL_PATH)/src
# check_categories= shell:legacy-no int:32 android convfds no-histfile
# 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)

View 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

View 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

View 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";

View 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 mkshs
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

View 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

View 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);
}

View 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;

View 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;

View 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;

View 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 */

View 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;

View file

@ -30,6 +30,12 @@
* 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:

View 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

View file

@ -169,9 +169,9 @@
#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 */

View file

@ -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))