From 0f1b18abb46844c01accf8cd0a698ea419fb3ee6 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Sun, 3 Feb 2013 16:27:57 +0000 Subject: [PATCH] gdb/ * contrib/expect-read1.c: New file. * contrib/expect-read1.sh: New file. --- gdb/ChangeLog | 5 +++++ gdb/contrib/expect-read1.c | 40 +++++++++++++++++++++++++++++++++++ gdb/contrib/expect-read1.sh | 42 +++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 gdb/contrib/expect-read1.c create mode 100644 gdb/contrib/expect-read1.sh diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a7f2e0c345e..c8ee3312fa5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2013-02-03 Jan Kratochvil + + * contrib/expect-read1.c: New file. + * contrib/expect-read1.sh: New file. + 2013-02-03 Jan Kratochvil * dwarf2read.c (file_file_name): New function with code from diff --git a/gdb/contrib/expect-read1.c b/gdb/contrib/expect-read1.c new file mode 100644 index 00000000000..963c1ffab93 --- /dev/null +++ b/gdb/contrib/expect-read1.c @@ -0,0 +1,40 @@ +/* Copyright (C) 2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +/* RTLD_NEXT requires _GNU_SOURCE. */ +#define _GNU_SOURCE 1 +#include +#include +#include +#include + +ssize_t +read (int fd, void *buf, size_t count) +{ + static ssize_t (*read2) (int fd, void *buf, size_t count) = NULL; + + if (read2 == NULL) + { + unsetenv ("LD_PRELOAD"); + read2 = dlsym (RTLD_NEXT, "read"); + } + + if (count > 1 && isatty (fd) == 1) + count = 1; + + return read2 (fd, buf, count); +} diff --git a/gdb/contrib/expect-read1.sh b/gdb/contrib/expect-read1.sh new file mode 100644 index 00000000000..ad325202f63 --- /dev/null +++ b/gdb/contrib/expect-read1.sh @@ -0,0 +1,42 @@ +#! /bin/sh +# runtest wrapper to reliably reproduce racy incomplete reads in the testsuite. + +# Copyright (C) 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 . + +# This tool excercise any incomplete reads handling in the testsuite by +# simulating read always returns just 1 character. +# Testsuite incompatibilities are tracked as GDB PR testsuite/12649. + +# Example usage: +# +# bash$ cd $objdir/gdb/testsuite +# bash$ EXPECT=$srcdir/gdb/contrib/expect-read1.sh runtest +# or +# bash$ EXPECT=../contrib/expect-read1.sh runtest + +C=`echo $0|sed 's/\.sh$/.c/'` +if ! test -e $C; then + echo >&2 "$0: Cannot find 'srcdir/gdb/contrib/expect-read1.c' at '$C'." + exit 2 +fi +SO=/tmp/expect-read1.$$.so +rm -f $SO +CMD="${CC_FOR_TARGET:-gcc} -o $SO -Wall -fPIC -shared $C" +if ! $CMD; then + echo >&2 "$0: Failed: $CMD" + exit 2 +fi +trap "rm -f $SO" EXIT +LD_PRELOAD=$SO expect "$@" -- 2.30.2