/[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.22 by mark, Sat Jul 2 20:32:55 2005 UTC revision 1.23 by mark, Mon Jul 11 18:23:06 2005 UTC
# Line 377  _javanet_get_netaddr (JNIEnv * env, jobj Line 377  _javanet_get_netaddr (JNIEnv * env, jobj
377    
378    DBG ("_javanet_get_netaddr(): Entered _javanet_get_netaddr\n");    DBG ("_javanet_get_netaddr(): Entered _javanet_get_netaddr\n");
379    
380      if (addr == NULL)
381        {
382          JCL_ThrowException (env, "java/lang/NullPointerException",
383                              "Null address");
384          return 0;
385        }
386    
387    /* Call the getAddress method on the object to retrieve the IP address */    /* Call the getAddress method on the object to retrieve the IP address */
388    cls = (*env)->GetObjectClass (env, addr);    cls = (*env)->GetObjectClass (env, addr);
389    if (cls == NULL)    if (cls == NULL)
# Line 473  _javanet_create (JNIEnv * env, jobject t Line 480  _javanet_create (JNIEnv * env, jobject t
480    else    else
481      _javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl",      _javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl",
482                              "native_fd", fd);                              "native_fd", fd);
483    
484      if ((*env)->ExceptionOccurred (env))
485        {
486          /* Try to make sure we close the socket since close() won't work. */
487          do
488            {
489              TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
490              if (result != TARGET_NATIVE_OK
491                  && (TARGET_NATIVE_LAST_ERROR ()
492                      != TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL))
493                return;
494            }
495          while (result != TARGET_NATIVE_OK);
496          return;
497        }
498    
499  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
500  #endif /* not WITHOUT_NETWORK */  #endif /* not WITHOUT_NETWORK */
501  }  }
# Line 489  _javanet_close (JNIEnv * env, jobject th Line 512  _javanet_close (JNIEnv * env, jobject th
512  #ifndef WITHOUT_NETWORK  #ifndef WITHOUT_NETWORK
513    int fd;    int fd;
514    int result;    int result;
515      int error = 0;
516    
517    assert (env != NULL);    assert (env != NULL);
518    assert ((*env) != NULL);    assert ((*env) != NULL);
# Line 497  _javanet_close (JNIEnv * env, jobject th Line 521  _javanet_close (JNIEnv * env, jobject th
521    if (fd == -1)    if (fd == -1)
522      return;      return;
523    
   TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);  
   
524    if (stream)    if (stream)
525      _javanet_set_int_field (env, this, "gnu/java/net/PlainSocketImpl",      _javanet_set_int_field (env, this, "gnu/java/net/PlainSocketImpl",
526                              "native_fd", -1);                              "native_fd", -1);
527    else    else
528      _javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl",      _javanet_set_int_field (env, this, "gnu/java/net/PlainDatagramSocketImpl",
529                              "native_fd", -1);                              "native_fd", -1);
530      do
531        {
532          TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
533          if (result != TARGET_NATIVE_OK)
534            {
535              /* Only throw an error when a "real" error occurs. */
536              error = TARGET_NATIVE_LAST_ERROR ();
537              if (error != TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL
538                  && error != ENOTCONN && error != ECONNRESET && error != EBADF)
539                JCL_ThrowException (env, IO_EXCEPTION,
540                                    TARGET_NATIVE_LAST_ERROR_STRING ());
541            }
542        }
543      while (error == TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL);
544    
545  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
546  #endif /* not WITHOUT_NETWORK */  #endif /* not WITHOUT_NETWORK */
547  }  }
# Line 548  _javanet_connect (JNIEnv * env, jobject Line 585  _javanet_connect (JNIEnv * env, jobject
585    DBG ("_javanet_connect(): Got native fd\n");    DBG ("_javanet_connect(): Got native fd\n");
586    
587    /* Connect up */    /* Connect up */
588    TARGET_NATIVE_NETWORK_SOCKET_CONNECT (fd, netaddr, port, result);    do
   if (result != TARGET_NATIVE_OK)  
