You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2011/05/07 09:07:55 UTC
svn commit: r1100469 - in /commons/sandbox/runtime/trunk/src/main:
java/org/apache/commons/runtime/net/SocketAddress.java
native/shared/netaddr.c
Author: mturk
Date: Sat May 7 07:07:55 2011
New Revision: 1100469
URL: http://svn.apache.org/viewvc?rev=1100469&view=rev
Log:
Allow defining service name
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketAddress.java
commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketAddress.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketAddress.java?rev=1100469&r1=1100468&r2=1100469&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketAddress.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketAddress.java Sat May 7 07:07:55 2011
@@ -55,7 +55,7 @@ public abstract class SocketAddress exte
private static native int port0(byte[] sa);
private static native String ipaddr0(byte[] sa);
- private static native byte[] sockaddr0(String hostname, int family, int port, int flags)
+ private static native byte[] sockaddr0(String hostname, String servname, int family, int port, int flags)
throws OutOfMemoryError, NetworkException;
private static native int next0(byte[] sa);
@@ -75,27 +75,42 @@ public abstract class SocketAddress exte
super(family);
}
- protected SocketAddress(String host, AddressFamily family, int port, int flags)
+ /**
+ * Create a new socket address object.
+ *
+ * @param hostname a host(node) name or a numeric host address string.
+ * @param servname a service name or a port number represented as string.
+ * @param family indicates a protocl family accepted.
+ */
+ protected SocketAddress(AddressFamily family, String hostname, String servname, int port, int flags)
throws InvalidArgumentException,
NetworkException
{
super(family);
if (family == AddressFamily.LOCAL)
throw new InvalidArgumentException();
- int masked = flags & (IPV4_ADDR_OK | IPV6_ADDR_OK);
- if (host == null || family != AddressFamily.UNSPEC || masked == (IPV4_ADDR_OK | IPV6_ADDR_OK))
- throw new InvalidArgumentException();
- super.sa = sockaddr0(host, family.valueOf(), port, flags);
+ if (hostname == null) {
+ int masked = flags & (IPV4_ADDR_OK | IPV6_ADDR_OK);
+ if (family != AddressFamily.UNSPEC || masked == (IPV4_ADDR_OK | IPV6_ADDR_OK))
+ throw new InvalidArgumentException();
+ if (servname == null)
+ servname = Integer.toString(port);
+ }
+ super.sa = sockaddr0(hostname, servname, family.valueOf(), port, flags);
}
- protected SocketAddress(String host, AddressFamily family)
+ protected SocketAddress(AddressFamily family, String hostname, String servname)
throws InvalidArgumentException,
NetworkException
{
- super(family);
- if (family == AddressFamily.LOCAL)
- throw new InvalidArgumentException();
- super.sa = sockaddr0(host, family.valueOf(), 0, 0);
+ this(family, hostname, servname, 0, 0);
+ }
+
+ protected SocketAddress(AddressFamily family, String hostname)
+ throws InvalidArgumentException,
+ NetworkException
+ {
+ this(family, hostname, null, 0, 0);
}
/**
@@ -104,7 +119,7 @@ public abstract class SocketAddress exte
* The methods does not resolve the host name. If the address was
* not resloved already the method returns IP notion of the address.
* </p>
- * @return the socket endpoint hostname.
+ * @return the socket endpoint host name.
*/
public final String getHostName()
{
@@ -116,7 +131,7 @@ public abstract class SocketAddress exte
* <p>
* The methods resolves the host name.
* </p>
- * @return the socket endpoint hostname.
+ * @return the socket endpoint host name.
*/
public final String getCanonicalHostName()
{
Modified: commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c?rev=1100469&r1=1100468&r2=1100469&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c Sat May 7 07:07:55 2011
@@ -471,6 +471,7 @@ sockaddr_vars_set(acr_sockaddr_t *addr,
static int
call_resolver(acr_sockaddr_t **sa, const char *hostname,
+ const char *servname,
int family, int port, int flags)
{
struct addrinfo hints, *ai, *ai_list;
@@ -478,8 +479,6 @@ call_resolver(acr_sockaddr_t **sa, const
int error;
int ai_len = ISIZEOF(acr_sockaddr_t);
int ai_cnt = 0;
- char *servname = 0;
- char buf[16];
memset(&hints, 0, sizeof(hints));
hints.ai_family = family;
@@ -495,13 +494,10 @@ call_resolver(acr_sockaddr_t **sa, const
if(hostname == 0) {
#if defined(AI_PASSIVE)
/* If hostname is NULL, assume we are trying to bind to all
- * interfaces. */
+ * interfaces.
+ */
hints.ai_flags |= AI_PASSIVE;
#endif
- /* getaddrinfo according to RFC 2553 must have either hostname
- * or servname non-NULL.
- */
- servname = AcrItoa(buf, port);
}
error = getaddrinfo(hostname, servname, &hints, &ai_list);
#if defined(AI_ADDRCONFIG)
@@ -569,7 +565,8 @@ call_resolver(acr_sockaddr_t **sa, const
}
if (hostname != 0)
strlcpy(new_sa->hostname, hostname, NI_MAXHOST);
-
+ if (servname != 0)
+ strlcpy(new_sa->servname, servname, NI_MAXSERV);
new_sa++;
ai = ai->ai_next;
}
@@ -579,23 +576,23 @@ call_resolver(acr_sockaddr_t **sa, const
int
AcrFindAddresses(acr_sockaddr_t **sa, const char *hostname,
- int family, int port, int flags)
+ const char *servname, int family, int port, int flags)
{
if (flags & ACR_IPV4_ADDR_OK) {
- int rc = call_resolver(sa, hostname, AF_INET, port, flags);
+ int rc = call_resolver(sa, hostname, servname, AF_INET, port, flags);
if (rc != 0)
family = AF_INET6; /* try again */
else
return 0;
}
else if (flags & ACR_IPV6_ADDR_OK) {
- int rc = call_resolver(sa, hostname, AF_INET6, port, flags);
+ int rc = call_resolver(sa, hostname, servname, AF_INET6, port, flags);
if (rc != 0)
family = AF_INET; /* try again */
else
return 0;
}
- return call_resolver(sa, hostname, family, port, flags);
+ return call_resolver(sa, hostname, servname, family, port, flags);
}
#define GETHOSTBYNAME_BUFLEN 512
@@ -962,6 +959,7 @@ ACR_NET_EXPORT(jint, SocketAddress, port
}
ACR_NET_EXPORT(jbyteArray, SocketAddress, sockaddr0)(JNI_STDARGS, jstring hostname,
+ jstring servname,
jint family, jint port, jint flags)
{
acr_sockaddr_t *sa = 0;
@@ -980,7 +978,9 @@ ACR_NET_EXPORT(jbyteArray, SocketAddress
break;
}
WITH_CSTR(hostname) {
- rc = AcrFindAddresses(&sa, J2S(hostname), ffamily, port, flags);
+ WITH_CSTR(servname) {
+ rc = AcrFindAddresses(&sa, J2S(hostname), J2S(servname), ffamily, port, flags);
+ } DONE_WITH_STR(servname);
} DONE_WITH_STR(hostname);
if (rc != 0) {