< prev index next >

src/java.base/unix/native/libnet/net_util_md.c

Print this page




  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 }


< prev index next >