test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/libInheritedChannel.c
author michaelm
Tue, 24 Sep 2019 16:19:11 +0100
changeset 58295 7973073dd048
parent 52778 dbbf46b13d52
permissions -rw-r--r--
8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket Reviewed-by: alanb, chegar
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
49128
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
     1
/*
58295
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
     2
 * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved.
49128
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
     4
 *
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
     7
 * published by the Free Software Foundation.
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
     8
 *
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    13
 * accompanied this code).
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    14
 *
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    18
 *
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    21
 * questions.
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    22
 */
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    23
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    24
/*
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    25
 * A simple launcher to launch a program as if it was launched by inetd.
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    26
 */
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    27
#include <stdio.h>
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    28
#include <stdlib.h>
58295
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
    29
#include <string.h>
49128
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    30
#include <sys/types.h>
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    31
#include <sys/socket.h>
58295
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
    32
#include <sys/un.h>
49128
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    33
#include <unistd.h>
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    34
#include <dirent.h>
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    35
#include <sys/stat.h>
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    36
#include <fcntl.h>
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    37
#include <ctype.h>
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    38
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    39
#include "jni.h"
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    40
52778
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
    41
#define CHECK(X) if ((X) == 0) {printf("JNI init error line %d\n", __LINE__); _exit(1);}
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
    42
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
    43
static jclass unixSocketClass;
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
    44
static jmethodID unixSocketCtor;
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
    45
49128
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    46
/*
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    47
 * Throws the exception of the given class name and detail message
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    48
 */
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    49
static void ThrowException(JNIEnv *env, const char *name, const char *msg) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    50
    jclass cls = (*env)->FindClass(env, name);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    51
    if (cls != NULL) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    52
        (*env)->ThrowNew(env, cls, msg);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    53
    }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    54
}
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    55
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    56
/*
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    57
 * Convert a jstring to an ISO 8859_1 encoded C string
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    58
 */
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    59
static char* getString8859_1Chars(JNIEnv *env, jstring jstr) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    60
    int i;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    61
    char *result;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    62
    jint len = (*env)->GetStringLength(env, jstr);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    63
    const jchar *str = (*env)->GetStringCritical(env, jstr, 0);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    64
    if (str == 0) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    65
        return NULL;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    66
    }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    67
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    68
    result = (char*)malloc(len+1);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    69
    if (result == 0) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    70
        (*env)->ReleaseStringCritical(env, jstr, str);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    71
        ThrowException(env, "java/lang/OutOfMemoryError", NULL);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    72
        return NULL;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    73
    }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    74
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    75
    for (i=0; i<len; i++) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    76
        jchar unicode = str[i];
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    77
        if (unicode <= 0x00ff)
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    78
            result[i] = unicode;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    79
        else
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    80
            result[i] = '?';
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    81
    }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    82
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    83
    result[len] = 0;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    84
    (*env)->ReleaseStringCritical(env, jstr, str);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    85
    return result;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    86
}
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    87
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    88
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    89
/*
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    90
 * Class:     Launcher
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    91
 * Method:    launch0
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    92
 * Signature: ([Ljava/lang/String;I)V
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    93
 */
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    94
JNIEXPORT void JNICALL Java_Launcher_launch0
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    95
  (JNIEnv *env, jclass cls, jobjectArray cmdarray, jint serviceFd)
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    96
{
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    97
    pid_t pid;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    98
    DIR* dp;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
    99
    struct dirent* dirp;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   100
    int thisFd;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   101
    char** cmdv;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   102
    int i, cmdlen;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   103
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   104
    /*
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   105
     * Argument 0 of the command array is the program name.
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   106
     * Here we just extract the program name and any arguments into
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   107
     * a command array suitable for use with execvp.
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   108
     */
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   109
    cmdlen = (*env)->GetArrayLength(env, cmdarray);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   110
    if (cmdlen == 0) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   111
        ThrowException(env, "java/lang/IllegalArgumentException",
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   112
            "command array must at least include the program name");
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   113
        return;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   114
    }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   115
    cmdv = (char **)malloc((cmdlen + 1) * sizeof(char *));
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   116
    if (cmdv == NULL) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   117
        ThrowException(env, "java/lang/OutOfMemoryError", NULL);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   118
        return;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   119
    }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   120
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   121
    for (i=0; i<cmdlen; i++) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   122
        jstring str = (*env)->GetObjectArrayElement(env, cmdarray, i);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   123
        cmdv[i] = (char *) getString8859_1Chars(env, str);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   124
        if (cmdv[i] == NULL) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   125
            return;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   126
        }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   127
    }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   128
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   129
    /*
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   130
     * Command array must have NULL as the last entry
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   131
     */
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   132
    cmdv[cmdlen] = NULL;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   133
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   134
    /*
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   135
     * Launch the program. As this isn't a complete inetd or Runtime.exec
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   136
     * implementation we don't have a reaper to pick up child exit status.
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   137
     */
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   138
#ifdef __solaris__
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   139
    pid = fork1();
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   140
#else
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   141
    pid = fork();
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   142
#endif
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   143
    if (pid != 0) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   144
        if (pid < 0) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   145
            ThrowException(env, "java/io/IOException", "fork failed");
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   146
        }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   147
        return;
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   148
    }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   149
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   150
    /*
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   151
     * We need to close all file descriptors except for serviceFd. To
58295
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   152
     * get the list of open file descriptos we read through /proc/self/fd (/dev/fd)
49128
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   153
     * but to open this requires a file descriptor. We could use a specific
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   154
     * file descriptor and fdopendir but Linux doesn't seem to support
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   155
     * fdopendir. Instead we use opendir and make an assumption on the
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   156
     * file descriptor that is used (by opening & closing a file).
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   157
     */