589      {      {
590        JCL_ThrowException (env, IO_EXCEPTION,        TARGET_NATIVE_NETWORK_SOCKET_CONNECT (fd, netaddr, port, result);
591                            TARGET_NATIVE_LAST_ERROR_STRING ());        if (result != TARGET_NATIVE_OK
592        return;            && (TARGET_NATIVE_LAST_ERROR ()
593                  != TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL))
594            {
595              JCL_ThrowException (env, IO_EXCEPTION,
596                                  TARGET_NATIVE_LAST_ERROR_STRING ());
597              return;
598            }
599      }      }
600      while (result != TARGET_NATIVE_OK);
601    
602    DBG ("_javanet_connect(): Connected successfully\n");    DBG ("_javanet_connect(): Connected successfully\n");
603    
604    /* Populate instance variables */    /* Populate instance variables */
# Line 562  _javanet_connect (JNIEnv * env, jobject Line 606  _javanet_connect (JNIEnv * env, jobject
606                                                 result);                                                 result);
607    if (result != TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
608      {      {
       TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);  
609        JCL_ThrowException (env, IO_EXCEPTION,        JCL_ThrowException (env, IO_EXCEPTION,
610                            TARGET_NATIVE_LAST_ERROR_STRING ());                            TARGET_NATIVE_LAST_ERROR_STRING ());
611          /* We don't care whether this succeeds. close() will cleanup later. */
612          TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
613        return;        return;
614      }      }
615    
616    _javanet_create_localfd (env, this);    _javanet_create_localfd (env, this);
617    if ((*env)->ExceptionOccurred (env))    if ((*env)->ExceptionOccurred (env))
618      {      {
619          /* We don't care whether this succeeds. close() will cleanup later. */
620        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
621        return;        return;
622      }      }
# Line 580  _javanet_connect (JNIEnv * env, jobject Line 626  _javanet_connect (JNIEnv * env, jobject
626                            local_port);                            local_port);
627    if ((*env)->ExceptionOccurred (env))    if ((*env)->ExceptionOccurred (env))
628      {      {
629          /* We don't care whether this succeeds. close() will cleanup later. */
630        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
631        return;        return;
632      }      }
# Line 589  _javanet_connect (JNIEnv * env, jobject Line 636  _javanet_connect (JNIEnv * env, jobject
636                                                  remote_port, result);                                                  remote_port, result);
637    if (result != TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
638      {      {
       TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);  
639        JCL_ThrowException (env, IO_EXCEPTION,        JCL_ThrowException (env, IO_EXCEPTION,
640                            TARGET_NATIVE_LAST_ERROR_STRING ());                            TARGET_NATIVE_LAST_ERROR_STRING ());
641          /* We don't care whether this succeeds. close() will cleanup later. */
642          TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
643        return;        return;
644      }      }
645    
# Line 605  _javanet_connect (JNIEnv * env, jobject Line 653  _javanet_connect (JNIEnv * env, jobject
653      }      }
654    if ((*env)->ExceptionOccurred (env))    if ((*env)->ExceptionOccurred (env))
655      {      {
656          /* We don't care whether this succeeds. close() will cleanup later. */
657        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
658        return;        return;
659      }      }
# Line 614  _javanet_connect (JNIEnv * env, jobject Line 663  _javanet_connect (JNIEnv * env, jobject
663                            remote_port);                            remote_port);
664    if ((*env)->ExceptionOccurred (env))    if ((*env)->ExceptionOccurred (env))
665      {      {
666          /* We don't care whether this succeeds. close() will cleanup later. */
667        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (fd, result);
668        return;        return;
669      }      }
# Line 698  _javanet_bind (JNIEnv * env, jobject thi Line 748  _javanet_bind (JNIEnv * env, jobject thi
748                                                  octets[3], tmpaddr);                                                  octets[3], tmpaddr);
749    TARGET_NATIVE_NETWORK_SOCKET_BIND (fd, tmpaddr, port, result);    TARGET_NATIVE_NETWORK_SOCKET_BIND (fd, tmpaddr, port, result);
750    
   (*env)->ReleaseByteArrayElements (env, arr, octets, 0);  
   
