diff --git a/README.md b/README.md index f68f079..4d52c47 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,7 @@ # ksh +KSH-93 is the most recent version of the Korn Shell by David Korn of +AT&T Bell Laboratories. +Korn Shell is a shell programming language, which is upward compatible +with "sh" (the Bourne Shell). + diff --git a/dotkshrc b/dotkshrc new file mode 100644 index 0000000..3175df7 --- /dev/null +++ b/dotkshrc @@ -0,0 +1,8 @@ +# .kshrc + +# Source global definitions +if [ -f /etc/kshrc ]; then + . /etc/kshrc +fi + +# User specific aliases and functions diff --git a/expectedresults.log b/expectedresults.log new file mode 100644 index 0000000..e69de29 diff --git a/ksh-20070328-builtins.patch b/ksh-20070328-builtins.patch new file mode 100644 index 0000000..e50470a --- /dev/null +++ b/ksh-20070328-builtins.patch @@ -0,0 +1,32 @@ +diff -up ksh-20100924/src/cmd/ksh93/data/builtins.c.builtins ksh-20100924/src/cmd/ksh93/data/builtins.c +--- ksh-20100924/src/cmd/ksh93/data/builtins.c.builtins 2010-08-10 20:58:54.000000000 +0200 ++++ ksh-20100924/src/cmd/ksh93/data/builtins.c 2010-10-08 18:08:35.118675557 +0200 +@@ -125,20 +125,28 @@ const struct shtable3 shtab_builtins[] = + #ifdef SHOPT_CMDLIB_HDR + #include SHOPT_CMDLIB_HDR + #else ++#if 1 + CMDLIST(basename) + CMDLIST(chmod) + CMDLIST(dirname) + CMDLIST(getconf) + CMDLIST(head) ++#if 0 ++does not work when ACLs are used + CMDLIST(mkdir) ++#endif + CMDLIST(logname) ++#if 1 ++//does not work in chrooted environments, because /dev/fd/? is missing + CMDLIST(cat) ++#endif + CMDLIST(cmp) + CMDLIST(cut) + CMDLIST(uname) + CMDLIST(wc) + CMDLIST(sync) + #endif ++#endif + #if SHOPT_REGRESS + "__regress__", NV_BLTIN|BLT_ENV, bltin(__regress__), + #endif diff --git a/ksh-20100826-fixregr.patch b/ksh-20100826-fixregr.patch new file mode 100644 index 0000000..1b7fdbe --- /dev/null +++ b/ksh-20100826-fixregr.patch @@ -0,0 +1,59 @@ +diff -up ksh-20101122/src/cmd/ksh93/tests/builtins.sh.fixregr ksh-20101122/src/cmd/ksh93/tests/builtins.sh +--- ksh-20101122/src/cmd/ksh93/tests/builtins.sh.fixregr 2010-10-27 08:52:38.000000000 +0200 ++++ ksh-20101122/src/cmd/ksh93/tests/builtins.sh 2010-11-26 10:17:05.653551931 +0100 +@@ -291,9 +291,9 @@ then err_exit "printf '%..*s' not workin + fi + [[ $(printf '%q\n') == '' ]] || err_exit 'printf "%q" with missing arguments' + # we won't get hit by the one second boundary twice, right? +-[[ $(printf '%T\n' now) == "$(date)" ]] || +-[[ $(printf '%T\n' now) == "$(date)" ]] || +-err_exit 'printf "%T" now' ++[[ $(printf '%T\n' now | sed 's/GMT/UTC/') == "$(date)" ]] || ++[[ $(printf '%T\n' now | sed 's/GMT/UTC/') == "$(date)" ]] || ++err_exit 'printf "%T" now = '"$(printf '%T\n' now) != $(date)" + behead() + { + read line +diff -up ksh-20101122/src/cmd/ksh93/tests/locale.sh.fixregr ksh-20101122/src/cmd/ksh93/tests/locale.sh +--- ksh-20101122/src/cmd/ksh93/tests/locale.sh.fixregr 2010-11-13 01:29:23.000000000 +0100 ++++ ksh-20101122/src/cmd/ksh93/tests/locale.sh 2010-11-26 10:08:17.334737934 +0100 +@@ -104,6 +104,7 @@ if (( $($SHELL -c $'export LC_ALL='$loca + then LC_ALL=$locale $SHELL -c b1=$'"\342\202\254\342\202\254\342\202\254\342\202\254w\342\202\254\342\202\254\342\202\254\342\202\254"; [[ ${b1:4:1} == w ]]' || err_exit 'multibyte ${var:offset:len} not working correctly' + fi + ++locale=en_US.UTF-8 + #$SHELL -c 'export LANG='$locale'; printf "\u[20ac]\u[20ac]" > $tmp/two_euro_chars.txt' + printf $'\342\202\254\342\202\254' > $tmp/two_euro_chars.txt + exp="6 2 6" +@@ -111,11 +112,11 @@ set -- $($SHELL -c " + unset LC_CTYPE + export LANG=$locale + export LC_ALL=C +- command wc -C < $tmp/two_euro_chars.txt ++ command wc -m < $tmp/two_euro_chars.txt + unset LC_ALL +- command wc -C < $tmp/two_euro_chars.txt ++ command wc -m < $tmp/two_euro_chars.txt + export LC_ALL=C +- command wc -C < $tmp/two_euro_chars.txt ++ command wc -m < $tmp/two_euro_chars.txt + ") + got=$* + [[ $got == $exp ]] || err_exit "command wc LC_ALL default failed -- expected '$exp', got '$got'" +@@ -134,6 +135,8 @@ set -- $($SHELL -c " + got=$* + [[ $got == $exp ]] || err_exit "builtin wc LC_ALL default failed -- expected '$exp', got '$got'" + ++locale=C_EU.UTF-8 ++ + # multibyte char straddling buffer boundary + + { +@@ -190,6 +193,7 @@ do exp=$1 + done + + # setocale(LC_ALL,"") after setlocale() initialization ++locale=en_US.UTF-8 + + printf 'f1\357\274\240f2\n' > input1 + printf 't2\357\274\240f1\n' > input2 diff --git a/ksh.spec b/ksh.spec new file mode 100644 index 0000000..69fedf3 --- /dev/null +++ b/ksh.spec @@ -0,0 +1,113 @@ +%define pkg_version %(echo %version | tr . - ) +Name: ksh +Version: 2011.02.08 +Release: 1mamba +Summary: The Original ATT Korn Shell +Group: Applications/Shells +Vendor: openmamba +Distribution: openmamba +Packager: Silvan Calarco +URL: http://www.kornshell.com/ +Source0: http://www2.research.att.com/~gsf/download/tgz/ast-ksh.%{pkg_version}.tgz +Source1: http://www2.research.att.com/~gsf/download/tgz/INIT.%{pkg_version}.tgz +# from fedora +Source2: dotkshrc +Source3: kshrc.mamba +Source4: expectedresults.log +Patch0: ksh-20070328-builtins.patch +Patch1: ksh-20100826-fixregr.patch +License: Common Public License Version 1.0 +BuildRequires: bison +BuildRequires: diffutils +## AUTOBUILDREQ-BEGIN +BuildRequires: glibc-devel +## AUTOBUILDREQ-END +BuildRequires: procps +Requires: coreutils +Requires: grep +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +%description +KSH-93 is the most recent version of the Korn Shell by David Korn of +AT&T Bell Laboratories. +Korn Shell is a shell programming language, which is upward compatible +with "sh" (the Bourne Shell). + +%prep +%setup -q -c %{name}-%{version} +%setup -q -T -D -a 1 + +%patch0 -p1 +%patch1 -p1 + +sed -i 's|ls /dev/fd|ls /proc/self/fd|' src/cmd/ksh93/features/options + +%build +./bin/package +./bin/package make mamake ||: +./bin/package make mamake ||: +export CCFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" +export CC=gcc +./bin/package "make" + +cp lib/package/LICENSES/ast LICENSE + +%install +[ "%{buildroot}" != / ] && rm -rf "%{buildroot}" + +mkdir -p %{buildroot}{/bin,%{_bindir},%{_mandir}/man1} +install -c -m 755 arch/*/bin/ksh %{buildroot}/bin/ksh +install -c -m 755 arch/*/bin/shcomp %{buildroot}%{_bindir}/shcomp +install -c -m 644 arch/*/man/man1/sh.1 %{buildroot}%{_mandir}/man1/ksh.1 +mkdir -p %{buildroot}%{_sysconfdir}/skel +install -m 644 %{SOURCE2} %{buildroot}%{_sysconfdir}/skel/.kshrc +install -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/kshrc + +%check +export SHELL=$(ls $(pwd)/arch/*/bin/ksh) +cd src/cmd/ksh93/tests/ +ulimit -c unlimited +if [ ! -e /dev/fd ] +then + echo "ERROR: /dev/fd does not exist, regression tests skipped" + exit 0 +fi +$SHELL ./shtests 2>&1 | tee testresults.log +sed -e '/begins at/d' -e '/ 0 error/d' -e 's/at [^\[]*\[/\[/' testresults.log -e '/tests skipped/d' >filteredresults.log +if ! cmp filteredresults.log %{SOURCE4} >/dev/null || ls core.* +then + echo "Regression tests failed (ignoring)" + diff -Naurp %{SOURCE4} filteredresults.log || true +# exit -1 +fi +: + +%clean +[ "%{buildroot}" != / ] && rm -rf "%{buildroot}" + +%post +if [ ! -f %{_sysconfdir}/shells ]; then + echo "/bin/ksh" > %{_sysconfdir}/shells +else + if ! grep -q '^/bin/ksh$' %{_sysconfdir}/shells ; then + echo "/bin/ksh" >> %{_sysconfdir}/shells + fi +fi + +%postun +if [ ! -f /bin/ksh ]; then + sed -i '/^\/bin\/ksh$/ d' %{_sysconfdir}/shells +fi + +%files +%defattr(-,root,root) +%config(noreplace) %{_sysconfdir}/skel/.kshrc +%config(noreplace) %{_sysconfdir}/kshrc +/bin/ksh +%{_bindir}/shcomp +%{_mandir}/man1/ksh.1.gz +%doc LICENSE README + +%changelog +* Sat Feb 12 2011 gil 20110208-1mamba +- package created by autospec diff --git a/kshrc.mamba b/kshrc.mamba new file mode 100644 index 0000000..dcb2e23 --- /dev/null +++ b/kshrc.mamba @@ -0,0 +1,40 @@ +# +# /etc/kshrc is sourced in interactive shells. It +# should contain commands to set up aliases, functions, +# options, key bindings, etc. +# + +# Set prompts +#PROMPT='[%n@%m]%~%# ' # default prompt +#RPROMPT=' %~' # prompt for right side of screen + +_src_etc_profile_d() +{ + # from zshrc, with ksh fixes + if [[ ! -o login ]]; then # We're not a login shell + for i in /etc/profile.d/*.sh; do + if [ -r "$i" ]; then + . $i + fi + done + unset i + fi +} + +pathmunge () { +case ":${PATH}:" in +*:"$1":*) + ;; +*) + if [ "$2" = "after" ]; then + PATH=$PATH:$1 + else + PATH=$1:$PATH + fi +esac +} + +_src_etc_profile_d + +unset -f _src_etc_profile_d +unset -f pathmunge