# Copyright (C) 2012 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/>.

# Manipulation with PID on target is not supported.
if [is_remote target] then {
    return 0
}

set testfile attach-twice
set executable ${testfile}
set binfile ${objdir}/${subdir}/${executable}

if { [prepare_for_testing ${testfile}.exp $executable] } {
    return -1
}

set testpid [eval exec $binfile &]
exec sleep 2

set parentpid 0

set test "attach"
gdb_test_multiple "attach $testpid" $test {
    -re "Attaching to program: \[^\r\n\]*, process $testpid\r\n.*warning: process $testpid is already traced by process (\[0-9\]+)\r\n.*ptrace: Operation not permitted\\.\r\n$gdb_prompt $" {
	set parentpid $expect_out(1,string)
	pass $test
    }
    -re "Attaching to program: \[^\r\n\]*, process $testpid\r\n.*ptrace: Operation not permitted\\.\r\n$gdb_prompt $" {
	fail $test
    }
    -re "\r\n$gdb_prompt $" {
	xfail $test
    }
}

if {$parentpid != 0} {
  eval exec kill -9 $parentpid
}
eval exec kill -9 $testpid
