This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: Fix ARM problem with freopen


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;
  }
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]