/* LocalSocketImpl.cc -- CNI implementation of LocalSocketImpl. Copyright (C) 2006 Free Software Foundation This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ // Written by Casey Marshall #include #include #include #include #include #include #include #include #include #include #include "local.h" void gnu::net::local::LocalSocketImpl::create (jboolean stream) { if (created) { return; } socket_fd = (jint) local_create ((int) stream); if (socket_fd < 0) { throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } created = true; } void gnu::net::local::LocalSocketImpl::localBind (::gnu::net::local::LocalSocketAddress *addr) { int len = JvGetStringUTFLength (addr->getPath()); char path[len+1]; JvGetStringUTFRegion (addr->getPath(), 0, len, path); path[len] = '\0'; if (local_bind ((int) socket_fd, path)) { throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } } void gnu::net::local::LocalSocketImpl::listen (jint backlog) { if (local_listen ((int) socket_fd, (int) backlog)) { throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } } void gnu::net::local::LocalSocketImpl::accept (::gnu::net::local::LocalSocketImpl *socket) { int newfd; char path[108]; newfd = local_accept (socket_fd, (char *) path); if (newfd < 0) { throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } socket->socket_fd = (jint) newfd; socket->remote = new ::gnu::net::local::LocalSocketAddress (JvNewStringLatin1 (path)); socket->local = local; } jint gnu::net::local::LocalSocketImpl::available () { jint avail = (jint) local_available ((int) socket_fd); if (avail < 0) { throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } return avail; } void gnu::net::local::LocalSocketImpl::close () { if (local_close (socket_fd)) { socket_fd = -1; throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } socket_fd = -1; } void gnu::net::local::LocalSocketImpl::unlink () { if (remote) { jstring path = remote->getPath (); int len = JvGetStringUTFLength (path); char p[len+1]; JvGetStringUTFRegion (path, 0, len, p); p[len] = '\0'; if (local_unlink (p)) { throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } } } void gnu::net::local::LocalSocketImpl::shutdownInput () { if (local_shutdown_input ((int) socket_fd)) { throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } } void gnu::net::local::LocalSocketImpl::shutdownOutput () { if (local_shutdown_output ((int) socket_fd)) { throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } } void gnu::net::local::LocalSocketImpl::sendUrgentData (jint data) { throw new ::java::lang::UnsupportedOperationException (JvNewStringLatin1 ("gnu::net::local::LocalSocketImpl::sendUrgentData (jint) not implemented")); } void gnu::net::local::LocalSocketImpl::localConnect (::gnu::net::local::LocalSocketAddress *addr) { int size; int len = JvGetStringUTFLength (addr->getPath()); char path[len+1]; if (socket_fd < 0) { throw new ::java::io::IOException (JvNewStringLatin1 ("invalid file descriptor")); } JvGetStringUTFRegion (addr->getPath(), 0, len, path); path[len] = '\0'; if (local_connect (socket_fd, (char *) path)) { throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } } jint gnu::net::local::LocalSocketImpl::read (jbyteArray buf, jint off, jint len) { jint count; jbyte *elem; if (off < 0 || len < 0 || off + len > JvGetArrayLength (buf)) { throw new ::java::lang::ArrayIndexOutOfBoundsException (); } elem = elements (buf); if (!elem) { throw new ::java::lang::NullPointerException (); } count = (jint) local_read ((int) socket_fd, (void *) (elem + off), (int) len); if (count < 0) { throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } return count; } void gnu::net::local::LocalSocketImpl::write (jbyteArray buf, jint off, jint len) { jint count; jbyte *elem; if (off < 0 || len < 0 || off + len > JvGetArrayLength (buf)) { throw new ::java::lang::ArrayIndexOutOfBoundsException (); } elem = elements (buf); if (!elem) { throw new ::java::lang::NullPointerException (); } count = (jint) local_write ((int) socket_fd, (void *) (elem + off), (int) len); if (count < 0) { throw new ::java::io::IOException (JvNewStringLatin1 (local_error ())); } }