mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			335 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			335 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C
		
	
	
	
| /* javanio.h -- reference implementation of native functions.
 | |
|    Copyright (C) 2006  Free Software Foundation, Inc.
 | |
| 
 | |
| This file is a part of GNU Classpath.
 | |
| 
 | |
| GNU Classpath 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 2 of the License, or (at
 | |
| your option) any later version.
 | |
| 
 | |
| GNU Classpath 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 GNU Classpath; if not, write to the Free Software
 | |
| Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
 | |
| USA
 | |
| 
 | |
| Linking this library statically or dynamically with other modules is
 | |
| making a combined work based on this library.  Thus, the terms and
 | |
| conditions of the GNU General Public License cover the whole
 | |
| combination.
 | |
| 
 | |
| As a special exception, the copyright holders of this library give you
 | |
| permission to link this library with independent modules to produce an
 | |
| executable, regardless of the license terms of these independent
 | |
| modules, and to copy and distribute the resulting executable under
 | |
| terms of your choice, provided that you also meet, for each linked
 | |
| independent module, the terms and conditions of the license of that
 | |
| module.  An independent module is a module which is not derived from
 | |
| or based on this library.  If you modify this library, you may extend
 | |
| this exception to your version of the library, but you are not
 | |
| obligated to do so.  If you do not wish to do so, delete this
 | |
| exception statement from your version.  */
 | |
| 
 | |
| 
 | |
| #ifndef __JAVANIO_H__
 | |
| #define __JAVANIO_H__
 | |
| 
 | |
| #include <sys/time.h>
 | |
| 
 | |
| /**
 | |
|  * This header defines functions that are called by our JNI reference
 | |
|  * implementation of java.nio.*. In our reference implementation, these
 | |
|  * functions map exactly to their counterparts in POSIX; in implementations
 | |
|  * that can't use these functions directly (such as systems that use user-land
 | |
|  * threads, and thus can't call blocking system calls directly) can provide
 | |
|  * their own implementations suitable for their system.
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * This macro is used in all function prototypes below; if any additional
 | |
|  * keywords need to be added to a prototype, declare them in this macro.
 | |
|  */
 | |
| #define CPNIO_EXPORT static inline
 | |
| 
 | |
| /**
 | |
|  * Read bytes from the given file descriptor into the given memory address, which
 | |
|  * has sufficient space for NBYTES bytes.
 | |
|  *
 | |
|  * \param fd     The file descriptor to read from.
 | |
|  * \param buf    The memory address to read bytes into.
 | |
|  * \param nbytes The number of bytes available to store in BUF.
 | |
|  * \return The number of bytes read, possibly zero, on success; return -1 on failure,
 | |
|  *  and set ERRNO to an appropriate value.
 | |
|  * \see read(2)
 | |
|  *
 | |
|  * Allowed errno values:
 | |
|  *   [EBADF]   If FD is not a valid file descriptor, or is not open for reading.
 | |
|  *   [EFAULT]  If BUF points outside the process's address space.
 | |
|  *   [EIO]     An I/O error occurrs.
 | |
|  *   [EINTR]   If the read is interrupted by a signal.
 | |
|  *   [EINVAL]  If FD is negative.
 | |
|  *   [EAGAIN]  If FD was marked for non-blocking I/O, and no data were ready to
 | |
|  *             be read.
 | |
|  */
 | |
| CPNIO_EXPORT ssize_t cpnio_read (int fd, void *buf, size_t nbytes);
 | |
| 
 | |
| /*
 | |
|  * Read bytes from a file descriptor into a sequence of IO buffers.
 | |
|  *
 | |
|  * The iovec structure is defined as:
 | |
|  *
 | |
|  *   struct iovec {
 | |
|  *     char   *iov_base;
 | |
|  *     size_t  iov_len;
 | |
|  *   };
 | |
|  *
 | |
|  * The call to _cp_readv should do a scattering read, where for each struct iovec
 | |
|  * in the supplied list, up to IOV_LEN bytes are read into IOV_BASE. The function
 | |
|  * returns the total number of bytes read into all supplied buffers.
 | |
|  *
 | |
|  * \param fd     The file descriptor.
 | |
|  * \param iov    A pointer to the head of a list of iovec structures.
 | |
|  * \param iovcnt The number of iovec structures pointed to by IOV.
 | |
|  * \return The total number of bytes read accross all buffers, possibly zero. On
 | |
|  *  error, -1 is returned and ERRNO is set.
 | |
|  * \see readv(2)
 | |
|  *
 | |
|  * Allowed ERRNO values include all of those listed for _cp_read, as well as the
 | |
|  * following:
 | |
|  *   [EINVAL] If IOVCNT overflows the maximum number of iovec structures
 | |
|  *            this platform supports (usually 16), if any IOV_LEN value
 | |
|  *            is negative, or if the sum of all IOV_LEN values is too
 | |
|  *            large to be stored in a ssize_t (usually a 32-bit integer).
 | |
|  *   [EFAULT] If part of IOV points outside the process's address space.
 | |
|  */
 | |
