aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2007-10-11 18:44:07 +0000
committerDaniel Jacobowitz <drow@false.org>2007-10-11 18:44:07 +0000
commiteb639c500494ee8c4ca8978c50451dca10112744 (patch)
treeaea47081d1300f0357ab386bc139b3c53f2e31c5
parentb981d7096356e3e92b66f0813881754fc69bf41d (diff)
downloadgdb-eb639c500494ee8c4ca8978c50451dca10112744.zip
gdb-eb639c500494ee8c4ca8978c50451dca10112744.tar.gz
gdb-eb639c500494ee8c4ca8978c50451dca10112744.tar.bz2
2007-10-11 Jesper Nilsson <jesper.nilsson@axis.com>
* callback.c (cb_is_stdin, cb_is_stdout, cb_is_stderr): Add functions. * syscall.c (cb_syscall): Test for stdin/out/err, not just fd 0/1/2. 2007-10-11 Jesper Nilsson <jesper.nilsson@axis.com> * callback.h (cb_is_stdin, cb_is_stdout, cb_is_stderr): Add prototypes. 2007-10-11 Jesper Nilsson <jesper.nilsson@axis.com> * sim/cris/c/freopen2.c: Added testcase.
-rw-r--r--include/gdb/ChangeLog2
-rw-r--r--include/gdb/callback.h4
-rw-r--r--sim/common/ChangeLog4
-rw-r--r--sim/common/callback.c11
-rw-r--r--sim/common/syscall.c4
-rw-r--r--sim/testsuite/ChangeLog4
-rw-r--r--sim/testsuite/sim/cris/c/freopen1.c5
-rw-r--r--sim/testsuite/sim/cris/c/freopen2.c40
8 files changed, 64 insertions, 10 deletions
diff --git a/include/gdb/ChangeLog b/include/gdb/ChangeLog
index 70266e2..67e5d97 100644
--- a/include/gdb/ChangeLog
+++ b/include/gdb/ChangeLog
@@ -1,6 +1,6 @@
2007-10-11 Jesper Nilsson <jesper.nilsson@axis.com>
- * callback.h (cb_is_stdin): Add prototype.
+ * callback.h (cb_is_stdin, cb_is_stdout, cb_is_stderr): Add prototypes.
2007-08-23 Joel Brobecker <brobecker@adacore.com>
diff --git a/include/gdb/callback.h b/include/gdb/callback.h
index 2245c87..eb991f7 100644
--- a/include/gdb/callback.h
+++ b/include/gdb/callback.h
@@ -315,8 +315,10 @@ int cb_host_to_target_stat PARAMS ((host_callback *, const struct stat *, PTR));
/* Translate a value to target endian. */
void cb_store_target_endian PARAMS ((host_callback *, char *, int, long));
-/* Test if the fd is stdin. */
+/* Tests for special fds. */
int cb_is_stdin PARAMS ((host_callback *, int));
+int cb_is_stdout PARAMS ((host_callback *, int));
+int cb_is_stderr PARAMS ((host_callback *, int));
/* Perform a system call. */
CB_RC cb_syscall PARAMS ((host_callback *, CB_SYSCALL *));
diff --git a/sim/common/ChangeLog b/sim/common/ChangeLog
index bd09a5c..87bc0ee 100644
--- a/sim/common/ChangeLog
+++ b/sim/common/ChangeLog
@@ -1,7 +1,7 @@
2007-10-11 Jesper Nilsson <jesper.nilsson@axis.com>
- * callback.c (cb_is_stdin): Add.
- * syscall.c (cb_syscall): Test for stdin, not just fd 0.
+ * callback.c (cb_is_stdin, cb_is_stdout, cb_is_stderr): Add functions.
+ * syscall.c (cb_syscall): Test for stdin/out/err, not just fd 0/1/2.
2007-08-10 Nick Clifton <nickc@redhat.com>
diff --git a/sim/common/callback.c b/sim/common/callback.c
index f83dd54..18bcc80 100644
--- a/sim/common/callback.c
+++ b/sim/common/callback.c
@@ -1143,3 +1143,14 @@ cb_is_stdin (host_callback *cb, int fd)
return fdbad (cb, fd) ? 0 : fdmap (cb, fd) == 0;
}
+int
+cb_is_stdout (host_callback *cb, int fd)
+{
+ return fdbad (cb, fd) ? 0 : fdmap (cb, fd) == 1;
+}
+
+int
+cb_is_stderr (host_callback *cb, int fd)
+{
+ return fdbad (cb, fd) ? 0 : fdmap (cb, fd) == 2;
+}
diff --git a/sim/common/syscall.c b/sim/common/syscall.c
index a3e7560..b002448 100644
--- a/sim/common/syscall.c
+++ b/sim/common/syscall.c
@@ -344,12 +344,12 @@ cb_syscall (cb, sc)
errcode = EINVAL;
goto FinishSyscall;
}
- if (fd == 1)
+ if (cb_is_stdout(cb, fd))
{
result = (int) (*cb->write_stdout) (cb, buf, bytes_read);
(*cb->flush_stdout) (cb);
}
- else if (fd == 2)
+ else if (cb_is_stderr(cb, fd))
{
result = (int) (*cb->write_stderr) (cb, buf, bytes_read);
(*cb->flush_stderr) (cb);
diff --git a/sim/testsuite/ChangeLog b/sim/testsuite/ChangeLog
index c7c0acc..168b05d 100644
--- a/sim/testsuite/ChangeLog
+++ b/sim/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2007-10-11 Jesper Nilsson <jesper.nilsson@axis.com>
+
+ * sim/cris/c/freopen2.c: Added testcase.
+
2006-10-02 Hans-Peter Nilsson <hp@axis.com>
Edgar E. Iglesias <edgar@axis.com>
diff --git a/sim/testsuite/sim/cris/c/freopen1.c b/sim/testsuite/sim/cris/c/freopen1.c
index eeb6079..0e0f28d 100644
--- a/sim/testsuite/sim/cris/c/freopen1.c
+++ b/sim/testsuite/sim/cris/c/freopen1.c
@@ -1,7 +1,4 @@
-/* Check that basic freopen functionality works.
-#xfail: *-*-*
- Currently doesn't work, because syscall.c:cb_syscall case
- CB_SYS_write intercepts writes to fd 1 and 2. */
+/* Check that basic freopen functionality works. */
#include <stdio.h>
#include <stdlib.h>
diff --git a/sim/testsuite/sim/cris/c/freopen2.c b/sim/testsuite/sim/cris/c/freopen2.c
new file mode 100644
index 0000000..3959607
--- /dev/null
+++ b/sim/testsuite/sim/cris/c/freopen2.c
@@ -0,0 +1,40 @@
+/* Tests that stdin can be redirected from a normal file. */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main (void)
+{
+ const char* fname = "freopen.dat";
+ const char tsttxt[]
+ = "A random line of text, used to test correct freopen etc.\n";
+ FILE* instream;
+ FILE *old_stderr;
+ char c1;
+
+ /* Like the freopen call in flex. */
+ old_stderr = freopen (fname, "w+", stderr);
+ if (old_stderr == NULL
+ || fwrite (tsttxt, 1, strlen (tsttxt), stderr) != strlen (tsttxt)
+ || fclose (stderr) != 0)
+ {
+ printf ("fail\n");
+ exit (1);
+ }
+
+ instream = freopen(fname, "r", stdin);
+ if (instream == NULL) {
+ printf("fail\n");
+ exit(1);
+ }
+
+ c1 = getc(instream);
+ if (c1 != 'A') {
+ printf("fail\n");
+ exit(1);
+ }
+
+ printf ("pass\n");
+ exit(0);
+}