|  | #!/bin/sh | 
|  | # | 
|  | # Check how strace -e signal=set works. | 
|  | # | 
|  | # Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org> | 
|  | # Copyright (c) 2016-2017 The strace developers. | 
|  | # All rights reserved. | 
|  | # | 
|  | # Redistribution and use in source and binary forms, with or without | 
|  | # modification, are permitted provided that the following conditions | 
|  | # are met: | 
|  | # 1. Redistributions of source code must retain the above copyright | 
|  | #    notice, this list of conditions and the following disclaimer. | 
|  | # 2. Redistributions in binary form must reproduce the above copyright | 
|  | #    notice, this list of conditions and the following disclaimer in the | 
|  | #    documentation and/or other materials provided with the distribution. | 
|  | # 3. The name of the author may not be used to endorse or promote products | 
|  | #    derived from this software without specific prior written permission. | 
|  | # | 
|  | # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | 
|  | # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | 
|  | # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | 
|  | # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | 
|  | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 
|  | # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
|  | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
|  | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
|  | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 
|  | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  |  | 
|  | . "${srcdir=.}/init.sh" | 
|  |  | 
|  | test_one_sig() | 
|  | { | 
|  | local sigs | 
|  | sigs="$1"; shift | 
|  |  | 
|  | run_prog "../$NAME" "$@" > /dev/null | 
|  | run_strace -e trace=none -e signal="$sigs" "../$NAME" "$@" > "$EXP" | 
|  | match_diff "$LOG" "$EXP" | 
|  | } | 
|  |  | 
|  | test_sigs() | 
|  | { | 
|  | local first second sigs | 
|  | first="$1"; shift | 
|  | second="$1"; shift | 
|  |  | 
|  | for sigs; do | 
|  | test_one_sig "$sigs" 2 "$first" 15 "$second" | 
|  | done | 
|  | } | 
|  |  | 
|  | test_sigs '' '' \ | 
|  | none '!all' \ | 
|  | CHLD SIGCHLD ALRM SIGALRM \ | 
|  | chld sigchld alrm sigalrm \ | 
|  | CHLD,SIGALRM ALRM,SIGCHLD \ | 
|  | chld,sigalrm alrm,sigchld \ | 
|  | 9 9,4 9,4,11 \ | 
|  | 4,CHLD,11,ALRM,9 \ | 
|  | '!2,15' '!INT,TERM' '!SIGINT,TERM' '!INT,SIGTERM' '!SIGTERM,SIGINT' \ | 
|  | '!2,INT,TERM' '!2,SIGTERM' '!SIGINT,15' '!INT,SIGTERM,15' \ | 
|  | '!2,4,15' '!15,9,2,11,4' | 
|  |  | 
|  | test_sigs SIGINT '' \ | 
|  | 2 INT SIGINT \ | 
|  | CHLD,SIGINT SIGINT,SIGALRM \ | 
|  | chld,sigint sigint,sigalrm \ | 
|  | ALRM,2,SIGCHLD \ | 
|  | '!15' '!TERM' '!SIGTERM' \ | 
|  | '!15,TERM' '!SIGTERM,15,TERM' \ | 
|  | '!SIGALRM,TERM' '!CHLD,SIGTERM' \ | 
|  | '!ALRM,15' '!SIGCHLD,ALRM,SIGTERM,KILL' \ | 
|  | '!4,15' '!15,9,11,4' | 
|  |  | 
|  | test_sigs '' SIGTERM \ | 
|  | 15 TERM SIGTERM \ | 
|  | CHLD,SIGTERM SIGTERM,SIGALRM \ | 
|  | chld,sigterm sigterm,sigalrm \ | 
|  | ALRM,15,SIGCHLD \ | 
|  | '!2' '!INT' '!SIGINT' \ | 
|  | '!2,INT' '!SIGINT,2,INT' \ | 
|  | '!SIGALRM,INT' '!CHLD,SIGINT' \ | 
|  | '!ALRM,2' '!SIGCHLD,ALRM,SIGINT,KILL' \ | 
|  | '!4,2' '!2,9,11,4' | 
|  |  | 
|  | test_sigs SIGINT SIGTERM \ | 
|  | all '!none' \ | 
|  | INT,TERM SIGINT,TERM SIGTERM,INT SIGINT,SIGTERM \ | 
|  | int,term sigint,term sigterm,int sigint,sigterm \ | 
|  | 2,15 2,TERM SIGTERM,2 TERM,15,SIGINT,2 \ | 
|  | '!CHLD' '!SIGCHLD' '!ALRM' '!SIGALRM' \ | 
|  | '!CHLD,SIGALRM' '!ALRM,SIGCHLD' \ | 
|  | '!9' '!9,4' '!9,4,11' '!4,CHLD,11,ALRM,9' | 
|  |  | 
|  | fail_with() | 
|  | { | 
|  | dump_log_and_fail_with \ | 
|  | "strace -e signal=$* failed to handle an argument error properly" | 
|  | } | 
|  |  | 
|  | for arg in ' ' invalid_signal_name SIG -1 256 1-1 \ | 
|  | 1,2,4,8,16,32,64,128,256,512,1024 9,chdir; do | 
|  | $STRACE -e signal="$arg" true 2> "$LOG" && | 
|  | fail_with "$arg" | 
|  | LC_ALL=C grep -F 'invalid signal' < "$LOG" > /dev/null || | 
|  | fail_with "$arg" | 
|  | done | 
|  |  | 
|  | exit 0 |