58295
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   158
    thisFd = open("/dev/fd", O_RDONLY);
49128
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   159
    if (thisFd < 0) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   160
        _exit(-1);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   161
    }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   162
58295
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   163
    if ((dp = fdopendir(thisFd)) == NULL) {
49128
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   164
        _exit(-1);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   165
    }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   166
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   167
    while ((dirp = readdir(dp)) != NULL) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   168
        if (isdigit(dirp->d_name[0])) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   169
            int fd = strtol(dirp->d_name, NULL, 10);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   170
            if (fd != serviceFd && fd != thisFd) {
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   171
                close(fd);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   172
            }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   173
        }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   174
    }
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   175
    closedir(dp);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   176
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   177
    /*
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   178
     * At this point all file descriptors are closed except for
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   179
     * serviceFd. We not dup 0,1,2 to this file descriptor and
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   180
     * close serviceFd. This should leave us with only 0,1,2
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   181
     * open and all connected to the same socket.
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   182
     */
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   183
    dup2(serviceFd, STDIN_FILENO);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   184
    dup2(serviceFd, STDOUT_FILENO);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   185
    dup2(serviceFd, STDERR_FILENO);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   186
    close(serviceFd);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   187
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   188
    execvp(cmdv[0], cmdv);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   189
    _exit(-1);
