2194 2195 /* 2196 * Map the Java level socket option to the platform specific 2197 * level and option name. 2198 */ 2199 if (NET_MapSocketOption(opt, &level, &optname)) { 2200 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Invalid option"); 2201 return NULL; 2202 } 2203 2204 if (fd == -1) { 2205 if (NET_MapSocketOptionV6(opt, &level, &optname)) { 2206 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Invalid option"); 2207 return NULL; 2208 } 2209 fd = fd1; /* must be IPv6 only */ 2210 } 2211 2212 optlen = sizeof(optval.i); 2213 if (NET_GetSockOpt(fd, level, optname, (void *)&optval, &optlen) < 0) { 2214 char errmsg[255]; 2215 sprintf(errmsg, "error getting socket option: %s\n", strerror(errno)); 2216 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", errmsg); 2217 return NULL; 2218 } 2219 2220 switch (opt) { 2221 case java_net_SocketOptions_SO_BROADCAST: 2222 case java_net_SocketOptions_SO_REUSEADDR: 2223 return createBoolean(env, optval.i); 2224 2225 case java_net_SocketOptions_IP_MULTICAST_LOOP: 2226 /* getLoopbackMode() returns true if IP_MULTICAST_LOOP is disabled */ 2227 return createBoolean(env, !optval.i); 2228 2229 case java_net_SocketOptions_SO_SNDBUF: 2230 case java_net_SocketOptions_SO_RCVBUF: 2231 case java_net_SocketOptions_IP_TOS: 2232 return createInteger(env, optval.i); 2233 2234 default : 2235 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", | 2194 2195 /* 2196 * Map the Java level socket option to the platform specific 2197 * level and option name. 2198 */ 2199 if (NET_MapSocketOption(opt, &level, &optname)) { 2200 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Invalid option"); 2201 return NULL; 2202 } 2203 2204 if (fd == -1) { 2205 if (NET_MapSocketOptionV6(opt, &level, &optname)) { 2206 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Invalid option"); 2207 return NULL; 2208 } 2209 fd = fd1; /* must be IPv6 only */ 2210 } 2211 2212 optlen = sizeof(optval.i); 2213 if (NET_GetSockOpt(fd, level, optname, (void *)&optval, &optlen) < 0) { 2214 char tmpbuf[255]; 2215 int size = 0; 2216 char errmsg[255 + 31]; 2217 getErrorString(errno, tmpbuf, sizeof(tmpbuf)); 2218 sprintf(errmsg, "error getting socket option: %s\n", tmpbuf); 2219 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", errmsg); 2220 return NULL; 2221 } 2222 2223 switch (opt) { 2224 case java_net_SocketOptions_SO_BROADCAST: 2225 case java_net_SocketOptions_SO_REUSEADDR: 2226 return createBoolean(env, optval.i); 2227 2228 case java_net_SocketOptions_IP_MULTICAST_LOOP: 2229 /* getLoopbackMode() returns true if IP_MULTICAST_LOOP is disabled */ 2230 return createBoolean(env, !optval.i); 2231 2232 case java_net_SocketOptions_SO_SNDBUF: 2233 case java_net_SocketOptions_SO_RCVBUF: 2234 case java_net_SocketOptions_IP_TOS: 2235 return createInteger(env, optval.i); 2236 2237 default : 2238 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", |