# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2007, 2008, 2009
# 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/>.

if [target_info exists gdb,nointerrupts] {
    verbose "Skipping interrupt.exp because of nointerrupts."
    continue
}

if [target_info exists gdb,noinferiorio] {
    verbose "Skipping interrupt.exp because of noinferiorio."
    return
}

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile interrupt
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

set options { debug }
if { ! [target_info exists gdb,nosignals] } {
    lappend options "additional_flags=-DSIGNALS"
}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $options] != "" } {
     untested interrupt.exp
     return -1
}

gdb_start


if ![file exists $binfile] then {
    perror "$binfile does not exist."
    return 0
} else {
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $binfile
    # Hope this is unix :-)
    gdb_test "shell stty intr '^C'" "" \
	"set interrupt character in interrupt.exp"
    if [runto_main] then {
	send_gdb "continue\n"
	gdb_expect {
	    -re "\r\ntalk to me baby\r\n$" {
		pass "child process is alive"
	    }
	    timeout { fail "run (timeout)" }
	    eof { fail "run (eof)" }
	}
	# This should appear twice, once for the echo and once for the
	# program's output.  Under dejagnu (but not interactively) for
	# SunOS4, it only appears once.  Don't worry about it, I imagine
	# dejagnu has just done something to the tty modes.
	send_gdb "a\n"
	gdb_expect {
	    -re "^a\r\n(|a\r\n)$" {
		pass "child process ate our char"
	    }
	    timeout { fail "echo a (timeout)" }
	    eof { fail "echo a (eof)" }
	}
	# Wait until the program is in the read system call again.
	sleep 2

	# Cntrl-c may fail for simulator targets running on a BSD host.
	# This is the result of a combination of the read syscall
	# being restarted and gdb capturing the cntrl-c signal.

	# Cntrl-c may fail for simulator targets on slow hosts.
	# This is because there is a race condition between entering
	# the read and delivering the cntrl-c.

	send_gdb "\003"
	gdb_expect {
	    -re "Program received signal SIGINT.*$gdb_prompt $" {
		pass "send_gdb control C"
	    }
	    -re ".*$gdb_prompt $" { fail "send_gdb control C" }
	    timeout { fail "send_gdb control C (timeout)" }
	    eof { fail "send_gdb control C (eof)" }
	}

	send_gdb "p func1 ()\n"
	gdb_expect {
	    -re " = 4.*$gdb_prompt $" { pass "call function when asleep" }
	    -re ".*Program received signal SIG(SEGV|ILL).*$gdb_prompt $" {
		setup_xfail "i*86-pc-linux*-gnu*"
		fail "child died when we called func1, skipped rest of tests"
		return
	    }
	    -re "$gdb_prompt $" {
		# On HPUX-11.0 'send "p func1 ()"' above
		# terminates the program. A defect is pending on this
		# issue [defect #DTS CHFts24203]. Hence calling setup_xfail
		# below.
	        setup_xfail "hppa*-*-*11*" CHFts24203
		fail "call function when asleep (wrong output)"
	    }
	    default {

		# This fail probably happens whenever we use /proc (we
		# don't use PRSABORT), but apparently also happens on
		# other machines as well.

		setup_xfail "sparc*-*-solaris2*"
		setup_xfail "mips-*-ultrix*"
		setup_xfail "i*86-*-solaris2*"
		setup_xfail "*-*-sysv4*"
		setup_xfail "vax-*-*"
		setup_xfail "alpha-*-*"
		setup_xfail "*-*-*bsd*"
		setup_xfail "*-*-irix*"
		setup_xfail "*-*-hpux*"
		setup_xfail "*-*-*lynx*"
		fail "call function when asleep (stays asleep)"
		# Send_Gdb a newline to wake it up
		send_gdb "\n"
		gdb_test "" " = 4" "call function after waking it"
	    }
#	    eof { fail "call function when asleep (eof)" }
	}

	# Now try calling the function again.
	gdb_test "p func1 ()" " = 4" "call function a second time"

	# And the program should still be doing the same thing.
	# The optional trailing \r\n is in case we sent a newline above
	# to wake the program, in which case the program now sends it
	# back.  We check for it either here or in the next gdb_expect
	# command, because which one it ends up in is timing dependent.
	send_gdb "continue\n"
	# For some reason, i386-*-sysv4 gdb fails to issue the Continuing
	# message, but otherwise appears normal (FIXME).
	gdb_expect {
	    -re "^continue\r\nContinuing.\r\n(\r\n|)$" { pass "continue" }
	    -re "^continue\r\n\r\n" { fail "continue (missing Continuing.)" }
	    -re "$gdb_prompt $" { fail "continue" }
	    timeout { fail "continue (timeout)" }
	    eof { fail "continue (eof)" }
	}

	send_gdb "data\n"
	# The optional leading \r\n is in case we sent a newline above
	# to wake the program, in which case the program now sends it
	# back.
        # FIXME: The pattern below leads to an expected success on HPUX-11.0
        # but the success is spurious. Need to provide the right reg.expr.
        # here.
	gdb_expect {
	    -re "^(\r\n|)data\r\n(|data\r\n)$" { pass "echo data" }
	    timeout { fail "echo data (timeout)" }
	    eof { fail "echo data (eof)" }
	}

 	if { ! [target_info exists gdb,nosignals] } {
	    # Wait until the program is in the read system call again.
	    sleep 2

	    # Stop the program for another test.
	    set msg "Send Control-C, second time"
	    send_gdb "\003"
	    gdb_test_multiple "" "$msg" {
		-re "Program received signal SIGINT.*$gdb_prompt $" {
		    pass "$msg"
		}
	    }

	    # The "signal" command should deliver the correct signal and
	    # return to the loop.
	    set msg "signal SIGINT"
	    gdb_test_multiple "signal SIGINT" "$msg" {
		-re "^signal SIGINT\r\nContinuing with signal SIGINT.\r\n(\r\n|)$" { pass "$msg" }
	    }

	    # We should be back in the loop.
	    send_gdb "more data\n"
	    gdb_expect {
		-re "^(\r\n|)more data\r\n(|more data\r\n)$" { pass "echo more data" }
		timeout { fail "echo more data (timeout)" }
		eof { fail "echo more data (eof)" }
	    }
	}

	send_gdb "\004"
	gdb_expect {
	    -re "end of file.*Program exited normally.*$gdb_prompt $" {
		pass "send end of file"
	    }
	    -re "$gdb_prompt $" { fail "send end of file" }
	    timeout { fail "send end of file (timeout)" }
	    eof { fail "send end of file (eof)" }
	}
    }
}
return 0
