78 /* 79 * EXCLBIND socket options only on Solaris 80 */ 81 #if defined(__solaris__) && !defined(TCP_EXCLBIND) 82 #define TCP_EXCLBIND 0x21 83 #endif 84 #if defined(__solaris__) && !defined(UDP_EXCLBIND) 85 #define UDP_EXCLBIND 0x0101 86 #endif 87 88 void setDefaultScopeID(JNIEnv *env, struct sockaddr *him) 89 { 90 #ifdef MACOSX 91 static jclass ni_class = NULL; 92 static jfieldID ni_defaultIndexID; 93 if (ni_class == NULL) { 94 jclass c = (*env)->FindClass(env, "java/net/NetworkInterface"); 95 CHECK_NULL(c); 96 c = (*env)->NewGlobalRef(env, c); 97 CHECK_NULL(c); 98 ni_defaultIndexID = (*env)->GetStaticFieldID( 99 env, c, "defaultIndex", "I"); 100 ni_class = c; 101 } 102 int defaultIndex; 103 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)him; 104 if (sin6->sin6_family == AF_INET6 && (sin6->sin6_scope_id == 0)) { 105 defaultIndex = (*env)->GetStaticIntField(env, ni_class, 106 ni_defaultIndexID); 107 sin6->sin6_scope_id = defaultIndex; 108 } 109 #endif 110 } 111 112 int getDefaultScopeID(JNIEnv *env) { 113 int defaultIndex = 0; 114 static jclass ni_class = NULL; 115 static jfieldID ni_defaultIndexID; 116 if (ni_class == NULL) { 117 jclass c = (*env)->FindClass(env, "java/net/NetworkInterface"); 118 CHECK_NULL_RETURN(c, 0); 119 c = (*env)->NewGlobalRef(env, c); 120 CHECK_NULL_RETURN(c, 0); 121 ni_defaultIndexID = (*env)->GetStaticFieldID(env, c, 122 "defaultIndex", "I"); 123 ni_class = c; 124 } 125 defaultIndex = (*env)->GetStaticIntField(env, ni_class, 126 ni_defaultIndexID); 127 return defaultIndex; 128 } 129 130 #define RESTARTABLE(_cmd, _result) do { \ 131 do { \ 132 _result = _cmd; \ 133 } while((_result == -1) && (errno == EINTR)); \ 134 } while(0) 135 136 int NET_SocketAvailable(int s, jint *pbytes) { 137 int result; 138 RESTARTABLE(ioctl(s, FIONREAD, pbytes), result); 139 // note: ioctl can return 0 when successful, NET_SocketAvailable 140 // is expected to return 0 on failure and 1 on success. 141 return (result == -1) ? 0 : 1; 142 } | 78 /* 79 * EXCLBIND socket options only on Solaris 80 */ 81 #if defined(__solaris__) && !defined(TCP_EXCLBIND) 82 #define TCP_EXCLBIND 0x21 83 #endif 84 #if defined(__solaris__) && !defined(UDP_EXCLBIND) 85 #define UDP_EXCLBIND 0x0101 86 #endif 87 88 void setDefaultScopeID(JNIEnv *env, struct sockaddr *him) 89 { 90 #ifdef MACOSX 91 static jclass ni_class = NULL; 92 static jfieldID ni_defaultIndexID; 93 if (ni_class == NULL) { 94 jclass c = (*env)->FindClass(env, "java/net/NetworkInterface"); 95 CHECK_NULL(c); 96 c = (*env)->NewGlobalRef(env, c); 97 CHECK_NULL(c); 98 ni_defaultIndexID = (*env)->GetStaticFieldID(env, c, "defaultIndex", "I"); 99 CHECK_NULL(ni_defaultIndexID); 100 ni_class = c; 101 } 102 int defaultIndex; 103 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)him; 104 if (sin6->sin6_family == AF_INET6 && (sin6->sin6_scope_id == 0)) { 105 defaultIndex = (*env)->GetStaticIntField(env, ni_class, 106 ni_defaultIndexID); 107 sin6->sin6_scope_id = defaultIndex; 108 } 109 #endif 110 } 111 112 int getDefaultScopeID(JNIEnv *env) { 113 int defaultIndex = 0; 114 static jclass ni_class = NULL; 115 static jfieldID ni_defaultIndexID; 116 if (ni_class == NULL) { 117 jclass c = (*env)->FindClass(env, "java/net/NetworkInterface"); 118 CHECK_NULL_RETURN(c, 0); 119 c = (*env)->NewGlobalRef(env, c); 120 CHECK_NULL_RETURN(c, 0); 121 ni_defaultIndexID = (*env)->GetStaticFieldID(env, c, "defaultIndex", "I"); 122 CHECK_NULL_RETURN(ni_defaultIndexID, 0); 123 ni_class = c; 124 } 125 defaultIndex = (*env)->GetStaticIntField(env, ni_class, 126 ni_defaultIndexID); 127 return defaultIndex; 128 } 129 130 #define RESTARTABLE(_cmd, _result) do { \ 131 do { \ 132 _result = _cmd; \ 133 } while((_result == -1) && (errno == EINTR)); \ 134 } while(0) 135 136 int NET_SocketAvailable(int s, jint *pbytes) { 137 int result; 138 RESTARTABLE(ioctl(s, FIONREAD, pbytes), result); 139 // note: ioctl can return 0 when successful, NET_SocketAvailable 140 // is expected to return 0 on failure and 1 on success. 141 return (result == -1) ? 0 : 1; 142 } |