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 } |