src/java.base/unix/native/libnio/ch/Net.c
branchunixdomainchannels
changeset 59111 31b8ffbfe1b9
parent 59090 fb91b01624be
equal deleted inserted replaced
59090:fb91b01624be 59111:31b8ffbfe1b9
    25 
    25 
    26 #include <poll.h>
    26 #include <poll.h>
    27 #include <sys/types.h>
    27 #include <sys/types.h>
    28 #include <sys/socket.h>
    28 #include <sys/socket.h>
    29 #include <string.h>
    29 #include <string.h>
       
    30 #include <stddef.h>
    30 #include <netinet/in.h>
    31 #include <netinet/in.h>
    31 #include <netinet/tcp.h>
    32 #include <netinet/tcp.h>
    32 #include <limits.h>
    33 #include <limits.h>
    33 
    34 
    34 #include "jni.h"
    35 #include "jni.h"
    49 
    50 
    50 extern jclass udsa_class;
    51 extern jclass udsa_class;
    51 extern jmethodID udsa_ctorID;
    52 extern jmethodID udsa_ctorID;
    52 extern jfieldID udsa_pathID;
    53 extern jfieldID udsa_pathID;
    53 
    54 
    54 #define PATHLEN(len) (len - offsetof(struct sockaddr_un, sun_path))
    55 /* Subtle platform differences in how unnamed sockets (empty path)
       
    56  * are returned from getsockname()
       
    57  */
       
    58 #if defined(__solaris__)
       
    59   #define ZERO_PATHLEN(len) (len == 0)
       
    60 #elif defined(MACOSX)
       
    61   #define ZERO_PATHLEN(len) (JNI_FALSE)
       
    62 #else
       
    63   #define ZERO_PATHLEN(len) (len == offsetof(struct sockaddr_un, sun_path))
       
    64 #endif
    55 
    65 
    56 JNIEXPORT jobject JNICALL
    66 JNIEXPORT jobject JNICALL
    57 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) {
    67 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) {
    58 
    68 
    59     if (sa->sun_family == AF_UNIX) {
    69     if (sa->sun_family == AF_UNIX) {
    60         char *name;
    70         char *name;
    61 
    71 
    62         if (PATHLEN(len) == 0) {
    72         if (ZERO_PATHLEN(len)) {
    63             name = "";
    73             name = "";
    64         } else {
    74         } else {
    65             name = sa->sun_path;
    75             name = sa->sun_path;
    66         }
    76         }
    67         jstring nstr = JNU_NewStringPlatform(env, name);
    77         jstring nstr = JNU_NewStringPlatform(env, name);
    74 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, struct sockaddr_un *sa, int *len)
    84 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, struct sockaddr_un *sa, int *len)
    75 {
    85 {
    76     jstring path;
    86     jstring path;
    77     memset(sa, 0, sizeof(struct sockaddr_un));
    87     memset(sa, 0, sizeof(struct sockaddr_un));
    78     sa->sun_family = AF_UNIX;
    88     sa->sun_family = AF_UNIX;
    79     if (uaddr == NULL) {
       
    80         *len = (int)(offsetof(struct sockaddr_un, sun_path));
       
    81         return 0;
       
    82     }
       
    83     path = (*env)->GetObjectField(env, uaddr, udsa_pathID);
    89     path = (*env)->GetObjectField(env, uaddr, udsa_pathID);
    84     jboolean isCopy;
    90     jboolean isCopy;
    85     int ret;
    91     int ret;
    86     const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy);
    92     const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy);
    87     size_t name_len = strlen(pname)+1;
    93     size_t name_len = strlen(pname)+1;
   121     struct sockaddr_un sa;
   127     struct sockaddr_un sa;
   122     int sa_len = 0;
   128     int sa_len = 0;
   123     int rv = 0;
   129     int rv = 0;
   124 
   130 
   125     if (uaddr == NULL)
   131     if (uaddr == NULL)
   126         return; /* Rely on implicit bind */
   132         return; /* Rely on implicit bind: Unix */
   127 
   133 
   128     if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0)
   134     if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0)
   129         return;
   135         return;
   130 
   136 
   131     int fd = fdval(env, fdo);
   137     int fd = fdval(env, fdo);