# Copyright 2016-2021 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Test that gdb's (or gdbserver's) own signal handling does not
# interfere with the signal actions (dispositions, etc.) and mask
# their spawned children inherit.
#
# - If gdb inherits some signal set to SIG_IGN, so should the
#   inferior, even if gdb itself chooses not to ignore the signal.
#
# - If gdb inherits some signal set to SIG_DFL, so should the inferior
#   even if gdb itself ignores that signal.
#
# This requires special support in gdb/gdbserver because the exec
# family of functions does not reset the signal disposition of signals
# that are set to SIG_IGN, nor signal masks and flags.

standard_testfile

if {![is_remote host] && ![is_remote target]} {
    set gdb_txt [standard_output_file gdb.txt]
    set standalone_txt [standard_output_file standalone.txt]
    set purely_local 1
} else {
    set gdb_txt gdb.txt
    set standalone_txt standalone.txt
    set purely_local 0
}

remote_file host delete $gdb_txt
remote_file host delete $standalone_txt
remote_file target delete $gdb_txt
remote_file target delete $standalone_txt

set options [list debug "additional_flags=-DOUTPUT_TXT=\"$gdb_txt\""]
if {[build_executable $testfile.exp $testfile $srcfile $options]} {
    untested "failed to compile"
    return -1
}

set options [list debug "additional_flags=-DOUTPUT_TXT=\"$standalone_txt\""]
if {[build_executable $testfile.exp $testfile-standalone $srcfile $options]} {
    untested "failed to compile"
    return -1
}

# Run the program directly, and dump its initial signal actions and
# mask in "standalone.txt".

# Use remote_spawn instead of remote_exec, like how we spawn gdb.
# This is in order to take the same code code paths in dejagnu
# compared to when running the program through gdb.  E.g., because
# local_exec uses -ignore SIGHUP, while remote_spawn does not, if we
# used remote_exec, the test program would start with SIGHUP ignored
# when run standalone, but not when run through gdb.
set res [remote_spawn target "$binfile-standalone"]
if { $res < 0 || $res == "" } {
    untested "spawning $binfile-standalone failed"
    return 1
} else {
    pass "collect standalone signals state"
}
remote_close target

# Now run the program through gdb, and dump its initial signal actions
# and mask in "gdb.txt".

clean_restart $binfile

if { ! [ runto_main ] } then {
    return -1
}

gdb_continue_to_end "collect signals state under gdb"

if {!$purely_local} {
    # Copy file from target to host through build.
    remote_download host [remote_upload target gdb.txt] gdb.txt
    remote_download host [remote_upload target standalone.txt] standalone.txt
}

# Diff the .txt files.  They should be identical.
gdb_test "shell diff -s $standalone_txt $gdb_txt" \
    "Files .* are identical.*" \
    "signals states are identical"
