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/06/02 16:32:55 UTC
svn commit: r1130573 - in /commons/sandbox/runtime/trunk/src/main:
java/org/apache/commons/runtime/net/ native/os/unix/ native/shared/
Author: mturk
Date: Thu Jun 2 14:32:55 2011
New Revision: 1130573
URL: http://svn.apache.org/viewvc?rev=1130573&view=rev
Log:
Implement initial bind/accept for local endpoints
Added:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/AbstractAddress.java (with props)
Modified:
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/InetSocketAddress.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalEndpoint.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalServerEndpoint.java
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketEndpoint.java
commons/sandbox/runtime/trunk/src/main/native/os/unix/usock.c
commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c
Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/AbstractAddress.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/AbstractAddress.java?rev=1130573&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/AbstractAddress.java (added)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/AbstractAddress.java Thu Jun 2 14:32:55 2011
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.commons.runtime.net;
+
+/**
+ * This class represents a network address.
+ */
+final class AbstractAddress extends EndpointAddress
+{
+ public static final int SALEN;
+ private static native int size0();
+
+ static {
+ SALEN = size0();
+ }
+
+ /**
+ * Creates a new EndpointAddress object.
+ */
+ private AbstractAddress()
+ {
+ // No instance
+ }
+
+ /**
+ * Creates a new AbstractAddress object.
+ * @param family The address family to which the endpoint belongs.
+ */
+ public AbstractAddress(AddressFamily family, byte[] sa)
+ {
+ super(family);
+ this.sa = sa;
+ }
+
+}
Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/AbstractAddress.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/InetSocketAddress.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/InetSocketAddress.java?rev=1130573&r1=1130572&r2=1130573&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/InetSocketAddress.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/InetSocketAddress.java Thu Jun 2 14:32:55 2011
@@ -34,15 +34,6 @@ import org.apache.commons.runtime.Invali
public class InetSocketAddress extends SocketAddress
{
- private static native int size0();
- private static final int sasize;
-
- static {
- // Gets the size of internal structure
- //
- sasize = size0();
- }
-
protected InetSocketAddress()
{
}
@@ -68,12 +59,13 @@ public class InetSocketAddress extends S
{
if (port < 0 || port > 65535)
throw new InvalidRangeException(Local.sm.get("port.ERANGE"));
+ int salen = AbstractAddress.SALEN;
byte[] sa = SocketAddressImpl.getnameinfo(AddressFamily.UNSPEC, hostname, null, port);
- int n = sa.length / sasize;
- SocketAddress[] a = new SocketAddress[n];
- for (int i = 0; i < n; i++) {
- byte[] ba = new byte[sasize];
- System.arraycopy(sa, i * sasize, ba, 0, sasize);
+ int naddr = sa.length / salen;
+ SocketAddress[] a = new SocketAddress[naddr];
+ for (int i = 0; i < naddr; i++) {
+ byte[] ba = new byte[salen];
+ System.arraycopy(sa, i * salen, ba, 0, salen);
// Create a new SocketAddress
a[i] = new SocketAddressImpl(ba);
}
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalEndpoint.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalEndpoint.java?rev=1130573&r1=1130572&r2=1130573&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalEndpoint.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalEndpoint.java Thu Jun 2 14:32:55 2011
@@ -38,6 +38,7 @@ import org.apache.commons.runtime.Status
public class LocalEndpoint extends Endpoint
{
private final LocalDescriptor sd;
+ private EndpointAddress ea;
private SelectionKeyImpl key;
private boolean blocking = false;
@@ -55,12 +56,13 @@ public class LocalEndpoint extends Endpo
/**
* Creates a new socket object from socket descriptor.
*/
- public LocalEndpoint(LocalDescriptor sd)
+ public LocalEndpoint(LocalDescriptor sd, EndpointAddress ea)
{
super(EndpointType.LOCAL);
if (sd == null)
throw new NullPointerException();
this.sd = sd;
+ this.ea = ea;
}
@Override
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalServerEndpoint.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalServerEndpoint.java?rev=1130573&r1=1130572&r2=1130573&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalServerEndpoint.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/LocalServerEndpoint.java Thu Jun 2 14:32:55 2011
@@ -37,6 +37,7 @@ import org.apache.commons.runtime.Status
*/
public class LocalServerEndpoint extends Endpoint
{
+ private static final int LISTEN_BACKLOG = 50;
private final LocalDescriptor sd;
private SelectionKeyImpl key;
private LocalEndpointAddress sa;
@@ -153,20 +154,30 @@ public class LocalServerEndpoint extends
return key.queue(ops);
}
- public void bind(LocalEndpointAddress endpoint)
+ private static native int bind0(int fd, byte[] sa, int backlog);
+ private static native int accept0(int fd, byte[] addr)
+ throws SocketException;
+
+ public void bind(LocalEndpointAddress endpoint, int backlog)
throws IOException
{
if (bound)
throw new IOException(Local.sm.get("endpoint.EBOUND"));
- // TODO: Implement bind
+ if (backlog < LISTEN_BACKLOG)
+ backlog = LISTEN_BACKLOG;
+ int rc = bind0(sd.fd(), sa.sockaddr(), backlog);
+ if (rc != 0)
+ throw new IOException(Status.describe(rc));
}
public LocalEndpoint accept()
throws IOException
{
- LocalEndpoint ep = new LocalEndpoint();
+ byte[] addr = new byte[AbstractAddress.SALEN];
- // TODO: Implement accept
- return ep;
+ int fd = accept0(sd.fd(), addr);
+ LocalDescriptor ad = new LocalDescriptor(fd);
+ AbstractAddress aa = new AbstractAddress(AddressFamily.LOCAL, addr);
+ return new LocalEndpoint(ad, aa);
}
}
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketEndpoint.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketEndpoint.java?rev=1130573&r1=1130572&r2=1130573&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketEndpoint.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/net/SocketEndpoint.java Thu Jun 2 14:32:55 2011
@@ -34,6 +34,7 @@ import org.apache.commons.runtime.Status
public class SocketEndpoint extends Endpoint
{
private final SocketDescriptor sd;
+ private EndpointAddress ea;
private SelectionKeyImpl key;
private boolean blocking = false;
@@ -51,12 +52,13 @@ public class SocketEndpoint extends Endp
/**
* Creates a new socket object from socket descriptor.
*/
- public SocketEndpoint(SocketDescriptor sd)
+ public SocketEndpoint(SocketDescriptor sd, EndpointAddress ea)
{
super(EndpointType.SOCKET);
if (sd == null)
throw new NullPointerException();
this.sd = sd;
+ this.ea = ea;
}
@Override
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/usock.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/usock.c?rev=1130573&r1=1130572&r2=1130573&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/usock.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/usock.c Thu Jun 2 14:32:55 2011
@@ -21,12 +21,18 @@
#include "acr/string.h"
#include "acr/memory.h"
#include "acr/iofd.h"
+#include "acr/netapi.h"
#include "acr/unsafe.h"
#include "acr/port.h"
#include "arch_opts.h"
#include <poll.h>
#include <sys/un.h>
+#define SOCKADDR_CAST(BA) \
+ (acr_sockaddr_t *)AcrGetArrayCritical(env, (BA))
+#define SOCKADDR_RELEASE(BA, SA) \
+ AcrReleaseArrayCritical(env, (BA), (SA))
+
ACR_NET_EXPORT(jint, LocalDescriptor, close0)(JNI_STDARGS, jint fd)
{
if (r_close(fd) == -1)
@@ -47,3 +53,65 @@ ACR_NET_EXPORT(jint, LocalEndpoint, nonb
{
return AcrNonblock(fd, on);
}
+
+ACR_NET_EXPORT(jint, LocalServerEndpoint, bind0)(JNI_STDARGS, jint fd,
+ jbyteArray aa,
+ jint backlog)
+{
+ int rc = 0;
+ acr_sockaddr_t *sa = SOCKADDR_CAST(aa);
+
+ if (bind(fd, (const struct sockaddr *)&sa->sa, sa->salen) == -1) {
+ rc = ACR_GET_NETOS_ERROR();
+ SOCKADDR_RELEASE(aa, sa);
+ return rc;
+ }
+ if (listen(fd, backlog) == -1)
+ rc = ACR_GET_NETOS_ERROR();
+ SOCKADDR_RELEASE(aa, sa);
+ return rc;
+}
+
+ACR_NET_EXPORT(jint, LocalServerEndpoint, accept0)(JNI_STDARGS, jint fd,
+ jbyteArray aa)
+{
+ int sd;
+ acr_sockaddr_t sa;
+ socklen_t salen;
+
+ memset(&sa, 0, sizeof(sa));
+ salen = ISIZEOF(struct sockaddr_un);
+
+ do {
+#if !HAVE_ACCEPT4
+ sd = accept(fd, (struct sockaddr *)&sa.sa, &salen);
+#else
+ sd = accept4(fd, (struct sockaddr *)&sa.sa, &salen, SOCK_CLOEXEC);
+#endif
+ } while (sd == -1 && errno == EINTR);
+
+ if (sd == -1) {
+ ACR_THROW_NET_ERRNO();
+ return -1;
+ }
+#if !HAVE_ACCEPT4
+ AcrCloseOnExec(sd, 1);
+#endif
+#if defined(DEBUG) || defined(_DEBUG)
+ if (sa.sa.unx.sun_family != AF_LOCAL) {
+ fprintf(stderr, "Expected AF_LOCAL but found %d\n", sa.sa.unx.sun_family);
+ fflush(stderr);
+ }
+#endif
+ sa.family = AF_LOCAL;
+ sa.salen = ISIZEOF(struct sockaddr_un);
+ sa.addrlen = ISIZEOF(sa.sa.unx.sun_path);
+ sa.iplen = sa.addrlen;
+ sa.addrcnt = 1;
+ /* Copy sockaddr to the provided byte array
+ * Note that byte array must be of valid size
+ */
+ (*env)->SetByteArrayRegion(env, aa, 0, ISIZEOF(acr_sockaddr_t), (jbyte *)&sa);
+
+ return sd;
+}
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=1130573&r1=1130572&r2=1130573&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/netaddr.c Thu Jun 2 14:32:55 2011
@@ -875,7 +875,7 @@ ACR_NET_EXPORT(jbyteArray, LocalEndpoint
return ba;
}
-ACR_NET_EXPORT(jint, InetSocketAddress, size0)(JNI_STDARGS)
+ACR_NET_EXPORT(jint, AbstractAddress, size0)(JNI_STDARGS)
{
return ISIZEOF(acr_sockaddr_t);
}