jdk/src/windows/native/sun/nio/ch/ServerSocketChannelImpl.c
changeset 1152 29d6145d1097
parent 2 90ce3da70b43
child 1247 b4c26443dee5
equal deleted inserted replaced
1151:4070cecdb99d 1152:29d6145d1097
    44 
    44 
    45 
    45 
    46 static jfieldID fd_fdID;        /* java.io.FileDescriptor.fd */
    46 static jfieldID fd_fdID;        /* java.io.FileDescriptor.fd */
    47 static jclass isa_class;        /* java.net.InetSocketAddress */
    47 static jclass isa_class;        /* java.net.InetSocketAddress */
    48 static jmethodID isa_ctorID;    /* InetSocketAddress(InetAddress, int) */
    48 static jmethodID isa_ctorID;    /* InetSocketAddress(InetAddress, int) */
    49 static jclass ia_class;         /* java.net.InetAddress */
       
    50 static jmethodID ia_ctorID;     /* InetAddress() */
       
    51 static jfieldID ia_addrID;      /* java.net.InetAddress.address */
       
    52 static jfieldID ia_famID;       /* java.net.InetAddress.family */
       
    53 
    49 
    54 
    50 
    55 /**************************************************************
    51 /**************************************************************
    56  * static method to store field IDs in initializers
    52  * static method to store field IDs in initializers
    57  */
    53  */
    64 
    60 
    65     cls = (*env)->FindClass(env, "java/net/InetSocketAddress");
    61     cls = (*env)->FindClass(env, "java/net/InetSocketAddress");
    66     isa_class = (*env)->NewGlobalRef(env, cls);
    62     isa_class = (*env)->NewGlobalRef(env, cls);
    67     isa_ctorID = (*env)->GetMethodID(env, cls, "<init>",
    63     isa_ctorID = (*env)->GetMethodID(env, cls, "<init>",
    68                                      "(Ljava/net/InetAddress;I)V");
    64                                      "(Ljava/net/InetAddress;I)V");
    69 
       
    70     cls = (*env)->FindClass(env, "java/net/Inet4Address");
       
    71     ia_class = (*env)->NewGlobalRef(env, cls);
       
    72     ia_ctorID = (*env)->GetMethodID(env, cls, "<init>","()V");
       
    73     ia_addrID = (*env)->GetFieldID(env, cls, "address", "I");
       
    74     ia_famID = (*env)->GetFieldID(env, cls, "family", "I");
       
    75 }
    65 }
    76 
    66 
    77 JNIEXPORT void JNICALL
    67 JNIEXPORT void JNICALL
    78 Java_sun_nio_ch_ServerSocketChannelImpl_listen(JNIEnv *env, jclass cl,
    68 Java_sun_nio_ch_ServerSocketChannelImpl_listen(JNIEnv *env, jclass cl,
    79                                                jobject fdo, jint backlog)
    69                                                jobject fdo, jint backlog)
    88                                                 jobject ssfdo, jobject newfdo,
    78                                                 jobject ssfdo, jobject newfdo,
    89                                                 jobjectArray isaa)
    79                                                 jobjectArray isaa)
    90 {
    80 {
    91     jint ssfd = (*env)->GetIntField(env, ssfdo, fd_fdID);
    81     jint ssfd = (*env)->GetIntField(env, ssfdo, fd_fdID);
    92     jint newfd;
    82     jint newfd;
    93     struct sockaddr_in sa;
    83     SOCKETADDRESS sa;
    94     jobject remote_ia = 0;
    84     jobject remote_ia;
       
    85     int remote_port;
    95     jobject isa;
    86     jobject isa;
    96     jobject ia;
    87     jobject ia;
    97     int addrlen = sizeof(sa);
    88     int addrlen = sizeof(sa);
    98 
    89 
    99     memset((char *)&sa, 0, sizeof(sa));
    90     memset((char *)&sa, 0, sizeof(sa));
   104             return IOS_UNAVAILABLE;
    95             return IOS_UNAVAILABLE;
   105         }
    96         }
   106         JNU_ThrowIOExceptionWithLastError(env, "Accept failed");
    97         JNU_ThrowIOExceptionWithLastError(env, "Accept failed");
   107         return IOS_THROWN;
    98         return IOS_THROWN;
   108     }
    99     }
       
   100 
   109     (*env)->SetIntField(env, newfdo, fd_fdID, newfd);
   101     (*env)->SetIntField(env, newfdo, fd_fdID, newfd);
       
   102     remote_ia = NET_SockaddrToInetAddress(env, (struct sockaddr *)&sa, (int *)&remote_port);
   110 
   103 
   111     ia = (*env)->NewObject(env, ia_class, ia_ctorID);
   104     isa = (*env)->NewObject(env, isa_class, isa_ctorID,
   112     (*env)->SetIntField(env, ia, ia_addrID, ntohl(sa.sin_addr.s_addr));
   105                             remote_ia, remote_port);
   113     (*env)->SetIntField(env, ia, ia_famID, sa.sin_family);
   106     (*env)->SetObjectArrayElement(env, isaa, 0, isa);
   114 
   107 
   115     isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia,
       
   116                             ntohs(sa.sin_port));
       
   117     (*env)->SetObjectArrayElement(env, isaa, 0, isa);
       
   118     return 1;
   108     return 1;
   119 }
   109 }