| CPNIO_EXPORT ssize_t cpnio_readv (int fd, const struct iovec *iov, int iovcnt);
 | |
| 
 | |
| /*
 | |
|  * Write NBYTES bytes from BUF to the file descriptor FD, returning the number
 | |
|  * of bytes successfully written.
 | |
|  *
 | |
|  * \param fd     The file descriptor.
 | |
|  * \param buf    A pointer to the bytes to write.
 | |
|  * \param nbytes The maximum number of bytes to write.
 | |
|  * \return The number of bytes written to the file descriptor, possibly zero. -1
 | |
|  *  is returned if an error is encountered, and ERRNO will be set.
 | |
|  * \see write(2)
 | |
|  *
 | |
|  * Allowed ERRNO values:
 | |
|  *   [EBADF]   If FD is not a valid file descriptor or is not open for writing.
 | |
|  *   [EPIPE]   If FD is a pipe, when the other side is disconnected; if FD is a
 | |
|  *             socket, when the peer is not connected.
 | |
|  *   [EFBIG]   When FD is a file, and writing to it overflows the process's
 | |
|  *             or the system's maximim file size.
 | |
|  *   [EFAULT]  If the buffer to write points outside the process's address
 | |
|  *             space.
 | |
|  *   [EINVAL]  If the descriptor FD is negative.
 | |
|  *   [ENOSPC]  If FD is a file, and there is insufficient space on the
 | |
|  *             filesystem.
 | |
|  *   [EDQUOT]  If FD is a file, and the user's disk quota has been exceeded.
 | |
|  *   [EIO]     If an I/O error occurs.
 | |
|  *   [EINTR]   If the call is interrupted by a signal.
 | |
|  *   [EAGAIN]  If FD is in non-blocking mode, and no bytes could be immediately
 | |
|  *             written.
 | |
|  */
 | |
| CPNIO_EXPORT ssize_t cpnio_write (int fd, const void *buf, size_t nbytes);
 | |
| 
 | |
| /*
 | |
|  * Write data from a sequence of IOVCNT buffers IOV to a file descriptor FD.
 | |
|  *
 | |
|  * \param fd     The file descriptor.
 | |
|  * \param iov    The list of buffers to write.
 | |
|  * \param iovcnt The number of iovec structures pointed to by IOV.
 | |
|  * \return The total number of bytes written from the given buffers, possibly
 | |
|  *   zero. -1 if an error occurs, and ERRNO will be set.
 | |
|  * \see writev(2)
 | |
|  *
 | |
|  * Allowed ERRNO values include those mentioned in _cp_write, as well as:
 | |
|  *  [EDESTADDRREQ]  If the descriptor is a datagram socket, and the peer is
 | |
|  *                  no longer available.
 | |
|  *  [EINVAL]        If IOVCNT is out of range, if any IOV_LEN value is
 | |
|  *                  negative, or if the sum of all IOVCNT IOV_LEN values
 | |
|  *                  will overflow a ssize_t.
 | |
|  *  [ENOBUFS]       If the mbuf pool is exhausted (???).
 | |
|  */
 | |
| CPNIO_EXPORT ssize_t cpnio_writev (int fd, const struct iovec *iov, size_t iovcnt);
 | |
| 
 | |
| /**
 | |
|  * Open a new, unbound and unconnected socket.
 | |
|  *
 | |
|  * \param domain The socket domain. Implementations need only handle AF_INET.
 | |
|  * \param type   The socket type; implementations need only handle types
 | |
|  *  SOCK_STREAM (for streaming sockets) and SOCK_DGRAM (for datagram sockets).
 | |
|  * \param protocol This should always be 0. It can be ignored.
 | |
|  * \return A new file descriptor pointing to a newly created socket, or -1 on
 | |
|  *  error, and ERRNO set.
 | |
|  *
 | |
|  * Allowed ERRNO values:
 | |
|  *  [EPROTONOSUPPORT]  If TYPE is unrecognized.
 | |
|  *  [EMFILE]           If a new file descriptor cannot be allocated, because
 | |
|  *                     the process's descriptor table is full.
 | |
|  *  [ENFILE]           Likewise, but when the system table is full.
 | |
|  *  [EACCES]           If this operation is not allowed.
 | |
|  *  [ENOBUFS]          If there is not enough buffer space available for the
 | |
|  *                     new socket.
 | |
|  */
 | |
