7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER START
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# The contents of this file are subject to the terms of the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Common Development and Distribution License (the "License").
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You may not use this file except in compliance with the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# or http://www.opensolaris.org/os/licensing.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# See the License for the specific language governing permissions
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# and limitations under the License.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# When distributing Covered Code, include this CDDL HEADER in each
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# If applicable, add the following below this CDDL HEADER, with the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# fields enclosed by brackets "[]" replaced with your own identifying
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# information: Portions Copyright [yyyy] [name of copyright owner]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# CDDL HEADER END
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Test whether CR #6763594 ('ksh93 executes command after "command"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# builtin twice on failure') has been fixed.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# Quote from CR #6763594:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# ---- snip ----
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# ksh93 has a bug which causes shell to execute the command after the
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# "command" builtin to be executed twice if "command" fails:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# -- snip --
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# $ ksh93 -x -c 'print "true" >myfoo ; chmod a+x,a-r myfoo ; command ./myfoo ;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# print $?'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# + print true
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# + 1> myfoo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# + chmod a+x,a-r myfoo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# + command ./myfoo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# ksh93[1]: ./myfoo: ./myfoo: cannot open [Permission denied]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# + print 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# + print 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# -- snip --
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# The "print" command at the end is executed twice in this case since
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# the shell jumps to the wrong position in the execution sequence.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# The correct output should be:
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# -- snip --
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# $ ksh93 -x -c 'print "true" >myfoo ; chmod a+x,a-r myfoo ; command ./myfoo ;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# print $?'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# + print true
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# + 1> myfoo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# + chmod a+x,a-r myfoo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# + command ./myfoo
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# ksh93[1]: ./myfoo: ./myfoo: cannot open [Permission denied]
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# + print 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# 1
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# -- snip --
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# ---- snip ----
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# test setup
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinfunction err_exit
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -n "\t"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin print -u2 -r ${Command}[$1]: "${@:2}"
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner (( Errors < 127 && Errors++ ))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinalias err_exit='err_exit $LINENO'
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzset -o nounset
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland MainzCommand=${0##*/}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chininteger Errors=0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset testtmpdir=/tmp/ksh93_test_cr_6763594_${PPID}_$$
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinmkdir "${testtmpdir}" || { err_exit "Could not create temporary directory ${testtmpdir}." ; exit ${Errors} ; }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincd "${testtmpdir}" || { err_exit "Cannot cd to temporary directory ${testtmpdir}." ; exit ${Errors} ; }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypeset s
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin${SHELL} -c 'print "true" >myfoo ; chmod a+x,a-r myfoo ; command ./myfoo ; print $?' 1>out_stdout 2>out_stderr
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin(( $? == 0 )) || err_exit "Return code $?, expected 0"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chins=$( < out_stdout ) ; [[ "$s" == '126' ]] || err_exit "Expected '126', got $(printf "%q\n" "$s")."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chins=$( < out_stderr ) ; [[ "$s" == ~(Elr)(.*:\ \./myfoo:\ \./myfoo:\ .*\[.*\]) ]] || err_exit "Output $(printf "%q\n" "$s") does not match pattern '~(Elr)(.*:\ \./myfoo:\ \./myfoo:\ .*\[.*\])'."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinrm "myfoo" "out_stdout" "out_stderr" || err_exit "rm failed."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chincd ..
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinrmdir "${testtmpdir}" || err_exit "Failed to remove temporary directory ${testtmpdir}."
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# tests done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinexit $((Errors))