This is the mail archive of the
newlib@sources.redhat.com
mailing list for the newlib project.
PATCH: Fix ARM problem with freopen
- From: Mark Mitchell <mark at codesourcery dot com>
- To: newlib at sources dot redhat dot com, jjohnstn at redhat dot com
- Date: Mon, 29 Dec 2003 13:12:48 -0800
- Subject: PATCH: Fix ARM problem with freopen
- Reply-to: mark at codesourcery dot com
Jeff --
I'd like to commit the attached patch to newlib.
The problem was that the current version of remap_handle did not work
correctly when a standard stream (such as "stdin") was reopend with
"freopen". Because "open" cleverly keeps the descriptors for the
standard streams and all other descriptors separate, we can just check
"STDIN_FILENO" instead.
OK?
--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com
2003-12-29 Mark Mitchell <mark@codesourcery.com>
* libc/sys/arm/syscalls.c (unistd.h): Include it.
(remap_handle): Use STDIN_FILENO instead of __sfileno(stdin).
Similarly for stdout and stderr.
Index: libc/sys/arm/syscalls.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/sys/arm/syscalls.c,v
retrieving revision 1.8
diff -c -5 -p -r1.8 syscalls.c
*** libc/sys/arm/syscalls.c 6 May 2002 20:46:37 -0000 1.8
--- libc/sys/arm/syscalls.c 29 Dec 2003 21:07:24 -0000
***************
*** 10,19 ****
--- 10,20 ----
#include <time.h>
#include <sys/time.h>
#include <sys/times.h>
#include <errno.h>
#include <reent.h>
+ #include <unistd.h>
#include "swi.h"
/* Forward prototypes. */
int _system _PARAMS ((const char *));
int _rename _PARAMS ((const char *, const char *));
*************** remap_handle (int fh)
*** 123,137 ****
CHECK_INIT(stdin);
CHECK_INIT(stdout);
CHECK_INIT(stderr);
std_files_checked = 1;
}
! if (fh == __sfileno (stdin))
return monitor_stdin;
! if (fh == __sfileno (stdout))
return monitor_stdout;
! if (fh == __sfileno (stderr))
return monitor_stderr;
return fh - FILE_HANDLE_OFFSET;
}
--- 124,138 ----
CHECK_INIT(stdin);
CHECK_INIT(stdout);
CHECK_INIT(stderr);
std_files_checked = 1;
}
! if (fh == STDIN_FILENO)
return monitor_stdin;
! if (fh == STDOUT_FILENO)
return monitor_stdout;
! if (fh == STDERR_FILENO)
return monitor_stderr;
return fh - FILE_HANDLE_OFFSET;
}