src/java.base/unix/native/libnio/ch/NioDatagramSocketImpl.c
author chegar
Thu, 17 Oct 2019 21:15:33 +0100
branchdatagramsocketimpl-branch
changeset 58680 7e9e2f10a050
permissions -rw-r--r--
datagramsocketimpl-branch: initial code changes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
58680
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
     1
/*
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
     2
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
     4
 *
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    10
 *
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    15
 * accompanied this code).
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    16
 *
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    20
 *
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    23
 * questions.
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    24
 */
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    25
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    26
#include "jni.h"
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    27
#include "jni_util.h"
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    28
#include "jvm.h"
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    29
#include "jlong.h"
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    30
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    31
#include <netdb.h>
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    32
#include <sys/types.h>
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    33
#include <sys/socket.h>
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    34
#include <stdlib.h>
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    35
#include <string.h>
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    36
#include <errno.h>
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    37
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    38
#if defined(__linux__) || defined(_ALLBSD_SOURCE)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    39
#include <netinet/in.h>
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    40
#endif
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    41
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    42
#include "net_util.h"
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    43
#include "net_util_md.h"
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    44
#include "nio.h"
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    45
#include "nio_util.h"
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    46
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    47
#include "sun_nio_ch_NioDatagramSocketImpl.h"
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    48
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    49
static jfieldID dsi_senderID;   /* sender in sun.nio.ch.NioDatagramSocketImpl */
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    50
static jclass isa_class;        /* java.net.InetSocketAddress */
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    51
static jmethodID isa_ctorID;    /* InetSocketAddress(InetAddress, int) */
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    52
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    53
JNIEXPORT void JNICALL
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    54
Java_sun_nio_ch_NioDatagramSocketImpl_initIDs(JNIEnv *env, jclass clazz)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    55
{
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    56
    clazz = (*env)->FindClass(env, "java/net/InetSocketAddress");
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    57
    CHECK_NULL(clazz);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    58
    isa_class = (*env)->NewGlobalRef(env, clazz);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    59
    if (isa_class == NULL) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    60
        JNU_ThrowOutOfMemoryError(env, NULL);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    61
        return;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    62
    }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    63
    isa_ctorID = (*env)->GetMethodID(env, clazz, "<init>", "(Ljava/net/InetAddress;I)V");
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    64
    CHECK_NULL(isa_ctorID);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    65
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    66
    clazz = (*env)->FindClass(env, "sun/nio/ch/NioDatagramSocketImpl");
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    67
    CHECK_NULL(clazz);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    68
    dsi_senderID = (*env)->GetFieldID(env, clazz, "sender", "Ljava/net/InetSocketAddress;");
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    69
    CHECK_NULL(dsi_senderID);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    70
}
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    71
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    72
JNIEXPORT jint JNICALL
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    73
Java_sun_nio_ch_NioDatagramSocketImpl_send0(JNIEnv *env,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    74
                                            jclass clazz,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    75
                                            jboolean preferIPv6,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    76
                                            jobject fdo,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    77
                                            jlong address,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    78
                                            jint len,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    79
                                            jobject destAddress,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    80
                                            jint destPort)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    81
{
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    82
    jint fd = fdval(env, fdo);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    83
    void *buf = (void *)jlong_to_ptr(address);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    84
    SOCKETADDRESS sa;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    85
    struct sockaddr *saP = NULL;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    86
    int sa_len = 0;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    87
    jint n = 0;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    88
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    89
    if (destAddress != NULL) {  // not connected
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    90
        if (NET_InetAddressToSockaddr(env, destAddress, destPort, &sa,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    91
                                      &sa_len, preferIPv6) != 0) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    92
            return IOS_THROWN;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    93
        }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    94
        saP = &sa.sa;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    95
    }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    96
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    97
    n = sendto(fd, buf, len, 0, saP, sa_len);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    98
    if (n < 0) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
    99
        if (errno == EAGAIN || errno == EWOULDBLOCK) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   100
            return IOS_UNAVAILABLE;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   101
        }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   102
        if (errno == EINTR) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   103
            return IOS_INTERRUPTED;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   104
        }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   105
        if (errno == ECONNREFUSED) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   106
            JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException", 0);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   107
            return IOS_THROWN;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   108
        }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   109
        return handleSocketError(env, errno);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   110
    }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   111
    return n;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   112
}
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   113
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   114
JNIEXPORT jint JNICALL
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   115
Java_sun_nio_ch_NioDatagramSocketImpl_receive0(JNIEnv *env,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   116
                                               jobject this,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   117
                                               jobject fdo,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   118
                                               jlong address,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   119
                                               jint len,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   120
                                               jboolean isPeek,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   121
                                               jobject cachedSenderAddress,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   122
                                               jint cachedSenderPort)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   123
{
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   124
    jint fd = fdval(env, fdo);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   125
    void *buf = (void *)jlong_to_ptr(address);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   126
    SOCKETADDRESS sa;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   127
    socklen_t sa_len = sizeof(SOCKETADDRESS);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   128
    jboolean retry = JNI_FALSE;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   129
    int flags = 0;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   130
    jint n = 0;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   131
    jobject senderAddr;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   132
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   133
    if (isPeek == JNI_TRUE) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   134
        flags = MSG_PEEK;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   135
    }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   136
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   137
    n = recvfrom(fd, buf, len, flags, &sa.sa, &sa_len);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   138
    if (n < 0) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   139
        if (errno == EAGAIN || errno == EWOULDBLOCK) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   140
            return IOS_UNAVAILABLE;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   141
        } else if (errno == EINTR) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   142
            return IOS_INTERRUPTED;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   143
        } else if (errno == ECONNREFUSED) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   144
            JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException",
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   145
                            "ICMP Port Unreachable");
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   146
            return IOS_THROWN;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   147
        } else {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   148
            return handleSocketError(env, errno);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   149
        }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   150
    }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   151
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   152
    // If the cached address does not match, then create a new one.
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   153
    if (cachedSenderAddress == NULL ||
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   154
        !NET_SockaddrEqualsInetAddress(env, &sa, cachedSenderAddress) ||
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   155
        cachedSenderPort != NET_GetPortFromSockaddr(&sa)) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   156
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   157
        jobject isa = NULL;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   158
        int port = 0;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   159
        jobject ia = NET_SockaddrToInetAddress(env, &sa, &port);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   160
        if (ia != NULL) {
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   161
            isa = (*env)->NewObject(env, isa_class, isa_ctorID, ia, port);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   162
        }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   163
        CHECK_NULL_RETURN(isa, IOS_THROWN);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   164
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   165
        (*env)->SetObjectField(env, this, dsi_senderID, isa);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   166
    }
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   167
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   168
    return n;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   169
}
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   170
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   171
JNIEXPORT void JNICALL
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   172
Java_sun_nio_ch_NioDatagramSocketImpl_disconnect0(JNIEnv *env,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   173
                                                 jobject clazz,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   174
                                                 jobject fdo,
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   175
                                                 jboolean isIPv6)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   176
{
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   177
    jint fd = fdval(env, fdo);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   178
    int rv;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   179
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   180
#if defined(__solaris__)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   181
    rv = connect(fd, 0, 0);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   182
#else
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   183
    SOCKETADDRESS sa;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   184
    socklen_t len = isIPv6 ? sizeof(struct sockaddr_in6) :
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   185
                             sizeof(struct sockaddr_in);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   186
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   187
    memset(&sa, 0, sizeof(sa));
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   188
#if defined(_ALLBSD_SOURCE)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   189
    sa.sa.sa_family = isIPv6 ? AF_INET6 : AF_INET;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   190
#else
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   191
    sa.sa.sa_family = AF_UNSPEC;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   192
#endif
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   193
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   194
    rv = connect(fd, &sa.sa, len);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   195
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   196
#if defined(_ALLBSD_SOURCE)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   197
    if (rv < 0 && errno == EADDRNOTAVAIL)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   198
        rv = errno = 0;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   199
#elif defined(_AIX)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   200
    /* See W. Richard Stevens, "UNIX Network Programming, Volume 1", p. 254:
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   201
     * 'Setting the address family to AF_UNSPEC might return EAFNOSUPPORT
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   202
     * but that is acceptable.
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   203
     */
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   204
    if (rv < 0 && errno == EAFNOSUPPORT)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   205
        rv = errno = 0;
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   206
#endif // defined(_ALLBSD_SOURCE) || defined(_AIX)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   207
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   208
#endif // defined(__solaris__)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   209
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   210
    if (rv < 0)
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   211
        handleSocketError(env, errno);
7e9e2f10a050 datagramsocketimpl-branch: initial code changes
chegar
parents:
diff changeset
   212
}