newlib and the use of fcntl by java

Richard Earnshaw rearnsha@arm.com
Fri Sep 20 02:00:00 GMT 2002


> >>>>> "Richard" == Richard Earnshaw <rearnsha@cambridge.arm.com> writes:
> 
> Richard> Hmm, it appears that java is making use of the fcntl function
> Richard> in newlib (or at least, it is trying to).  This is a problem,
> Richard> since most embedded targets don't provide this function.
> 
> Was this resolved to your satisfaction?
> 
> Tom

Well Jeff has changed Newlib so that fcntl now always returns -1 and sets 
errno to ENOSYS on configurations that don't really have fcntl support.  
That will fix the linkage problems.

I haven't had a chance yet to rerun all the libjava tests, and I don't 
know if they will trip the following anyway (or even if they are really 
relevant on an embedded target), but a quick audit of libjava shows the 
following cases where we use fcntl:

java/lang/natPosixProcess.cc:

      // Create pipes for I/O.  MSGP is for communicating exec()
      // status.
      if (pipe (inp) || pipe (outp) || pipe (errp) || pipe (msgp)
          || fcntl (msgp[1], F_SETFD, FD_CLOEXEC))
        throw new IOException (JvNewStringLatin1 (strerror (errno)));

Should we really throw the exception if the fcntl is not supported?  (I 
suspect it may not matter, since we can't start processes without a proper 
OS anyway).

Other cases in that file ignore the return value, so may be ok.

java/net/natPlainSocketImpl.cc

      int flags = ::fcntl (fnum, F_GETFL);
      ::fcntl (fnum, F_SETFL, flags | O_NONBLOCK);
      
This is setting properties of a socket, which also isn't really supported 
on a bare-metal system.

R. 



More information about the Java mailing list