/[classpath]/classpath/native/jni/java-net/javanet.c
ViewVC logotype

Diff of /classpath/native/jni/java-net/javanet.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.18.2.2 by gnu_andrew, Sun Jan 16 15:15:14 2005 UTC revision 1.18.2.3 by gnu_andrew, Mon Apr 18 01:37:43 2005 UTC
# Line 50  exception statement from your version. * Line 50  exception statement from your version. *
50    
51  #include "target_native.h"  #include "target_native.h"
52  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
53    #include "target_native_network.h"  #include "target_native_network.h"
54  #endif /* WITHOUT_NETWORK */  #endif /* WITHOUT_NETWORK */
55    
56  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
# Line 71  exception statement from your version. * Line 71  exception statement from your version. *
71   * Sets an integer field in the specified object.   * Sets an integer field in the specified object.
72   */   */
73  static void  static void
74  _javanet_set_int_field(JNIEnv *env, jobject obj,  _javanet_set_int_field (JNIEnv * env, jobject obj,
75                         const char *class, const char *field,                          const char *class, const char *field, int val)
                        int val)  
76  {  {
77    jclass   cls;    jclass cls;
78    jfieldID fid;    jfieldID fid;
79    
80    assert(env!=NULL);    assert (env != NULL);
81    assert((*env)!=NULL);    assert ((*env) != NULL);
82    
83    cls = (*env)->FindClass(env, class);    cls = (*env)->FindClass (env, class);
84    if (cls == NULL)    if (cls == NULL)
85      return;      return;
86    
87    fid = (*env)->GetFieldID(env, cls, field, "I");    fid = (*env)->GetFieldID (env, cls, field, "I");
88    if (fid == NULL)    if (fid == NULL)
89      return;      return;
90    
91    (*env)->SetIntField(env, obj, fid, val);    (*env)->SetIntField (env, obj, fid, val);
92    
93    return;    return;
94  }  }
# Line 101  _javanet_set_int_field(JNIEnv *env, jobj Line 100  _javanet_set_int_field(JNIEnv *env, jobj
100   * -1 if an error occurs.   * -1 if an error occurs.
101   */   */
102  int  int
103  _javanet_get_int_field(JNIEnv *env, jobject obj, const char *field)  _javanet_get_int_field (JNIEnv * env, jobject obj, const char *field)
104  {  {
105    jclass cls = 0;    jclass cls = 0;
106    jfieldID fid;    jfieldID fid;
107    int fd;    int fd;
108    
109    assert(env!=NULL);    assert (env != NULL);
110    assert((*env)!=NULL);    assert ((*env) != NULL);
111    
112    DBG("_javanet_get_int_field(): Entered _javanet_get_int_field\n");    DBG ("_javanet_get_int_field(): Entered _javanet_get_int_field\n");
113    
114    cls = (*env)->GetObjectClass(env, obj);    cls = (*env)->GetObjectClass (env, obj);
115    if (cls == NULL)    if (cls == NULL)
116      return -1;      return -1;
117    
118    fid = (*env)->GetFieldID(env, cls, field, "I");    fid = (*env)->GetFieldID (env, cls, field, "I");
119    if (fid == NULL)    if (fid == NULL)
120      return -1;      return -1;
121    DBG("_javanet_get_int_field(): Found field id\n");    DBG ("_javanet_get_int_field(): Found field id\n");
122    
123    fd = (*env)->GetIntField(env, obj, fid);    fd = (*env)->GetIntField (env, obj, fid);
124    
125    return fd;    return fd;
126  }  }
# Line 134  _javanet_get_int_field(JNIEnv *env, jobj Line 133  _javanet_get_int_field(JNIEnv *env, jobj
133   * need to include it.   * need to include it.
134   */   */
135  static void  static void
136  _javanet_create_localfd(JNIEnv *env, jobject this)  _javanet_create_localfd (JNIEnv * env, jobject this)
137  {  {
138    jclass    this_cls, fd_cls;    jclass this_cls, fd_cls;
139    jfieldID  fid;    jfieldID fid;
140    jmethodID mid;    jmethodID mid;
141    jobject   fd_obj;    jobject fd_obj;
142    
143    assert(env!=NULL);    assert (env != NULL);
144    assert((*env)!=NULL);    assert ((*env) != NULL);
145    
146    DBG("_javanet_create_localfd(): Entered _javanet_create_localfd\n");    DBG ("_javanet_create_localfd(): Entered _javanet_create_localfd\n");
147    
148    /* Look up the fd field */    /* Look up the fd field */
149    this_cls = (*env)->FindClass(env, "java/net/SocketImpl");    this_cls = (*env)->FindClass (env, "java/net/SocketImpl");
150    if (this_cls == NULL)    if (this_cls == NULL)
151      return;      return;
152    
153    fid = (*env)->GetFieldID(env, this_cls, "fd", "Ljava/io/FileDescriptor;");    fid = (*env)->GetFieldID (env, this_cls, "fd", "Ljava/io/FileDescriptor;");
154    if (fid == NULL)    if (fid == NULL)
155      return;      return;
156    
157    DBG("_javanet_create_localfd(): Found fd variable\n");    DBG ("_javanet_create_localfd(): Found fd variable\n");
158    
159    /* Create a FileDescriptor */    /* Create a FileDescriptor */
160    fd_cls = (*env)->FindClass(env, "java/io/FileDescriptor");    fd_cls = (*env)->FindClass (env, "java/io/FileDescriptor");
161    if (fd_cls == NULL)    if (fd_cls == NULL)
162      return;      return;
163    
164    DBG("_javanet_create_localfd(): Found FileDescriptor class\n");    DBG ("_javanet_create_localfd(): Found FileDescriptor class\n");
165    
166    mid  = (*env)->GetMethodID(env, fd_cls, "<init>", "()V");    mid = (*env)->GetMethodID (env, fd_cls, "<init>", "()V");
167    if (mid == NULL)    if (mid == NULL)
168      return;      return;
169    
170    DBG("_javanet_create_localfd(): Found FileDescriptor constructor\n");    DBG ("_javanet_create_localfd(): Found FileDescriptor constructor\n");
171    
172    fd_obj = (*env)->NewObject(env, fd_cls, mid);    fd_obj = (*env)->NewObject (env, fd_cls, mid);
173    if (fd_obj == NULL)    if (fd_obj == NULL)
174      return;      return;
175    
176    DBG("_javanet_create_localfd(): Created FileDescriptor\n");    DBG ("_javanet_create_localfd(): Created FileDescriptor\n");
177    
178    /* Now set the pointer to the new FileDescriptor */    /* Now set the pointer to the new FileDescriptor */
179    (*env)->SetObjectField(env, this, fid, fd_obj);    (*env)->SetObjectField (env, this, fid, fd_obj);
180    DBG("_javanet_create_localfd(): Set fd field\n");    DBG ("_javanet_create_localfd(): Set fd field\n");
181    
182    return;    return;
183  }  }
# Line 189  _javanet_create_localfd(JNIEnv *env, job Line 188  _javanet_create_localfd(JNIEnv *env, job
188   * Returns a Boolean object with the specfied value   * Returns a Boolean object with the specfied value
189   */   */
190  static jobject  static jobject
191  _javanet_create_boolean(JNIEnv *env, jboolean val)  _javanet_create_boolean (JNIEnv * env, jboolean val)
192  {  {
193    jclass    cls;    jclass cls;
194    jmethodID mid;    jmethodID mid;
195    jobject   obj;    jobject obj;
196    
197    assert(env!=NULL);    assert (env != NULL);
198    assert((*env)!=NULL);    assert ((*env) != NULL);
199    
200    cls = (*env)->FindClass(env, "java/lang/Boolean");    cls = (*env)->FindClass (env, "java/lang/Boolean");
201    if (cls == NULL)    if (cls == NULL)
202      return NULL;      return NULL;
203    
204    mid = (*env)->GetMethodID(env, cls, "<init>", "(Z)V");    mid = (*env)->GetMethodID (env, cls, "<init>", "(Z)V");
205    if (mid == NULL)    if (mid == NULL)
206      return NULL;      return NULL;
207    
208    obj = (*env)->NewObject(env, cls, mid, val);    obj = (*env)->NewObject (env, cls, mid, val);
209    if (obj == NULL)    if (obj == NULL)
210      return NULL;      return NULL;
211    
# Line 219  _javanet_create_boolean(JNIEnv *env, jbo Line 218  _javanet_create_boolean(JNIEnv *env, jbo
218   * Returns an Integer object with the specfied value   * Returns an Integer object with the specfied value
219   */   */
220  static jobject  static jobject
221  _javanet_create_integer(JNIEnv *env, jint val)  _javanet_create_integer (JNIEnv * env, jint val)
222  {  {
223    jclass cls;    jclass cls;
224    jmethodID mid;    jmethodID mid;
225    jobject obj;    jobject obj;
226    
227    assert(env!=NULL);    assert (env != NULL);
228    assert((*env)!=NULL);    assert ((*env) != NULL);
229    
230    cls = (*env)->FindClass(env, "java/lang/Integer");    cls = (*env)->FindClass (env, "java/lang/Integer");
231    if (cls == NULL)    if (cls == NULL)
232      return NULL;      return NULL;
233    
234    mid = (*env)->GetMethodID(env, cls, "<init>", "(I)V");    mid = (*env)->GetMethodID (env, cls, "<init>", "(I)V");
235    if (mid == NULL)    if (mid == NULL)
236      return NULL;      return NULL;
237    
238    obj = (*env)->NewObject(env, cls, mid, val);    obj = (*env)->NewObject (env, cls, mid, val);
239    if (obj == NULL)    if (obj == NULL)
240      return NULL;      return NULL;
241    
# Line 249  _javanet_create_integer(JNIEnv *env, jin Line 248  _javanet_create_integer(JNIEnv *env, jin
248   * Builds an InetAddress object from a 32 bit address in host byte order   * Builds an InetAddress object from a 32 bit address in host byte order
249   */   */
250  static jobject  static jobject
251  _javanet_create_inetaddress(JNIEnv *env, int netaddr)  _javanet_create_inetaddress (JNIEnv * env, int netaddr)
252  {  {
253  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
254    unsigned char octets[4];    unsigned char octets[4];
255    char          buf[16];    char buf[16];
256    jclass        ia_cls;    jclass ia_cls;
257    jmethodID     mid;    jmethodID mid;
258    jstring       ip_str;    jstring ip_str;
259    jobject       ia;    jobject ia;
260    
261    assert(env!=NULL);    assert (env != NULL);
262    assert((*env)!=NULL);    assert ((*env) != NULL);
263    
264    /* Build a string IP address */    /* Build a string IP address */
265    TARGET_NATIVE_NETWORK_INT_TO_IPADDRESS_BYTES(netaddr,    TARGET_NATIVE_NETWORK_INT_TO_IPADDRESS_BYTES (netaddr,
266                                                 octets[0],                                                  octets[0],
267                                                 octets[1],                                                  octets[1],
268                                                 octets[2],                                                  octets[2], octets[3]);
269                                                 octets[3]    sprintf (buf, "%d.%d.%d.%d", octets[0], octets[1], octets[2], octets[3]);
270                                                );    DBG ("_javanet_create_inetaddress(): Created ip addr string\n");
   sprintf(buf, "%d.%d.%d.%d",  
           octets[0],  
           octets[1],  
           octets[2],  
           octets[3]  
          );  
   DBG("_javanet_create_inetaddress(): Created ip addr string\n");  
271    
272    /* Get an InetAddress object for this IP */    /* Get an InetAddress object for this IP */
273    ia_cls = (*env)->FindClass(env, "java/net/InetAddress");    ia_cls = (*env)->FindClass (env, "java/net/InetAddress");
274    if (ia_cls == NULL)    if (ia_cls == NULL)
275      {      {
276        return NULL;        return NULL;
277      }      }
278    
279    DBG("_javanet_create_inetaddress(): Found InetAddress class\n");    DBG ("_javanet_create_inetaddress(): Found InetAddress class\n");
280    
281    mid = (*env)->GetStaticMethodID(env, ia_cls, "getByName",    mid = (*env)->GetStaticMethodID (env, ia_cls, "getByName",
282                                    "(Ljava/lang/String;)Ljava/net/InetAddress;");                                     "(Ljava/lang/String;)Ljava/net/InetAddress;");
283    if (mid == NULL)    if (mid == NULL)
284      {      {
285        return NULL;        return NULL;
286      }      }
287    
288    DBG("_javanet_create_inetaddress(): Found getByName method\n");    DBG ("_javanet_create_inetaddress(): Found getByName method\n");
289    
290    ip_str = (*env)->NewStringUTF(env, buf);    ip_str = (*env)->NewStringUTF (env, buf);
291    if (ip_str == NULL)    if (ip_str == NULL)
292      {      {
293        return NULL;        return NULL;
294      }      }
295    
296    ia = (*env)->CallStaticObjectMethod(env, ia_cls, mid, ip_str);    ia = (*env)->CallStaticObjectMethod (env, ia_cls, mid, ip_str);
297    if (ia == NULL)    if (ia == NULL)
298      {      {
299        return NULL;        return NULL;
300      }      }
301    
302    DBG("_javanet_create_inetaddress(): Called getByName method\n");    DBG ("_javanet_create_inetaddress(): Called getByName method\n");
303    
304    return ia;    return ia;
305  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
# Line 318  _javanet_create_inetaddress(JNIEnv *env, Line 310  _javanet_create_inetaddress(JNIEnv *env,
310  /*************************************************************************/  /*************************************************************************/
311    
312  static void  static void
313  _javanet_set_remhost_addr(JNIEnv *env, jobject this, jobject ia)  _javanet_set_remhost_addr (JNIEnv * env, jobject this, jobject ia)
314  {  {
315    jclass   this_cls;    jclass this_cls;
316    jfieldID fid;    jfieldID fid;
317    
318    assert(env!=NULL);    assert (env != NULL);
319    assert((*env)!=NULL);    assert ((*env) != NULL);
320    
321    /* Set the variable in the object */    /* Set the variable in the object */
322    this_cls = (*env)->FindClass(env, "java/net/SocketImpl");    this_cls = (*env)->FindClass (env, "java/net/SocketImpl");
323    if (this_cls == NULL)    if (this_cls == NULL)
324      return;      return;
325    
326    fid = (*env)->GetFieldID(env, this_cls, "address", "Ljava/net/InetAddress;");    fid =
327        (*env)->GetFieldID (env, this_cls, "address", "Ljava/net/InetAddress;");
328    if (fid == NULL)    if (fid == NULL)
329      return;      return;
330    
331    DBG("_javanet_set_remhost_addr(): Found address field\n");    DBG ("_javanet_set_remhost_addr(): Found address field\n");
332    
333    (*env)->SetObjectField(env, this, fid, ia);    (*env)->SetObjectField (env, this, fid, ia);
334    DBG("_javanet_set_remhost_addr(): Set field\n");    DBG ("_javanet_set_remhost_addr(): Set field\n");
335  }  }
336    
337  /*  /*
# Line 346  _javanet_set_remhost_addr(JNIEnv *env, j Line 339  _javanet_set_remhost_addr(JNIEnv *env, j
339   * InetAddress for the specified addr   * InetAddress for the specified addr
340   */   */
341  static void  static void
342  _javanet_set_remhost(JNIEnv *env, jobject this, int netaddr)  _javanet_set_remhost (JNIEnv * env, jobject this, int netaddr)
343  {  {
344    jobject ia;    jobject ia;
345    
346    assert(env!=NULL);    assert (env != NULL);
347    assert((*env)!=NULL);    assert ((*env) != NULL);
348    
349    DBG("_javanet_set_remhost(): Entered _javanet_set_remhost\n");    DBG ("_javanet_set_remhost(): Entered _javanet_set_remhost\n");
350    
351    /* Get an InetAddress object */    /* Get an InetAddress object */
352    ia = _javanet_create_inetaddress(env, netaddr);    ia = _javanet_create_inetaddress (env, netaddr);
353    if (ia == NULL)    if (ia == NULL)
354      return;      return;
355    
356    _javanet_set_remhost_addr(env, this, ia);    _javanet_set_remhost_addr (env, this, ia);
357  }  }
358    
359    
# Line 370  _javanet_set_remhost(JNIEnv *env, jobjec Line 363  _javanet_set_remhost(JNIEnv *env, jobjec
363   * Returns a 32 bit Internet address for the passed in InetAddress object   * Returns a 32 bit Internet address for the passed in InetAddress object
364   */   */
365  int  int
366  _javanet_get_netaddr(JNIEnv *env, jobject addr)  _javanet_get_netaddr (JNIEnv * env, jobject addr)
367  {  {
368  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
369    jclass    cls = 0;    jclass cls = 0;
370    jmethodID mid;    jmethodID mid;
371    jarray    arr = 0;    jarray arr = 0;
372    jbyte     *octets;    jbyte *octets;
373    int       netaddr, len;    int netaddr, len;
374    
375    assert(env!=NULL);    assert (env != NULL);
376    assert((*env)!=NULL);    assert ((*env) != NULL);
377    
378    DBG("_javanet_get_netaddr(): Entered _javanet_get_netaddr\n");    DBG ("_javanet_get_netaddr(): Entered _javanet_get_netaddr\n");
379    
380    /* Call the getAddress method on the object to retrieve the IP address */    /* Call the getAddress method on the object to retrieve the IP address */
381    cls = (*env)->GetObjectClass(env, addr);    cls = (*env)->GetObjectClass (env, addr);
382    if (cls == NULL)    if (cls == NULL)
383      return 0;      return 0;
384    
385    mid = (*env)->GetMethodID(env, cls, "getAddress", "()[B");    mid = (*env)->GetMethodID (env, cls, "getAddress", "()[B");
386    if (mid == NULL)    if (mid == NULL)
387      return 0;      return 0;
388    
389    DBG("_javanet_get_netaddr(): Got getAddress method\n");    DBG ("_javanet_get_netaddr(): Got getAddress method\n");
390    
391    arr = (*env)->CallObjectMethod(env, addr, mid);    arr = (*env)->CallObjectMethod (env, addr, mid);
392    if (arr == NULL)    if (arr == NULL)
393      return 0;      return 0;
394    
395    DBG("_javanet_get_netaddr(): Got the address\n");    DBG ("_javanet_get_netaddr(): Got the address\n");
396    
397    /* Turn the IP address into a 32 bit Internet address in network byte order */    /* Turn the IP address into a 32 bit Internet address in network byte order */
398    len = (*env)->GetArrayLength(env, arr);    len = (*env)->GetArrayLength (env, arr);
399    if (len != 4)    if (len != 4)
400      {      {
401        JCL_ThrowException(env, IO_EXCEPTION, "Internal Error");        JCL_ThrowException (env, IO_EXCEPTION, "Internal Error");
402        return 0;        return 0;
403      }      }
404    DBG("_javanet_get_netaddr(): Length ok\n");    DBG ("_javanet_get_netaddr(): Length ok\n");
405    
406    octets = (*env)->GetByteArrayElements(env, arr, 0);      octets = (*env)->GetByteArrayElements (env, arr, 0);
407    if (octets == NULL)    if (octets == NULL)
408      return 0;      return 0;
409    
410    DBG("_javanet_get_netaddr(): Grabbed bytes\n");    DBG ("_javanet_get_netaddr(): Grabbed bytes\n");
411    
412    TARGET_NATIVE_NETWORK_IPADDRESS_BYTES_TO_INT(octets[0],    TARGET_NATIVE_NETWORK_IPADDRESS_BYTES_TO_INT (octets[0],
413                                                 octets[1],                                                  octets[1],
414                                                 octets[2],                                                  octets[2],
415                                                 octets[3],                                                  octets[3], netaddr);
                                                netaddr  
                                               );  
416    
417    (*env)->ReleaseByteArrayElements(env, arr, octets, 0);    (*env)->ReleaseByteArrayElements (env, arr, octets, 0);
418    DBG("_javanet_get_netaddr(): Done getting addr\n");    DBG ("_javanet_get_netaddr(): Done getting addr\n");
419    
420    return netaddr;    return netaddr;
421  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
422  #endif /* not WITHOUT_NETWORK */  #endif /* not WITHOUT_NETWORK */
423  }  }
# Line 437  _javanet_get_netaddr(JNIEnv *env, jobjec Line 428  _javanet_get_netaddr(JNIEnv *env, jobjec
428   * Creates a new stream or datagram socket   * Creates a new stream or datagram socket
429   */   */
430  void  void
431  _javanet_create(JNIEnv *env, jobject this, jboolean stream)  _javanet_create (JNIEnv * env, jobject this, jboolean stream)
432  {  {
433  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
434    int fd;    int fd;
435    int result;    int result;
436    
437    assert(env!=NULL);    assert (env != NULL);
438    assert((*env)!=NULL);    assert ((*env) != NULL);
439    
440    if (stream)    if (stream)
441      {      {
442        /* create a stream socket */        /* create a stream socket */
443        TARGET_NATIVE_NETWORK_SOCKET_OPEN_STREAM(fd,result);        TARGET_NATIVE_NETWORK_SOCKET_OPEN_STREAM (fd, result);
444        if (result != TARGET_NATIVE_OK)        if (result != TARGET_NATIVE_OK)
445          {          {
446            JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());            JCL_ThrowException (env, IO_EXCEPTION,
447            return;                                TARGET_NATIVE_LAST_ERROR_STRING ());
448          }            return;
449            }
450      }      }
451    else    else
452      {      {
453        /* create a datagram socket, set broadcast option */        /* create a datagram socket, set broadcast option */
454        TARGET_NATIVE_NETWORK_SOCKET_OPEN_DATAGRAM(fd,result);        TARGET_NATIVE_NETWORK_SOCKET_OPEN_DATAGRAM (fd, result);
455        if (result != TARGET_NATIVE_OK)        if (result != TARGET_NATIVE_OK)
456          {          {
457            JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());            JCL_ThrowException (env, IO_EXCEPTION,
458            return;                                TARGET_NATIVE_LAST_ERROR_STRING ());
459          }            return;
460        TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_BROADCAST(fd,1,result);          }
461          TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_BROADCAST (fd, 1, result);
462        if (result != TARGET_NATIVE_OK)        if (result != TARGET_NATIVE_OK)
463          {          {
464            JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());            JCL_ThrowException (env, IO_EXCEPTION,
465            return;                                TARGET_NATIVE_LAST_ERROR_STRING ());
466          }            return;
467            }
468      }      }
469        
470    if (stream)    if (stream)
471      _javanet_set_int_field(env, this, "gnu/java/net/PlainSocketImpl",      _javanet_set_int_field (env, this, "gnu/java/net/PlainSocketImpl",
472                             "native_fd", fd);                              "native_fd", fd);
473    else    else
474      _javanet_set_int_field(env, this, "gnu/java/net/PlainDatagramSocketImpl",      _javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl",
475                             "native_fd", fd);                              "native_fd", fd);
476  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
477  #endif /* not WITHOUT_NETWORK */  #endif /* not WITHOUT_NETWORK */
478  }  }
# Line 490  _javanet_create(JNIEnv *env, jobject thi Line 484  _javanet_create(JNIEnv *env, jobject thi
484   * action as well.   * action as well.
485   */   */
486  void  void
487  _javanet_close(JNIEnv *env, jobject this, int stream)  _javanet_close (JNIEnv * env, jobject this, int stream)
488  {  {
489  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
490    int fd;    int fd;
491    int result;    int result;
492    
493    assert(env!=NULL);    assert (env != NULL);
494    assert((*env)!=NULL);    assert ((*env) != NULL);
495    
496    fd = _javanet_get_int_field(env, this, "native_fd");    fd = _javanet_get_int_field (env, this, "native_fd");
497    if (fd == -1)    if (fd == -1)
498      return;      return;
499    
500    TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result);    TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
501    
502    if (stream)    if (stream)
503      _javanet_set_int_field(env, this, "gnu/java/net/PlainSocketImpl",      _javanet_set_int_field (env, this, "gnu/java/net/PlainSocketImpl",
504                             "native_fd", -1);                              "native_fd", -1);
505    else    else
506      _javanet_set_int_field(env, this, "gnu/java/net/PlainDatagramSocketImpl",      _javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl",
507                             "native_fd", -1);                              "native_fd", -1);
508  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
509  #endif /* not WITHOUT_NETWORK */  #endif /* not WITHOUT_NETWORK */
510  }  }
# Line 520  _javanet_close(JNIEnv *env, jobject this Line 514  _javanet_close(JNIEnv *env, jobject this
514  /*  /*
515   * Connects to the specified destination.   * Connects to the specified destination.
516   */   */
517  void  void
518  _javanet_connect(JNIEnv *env, jobject this, jobject addr, jint port)  _javanet_connect (JNIEnv * env, jobject this, jobject addr, jint port)
519  {  {
520  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
521    int netaddr, fd;    int netaddr, fd;
522    int result;    int result;
523    int local_address,local_port;    int local_address, local_port;
524    int remote_address,remote_port;    int remote_address, remote_port;
525    
526    assert(env!=NULL);    assert (env != NULL);
527    assert((*env)!=NULL);    assert ((*env) != NULL);
528    
529    DBG("_javanet_connect(): Entered _javanet_connect\n");    DBG ("_javanet_connect(): Entered _javanet_connect\n");
530    
531    /* Pre-process input variables */    /* Pre-process input variables */
532    netaddr = _javanet_get_netaddr(env, addr);    netaddr = _javanet_get_netaddr (env, addr);
533    if ((*env)->ExceptionOccurred(env))    if ((*env)->ExceptionOccurred (env))
534      return;      return;
535    
536    if (port == -1)    if (port == -1)
537      port = 0;      port = 0;
538    DBG("_javanet_connect(): Got network address\n");    DBG ("_javanet_connect(): Got network address\n");
539    
540    /* Grab the real socket file descriptor */    /* Grab the real socket file descriptor */
541    fd = _javanet_get_int_field(env, this, "native_fd");    fd = _javanet_get_int_field (env, this, "native_fd");
542    if (fd == -1)    if (fd == -1)
543      {      {
544        JCL_ThrowException(env, IO_EXCEPTION,        JCL_ThrowException (env, IO_EXCEPTION,
545                           "Internal error: _javanet_connect(): no native file descriptor");                            "Internal error: _javanet_connect(): no native file descriptor");
546        return;        return;
547      }      }
548    DBG("_javanet_connect(): Got native fd\n");    DBG ("_javanet_connect(): Got native fd\n");
549    
550    /* Connect up */    /* Connect up */
551    TARGET_NATIVE_NETWORK_SOCKET_CONNECT(fd,netaddr,port,result);    TARGET_NATIVE_NETWORK_SOCKET_CONNECT (fd, netaddr, port, result);
552    if (result != TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
553      {      {
554         JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        JCL_ThrowException (env, IO_EXCEPTION,
555         return;                            TARGET_NATIVE_LAST_ERROR_STRING ());
556          return;
557      }      }
558    DBG("_javanet_connect(): Connected successfully\n");    DBG ("_javanet_connect(): Connected successfully\n");
559    
560    /* Populate instance variables */    /* Populate instance variables */
561    TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO(fd,local_address,local_port,result);    TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO (fd, local_address, local_port,
562                                                   result);
563    if (result != TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
564      {      {
565        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
566        JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        JCL_ThrowException (env, IO_EXCEPTION,
567                              TARGET_NATIVE_LAST_ERROR_STRING ());
568        return;        return;
569      }      }
570    
571    _javanet_create_localfd(env, this);    _javanet_create_localfd (env, this);
572    if ((*env)->ExceptionOccurred(env))    if ((*env)->ExceptionOccurred (env))
573      {      {
574        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
575        return;        return;
576      }      }
577    DBG("_javanet_connect(): Created fd\n");    DBG ("_javanet_connect(): Created fd\n");
578    
579    _javanet_set_int_field(env, this, "java/net/SocketImpl", "localport",    _javanet_set_int_field (env, this, "java/net/SocketImpl", "localport",
580                           local_port);                            local_port);
581    if ((*env)->ExceptionOccurred(env))    if ((*env)->ExceptionOccurred (env))
582      {      {
583        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
584        return;        return;
585      }      }
586    DBG("_javanet_connect(): Set the local port\n");    DBG ("_javanet_connect(): Set the local port\n");
587      
588    TARGET_NATIVE_NETWORK_SOCKET_GET_REMOTE_INFO(fd,remote_address,remote_port,result);    TARGET_NATIVE_NETWORK_SOCKET_GET_REMOTE_INFO (fd, remote_address,
589                                                    remote_port, result);
590    if (result != TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
591      {      {
592        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
593        JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        JCL_ThrowException (env, IO_EXCEPTION,
594                              TARGET_NATIVE_LAST_ERROR_STRING ());
595        return;        return;
596      }      }
597    
598    if (remote_address == netaddr)    if (remote_address == netaddr)
599      {      {
600        _javanet_set_remhost_addr(env, this, addr);        _javanet_set_remhost_addr (env, this, addr);
601      }      }
602    else    else
603      {      {
604        _javanet_set_remhost(env, this, remote_address);        _javanet_set_remhost (env, this, remote_address);
605      }      }
606    if ((*env)->ExceptionOccurred(env))    if ((*env)->ExceptionOccurred (env))
607      {      {
608        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
609        return;        return;
610      }      }
611    DBG("_javanet_connect(): Set the remote host\n");    DBG ("_javanet_connect(): Set the remote host\n");
612    
613    _javanet_set_int_field(env, this, "java/net/SocketImpl", "port",    _javanet_set_int_field (env, this, "java/net/SocketImpl", "port",
614                           remote_port);                            remote_port);
615    if ((*env)->ExceptionOccurred(env))    if ((*env)->ExceptionOccurred (env))
616      {      {
617        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(fd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
618        return;        return;
619      }      }
620    DBG("_javanet_connect(): Set the remote port\n");    DBG ("_javanet_connect(): Set the remote port\n");
621  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
622  #endif /* not WITHOUT_NETWORK */  #endif /* not WITHOUT_NETWORK */
623  }  }
# Line 631  _javanet_connect(JNIEnv *env, jobject th Line 630  _javanet_connect(JNIEnv *env, jobject th
630   * port public instance variables.   * port public instance variables.
631   */   */
632  void  void
633  _javanet_bind(JNIEnv *env, jobject this, jobject addr, jint port, int stream)  _javanet_bind (JNIEnv * env, jobject this, jobject addr, jint port,
634                   int stream)
635  {  {
636  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
637    jclass     cls;    jclass cls;
638    jmethodID  mid;    jmethodID mid;
639    jbyteArray arr = 0;    jbyteArray arr = 0;
640    jbyte      *octets;    jbyte *octets;
641    jint       fd;    jint fd;
642    int        tmpaddr;    int tmpaddr;
643    int        result;    int result;
644    int        local_address,local_port;            int local_address, local_port;
645    
646    assert(env!=NULL);    assert (env != NULL);
647    assert((*env)!=NULL);    assert ((*env) != NULL);
648    
649    DBG("_javanet_bind(): Entering native bind()\n");    DBG ("_javanet_bind(): Entering native bind()\n");
650    
651    /* Get the address to connect to */    /* Get the address to connect to */
652    cls = (*env)->GetObjectClass(env, addr);    cls = (*env)->GetObjectClass (env, addr);
653    if (cls == NULL)    if (cls == NULL)
654      return;      return;
655    
656    mid  = (*env)->GetMethodID(env, cls, "getAddress", "()[B");    mid = (*env)->GetMethodID (env, cls, "getAddress", "()[B");
657    if (mid == NULL)    if (mid == NULL)
658      return;      return;
659    
660    DBG("_javanet_bind(): Past getAddress method id\n");    DBG ("_javanet_bind(): Past getAddress method id\n");
661    
662    arr = (*env)->CallObjectMethod(env, addr, mid);    arr = (*env)->CallObjectMethod (env, addr, mid);
663    if ((arr == NULL) || (*env)->ExceptionOccurred(env))    if ((arr == NULL) || (*env)->ExceptionOccurred (env))
664      { JCL_ThrowException(env, IO_EXCEPTION, "Internal error: _javanet_bind()"); return; }      {
665          JCL_ThrowException (env, IO_EXCEPTION,
666                              "Internal error: _javanet_bind()");
667          return;
668        }
669    
670    DBG("_javanet_bind(): Past call object method\n");    DBG ("_javanet_bind(): Past call object method\n");
671    
672    octets = (*env)->GetByteArrayElements(env, arr, 0);      octets = (*env)->GetByteArrayElements (env, arr, 0);
673    if (octets == NULL)    if (octets == NULL)
674      return;      return;
675    
676    DBG("_javanet_bind(): Past grab array\n");    DBG ("_javanet_bind(): Past grab array\n");
677    
678    /* Get the native socket file descriptor */    /* Get the native socket file descriptor */
679    fd = _javanet_get_int_field(env, this, "native_fd");    fd = _javanet_get_int_field (env, this, "native_fd");
680    if (fd == -1)    if (fd == -1)
681      {      {
682        (*env)->ReleaseByteArrayElements(env, arr, octets, 0);        (*env)->ReleaseByteArrayElements (env, arr, octets, 0);
683        JCL_ThrowException(env, IO_EXCEPTION,        JCL_ThrowException (env, IO_EXCEPTION,
684                           "Internal error: _javanet_bind(): no native file descriptor");                            "Internal error: _javanet_bind(): no native file descriptor");
685        return;        return;
686      }      }
687    DBG("_javanet_bind(): Past native_fd lookup\n");    DBG ("_javanet_bind(): Past native_fd lookup\n");
688    
689    /* XXX NYI ??? */    /* XXX NYI ??? */
690    _javanet_set_option (env, this, SOCKOPT_SO_REUSEADDR,    _javanet_set_option (env, this, SOCKOPT_SO_REUSEADDR,
691                         _javanet_create_boolean (env, JNI_TRUE));                         _javanet_create_boolean (env, JNI_TRUE));
692    
693    
694    /* Bind the socket */    /* Bind the socket */
695    TARGET_NATIVE_NETWORK_IPADDRESS_BYTES_TO_INT(octets[0],    TARGET_NATIVE_NETWORK_IPADDRESS_BYTES_TO_INT (octets[0],
696                                                 octets[1],                                                  octets[1],
697                                                 octets[2],                                                  octets[2],
698                                                 octets[3],                                                  octets[3], tmpaddr);
699                                                 tmpaddr    TARGET_NATIVE_NETWORK_SOCKET_BIND (fd, tmpaddr, port, result);
                                               );  
   TARGET_NATIVE_NETWORK_SOCKET_BIND(fd,tmpaddr,port,result);  
700    
701    (*env)->ReleaseByteArrayElements(env, arr, octets, 0);    (*env)->ReleaseByteArrayElements (env, arr, octets, 0);
702    
703    if (result != TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
704      {      {
705        JCL_ThrowException(env, BIND_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        JCL_ThrowException (env, BIND_EXCEPTION,
706                              TARGET_NATIVE_LAST_ERROR_STRING ());
707        return;        return;
708      }      }
709    DBG("_javanet_bind(): Past bind\n");    DBG ("_javanet_bind(): Past bind\n");
710      
711    /* Update instance variables, specifically the local port number */    /* Update instance variables, specifically the local port number */
712    TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO(fd,local_address,local_port,result);    TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO (fd, local_address, local_port,
713                                                   result);
714    if (result != TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
715      {      {
716        JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        JCL_ThrowException (env, IO_EXCEPTION,
717                              TARGET_NATIVE_LAST_ERROR_STRING ());
718        return;        return;
719      }      }
720    
721    if (stream)    if (stream)
722      _javanet_set_int_field(env, this, "java/net/SocketImpl",      _javanet_set_int_field (env, this, "java/net/SocketImpl",
723                             "localport", local_port);                              "localport", local_port);
724    else    else
725      _javanet_set_int_field(env, this, "java/net/DatagramSocketImpl",      _javanet_set_int_field (env, this, "java/net/DatagramSocketImpl",
726                             "localPort", local_port);                              "localPort", local_port);
727    DBG("_javanet_bind(): Past update port number\n");    DBG ("_javanet_bind(): Past update port number\n");
728    
729    return;    return;
730  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
# Line 732  _javanet_bind(JNIEnv *env, jobject this, Line 737  _javanet_bind(JNIEnv *env, jobject this,
737   * Starts listening on a socket with the specified number of pending   * Starts listening on a socket with the specified number of pending
738   * connections allowed.   * connections allowed.
739   */   */
740  void  void
741  _javanet_listen(JNIEnv *env, jobject this, jint queuelen)  _javanet_listen (JNIEnv * env, jobject this, jint queuelen)
742  {  {
743  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
744    int fd;    int fd;
745    int result;    int result;
746    
747    assert(env!=NULL);    assert (env != NULL);
748    assert((*env)!=NULL);    assert ((*env) != NULL);
749    
750    /* Get the real file descriptor */    /* Get the real file descriptor */
751    fd = _javanet_get_int_field(env, this, "native_fd");    fd = _javanet_get_int_field (env, this, "native_fd");
752    if (fd == -1)    if (fd == -1)
753      {      {
754        JCL_ThrowException(env, IO_EXCEPTION,        JCL_ThrowException (env, IO_EXCEPTION,
755                           "Internal error: _javanet_listen(): no native file descriptor");                            "Internal error: _javanet_listen(): no native file descriptor");
756        return;        return;
757      }      }
758    
759    /* Start listening */    /* Start listening */
760    TARGET_NATIVE_NETWORK_SOCKET_LISTEN(fd,queuelen,result);    TARGET_NATIVE_NETWORK_SOCKET_LISTEN (fd, queuelen, result);
761    if (result!=TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
762      {      {
763        JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        JCL_ThrowException (env, IO_EXCEPTION,
764                              TARGET_NATIVE_LAST_ERROR_STRING ());
765        return;        return;
766      }      }
767  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
# Line 768  _javanet_listen(JNIEnv *env, jobject thi Line 774  _javanet_listen(JNIEnv *env, jobject thi
774   * Accepts a new connection and assigns it to the passed in SocketImpl   * Accepts a new connection and assigns it to the passed in SocketImpl
775   * object. Note that we assume this is a PlainSocketImpl just like us   * object. Note that we assume this is a PlainSocketImpl just like us
776   */   */
777  void  void
778  _javanet_accept(JNIEnv *env, jobject this, jobject impl)  _javanet_accept (JNIEnv * env, jobject this, jobject impl)
779  {  {
780  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
781    int fd, newfd;    int fd, newfd;
782    int result;    int result;
783    int local_address,local_port;    int local_address, local_port;
784    int remote_address,remote_port;    int remote_address, remote_port;
785    
786    assert(env!=NULL);    assert (env != NULL);
787    assert((*env)!=NULL);    assert ((*env) != NULL);
788    
789    /* Get the real file descriptor */    /* Get the real file descriptor */
790    fd = _javanet_get_int_field(env, this, "native_fd");    fd = _javanet_get_int_field (env, this, "native_fd");
791    if (fd == -1)    if (fd == -1)
792      {      {
793        JCL_ThrowException(env, IO_EXCEPTION,        JCL_ThrowException (env, IO_EXCEPTION,
794                           "Internal error: _javanet_accept(): no native file descriptor");                            "Internal error: _javanet_accept(): no native file descriptor");
795        return;        return;
796      }      }
797    
798    /* Accept the connection */    /* Accept the connection */
799    do    do
800      {      {
801        TARGET_NATIVE_NETWORK_SOCKET_ACCEPT(fd,newfd,result);        TARGET_NATIVE_NETWORK_SOCKET_ACCEPT (fd, newfd, result);
802        if (result != TARGET_NATIVE_OK        if (result != TARGET_NATIVE_OK
803            && (TARGET_NATIVE_LAST_ERROR()            && (TARGET_NATIVE_LAST_ERROR ()
804                != TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL))                != TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL))
805          {          {
806            JCL_ThrowException(env, IO_EXCEPTION,            JCL_ThrowException (env, IO_EXCEPTION,
807                               "Internal error: _javanet_accept(): ");                                "Internal error: _javanet_accept(): ");
808            return;            return;
809          }          }
810      }      }
811    while (result != TARGET_NATIVE_OK);    while (result != TARGET_NATIVE_OK);
812    
813    /* Populate instance variables */    /* Populate instance variables */
814    _javanet_set_int_field(env, impl, "gnu/java/net/PlainSocketImpl", "native_fd",    _javanet_set_int_field (env, impl, "gnu/java/net/PlainSocketImpl",
815                           newfd);                            "native_fd", newfd);
816    
817    if ((*env)->ExceptionOccurred(env))    if ((*env)->ExceptionOccurred (env))
818      {      {
819        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
820        return;        return;
821      }      }
822    
823    TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO(newfd,local_address,local_port,result);    TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO (newfd, local_address,
824    if (result!=TARGET_NATIVE_OK)                                                 local_port, result);
825      if (result != TARGET_NATIVE_OK)
826      {      {
827        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
828        JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        JCL_ThrowException (env, IO_EXCEPTION,
829                              TARGET_NATIVE_LAST_ERROR_STRING ());
830        return;        return;
831      }      }
832    
833    _javanet_create_localfd(env, impl);    _javanet_create_localfd (env, impl);
834    if ((*env)->ExceptionOccurred(env))    if ((*env)->ExceptionOccurred (env))
835      {      {
836        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
837        return;        return;
838      }      }
839    
840    _javanet_set_int_field(env, impl, "java/net/SocketImpl", "localport",    _javanet_set_int_field (env, impl, "java/net/SocketImpl", "localport",
841                           local_port);                            local_port);
842    if ((*env)->ExceptionOccurred(env))    if ((*env)->ExceptionOccurred (env))
843      {      {
844        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
845        return;        return;
846      }      }
847      
848    TARGET_NATIVE_NETWORK_SOCKET_GET_REMOTE_INFO(newfd,remote_address,remote_port,result);    TARGET_NATIVE_NETWORK_SOCKET_GET_REMOTE_INFO (newfd, remote_address,
849    if (result!=TARGET_NATIVE_OK)                                                  remote_port, result);
850      if (result != TARGET_NATIVE_OK)
851      {      {
852        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
853        JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        JCL_ThrowException (env, IO_EXCEPTION,
854                              TARGET_NATIVE_LAST_ERROR_STRING ());
855        return;        return;
856      }      }
857    
858    _javanet_set_remhost(env, impl, remote_address);    _javanet_set_remhost (env, impl, remote_address);
859    if ((*env)->ExceptionOccurred(env))    if ((*env)->ExceptionOccurred (env))
860      {      {
861        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
862        return;        return;
863      }      }
864    
865    _javanet_set_int_field(env, impl, "java/net/SocketImpl", "port",    _javanet_set_int_field (env, impl, "java/net/SocketImpl", "port",
866                           remote_port);                            remote_port);
867    if ((*env)->ExceptionOccurred(env))    if ((*env)->ExceptionOccurred (env))
868      {      {
869        TARGET_NATIVE_NETWORK_SOCKET_CLOSE(newfd,result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
870        return;        return;
871      }      }
872  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
# Line 880  _javanet_accept(JNIEnv *env, jobject thi Line 890  _javanet_accept(JNIEnv *env, jobject thi
890   * The actual number of bytes read is returned.   * The actual number of bytes read is returned.
891   */   */
892  int  int
893  _javanet_recvfrom(JNIEnv *env, jobject this, jarray buf, int offset, int len,  _javanet_recvfrom (JNIEnv * env, jobject this, jarray buf, int offset,
894                    int *addr, int *port)                     int len, int *addr, int *port)
895  {  {
896  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
897    int   fd;    int fd;
898    jbyte *p;    jbyte *p;
899    int   from_address,from_port;    int from_address, from_port;
900    int   received_bytes;    int received_bytes;
901    
902    assert(env!=NULL);    assert (env != NULL);
903    assert((*env)!=NULL);    assert ((*env) != NULL);
904    
905    DBG("_javanet_recvfrom(): Entered _javanet_recvfrom\n");    DBG ("_javanet_recvfrom(): Entered _javanet_recvfrom\n");
906    
907    /* Get the real file descriptor */    /* Get the real file descriptor */
908    fd = _javanet_get_int_field(env, this, "native_fd");    fd = _javanet_get_int_field (env, this, "native_fd");
909    if (fd == -1)    if (fd == -1)
910      {      {
911        JCL_ThrowException(env, IO_EXCEPTION,        JCL_ThrowException (env, IO_EXCEPTION,
912                           "Internal error: _javanet_recvfrom(): no native file descriptor");                            "Internal error: _javanet_recvfrom(): no native file descriptor");
913        return 0;        return 0;
914      }      }
915    DBG("_javanet_recvfrom(): Got native_fd\n");    DBG ("_javanet_recvfrom(): Got native_fd\n");
916    
917    /* Get a pointer to the buffer */    /* Get a pointer to the buffer */
918    p = (*env)->GetByteArrayElements(env, buf, 0);    p = (*env)->GetByteArrayElements (env, buf, 0);
919    if (p == NULL)    if (p == NULL)
920      return 0;      return 0;
921    
922    DBG("_javanet_recvfrom(): Got buffer\n");    DBG ("_javanet_recvfrom(): Got buffer\n");
923    
924    /* Read the data */    /* Read the data */
925    from_address = 0;    from_address = 0;
926    from_port    = 0;    from_port = 0;
927    do {    do
928       if (addr != NULL)      {
929         {        if (addr != NULL)
930           TARGET_NATIVE_NETWORK_SOCKET_RECEIVE_WITH_ADDRESS_PORT(fd,p+offset,len,from_address,from_port,received_bytes);            {
931         }            TARGET_NATIVE_NETWORK_SOCKET_RECEIVE_WITH_ADDRESS_PORT (fd,
932       else                                                                    p + offset,
933         {                                                                    len,
934           TARGET_NATIVE_NETWORK_SOCKET_RECEIVE(fd,p+offset,len,received_bytes);                                                                    from_address,
935         }                                                                    from_port,
936    } while ((received_bytes == -1) &&                                                                    received_bytes);
937             (TARGET_NATIVE_LAST_ERROR() == TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL)          }
938            );        else
939            {
940              TARGET_NATIVE_NETWORK_SOCKET_RECEIVE (fd, p + offset, len,
941                                                    received_bytes);
942            }
943        }
944      while ((received_bytes == -1) &&
945             (TARGET_NATIVE_LAST_ERROR () ==
946              TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL));
947    
948    (*env)->ReleaseByteArrayElements(env, buf, p, 0);    (*env)->ReleaseByteArrayElements (env, buf, p, 0);
949    
950    if (received_bytes == -1)    if (received_bytes == -1)
951      {      {
952         JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        JCL_ThrowException (env, IO_EXCEPTION,
953         return 0;                            TARGET_NATIVE_LAST_ERROR_STRING ());
954          return 0;
955      }      }
956    
957    /* Handle return addr case */    /* Handle return addr case */
# Line 940  _javanet_recvfrom(JNIEnv *env, jobject t Line 959  _javanet_recvfrom(JNIEnv *env, jobject t
959      {      {
960        (*addr) = from_address;        (*addr) = from_address;
961        if (port != NULL)        if (port != NULL)
962          (*port) = from_port;          (*port) = from_port;
963      }      }
964    
965    return(received_bytes);    return (received_bytes);
966  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
967  #endif /* not WITHOUT_NETWORK */  #endif /* not WITHOUT_NETWORK */
968  }  }
# Line 959  _javanet_recvfrom(JNIEnv *env, jobject t Line 978  _javanet_recvfrom(JNIEnv *env, jobject t
978   * addr - The 32bit address to send to (may be 0)   * addr - The 32bit address to send to (may be 0)
979   * port - The port number to send to (may be 0)   * port - The port number to send to (may be 0)
980   */   */
981  void  void
982  _javanet_sendto(JNIEnv *env, jobject this, jarray buf, int offset, int len,  _javanet_sendto (JNIEnv * env, jobject this, jarray buf, int offset, int len,
983                  int addr, int port)                   int addr, int port)
984  {  {
985  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
986    int   fd;    int fd;
987    jbyte *p;    jbyte *p;
988    int   bytes_sent;    int bytes_sent;
989    
990    assert(env!=NULL);    assert (env != NULL);
991    assert((*env)!=NULL);    assert ((*env) != NULL);
992    
993    /* Get the real file descriptor */    /* Get the real file descriptor */
994    fd = _javanet_get_int_field(env, this, "native_fd");    fd = _javanet_get_int_field (env, this, "native_fd");
995    if (fd == -1)    if (fd == -1)
996      {      {
997        JCL_ThrowException(env, IO_EXCEPTION,        JCL_ThrowException (env, IO_EXCEPTION,
998                           "Internal error: _javanet_sendto(): no native file descriptor");                            "Internal error: _javanet_sendto(): no native file descriptor");
999        return;        return;
1000      }      }
1001    
1002    /* Get a pointer to the buffer */    /* Get a pointer to the buffer */
1003    p = (*env)->GetByteArrayElements(env, buf, 0);    p = (*env)->GetByteArrayElements (env, buf, 0);
1004    if (p == NULL)    if (p == NULL)
1005      return;      return;
1006    
1007    /* Send the data */    /* Send the data */
1008    if (addr == 0)    if (addr == 0)
1009      {      {
1010        DBG("_javanet_sendto(): Sending....\n");        DBG ("_javanet_sendto(): Sending....\n");
1011        TARGET_NATIVE_NETWORK_SOCKET_SEND(fd,p+offset,len,bytes_sent);        TARGET_NATIVE_NETWORK_SOCKET_SEND (fd, p + offset, len, bytes_sent);
1012      }      }
1013    else    else
1014      {      {
1015        DBG("_javanet_sendto(): Sending....\n");        DBG ("_javanet_sendto(): Sending....\n");
1016        TARGET_NATIVE_NETWORK_SOCKET_SEND_WITH_ADDRESS_PORT(fd,p+offset,len,addr,port,bytes_sent);        TARGET_NATIVE_NETWORK_SOCKET_SEND_WITH_ADDRESS_PORT (fd, p + offset,
1017                                                               len, addr, port,
1018                                                               bytes_sent);
1019      }      }
1020    
1021    (*env)->ReleaseByteArrayElements(env, buf, p, 0);    (*env)->ReleaseByteArrayElements (env, buf, p, 0);
1022    
1023    /***** Do we need to check EINTR? */    /***** Do we need to check EINTR? */
1024    if (bytes_sent<0)    if (bytes_sent < 0)
1025      {      {
1026        JCL_ThrowException(env, IO_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        JCL_ThrowException (env, IO_EXCEPTION,
1027                              TARGET_NATIVE_LAST_ERROR_STRING ());
1028        return;        return;
1029      }      }
1030  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
# Line 1014  _javanet_sendto(JNIEnv *env, jobject thi Line 1036  _javanet_sendto(JNIEnv *env, jobject thi
1036  /*  /*
1037   * Sets the specified option for a socket   * Sets the specified option for a socket
1038   */   */
1039  void  void
1040  _javanet_set_option(JNIEnv *env, jobject this, jint option_id, jobject val)  _javanet_set_option (JNIEnv * env, jobject this, jint option_id, jobject val)
1041  {  {
1042  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
1043    int       fd;    int fd;
1044    int       optval;    int optval;
1045    jclass    cls;    jclass cls;
1046    jmethodID mid;    jmethodID mid;
1047    int       address;    int address;
1048    int       result;    int result;
1049    
1050    assert(env!=NULL);    assert (env != NULL);
1051    assert((*env)!=NULL);    assert ((*env) != NULL);
1052    
1053    /* Get the real file descriptor */    /* Get the real file descriptor */
1054    fd = _javanet_get_int_field(env, this, "native_fd");    fd = _javanet_get_int_field (env, this, "native_fd");
1055    if (fd == -1)    if (fd == -1)
1056      {      {
1057        JCL_ThrowException(env, IO_EXCEPTION,        JCL_ThrowException (env, IO_EXCEPTION,
1058                           "Internal error: _javanet_set_option(): no native file descriptor");                            "Internal error: _javanet_set_option(): no native file descriptor");
1059        return;        return;
1060      }      }
1061    
1062    /* We need a class object for all cases below */    /* We need a class object for all cases below */
1063    cls = (*env)->GetObjectClass(env, val);    cls = (*env)->GetObjectClass (env, val);
1064    if (cls == NULL)    if (cls == NULL)
1065      return;      return;
1066    
# Line 1047  _javanet_set_option(JNIEnv *env, jobject Line 1069  _javanet_set_option(JNIEnv *env, jobject
1069    switch (option_id)    switch (option_id)
1070      {      {
1071        /* TCP_NODELAY case.  val is a Boolean that tells us what to do */        /* TCP_NODELAY case.  val is a Boolean that tells us what to do */
1072        case SOCKOPT_TCP_NODELAY:      case SOCKOPT_TCP_NODELAY:
1073          mid = (*env)->GetMethodID(env, cls, "booleanValue", "()Z");        mid = (*env)->GetMethodID (env, cls, "booleanValue", "()Z");
1074          if (mid == NULL)        if (mid == NULL)
1075            { JCL_ThrowException(env, IO_EXCEPTION,          {
1076                                       "Internal error: _javanet_set_option()"); return; }            JCL_ThrowException (env, IO_EXCEPTION,
1077                                  "Internal error: _javanet_set_option()");
         /* Should be a 0 or a 1 */  
         optval = (*env)->CallBooleanMethod(env, val, mid);  
         if ((*env)->ExceptionOccurred(env))  
1078            return;            return;
1079            }
1080    
1081          TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_TCP_NODELAY(fd,optval,result);        /* Should be a 0 or a 1 */
1082          break;        optval = (*env)->CallBooleanMethod (env, val, mid);
1083          if ((*env)->ExceptionOccurred (env))
1084            return;
1085    
1086          TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_TCP_NODELAY (fd, optval,
1087                                                               result);
1088          break;
1089    
1090        /* SO_LINGER case.  If val is a boolean, then it will always be set        /* SO_LINGER case.  If val is a boolean, then it will always be set
1091           to false indicating disable linger, otherwise it will be an           to false indicating disable linger, otherwise it will be an
1092           integer that contains the linger value */           integer that contains the linger value */
1093        case SOCKOPT_SO_LINGER:      case SOCKOPT_SO_LINGER:
1094          mid = (*env)->GetMethodID(env, cls, "booleanValue", "()Z");        mid = (*env)->GetMethodID (env, cls, "booleanValue", "()Z");
1095          if (mid)        if (mid)
1096            {          {
1097              /* We are disabling linger */            /* We are disabling linger */
1098              TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_LINGER(fd,1,0,result);            TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_LINGER (fd, 1, 0,
1099            }                                                               result);
1100          else          }
1101            {        else
1102              /* Clear exception if thrown for failure to do method lookup          {
1103                 above */            /* Clear exception if thrown for failure to do method lookup
1104              if ((*env)->ExceptionOccurred(env))               above */
1105                (*env)->ExceptionClear(env);            if ((*env)->ExceptionOccurred (env))
1106                (*env)->ExceptionClear (env);
1107              mid = (*env)->GetMethodID(env, cls, "intValue", "()I");  
1108              if (mid == NULL)            mid = (*env)->GetMethodID (env, cls, "intValue", "()I");
1109                { JCL_ThrowException(env, IO_EXCEPTION,            if (mid == NULL)
1110                                     "Internal error: _javanet_set_option()"); return; }              {
1111                  JCL_ThrowException (env, IO_EXCEPTION,
1112              optval= (*env)->CallIntMethod(env, val, mid);                                    "Internal error: _javanet_set_option()");
             if ((*env)->ExceptionOccurred(env))  
1113                return;                return;
1114                }
1115    
1116              TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_LINGER(fd,0,optval,result);            optval = (*env)->CallIntMethod (env, val, mid);
1117            }            if ((*env)->ExceptionOccurred (env))
1118          break;              return;
1119    
1120              TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_LINGER (fd, 0, optval,
1121                                                                 result);
1122            }
1123          break;
1124    
1125        /* SO_TIMEOUT case. Val will be an integer with the new value */        /* SO_TIMEOUT case. Val will be an integer with the new value */
1126        /* Not writable on Linux */        /* Not writable on Linux */
1127        case SOCKOPT_SO_TIMEOUT:      case SOCKOPT_SO_TIMEOUT:
1128  #ifdef SO_TIMEOUT  #ifdef SO_TIMEOUT
1129          mid = (*env)->GetMethodID(env, cls, "intValue", "()I");        mid = (*env)->GetMethodID (env, cls, "intValue", "()I");
1130          if (mid == NULL)        if (mid == NULL)
1131            { JCL_ThrowException(env, IO_EXCEPTION,          {
1132                                       "Internal error: _javanet_set_option()"); return; }            JCL_ThrowException (env, IO_EXCEPTION,
1133                                  "Internal error: _javanet_set_option()");
         optval = (*env)->CallIntMethod(env, val, mid);  
         if ((*env)->ExceptionOccurred(env))  
1134            return;            return;
1135            }
1136    
1137          TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_TIMEOUT(fd,optval,result);        optval = (*env)->CallIntMethod (env, val, mid);
1138  #endif        if ((*env)->ExceptionOccurred (env))
1139          /* ignore errors and do not throw an exception. */          return;
         result = TARGET_NATIVE_OK;  
         break;  
   
       case SOCKOPT_SO_SNDBUF:  
       case SOCKOPT_SO_RCVBUF:  
         mid = (*env)->GetMethodID(env, cls, "intValue", "()I");  
         if (mid == NULL)  
           { JCL_ThrowException(env, IO_EXCEPTION,  
                                      "Internal error: _javanet_set_option()"); return; }  
1140    
1141          TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_TIMEOUT (fd, optval, result);
1142    #endif
1143          /* ignore errors and do not throw an exception. */
1144          result = TARGET_NATIVE_OK;
1145          break;
1146    
1147          optval = (*env)->CallIntMethod(env, val, mid);      case SOCKOPT_SO_SNDBUF:
1148          if ((*env)->ExceptionOccurred(env))      case SOCKOPT_SO_RCVBUF:
1149          mid = (*env)->GetMethodID (env, cls, "intValue", "()I");
1150          if (mid == NULL)
1151            {
1152              JCL_ThrowException (env, IO_EXCEPTION,
1153                                  "Internal error: _javanet_set_option()");
1154            return;            return;
1155                    }
         if (option_id == SOCKOPT_SO_SNDBUF)  
           TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_SNDBUF(fd,optval,result);  
         else  
           TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_RCDBUF(fd,optval,result);  
         break;  
1156    
       /* TTL case.  Val with be an Integer with the new time to live value */  
       case SOCKOPT_IP_TTL:  
         mid = (*env)->GetMethodID(env, cls, "intValue", "()I");  
         if (!mid)  
           { JCL_ThrowException(env, IO_EXCEPTION,  
                                      "Internal error: _javanet_set_option()"); return; }  
1157    
1158          optval = (*env)->CallIntMethod(env, val, mid);        optval = (*env)->CallIntMethod (env, val, mid);
1159          if ((*env)->ExceptionOccurred(env))        if ((*env)->ExceptionOccurred (env))
1160            return;
1161    
1162          if (option_id == SOCKOPT_SO_SNDBUF)
1163            TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_SNDBUF (fd, optval,
1164                                                               result);
1165          else
1166            TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_RCDBUF (fd, optval,
1167                                                               result);
1168          break;
1169    
1170          /* TTL case.  Val with be an Integer with the new time to live value */
1171        case SOCKOPT_IP_TTL:
1172          mid = (*env)->GetMethodID (env, cls, "intValue", "()I");
1173          if (!mid)
1174            {
1175              JCL_ThrowException (env, IO_EXCEPTION,
1176                                  "Internal error: _javanet_set_option()");
1177            return;            return;
1178                    }
1179          TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_IP_TTL(fd,optval,result);  
1180          break;        optval = (*env)->CallIntMethod (env, val, mid);
1181          if ((*env)->ExceptionOccurred (env))
1182            return;
1183    
1184          TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_IP_TTL (fd, optval, result);
1185          break;
1186    
1187        /* Multicast Interface case - val is InetAddress object */        /* Multicast Interface case - val is InetAddress object */
1188        case SOCKOPT_IP_MULTICAST_IF:      case SOCKOPT_IP_MULTICAST_IF:
1189          address = _javanet_get_netaddr(env, val);        address = _javanet_get_netaddr (env, val);
1190    
1191          if ((*env)->ExceptionOccurred(env))        if ((*env)->ExceptionOccurred (env))
1192            return;          return;
1193    
1194          TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_IP_MULTICAST_IF(fd,address,result);        TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_IP_MULTICAST_IF (fd, address,
1195          break;                                                                 result);
1196          break;
1197    
1198        case SOCKOPT_SO_REUSEADDR:      case SOCKOPT_SO_REUSEADDR:
1199          mid = (*env)->GetMethodID(env, cls, "booleanValue", "()Z");        mid = (*env)->GetMethodID (env, cls, "booleanValue", "()Z");
1200          if (mid == NULL)        if (mid == NULL)
1201            { JCL_ThrowException(env, IO_EXCEPTION,          {
1202                                       "Internal error: _javanet_set_option()"); return; }            JCL_ThrowException (env, IO_EXCEPTION,
1203                                  "Internal error: _javanet_set_option()");
         /* Should be a 0 or a 1 */  
         optval = (*env)->CallBooleanMethod(env, val, mid);  
         if ((*env)->ExceptionOccurred(env))  
1204            return;            return;
1205            }
1206    
1207          /* Should be a 0 or a 1 */
1208          optval = (*env)->CallBooleanMethod (env, val, mid);
1209          if ((*env)->ExceptionOccurred (env))
1210            return;
1211    
1212          TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_REUSE_ADDRESS(fd,optval,result);        TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_REUSE_ADDRESS (fd, optval,
1213          break;                                                               result);
1214          break;
1215    
1216      case SOCKOPT_SO_KEEPALIVE:      case SOCKOPT_SO_KEEPALIVE:
1217          mid = (*env)->GetMethodID(env, cls, "booleanValue", "()Z");        mid = (*env)->GetMethodID (env, cls, "booleanValue", "()Z");
1218          if (mid == NULL)        if (mid == NULL)
1219            { JCL_ThrowException(env, IO_EXCEPTION,          {
1220                                       "Internal error: _javanet_set_option()"); return; }            JCL_ThrowException (env, IO_EXCEPTION,
1221                                  "Internal error: _javanet_set_option()");
         /* Should be a 0 or a 1 */  
         optval = (*env)->CallBooleanMethod(env, val, mid);  
         if ((*env)->ExceptionOccurred(env))  
1222            return;            return;
1223            }
1224    
1225          /* Should be a 0 or a 1 */
1226          optval = (*env)->CallBooleanMethod (env, val, mid);
1227          if ((*env)->ExceptionOccurred (env))
1228            return;
1229    
1230          TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_KEEP_ALIVE(fd,optval,result);        TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_KEEP_ALIVE (fd, optval, result);
1231        break;        break;
1232        
1233      case SOCKOPT_SO_BINDADDR:      case SOCKOPT_SO_BINDADDR:
1234        JCL_ThrowException(env, SOCKET_EXCEPTION, "This option cannot be set");        JCL_ThrowException (env, SOCKET_EXCEPTION, "This option cannot be set");
1235        break;        break;
1236    
1237      default:      default:
1238        JCL_ThrowException(env, SOCKET_EXCEPTION, "Unrecognized option");        JCL_ThrowException (env, SOCKET_EXCEPTION, "Unrecognized option");
1239        return;        return;
1240      }      }
1241    
1242    /* Check to see if above operations succeeded */    /* Check to see if above operations succeeded */
1243    if (result != TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
1244      {      {
1245        JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        JCL_ThrowException (env, SOCKET_EXCEPTION,
1246                              TARGET_NATIVE_LAST_ERROR_STRING ());
1247        return;        return;
1248      }      }
1249  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
# Line 1204  _javanet_set_option(JNIEnv *env, jobject Line 1255  _javanet_set_option(JNIEnv *env, jobject
1255  /*  /*
1256   * Retrieves the specified option values for a socket   * Retrieves the specified option values for a socket
1257   */   */
1258  jobject  jobject
1259  _javanet_get_option(JNIEnv *env, jobject this, jint option_id)  _javanet_get_option (JNIEnv * env, jobject this, jint option_id)
1260  {  {
1261  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
1262    int fd;    int fd;
1263    int flag,optval;    int flag, optval;
1264    int address;    int address;
1265    int result;    int result;
1266    
1267    assert(env!=NULL);    assert (env != NULL);
1268    assert((*env)!=NULL);    assert ((*env) != NULL);
1269    
1270    /* Get the real file descriptor */    /* Get the real file descriptor */
1271    fd = _javanet_get_int_field(env, this, "native_fd");    fd = _javanet_get_int_field (env, this, "native_fd");
1272    if (fd == -1)    if (fd == -1)
1273      {      {
1274        JCL_ThrowException(env, SOCKET_EXCEPTION,        JCL_ThrowException (env, SOCKET_EXCEPTION,
1275                           "Internal error: _javanet_get_option(): no native file descriptor");                            "Internal error: _javanet_get_option(): no native file descriptor");
1276        return(0);        return (0);
1277      }      }
1278    
1279    /* Process the option requested */    /* Process the option requested */
1280    switch (option_id)    switch (option_id)
1281      {      {
1282        /* TCP_NODELAY case.  Return a Boolean indicating on or off */        /* TCP_NODELAY case.  Return a Boolean indicating on or off */
1283        case SOCKOPT_TCP_NODELAY:      case SOCKOPT_TCP_NODELAY:
1284          TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_TCP_NODELAY(fd,optval,result);        TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_TCP_NODELAY (fd, optval,
1285          if (result != TARGET_NATIVE_OK)                                                             result);
1286            {        if (result != TARGET_NATIVE_OK)
1287              JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());          {
1288              return(0);            JCL_ThrowException (env, SOCKET_EXCEPTION,
1289            }                                TARGET_NATIVE_LAST_ERROR_STRING ());
1290              return (0);
1291          if (optval)          }
1292            return(_javanet_create_boolean(env, JNI_TRUE));  
1293          else        if (optval)
1294            return(_javanet_create_boolean(env, JNI_FALSE));          return (_javanet_create_boolean (env, JNI_TRUE));
1295            else
1296          break;          return (_javanet_create_boolean (env, JNI_FALSE));
1297    
1298          break;
1299    
1300        /* SO_LINGER case.  If disabled, return a Boolean object that represents        /* SO_LINGER case.  If disabled, return a Boolean object that represents
1301           false, else return an Integer that is the value of SO_LINGER */           false, else return an Integer that is the value of SO_LINGER */
1302        case SOCKOPT_SO_LINGER:      case SOCKOPT_SO_LINGER:
1303          TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_LINGER(fd,flag,optval,result);        TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_LINGER (fd, flag, optval,
1304          if (result != TARGET_NATIVE_OK)                                                           result);
1305            {        if (result != TARGET_NATIVE_OK)
1306              JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());          {
1307              return(0);            JCL_ThrowException (env, SOCKET_EXCEPTION,
1308            }                                TARGET_NATIVE_LAST_ERROR_STRING ());
1309              return (0);
1310          if (optval)          }
           return(_javanet_create_integer(env, JNI_TRUE));  
         else  
           return(_javanet_create_boolean(env, JNI_FALSE));  
1311    
1312          break;        if (optval)
1313            return (_javanet_create_integer (env, JNI_TRUE));
1314          else
1315            return (_javanet_create_boolean (env, JNI_FALSE));
1316    
1317          break;
1318    
1319        /* SO_TIMEOUT case. Return an Integer object with the timeout value */        /* SO_TIMEOUT case. Return an Integer object with the timeout value */
1320        case SOCKOPT_SO_TIMEOUT:      case SOCKOPT_SO_TIMEOUT:
1321  #ifdef SO_TIMEOUT  #ifdef SO_TIMEOUT
1322          TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_TIMEOUT(fd,optval,result);        TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_TIMEOUT (fd, optval, result);
1323          if (result != TARGET_NATIVE_OK)        if (result != TARGET_NATIVE_OK)
1324            {          {
1325              JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());            JCL_ThrowException (env, SOCKET_EXCEPTION,
1326              return(0);                                TARGET_NATIVE_LAST_ERROR_STRING ());
1327            }            return (0);
1328            }
1329    
1330          return(_javanet_create_integer(env, optval));        return (_javanet_create_integer (env, optval));
1331  #else  #else
1332          JCL_ThrowException(env, SOCKET_EXCEPTION,        JCL_ThrowException (env, SOCKET_EXCEPTION,
1333                                   "SO_TIMEOUT not supported on this platform");                            "SO_TIMEOUT not supported on this platform");
1334          return(0);        return (0);
1335  #endif /* not SO_TIMEOUT */  #endif /* not SO_TIMEOUT */
1336          break;        break;
1337    
1338        case SOCKOPT_SO_SNDBUF:      case SOCKOPT_SO_SNDBUF:
1339        case SOCKOPT_SO_RCVBUF:      case SOCKOPT_SO_RCVBUF:
1340          if (option_id == SOCKOPT_SO_SNDBUF)        if (option_id == SOCKOPT_SO_SNDBUF)
1341            TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_SNDBUF(fd,optval,result);          TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_SNDBUF (fd, optval,
1342          else                                                             result);
1343            TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_RCDBUF(fd,optval,result);        else
1344          if (result != TARGET_NATIVE_OK)          TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_SO_RCDBUF (fd, optval,
1345            {                                                             result);
1346              JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        if (result != TARGET_NATIVE_OK)
1347              return(0);          {
1348            }            JCL_ThrowException (env, SOCKET_EXCEPTION,
1349                                  TARGET_NATIVE_LAST_ERROR_STRING ());
1350              return (0);
1351            }
1352    
1353          return(_javanet_create_integer(env, optval));        return (_javanet_create_integer (env, optval));
1354          break;        break;
1355    
1356        /* The TTL case.  Return an Integer with the Time to Live value */        /* The TTL case.  Return an Integer with the Time to Live value */
1357        case SOCKOPT_IP_TTL:      case SOCKOPT_IP_TTL:
1358          TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_IP_TTL(fd,optval,result);        TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_IP_TTL (fd, optval, result);
1359          if (result != TARGET_NATIVE_OK)        if (result != TARGET_NATIVE_OK)
1360            {          {
1361              JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());            JCL_ThrowException (env, SOCKET_EXCEPTION,
1362              return(0);                                TARGET_NATIVE_LAST_ERROR_STRING ());
1363            }            return (0);
1364            }
1365    
1366          return(_javanet_create_integer(env, optval));        return (_javanet_create_integer (env, optval));
1367          break;        break;
1368    
1369        /* Multicast interface case */        /* Multicast interface case */
1370        case SOCKOPT_IP_MULTICAST_IF:      case SOCKOPT_IP_MULTICAST_IF:
1371          TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_IP_MULTICAST_IF(fd,address,result);        TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_IP_MULTICAST_IF (fd, address,
1372          if (result != TARGET_NATIVE_OK)                                                                 result);
1373            {        if (result != TARGET_NATIVE_OK)
1374              JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());          {
1375              return(0);            JCL_ThrowException (env, SOCKET_EXCEPTION,
1376            }                                TARGET_NATIVE_LAST_ERROR_STRING ());
1377              return (0);
1378          return(_javanet_create_inetaddress(env, address));          }
1379          break;  
1380          return (_javanet_create_inetaddress (env, address));
1381        case SOCKOPT_SO_BINDADDR:        break;
1382          TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_BIND_ADDRESS(fd,address,result);  
1383          if (result != TARGET_NATIVE_OK)      case SOCKOPT_SO_BINDADDR:
1384            {        TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_BIND_ADDRESS (fd, address,
1385              JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());                                                              result);
1386              return(0);        if (result != TARGET_NATIVE_OK)
1387            }          {
1388                      JCL_ThrowException (env, SOCKET_EXCEPTION,
1389          return(_javanet_create_inetaddress(env, address));                                TARGET_NATIVE_LAST_ERROR_STRING ());
1390          break;            return (0);
1391            }
1392        case SOCKOPT_SO_REUSEADDR:  
1393          TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_REUSE_ADDRESS(fd,optval,result);        return (_javanet_create_inetaddress (env, address));
1394          if (result != TARGET_NATIVE_OK)        break;
1395            {  
1396              JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());      case SOCKOPT_SO_REUSEADDR:
1397              return(0);        TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_REUSE_ADDRESS (fd, optval,
1398            }                                                               result);
1399          if (result != TARGET_NATIVE_OK)
1400          if (optval)          {
1401            return(_javanet_create_boolean(env, JNI_TRUE));            JCL_ThrowException (env, SOCKET_EXCEPTION,
1402          else                                TARGET_NATIVE_LAST_ERROR_STRING ());
1403            return(_javanet_create_boolean(env, JNI_FALSE));            return (0);
1404            }
1405          break;  
1406          if (optval)
1407        case SOCKOPT_SO_KEEPALIVE:          return (_javanet_create_boolean (env, JNI_TRUE));
1408          TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_KEEP_ALIVE(fd,optval,result);        else
1409          if (result != TARGET_NATIVE_OK)          return (_javanet_create_boolean (env, JNI_FALSE));
1410            {  
1411              JCL_ThrowException(env, SOCKET_EXCEPTION, TARGET_NATIVE_LAST_ERROR_STRING());        break;
1412              return(0);  
1413            }      case SOCKOPT_SO_KEEPALIVE:
1414          TARGET_NATIVE_NETWORK_SOCKET_GET_OPTION_KEEP_ALIVE (fd, optval, result);
1415          if (optval)        if (result != TARGET_NATIVE_OK)
1416            return(_javanet_create_boolean(env, JNI_TRUE));          {
1417          else            JCL_ThrowException (env, SOCKET_EXCEPTION,
1418            return(_javanet_create_boolean(env, JNI_FALSE));                                TARGET_NATIVE_LAST_ERROR_STRING ());
1419              return (0);
1420          break;          }
1421    
1422        default:        if (optval)
1423          JCL_ThrowException(env, SOCKET_EXCEPTION, "No such option" );          return (_javanet_create_boolean (env, JNI_TRUE));
1424          return(0);        else
1425            return (_javanet_create_boolean (env, JNI_FALSE));
1426    
1427          break;
1428    
1429        default:
1430          JCL_ThrowException (env, SOCKET_EXCEPTION, "No such option");
1431          return (0);
1432      }      }
1433    
1434    return(0);    return (0);
1435  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
1436  #endif /* not WITHOUT_NETWORK */  #endif /* not WITHOUT_NETWORK */
1437  }  }
1438    
1439  void  void
1440  _javanet_shutdownInput (JNIEnv *env, jobject this)  _javanet_shutdownInput (JNIEnv * env, jobject this)
1441  {  {
1442    int fd;    int fd;
1443    
# Line 1380  _javanet_shutdownInput (JNIEnv *env, job Line 1447  _javanet_shutdownInput (JNIEnv *env, job
1447    /* Get the real file descriptor. */    /* Get the real file descriptor. */
1448    fd = _javanet_get_int_field (env, this, "native_fd");    fd = _javanet_get_int_field (env, this, "native_fd");
1449    if (fd == -1)    if (fd == -1)
1450      {      {
1451        JCL_ThrowException(env, SOCKET_EXCEPTION,        JCL_ThrowException (env, SOCKET_EXCEPTION,
1452                           "Internal error: _javanet_get_option(): no native file descriptor");                            "Internal error: _javanet_get_option(): no native file descriptor");
1453        return;        return;
1454      }      }
1455    
1456    /* Shutdown input stream of socket. */    /* Shutdown input stream of socket. */
# Line 1395  _javanet_shutdownInput (JNIEnv *env, job Line 1462  _javanet_shutdownInput (JNIEnv *env, job
1462      }      }
1463  }  }
1464    
1465  void  void
1466  _javanet_shutdownOutput (JNIEnv *env, jobject this)  _javanet_shutdownOutput (JNIEnv * env, jobject this)
1467  {  {
1468    int fd;    int fd;
1469    
# Line 1406  _javanet_shutdownOutput (JNIEnv *env, jo Line 1473  _javanet_shutdownOutput (JNIEnv *env, jo
1473    /* Get the real file descriptor. */    /* Get the real file descriptor. */
1474    fd = _javanet_get_int_field (env, this, "native_fd");    fd = _javanet_get_int_field (env, this, "native_fd");
1475    if (fd == -1)    if (fd == -1)
1476      {      {
1477        JCL_ThrowException(env, SOCKET_EXCEPTION,        JCL_ThrowException (env, SOCKET_EXCEPTION,
1478                           "Internal error: _javanet_get_option(): no native file descriptor");                            "Internal error: _javanet_get_option(): no native file descriptor");
1479        return;        return;
1480      }      }
1481    
1482    /* Shutdown output stream of socket. */    /* Shutdown output stream of socket. */

Legend:
Removed from v.1.18.2.2  
changed lines
  Added in v.1.18.2.3

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26