src/java.base/unix/native/libnet/SdpSupport.c
author erikj
Tue, 12 Sep 2017 19:03:39 +0200
changeset 47216 71c04702a3d5
parent 41834 jdk/src/java.base/unix/native/libnet/SdpSupport.c@99c4f72c0a91
permissions -rw-r--r--
8187443: Forest Consolidation: Move files to unified layout Reviewed-by: darcy, ihse
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6525
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
     1
/*
36115
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 32512
diff changeset
     2
 * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
6525
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
     4
 *
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    10
 *
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    15
 * accompanied this code).
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    16
 *
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    20
 *
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    23
 * questions.
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    24
 */
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    25
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    26
#include <sys/types.h>
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    27
#include <sys/socket.h>
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    28
#include <errno.h>
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    29
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    30
#if defined(__solaris__)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    31
  #if !defined(PROTO_SDP)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    32
    #define PROTO_SDP       257
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    33
  #endif
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    34
#elif defined(__linux__)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    35
  #if !defined(AF_INET_SDP)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    36
    #define AF_INET_SDP     27
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    37
  #endif
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    38
#endif
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    39
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    40
#include "jni.h"
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    41
#include "jni_util.h"
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    42
#include "net_util.h"
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    43
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    44
#define RESTARTABLE(_cmd, _result) do { \
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    45
  do { \
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    46
    _result = _cmd; \
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    47
  } while((_result == -1) && (errno == EINTR)); \
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    48
} while(0)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    49
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    50
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    51
/**
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    52
 * Creates a SDP socket.
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    53
 */
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    54
static int create(JNIEnv* env)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    55
{
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    56
    int s;
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    57
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    58
#if defined(__solaris__)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    59
    int domain = ipv6_available() ? AF_INET6 : AF_INET;
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    60
    s = socket(domain, SOCK_STREAM, PROTO_SDP);
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    61
#elif defined(__linux__)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    62
    /**
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    63
     * IPv6 not supported by SDP on Linux
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    64
     */
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    65
    if (ipv6_available()) {
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    66
        JNU_ThrowIOException(env, "IPv6 not supported");
6850
56966b0a6a0d 6989466: Miscellaneous compiler warnings in java/lang, java/util, java/io, sun/misc native code
alanb
parents: 6525
diff changeset
    67
        return -1;
6525
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    68
    }
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    69
    s = socket(AF_INET_SDP, SOCK_STREAM, 0);
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    70
#else
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    71
    /* not supported on other platforms at this time */
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    72
    s = -1;
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    73
    errno = EPROTONOSUPPORT;
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    74
#endif
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    75
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    76
    if (s < 0)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    77
        JNU_ThrowIOExceptionWithLastError(env, "socket");
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    78
    return s;
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    79
}
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    80
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    81
/**
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    82
 * Creates a SDP socket, returning file descriptor referencing the socket.
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    83
 */
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    84
JNIEXPORT jint JNICALL
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    85
Java_sun_net_sdp_SdpSupport_create0(JNIEnv *env, jclass cls)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    86
{
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    87
    return create(env);
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    88
}
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    89
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    90
/**
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    91
 * Converts an existing file descriptor, that references an unbound TCP socket,
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    92
 * to SDP.
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    93
 */
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    94
JNIEXPORT void JNICALL
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    95
Java_sun_net_sdp_SdpSupport_convert0(JNIEnv *env, jclass cls, int fd)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    96
{
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    97
    int s = create(env);
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    98
    if (s >= 0) {
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
    99
        socklen_t len;
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   100
        int arg, res;
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   101
        struct linger linger;
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   102
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   103
        /* copy socket options that are relevant to SDP */
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   104
        len = sizeof(arg);
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   105
        if (getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, &len) == 0)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   106
            setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&arg, len);
36115
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 32512
diff changeset
   107
#ifdef SO_REUSEPORT
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 32512
diff changeset
   108
        len = sizeof(arg);
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 32512
diff changeset
   109
        if (getsockopt(fd, SOL_SOCKET, SO_REUSEPORT, (char*)&arg, &len) == 0)
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 32512
diff changeset
   110
            setsockopt(s, SOL_SOCKET, SO_REUSEPORT, (char*)&arg, len);
0676e37a0b9c 6432031: Add support for SO_REUSEPORT
alanb
parents: 32512
diff changeset
   111
#endif
6525
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   112
        len = sizeof(arg);
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   113
        if (getsockopt(fd, SOL_SOCKET, SO_OOBINLINE, (char*)&arg, &len) == 0)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   114
            setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char*)&arg, len);
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   115
        len = sizeof(linger);
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   116
        if (getsockopt(fd, SOL_SOCKET, SO_LINGER, (void*)&linger, &len) == 0)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   117
            setsockopt(s, SOL_SOCKET, SO_LINGER, (char*)&linger, len);
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   118
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   119
        RESTARTABLE(dup2(s, fd), res);
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   120
        if (res < 0)
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   121
            JNU_ThrowIOExceptionWithLastError(env, "dup2");
32512
89cd776e3a25 8080402: File Leak in jdk/src/java.base/share/classes/sun/net/sdp/SdpSupport.java
dfuchs
parents: 25859
diff changeset
   122
        res = close(s);
89cd776e3a25 8080402: File Leak in jdk/src/java.base/share/classes/sun/net/sdp/SdpSupport.java
dfuchs
parents: 25859
diff changeset
   123
        if (res < 0 && !(*env)->ExceptionOccurred(env))
89cd776e3a25 8080402: File Leak in jdk/src/java.base/share/classes/sun/net/sdp/SdpSupport.java
dfuchs
parents: 25859
diff changeset
   124
            JNU_ThrowIOExceptionWithLastError(env, "close");
6525
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   125
    }
56be41b86ef8 6965072: Need API to create SDP sockets
alanb
parents:
diff changeset
   126
}