751    if (result != TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
752      {      {
753          char *errorstr = TARGET_NATIVE_LAST_ERROR_STRING ();
754          (*env)->ReleaseByteArrayElements (env, arr, octets, 0);
755    
756        JCL_ThrowException (env, BIND_EXCEPTION,        JCL_ThrowException (env, BIND_EXCEPTION,
757                            TARGET_NATIVE_LAST_ERROR_STRING ());                            errorstr);
758        return;        return;
759      }      }
760    DBG ("_javanet_bind(): Past bind\n");    DBG ("_javanet_bind(): Past bind\n");
761    
762      (*env)->ReleaseByteArrayElements (env, arr, octets, 0);
763    
764    /* Update instance variables, specifically the local port number */    /* Update instance variables, specifically the local port number */
765    TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO (fd, local_address, local_port,    TARGET_NATIVE_NETWORK_SOCKET_GET_LOCAL_INFO (fd, local_address, local_port,
766                                                 result);                                                 result);
# Line 816  _javanet_accept (JNIEnv * env, jobject t Line 869  _javanet_accept (JNIEnv * env, jobject t
869    
870    if ((*env)->ExceptionOccurred (env))    if ((*env)->ExceptionOccurred (env))
871      {      {
872        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);        /* Try to make sure we close the socket since close() won't work. */
873          do
874            {
875              TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
876              if (result != TARGET_NATIVE_OK
877                  && (TARGET_NATIVE_LAST_ERROR ()
878                      != TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL))
879                return;
880            }
881          while (result != TARGET_NATIVE_OK);
882        return;        return;
883      }      }
884    
# Line 824  _javanet_accept (JNIEnv * env, jobject t Line 886  _javanet_accept (JNIEnv * env, jobject t
886                                                 local_port, result);                                                 local_port, result);
887    if (result != TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
888      {      {
889          /* We don't care whether this succeeds. close() will cleanup later. */
890        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
891        JCL_ThrowException (env, IO_EXCEPTION,        JCL_ThrowException (env, IO_EXCEPTION,
892                            TARGET_NATIVE_LAST_ERROR_STRING ());                            TARGET_NATIVE_LAST_ERROR_STRING ());
# Line 833  _javanet_accept (JNIEnv * env, jobject t Line 896  _javanet_accept (JNIEnv * env, jobject t
896    _javanet_create_localfd (env, impl);    _javanet_create_localfd (env, impl);
897    if ((*env)->ExceptionOccurred (env))    if ((*env)->ExceptionOccurred (env))
898      {      {
899          /* We don't care whether this succeeds. close() will cleanup later. */
900        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
901        return;        return;
902      }      }
# Line 841  _javanet_accept (JNIEnv * env, jobject t Line 905  _javanet_accept (JNIEnv * env, jobject t
905                            local_port);                            local_port);
906    if ((*env)->ExceptionOccurred (env))    if ((*env)->ExceptionOccurred (env))
907      {      {
908          /* We don't care whether this succeeds. close() will cleanup later. */
909        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
910        return;        return;
911      }      }
# Line 849  _javanet_accept (JNIEnv * env, jobject t Line 914  _javanet_accept (JNIEnv * env, jobject t
914                                                  remote_port, result);                                                  remote_port, result);
915    if (result != TARGET_NATIVE_OK)    if (result != TARGET_NATIVE_OK)
916      {      {
       TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);  
917        JCL_ThrowException (env, IO_EXCEPTION,        JCL_ThrowException (env, IO_EXCEPTION,
918                            TARGET_NATIVE_LAST_ERROR_STRING ());                            TARGET_NATIVE_LAST_ERROR_STRING ());
919          /* We don't care whether this succeeds. close() will cleanup later. */
920          TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
921        return;        return;
922      }      }
923    
924    _javanet_set_remhost (env, impl, remote_address);    _javanet_set_remhost (env, impl, remote_address);
925    if ((*env)->ExceptionOccurred (env))    if ((*env)->ExceptionOccurred (env))
926      {      {
927          /* We don't care whether this succeeds. close() will cleanup later. */
928        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
929        return;        return;
930      }      }
# Line 866  _javanet_accept (JNIEnv * env, jobject t Line 933  _javanet_accept (JNIEnv * env, jobject t
933                            remote_port);                            remote_port);
934    if ((*env)->ExceptionOccurred (env))    if ((*env)->ExceptionOccurred (env))
935      {      {
936          /* We don't care whether this succeeds. close() will cleanup later. */
937        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);        TARGET_NATIVE_NETWORK_SOCKET_CLOSE (newfd, result);
938        return;        return;
939      }      }
# Line 945  _javanet_recvfrom (JNIEnv * env, jobject Line 1013  _javanet_recvfrom (JNIEnv * env, jobject
1013           (TARGET_NATIVE_LAST_ERROR () ==           (TARGET_NATIVE_LAST_ERROR () ==
1014            TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL));            TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL));
1015    
   (*env)->ReleaseByteArrayElements (env, buf, p, 0);  
   
