123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- /* 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__ */
|