| CPNIO_EXPORT int cpnio_socket (int domain, int type, int protocol);
 | |
| 
 | |
| /**
 | |
|  * Connect a socket to a remote address.
 | |
|  *
 | |
|  * \param fd      The file descriptor of the socket to connect.
 | |
|  * \param addr    The address to connect to. In practice, this should be
 | |
|  *                either a `struct sockaddr_in' or a `struct sockaddr_in6'.
 | |
|  * \param addrlen The size of the address structure passed by ADDR.
 | |
|  * \return Zero if the connect succeeds. -1 on error, and ERRNO should be set.
 | |
|  *
 | |
|  * Allowed ERRNO values:
 | |
|  *  [EBADF]         If FD is not a valid file descriptor.
 | |
|  *  [ENOTSOCK]      If FD is not a socket descriptor.
 | |
|  *  [EADDRNOTAVAIL] If ADDR is not available for use to this process.
 | |
|  *  [EAFNOSUPPORT]  If the address family of ADDR is not supported.
 | |
|  *  [EISCONN]       If the socket is already connected.
 | |
|  *  [ETIMEDOUT]     If the connection could not be made in a reasonable
 | |
|  *                  amount of time.
 | |
|  *  [ECONNREFUSED]  If the connection attempt was rejected.
 | |
|  *  [ENETUNREACH]   If the network ADDR is on is unreachable.
 | |
|  *  [EADDRINUSE]    If the address is already in use.
 | |
|  *  [EFAULT]        If ADDR points outside the addressable space.
 | |
|  *  [EINPROGRESS]   If FD is in non-blocking mode, and the connection could
 | |
|  *                  not be completed immediately.
 | |
|  *  [EALREADY]      If FD is in non-blocking mode, and a connection attempt
 | |
|  *                  is still pending.
 | |
|  *  [EACCESS]       If ADDR is the broadcast address, and the socket option
 | |
|  *                  SO_BROADCAST is not set.
 | |
|  */
 | |
| CPNIO_EXPORT int cpnio_connect (int fd, const struct sockaddr *addr, socklen_t addrlen);
 | |
| 
 | |
| /**
 | |
|  * Accept an incoming connection on a socket, returning a new socket for
 | |
|  * the connection, and storing the peer address in ADDR.
 | |
|  *
 | |
|  * \param fd      The socket file descriptor.
 | |
|  * \param addr    The structure to store the peer address in.
 | |
|  * \param addrlen The size of the data available in ADDR; upon return, the
 | |
|  *                number of bytes stored in ADDR will be placed here.
 | |
|  * \return The new socket file descriptor, or -1 on error, and ERRNO set.
 | |
|  *
 | |
|  * Allowed ERRNO values:
 | |
|  *  [EBADF]         If FD is not a valid file descriptor.
 | |
|  *  [ENOTSOCK]      If FD in not a socket descriptor.
 | |
|  *  [EOPNOTSUPP]    If the socket is not a SOCK_STREAM socket.
 | |
|  *  [EFAULT]        If ADDR points outside the process's addressable space.
 | |
|  *  [EWOULDBLOCK]   If the socket is in non-blocking mode, and no connection
 | |
|  *                  attempt is currently ready.
 | |
|  *  [EMFILE]        If the process's descriptor table is full.
 | |
|  *  [ENFILE]        If the system's descriptor table is full.
 | |
|  */
 | |
| CPNIO_EXPORT int cpnio_accept (int fd, struct sockaddr *addr, socklen_t *addrlen);
 | |
| 
 | |
