196 (JNIEnv* env, int fd, jobject resultContainerObj, struct sctp_send_failed *ssf,
197 int read, jboolean isEOR, struct sockaddr* sap) {
198 jobject bufferObj = NULL, resultObj, isaObj;
199 char *addressP;
200 struct sctp_sndrcvinfo *sri;
201 int remaining, dataLength;
202
203 /* the actual undelivered message data is directly after the ssf */
204 int dataOffset = sizeof(struct sctp_send_failed);
205
206 sri = (struct sctp_sndrcvinfo*) &ssf->ssf_info;
207
208 /* the number of bytes remaining to be read in the sctp_send_failed notif*/
209 remaining = ssf->ssf_length - read;
210
211 /* the size of the actual undelivered message */
212 dataLength = ssf->ssf_length - dataOffset;
213
214 /* retrieved address from sockaddr */
215 isaObj = SockAddrToInetSocketAddress(env, sap);
216
217 /* data retrieved from sff_data */
218 if (dataLength > 0) {
219 struct iovec iov[1];
220 struct msghdr msg[1];
221 int rv, alreadyRead;
222 char *dataP = (char*) ssf;
223 dataP += dataOffset;
224
225 if ((addressP = malloc(dataLength)) == NULL) {
226 JNU_ThrowOutOfMemoryError(env, "handleSendFailed");
227 return;
228 }
229
230 memset(msg, 0, sizeof (*msg));
231 msg->msg_iov = iov;
232 msg->msg_iovlen = 1;
233
234 bufferObj = (*env)->NewDirectByteBuffer(env, addressP, dataLength);
235 CHECK_NULL(bufferObj);
320 break;
321 case SCTP_ADDR_UNREACHABLE :
322 event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_UNREACHABLE;
323 break;
324 case SCTP_ADDR_REMOVED :
325 event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_REMOVED;
326 break;
327 case SCTP_ADDR_ADDED :
328 event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_ADDED;
329 break;
330 case SCTP_ADDR_MADE_PRIM :
331 event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_MADE_PRIM;
332 #ifdef __linux__ /* Solaris currently doesn't support SCTP_ADDR_CONFIRMED */
333 break;
334 case SCTP_ADDR_CONFIRMED :
335 event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_CONFIRMED;
336 #endif /* __linux__ */
337 }
338
339 addressObj = SockAddrToInetSocketAddress(env, (struct sockaddr*)&spc->spc_aaddr);
340
341 /* create PeerAddressChanged */
342 resultObj = (*env)->NewObject(env, spc_class, spc_ctrID, spc->spc_assoc_id,
343 addressObj, event);
344 CHECK_NULL(resultObj);
345 (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
346 (*env)->SetIntField(env, resultContainerObj, src_typeID,
347 sun_nio_ch_sctp_ResultContainer_PEER_ADDRESS_CHANGED);
348 }
349
350 void handleUninteresting
351 (union sctp_notification *snp) {
352 //fprintf(stdout,"\nNative: handleUninterestingNotification: Receive notification type [%u]", snp->sn_header.sn_type);
353 }
354
355 /**
356 * Handle notifications from the SCTP stack.
357 * Returns JNI_TRUE if the notification is one that is of interest to the
358 * Java API, otherwise JNI_FALSE.
359 */
376 return JNI_TRUE;
377 default :
378 /* the Java API is not interested in this event, maybe we are? */
379 handleUninteresting(snp);
380 }
381 return JNI_FALSE;
382 }
383
384 void handleMessage
385 (JNIEnv* env, jobject resultContainerObj, struct msghdr* msg,int read,
386 jboolean isEOR, struct sockaddr* sap) {
387 jobject isa, resultObj;
388 struct controlData cdata[1];
389
390 if (read == 0) {
391 /* we reached EOF */
392 read = -1;
393 }
394
395 isa = SockAddrToInetSocketAddress(env, sap);
396 getControlData(msg, cdata);
397
398 /* create MessageInfoImpl */
399 resultObj = (*env)->NewObject(env, smi_class, smi_ctrID, cdata->assocId,
400 isa, read, cdata->streamNumber,
401 isEOR ? JNI_TRUE : JNI_FALSE,
402 cdata->unordered, cdata->ppid);
403 CHECK_NULL(resultObj);
404 (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
405 (*env)->SetIntField(env, resultContainerObj, src_typeID,
406 sun_nio_ch_sctp_ResultContainer_MESSAGE);
407 }
408
409 /*
410 * Class: sun_nio_ch_sctp_SctpChannelImpl
411 * Method: receive0
412 * Signature: (ILsun/nio/ch/sctp/ResultContainer;JIZ)I
413 */
414 JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_receive0
415 (JNIEnv *env, jclass klass, jint fd, jobject resultContainerObj,
596 "Socket is shutdown for writing");
597 } else {
598 handleSocketError(env, errno);
599 return 0;
600 }
601 }
602
603 return rv;
604 }
605
606 /*
607 * Class: sun_nio_ch_sctp_SctpChannelImpl
608 * Method: checkConnect
609 * Signature: (Ljava/io/FileDescriptor;ZZ)I
610 */
611 JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_checkConnect
612 (JNIEnv* env, jobject this, jobject fdo, jboolean block, jboolean ready) {
613 return Java_sun_nio_ch_SocketChannelImpl_checkConnect(env, this,
614 fdo, block, ready);
615 }
616
|
196 (JNIEnv* env, int fd, jobject resultContainerObj, struct sctp_send_failed *ssf,
197 int read, jboolean isEOR, struct sockaddr* sap) {
198 jobject bufferObj = NULL, resultObj, isaObj;
199 char *addressP;
200 struct sctp_sndrcvinfo *sri;
201 int remaining, dataLength;
202
203 /* the actual undelivered message data is directly after the ssf */
204 int dataOffset = sizeof(struct sctp_send_failed);
205
206 sri = (struct sctp_sndrcvinfo*) &ssf->ssf_info;
207
208 /* the number of bytes remaining to be read in the sctp_send_failed notif*/
209 remaining = ssf->ssf_length - read;
210
211 /* the size of the actual undelivered message */
212 dataLength = ssf->ssf_length - dataOffset;
213
214 /* retrieved address from sockaddr */
215 isaObj = SockAddrToInetSocketAddress(env, sap);
216 CHECK_NULL(isaObj);
217
218 /* data retrieved from sff_data */
219 if (dataLength > 0) {
220 struct iovec iov[1];
221 struct msghdr msg[1];
222 int rv, alreadyRead;
223 char *dataP = (char*) ssf;
224 dataP += dataOffset;
225
226 if ((addressP = malloc(dataLength)) == NULL) {
227 JNU_ThrowOutOfMemoryError(env, "handleSendFailed");
228 return;
229 }
230
231 memset(msg, 0, sizeof (*msg));
232 msg->msg_iov = iov;
233 msg->msg_iovlen = 1;
234
235 bufferObj = (*env)->NewDirectByteBuffer(env, addressP, dataLength);
236 CHECK_NULL(bufferObj);
321 break;
322 case SCTP_ADDR_UNREACHABLE :
323 event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_UNREACHABLE;
324 break;
325 case SCTP_ADDR_REMOVED :
326 event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_REMOVED;
327 break;
328 case SCTP_ADDR_ADDED :
329 event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_ADDED;
330 break;
331 case SCTP_ADDR_MADE_PRIM :
332 event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_MADE_PRIM;
333 #ifdef __linux__ /* Solaris currently doesn't support SCTP_ADDR_CONFIRMED */
334 break;
335 case SCTP_ADDR_CONFIRMED :
336 event = sun_nio_ch_sctp_PeerAddrChange_SCTP_ADDR_CONFIRMED;
337 #endif /* __linux__ */
338 }
339
340 addressObj = SockAddrToInetSocketAddress(env, (struct sockaddr*)&spc->spc_aaddr);
341 CHECK_NULL(addressObj);
342
343 /* create PeerAddressChanged */
344 resultObj = (*env)->NewObject(env, spc_class, spc_ctrID, spc->spc_assoc_id,
345 addressObj, event);
346 CHECK_NULL(resultObj);
347 (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
348 (*env)->SetIntField(env, resultContainerObj, src_typeID,
349 sun_nio_ch_sctp_ResultContainer_PEER_ADDRESS_CHANGED);
350 }
351
352 void handleUninteresting
353 (union sctp_notification *snp) {
354 //fprintf(stdout,"\nNative: handleUninterestingNotification: Receive notification type [%u]", snp->sn_header.sn_type);
355 }
356
357 /**
358 * Handle notifications from the SCTP stack.
359 * Returns JNI_TRUE if the notification is one that is of interest to the
360 * Java API, otherwise JNI_FALSE.
361 */
378 return JNI_TRUE;
379 default :
380 /* the Java API is not interested in this event, maybe we are? */
381 handleUninteresting(snp);
382 }
383 return JNI_FALSE;
384 }
385
386 void handleMessage
387 (JNIEnv* env, jobject resultContainerObj, struct msghdr* msg,int read,
388 jboolean isEOR, struct sockaddr* sap) {
389 jobject isa, resultObj;
390 struct controlData cdata[1];
391
392 if (read == 0) {
393 /* we reached EOF */
394 read = -1;
395 }
396
397 isa = SockAddrToInetSocketAddress(env, sap);
398 CHECK_NULL(isa);
399 getControlData(msg, cdata);
400
401 /* create MessageInfoImpl */
402 resultObj = (*env)->NewObject(env, smi_class, smi_ctrID, cdata->assocId,
403 isa, read, cdata->streamNumber,
404 isEOR ? JNI_TRUE : JNI_FALSE,
405 cdata->unordered, cdata->ppid);
406 CHECK_NULL(resultObj);
407 (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
408 (*env)->SetIntField(env, resultContainerObj, src_typeID,
409 sun_nio_ch_sctp_ResultContainer_MESSAGE);
410 }
411
412 /*
413 * Class: sun_nio_ch_sctp_SctpChannelImpl
414 * Method: receive0
415 * Signature: (ILsun/nio/ch/sctp/ResultContainer;JIZ)I
416 */
417 JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_receive0
418 (JNIEnv *env, jclass klass, jint fd, jobject resultContainerObj,
599 "Socket is shutdown for writing");
600 } else {
601 handleSocketError(env, errno);
602 return 0;
603 }
604 }
605
606 return rv;
607 }
608
609 /*
610 * Class: sun_nio_ch_sctp_SctpChannelImpl
611 * Method: checkConnect
612 * Signature: (Ljava/io/FileDescriptor;ZZ)I
613 */
614 JNIEXPORT jint JNICALL Java_sun_nio_ch_sctp_SctpChannelImpl_checkConnect
615 (JNIEnv* env, jobject this, jobject fdo, jboolean block, jboolean ready) {
616 return Java_sun_nio_ch_SocketChannelImpl_checkConnect(env, this,
617 fdo, block, ready);
618 }
|