97288886180c 8198834: (ch) Enable java/nio/channels/spi/SelectorProvider/inheritedChannel/InheritedChannelTest.java on linux-x64
bpb
parents:
diff changeset
   190
}
52778
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   191
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   192
JNIEXPORT void JNICALL Java_UnixDomainSocket_init(JNIEnv *env, jclass cls) {
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   193
    CHECK(unixSocketClass = (*env)->FindClass(env, "UnixDomainSocket"));
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   194
    CHECK(unixSocketClass = (*env)->NewGlobalRef(env, unixSocketClass));
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   195
    CHECK(unixSocketCtor = (*env)->GetMethodID(env, unixSocketClass, "<init>", "(I)V"));
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   196
}
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   197
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   198
/*
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   199
 * Class:     UnixDomainSocket
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   200
 * Method:    socketpair
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   201
 * Signature: ()[LUnixDomainSocket
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   202
 */
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   203
JNIEXPORT jobjectArray JNICALL Java_UnixDomainSocket_socketpair
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   204
  (JNIEnv *env, jclass cls)
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   205
{
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   206
    int fds[2];
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   207
    jobject socket;
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   208
    jobjectArray result = (*env)->NewObjectArray(env, 2, unixSocketClass, 0);
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   209
    if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0) {
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   210
        perror("socketpair");
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   211
        return result;
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   212
    }
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   213
    socket = (*env)->NewObject(env, unixSocketClass, unixSocketCtor, fds[0]);
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   214
    (*env)->SetObjectArrayElement(env, result, 0, socket);
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   215
    socket = (*env)->NewObject(env, unixSocketClass, unixSocketCtor, fds[1]);
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   216
    (*env)->SetObjectArrayElement(env, result, 1, socket);
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   217
    return result;
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   218
}
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   219
58295
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   220
JNIEXPORT jint JNICALL Java_UnixDomainSocket_create
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   221
  (JNIEnv *env, jclass cls)
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   222
{
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   223
    int sock = socket(AF_UNIX, SOCK_STREAM, 0);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   224
    if (sock == -1) {
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   225
        ThrowException(env, "java/io/IOException", "socket create error");
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   226
    }
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   227
    return sock;
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   228
}
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   229
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   230
JNIEXPORT void JNICALL Java_UnixDomainSocket_bind0
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   231
  (JNIEnv *env, jclass cls, jint sock, jstring name)
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   232
{
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   233
    struct sockaddr_un addr;
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   234
    const char *nameUtf = (*env)->GetStringUTFChars(env, name, NULL);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   235
    int ret = -1;
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   236
    unlink(nameUtf);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   237
    memset(&addr, 0, sizeof(addr));
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   238
    addr.sun_family = AF_UNIX;
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   239
    strncpy(addr.sun_path, nameUtf, strlen(nameUtf));
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   240
    ret = bind(sock, (const struct sockaddr*)&addr, sizeof(addr));
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   241
    if (ret == -1) {
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   242
        ThrowException(env, "java/io/IOException", "socket bind error");
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   243
    }
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   244
    ret = listen(sock, 5);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   245
    if (ret == -1) {
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   246
        ThrowException(env, "java/io/IOException", "socket bind error");
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   247
    }
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   248
    (*env)->ReleaseStringUTFChars(env, name, nameUtf);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   249
}
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   250
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   251
JNIEXPORT jint JNICALL Java_UnixDomainSocket_accept0
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   252
  (JNIEnv *env, jclass cls, jint sock)
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   253
{
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   254
    struct sockaddr_storage addr;
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   255
    socklen_t len = sizeof(addr);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   256
    int ret = accept(sock, (struct sockaddr *)&addr, &len);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   257
    if (ret == -1)
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   258
        ThrowException(env, "java/io/IOException", "socket accept error");
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   259
    return ret;
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   260
}
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   261
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   262
JNIEXPORT void JNICALL Java_UnixDomainSocket_connect0
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   263
  (JNIEnv *env, jclass cls, jint fd, jstring name)
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   264
{
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   265
    struct sockaddr_un addr;
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   266
    const char *nameUtf = (*env)->GetStringUTFChars(env, name, NULL);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   267
    int ret = -1;
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   268
    memset(&addr, 0, sizeof(addr));
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   269
    addr.sun_family = AF_UNIX;
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   270
    strncpy(addr.sun_path, nameUtf, strlen(nameUtf));
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   271
    ret = connect(fd, (const struct sockaddr*)&addr, sizeof(addr));
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   272
    if (ret == -1) {
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   273
        ThrowException(env, "java/io/IOException", "socket connect error");
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   274
    }
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   275
    (*env)->ReleaseStringUTFChars(env, name, nameUtf);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   276
}
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   277
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   278
52778
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   279
JNIEXPORT jint JNICALL Java_UnixDomainSocket_read0
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   280
  (JNIEnv *env, jclass cls, jint fd)
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   281
{
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   282
    int ret;
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   283
    unsigned char res;
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   284
    ret = read(fd, &res, 1);
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   285
    if (ret == 0)
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   286
        return -1; /* EOF */
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   287
    else if (ret < 0) {
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   288
        ThrowException(env, "java/io/IOException", "read error");
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   289
        return -1;
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   290
    }
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   291
    return res;
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   292
}
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   293
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   294
JNIEXPORT void JNICALL Java_UnixDomainSocket_write0
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   295
  (JNIEnv *env, jclass cls, jint fd, jint byte)
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   296
{
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   297
    int ret;
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   298
    unsigned char w = (unsigned char)byte;
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   299
    ret = write(fd, &w, 1);
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   300
    if (ret < 0) {
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   301
        ThrowException(env, "java/io/IOException", "write error");
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   302
    }
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   303
}
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   304
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   305
JNIEXPORT void JNICALL Java_UnixDomainSocket_close0
58295
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   306
  (JNIEnv *env, jclass cls, jint fd, jstring name)
52778
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   307
{
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   308
    close(fd);
58295
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   309
    if (name != NULL) {
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   310
        const char *nameUtf = (*env)->GetStringUTFChars(env, name, NULL);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   311
        unlink(nameUtf);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   312
        (*env)->ReleaseStringUTFChars(env, name, nameUtf);
7973073dd048 8231187: SelectorProvider.inheritedChannel() returns TCP socket channel for Unix domain socket
michaelm
parents: 52778
diff changeset
   313
    }
52778
dbbf46b13d52 8211842: IPv6_supported wrongly returns false when unix domain socket is bound to fd 0
michaelm
parents: 49128
diff changeset
   314
}