| /**
 | |
|  * Send a datagram to the given address.
 | |
|  *
 | |
|  * \param fd    The socket file descriptor.
 | |
|  * \param msg   A pointer to the message to send.
 | |
|  * \param len   The size of the message to send.
 | |
|  * \param flags Flags for sending.
 | |
|  * \param to    The remote address to send the message to.
 | |
|  * \param tolen The size of the TO address structure.
 | |
|  * \return The number of bytes written, possibly zero, on success. Returns
 | |
|  *  -1 on failure, and sets ERRNO.
 | |
|  * \see sendto(2)
 | |
|  *
 | |
|  * Allowed ERRNO values:
 | |
|  *  [EBADF]
 | |
|  *  [ENOTSOCK]
 | |
|  *  [EFAULT]
 | |
|  *  [EMSGSIZE]
 | |
|  *  [EAGAIN]
 | |
|  *  [ENOBUFS]
 | |
|  *  [EACCES]
 | |
|  *  [EHOSTUNREACH]
 | |
|  */
 | |
| CPNIO_EXPORT ssize_t cpnio_sendto (int fd, const void *msg, size_t len, int flags,
 | |
|                                    const struct sockaddr *to, socklen_t tolen);
 | |
| 
 | |
| /**
 | |
|  * Receive a message on a socket, storing the remote host's address in
 | |
|  * FROM.
 | |
|  *
 | |
|  * \param fd      The socket file descriptor.
 | |
|  * \param buf     The buffer to store received bytes in.
 | |
|  * \param flags   Flags to control the receive.
 | |
|  * \param from    Where to store the remote address.
 | |
|  * \param fromlen Pointer to the size of FROM; on return, it will contain the
 | |
|  *  size of the structure placed in FROM.
 | |
|  * \return The number of bytes received on success. -1 on error, and ERRNO will
 | |
|  *  be set.
 | |
|  * \see recvfrom(2)
 | |
|  *
 | |
|  * Allewed ERRNO values:
 | |
|  *  [EBADF]    FD is not a valid file descriptor.
 | |
|  *  [ENOTCONN] If the socket is stream-oriented, and no prior call to
 | |
|  *             connect(2) was made.
 | |
|  *  [ENOTSOCK] FD is not a socket.
 | |
|  *  [EAGAIN]   FD is in non-blocking mode, and no message was
 | |
|  *             immediately available.
 | |
|  *  [EINTR]    The system call was interrupted by a signal.
 | |
|  *  [EFAULT]   BUF, FROM, or FROMLEN lie outside the process's address
 | |
|  *             space.
 | |
|  */
 | |
| CPNIO_EXPORT ssize_t cpnio_recvfrom (int fd, void *buf, size_t len, int flags,
 | |
|                                      struct sockaddr *from, socklen_t *fromlen);
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Control file descriptor properties.
 | |
|  *
 | |
|  * \param fd  The file descriptor to control.
 | |
|  * \param cmd The command to execute.
 | |
|  * \param arg The command argument.
 | |
|  * \return A value other than -1, specific to CMD. On error, -1 is
 | |
|  *  returned, and ERRNO is set.
 | |
|  *
 | |
|  * Allowed ERRNO values:
 | |
|  *  FIXME
 | |
|  */
 | |
| CPNIO_EXPORT int cpnio_fcntl (int fd, int cmd, long arg);
 | |
| 
 | |
| 
 | |
| /**
 | |
|  * Select from one of the given file descriptor sets a descriptor that
 | |
|  * is ready for the given operation (read, write, etc.).
 | |
|  *
 | |
|  * \param nfds      A value one larger than the largest file
 | |
|  *                  descriptor.
 | |
|  * \param readfds   A set of file descriptors to select for
 | |
|  *                  readability.
 | |
|  * \param writefds  A set of file descriptors to select for
 | |
|  *                  writability.
 | |
|  * \param exceptfds A set of file descriptors to select for
 | |
|  *                  exceptional conditions.
 | |
|  * \param tm        The selection timeout.
 | |
|  * \return The number of file descriptors selected, possibly zero, or
 | |
|  *                  -1 on error (and with ERRNO set).
 | |
|  */
 | |
| CPNIO_EXPORT int cpnio_select (int nfds, fd_set *readfds, fd_set *writefds,
 | |
|                                fd_set *exceptfds, struct timeval *tm);
 | |
| 
 | |
| /*
 | |
|  * We include the implementation file here, because our reference
 | |
|  * implementation is trivial, and the functions are declared extern
 | |
|  * inline.
 | |
|  *
 | |
|  * Implementations that need different implementations of these functions
 | |
|  * SHOULD remove this line, and compile javanio.c as a separate unit.
 | |
|  */
 | |
| #include "javanio.c"
 | |
| 
 | |
| #endif /* __JAVANIO_H__ */
 |