1016    if (received_bytes == -1)    if (received_bytes == -1)
1017      {      {
1018        JCL_ThrowException (env, IO_EXCEPTION,        if (TARGET_NATIVE_LAST_ERROR () == EAGAIN)
1019                            TARGET_NATIVE_LAST_ERROR_STRING ());          JCL_ThrowException (env, "java/net/SocketTimeoutException", "Timeout");
1020          else
1021            JCL_ThrowException (env, IO_EXCEPTION,
1022                                TARGET_NATIVE_LAST_ERROR_STRING ());
1023    
1024          /* Cleanup and return. */
1025          (*env)->ReleaseByteArrayElements (env, buf, p, 0);
1026        return 0;        return 0;
1027      }      }
1028    
1029      (*env)->ReleaseByteArrayElements (env, buf, p, 0);
1030    
1031    /* Handle return addr case */    /* Handle return addr case */
1032    if (addr != NULL)    if (addr != NULL)
1033      {      {
# Line 1004  _javanet_sendto (JNIEnv * env, jobject t Line 1078  _javanet_sendto (JNIEnv * env, jobject t
1078    if (p == NULL)    if (p == NULL)
1079      return;      return;
1080    
1081    /* Send the data */    /* We must send all the data, so repeat till done. */
1082    if (addr == 0)    while (len > 0)
1083      {      {
1084        DBG ("_javanet_sendto(): Sending....\n");        /* Send the data */
1085        TARGET_NATIVE_NETWORK_SOCKET_SEND (fd, p + offset, len, bytes_sent);        if (addr == 0)
1086      }          {
1087    else            DBG ("_javanet_sendto(): Sending....\n");
1088      {            TARGET_NATIVE_NETWORK_SOCKET_SEND (fd, p + offset, len, bytes_sent);
1089        DBG ("_javanet_sendto(): Sending....\n");          }
1090        TARGET_NATIVE_NETWORK_SOCKET_SEND_WITH_ADDRESS_PORT (fd, p + offset,        else
1091                                                             len, addr, port,          {
1092                                                             bytes_sent);            DBG ("_javanet_sendto(): Sending....\n");
1093              TARGET_NATIVE_NETWORK_SOCKET_SEND_WITH_ADDRESS_PORT (fd, p + offset,
1094                                                                   len, addr, port,
1095                                                                   bytes_sent);
1096            }
1097    
1098          if (bytes_sent < 0)
1099            {
1100              if (TARGET_NATIVE_LAST_ERROR ()
1101                  != TARGET_NATIVE_ERROR_INTERRUPT_FUNCTION_CALL)
1102                {
1103                  JCL_ThrowException (env, IO_EXCEPTION,
1104                                      TARGET_NATIVE_LAST_ERROR_STRING ());
1105                  break;
1106                }
1107            }
1108          else
1109            {
1110              len -= bytes_sent;
1111              addr += bytes_sent;
1112            }
1113      }      }
1114    
1115    (*env)->ReleaseByteArrayElements (env, buf, p, 0);    (*env)->ReleaseByteArrayElements (env, buf, p, 0);
1116    
   /***** Do we need to check EINTR? */  
   if (bytes_sent < 0)  
     {  
       JCL_ThrowException (env, IO_EXCEPTION,  
                           TARGET_NATIVE_LAST_ERROR_STRING ());  
       return;  
     }  
1117  #else /* not WITHOUT_NETWORK */  #else /* not WITHOUT_NETWORK */
1118  #endif /* not WITHOUT_NETWORK */  #endif /* not WITHOUT_NETWORK */
1119  }  }
# Line 1139  _javanet_set_option (JNIEnv * env, jobje Line 1226  _javanet_set_option (JNIEnv * env, jobje
1226          return;          return;
1227    
1228        TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_TIMEOUT (fd, optval, result);        TARGET_NATIVE_NETWORK_SOCKET_SET_OPTION_SO_TIMEOUT (fd, optval, result);
1229  #endif  #else
       /* ignore errors and do not throw an exception. */  
1230        result = TARGET_NATIVE_OK;        result = TARGET_NATIVE_OK;
1231    #endif
1232        break;        break;
1233    
1234      case SOCKOPT_SO_SNDBUF:      case SOCKOPT_SO_SNDBUF:
# Line 1326  _javanet_get_option (JNIEnv * env, jobje Line 1413  _javanet_get_option (JNIEnv * env, jobje
1413                                TARGET_NATIVE_LAST_ERROR_STRING ());                                TARGET_NATIVE_LAST_ERROR_STRING ());
1414            return (0);            return (0);
1415          }          }
   
1416        return (_javanet_create_integer (env, optval));        return (_javanet_create_integer (env, optval));
1417  #else  #else
1418        JCL_ThrowException (env, SOCKET_EXCEPTION,        JCL_ThrowException (env, SOCKET_EXCEPTION,

Legend:
Removed from v.1.22  
changed lines
  Added in v.1.23

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