2 Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
38 #ifndef _CLASSPATH_NET_H_INCLUDED
39 #define _CLASSPATH_NET_H_INCLUDED
45 #include <sys/types.h>
46 #include <sys/socket.h>
47 #include <netinet/in_systm.h>
48 #include <netinet/in.h>
49 #include <netinet/ip.h>
56 #define CPNET_SHUTDOWN_READ 1
57 #define CPNET_SHUTDOWN_WRITE 2
59 JNIEXPORT jint cpnet_openSocketStream(JNIEnv *env, jint *fd, jint family);
60 JNIEXPORT jint cpnet_openSocketDatagram(JNIEnv *env, jint *fd, jint family);
61 JNIEXPORT jint cpnet_shutdown (JNIEnv *env, jint fd, jbyte flag);
62 JNIEXPORT jint cpnet_close(JNIEnv *env, jint fd);
63 JNIEXPORT jint cpnet_listen(JNIEnv *env, jint fd, jint queuelen);
64 JNIEXPORT jint cpnet_accept(JNIEnv *env, jint fd, jint *newfd);
65 JNIEXPORT jint cpnet_bind(JNIEnv *env, jint fd, cpnet_address *addr);
66 JNIEXPORT jint cpnet_connect(JNIEnv *env, jint fd, cpnet_address *addr);
67 JNIEXPORT jint cpnet_getLocalAddr(JNIEnv *env, jint fd, cpnet_address **addr);
68 JNIEXPORT jint cpnet_getRemoteAddr(JNIEnv *env, jint fd, cpnet_address **addr);
69 JNIEXPORT jint cpnet_setBroadcast(JNIEnv *env, jint fd, jint flag);
70 JNIEXPORT jint cpnet_send (JNIEnv *env, jint fd, jbyte *data, jint len, jint *bytes_sent);
71 JNIEXPORT jint cpnet_sendTo (JNIEnv *env, jint fd, jbyte *data, jint len, cpnet_address *addr, jint *bytes_sent);
72 JNIEXPORT jint cpnet_recv (JNIEnv *env, jint fd, jbyte *data, jint len, jint *bytes_recv);
73 JNIEXPORT jint cpnet_recvFrom (JNIEnv *env, jint fd, jbyte *data, jint len, cpnet_address **addr, jint *bytes_recv);
74 JNIEXPORT jint cpnet_setSocketTCPNoDelay (JNIEnv *env, jint fd, jint nodelay);
75 JNIEXPORT jint cpnet_getSocketTCPNoDelay (JNIEnv *env, jint fd, jint *nodelay);
76 JNIEXPORT jint cpnet_setLinger (JNIEnv *env, jint fd, jint flag, jint value);
77 JNIEXPORT jint cpnet_getLinger (JNIEnv *env, jint fd, jint *flag, jint *value);
78 JNIEXPORT jint cpnet_setSocketTimeout (JNIEnv *env, jint fd, jint value);
79 JNIEXPORT jint cpnet_getSocketTimeout (JNIEnv *env, jint fd, jint *value);
80 JNIEXPORT jint cpnet_setSendBuf (JNIEnv *env, jint fd, jint value);
81 JNIEXPORT jint cpnet_getSendBuf (JNIEnv *env, jint fd, jint *value);
82 JNIEXPORT jint cpnet_setRecvBuf (JNIEnv *env, jint fd, jint value);
83 JNIEXPORT jint cpnet_getRecvBuf (JNIEnv *env, jint fd, jint *value);
84 JNIEXPORT jint cpnet_setTTL (JNIEnv *env, jint fd, jint value);
85 JNIEXPORT jint cpnet_getTTL (JNIEnv *env, jint fd, jint *value);
86 JNIEXPORT jint cpnet_setMulticastIF (JNIEnv *env, jint fd, cpnet_address *addr);
87 JNIEXPORT jint cpnet_getMulticastIF (JNIEnv *env, jint fd, cpnet_address **addr);
88 JNIEXPORT jint cpnet_setReuseAddress (JNIEnv *env, jint fd, jint reuse);
89 JNIEXPORT jint cpnet_getReuseAddress (JNIEnv *env, jint fd, jint *reuse);
90 JNIEXPORT jint cpnet_setKeepAlive (JNIEnv *env, jint fd, jint keep);
91 JNIEXPORT jint cpnet_getKeepAlive (JNIEnv *env, jint fd, jint *keep);
92 JNIEXPORT jint cpnet_getBindAddress (JNIEnv *env, jint fd, cpnet_address **addr);
93 JNIEXPORT jint cpnet_addMembership (JNIEnv *env, jint fd, cpnet_address *addr);
94 JNIEXPORT jint cpnet_dropMembership (JNIEnv *env, jint fd, cpnet_address *addr);
95 JNIEXPORT jint cpnet_getAvailableBytes (JNIEnv *env, jint fd, jint *availableBytes);
96 JNIEXPORT jint cpnet_getHostname (JNIEnv *env, char *hostname, jint hostname_len);
97 JNIEXPORT jint cpnet_getHostByName (JNIEnv *env, const char *hostname, cpnet_address ***adresses, jint *addresses_count);
98 JNIEXPORT jint cpnet_getHostByAddr (JNIEnv *env, cpnet_address *addr, char *hostname, jint hostname_len);
99 JNIEXPORT jint cpnet_aton (JNIEnv *env, const char *hostname, cpnet_address **addr);
100 JNIEXPORT void cpnet_freeAddresses(JNIEnv * env, cpnet_address **addr, jint addresses_count);
102 static inline cpnet_address *cpnet_newIPV4Address(JNIEnv * env)
104 cpnet_address *addr = (cpnet_address *)JCL_malloc(env, sizeof(cpnet_address) + sizeof(struct sockaddr_in));
105 struct sockaddr_in *netaddr = (struct sockaddr_in *)&(addr->data[0]);
107 addr->len = sizeof(struct sockaddr_in);
108 memset(netaddr, 0, addr->len);
109 netaddr->sin_family = AF_INET;
113 static inline void cpnet_setIPV4Any(cpnet_address *addr)
115 struct sockaddr_in *netaddr = (struct sockaddr_in *)&(addr->data[0]);
117 netaddr->sin_addr.s_addr = INADDR_ANY;
121 static inline cpnet_address *cpnet_newIPV6Address(JNIEnv * env)
123 cpnet_address * addr = (cpnet_address *)JCL_malloc(env, sizeof(cpnet_address) + sizeof(struct sockaddr_in6));
124 struct sockaddr_in6 *netaddr = (struct sockaddr_in6 *)&(addr->data[0]);
126 addr->len = sizeof(struct sockaddr_in6);
127 memset(netaddr, 0, addr->len);
128 netaddr->sin6_family = AF_INET6;
134 static inline void cpnet_freeAddress(JNIEnv * env, cpnet_address *addr)
139 static inline void cpnet_addressSetPort(cpnet_address *addr, jint port)
141 struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(addr->data[0]);
143 ipaddr->sin_port = htons(port);
146 static inline jint cpnet_addressGetPort(cpnet_address *addr)
148 struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(addr->data[0]);
150 return ntohs(ipaddr->sin_port);
153 static inline jboolean cpnet_isAddressEqual(cpnet_address *addr1, cpnet_address *addr2)
155 if (addr1->len != addr2->len)
158 return memcmp(addr1->data, addr2->data, addr1->len) == 0;
162 static inline jboolean cpnet_isIPV6Address(cpnet_address *addr)
164 struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(addr->data[0]);
166 return ipaddr->sin_family == AF_INET6;
170 static inline jboolean cpnet_isIPV4Address(cpnet_address *addr)
172 struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(addr->data[0]);
174 return ipaddr->sin_family == AF_INET;
177 static inline void cpnet_IPV4AddressToBytes(cpnet_address *netaddr, jbyte *octets)
179 struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(netaddr->data[0]);
180 unsigned long sysaddr = ntohl(ipaddr->sin_addr.s_addr);
182 octets[0] = ((sysaddr >> 24) & 0xff);
183 octets[1] = ((sysaddr >> 16) & 0xff);
184 octets[2] = ((sysaddr >> 8) & 0xff);
185 octets[3] = (sysaddr & 0xff);
188 static inline void cpnet_bytesToIPV4Address(cpnet_address *netaddr, jbyte *octets)
191 struct sockaddr_in *ipaddr = (struct sockaddr_in *)&(netaddr->data[0]);
193 sysaddr = ((jint)(unsigned char)octets[0]) << 24;
194 sysaddr |= ((jint)(unsigned char)octets[1]) << 16;
195 sysaddr |= ((jint)(unsigned char)octets[2]) << 8;
196 sysaddr |= ((jint)(unsigned char)octets[3]);
198 ipaddr->sin_addr.s_addr = htonl(sysaddr);
202 static inline void cpnet_IPV6AddressToBytes(cpnet_address *netaddr, jbyte *octets)
204 struct sockaddr_in6 *ipaddr = (struct sockaddr_in6 *)&(netaddr->data[0]);
206 memcpy(octets, &ipaddr->sin6_addr, 16);
209 static inline void cpnet_bytesToIPV6Address(cpnet_address *netaddr, jbyte *octets)
211 struct sockaddr_in6 *ipaddr = (struct sockaddr_in6 *)&(netaddr->data[0]);
213 memcpy(&ipaddr->sin6_addr, octets, 16);