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