From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19871 invoked by alias); 22 May 2008 15:25:56 -0000 Received: (qmail 19846 invoked by uid 367); 22 May 2008 15:25:56 -0000 Date: Thu, 22 May 2008 15:25:00 -0000 Message-ID: <20080522152556.19831.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Implement jni/AuditLibs, jni/StatelessFile, and jni/Uname. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 6b1edf3fd6d721ae29fd96c54c70bde00920430c X-Git-Newrev: 05dbb548a7214062166c1cd7eb447c3ef7ca88d1 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q2/txt/msg00270.txt.bz2 The branch, master has been updated via 05dbb548a7214062166c1cd7eb447c3ef7ca88d1 (commit) from 6b1edf3fd6d721ae29fd96c54c70bde00920430c (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 05dbb548a7214062166c1cd7eb447c3ef7ca88d1 Author: Andrew Cagney Date: Thu May 22 11:23:47 2008 -0400 Implement jni/AuditLibs, jni/StatelessFile, and jni/Uname. frysk-sys/ChangeLog 2008-05-22 Andrew Cagney * Makefile.am (JniRunner): Add TestStatelessFile and TestPseudoTerminal. frysk-sys/frysk/sys/ChangeLog 2008-05-22 Andrew Cagney * jni/Poll.cxx: Implement. * jni/AuditLibs.cxx: Implement. * jni/StatelessFile.cxx: Implement. * jni/Uname.cxx: Implement. frysk-sys/jnixx/ChangeLog 2008-05-22 Andrew Cagney * exceptions.cxx (errnoException): Use vasprintf, not snprintf. (runtimeException): Simplify exception checks; throw RuntimeException. * print.cxx (vajprintf): Ditto. ----------------------------------------------------------------------- Summary of changes: frysk-sys/ChangeLog | 5 ++ frysk-sys/Makefile.am | 2 + frysk-sys/frysk/sys/ChangeLog | 7 +++ frysk-sys/frysk/sys/jni/AuditLibs.cxx | 27 ++++++++++- frysk-sys/frysk/sys/jni/StatelessFile.cxx | 75 +++++++++++++++++++++++++++- frysk-sys/frysk/sys/jni/Uname.cxx | 27 ++++++++++- frysk-sys/jnixx/ChangeLog | 6 ++ frysk-sys/jnixx/exceptions.cxx | 47 +++++++++++------- frysk-sys/jnixx/print.cxx | 7 ++- 9 files changed, 179 insertions(+), 24 deletions(-) First 500 lines of diff: diff --git a/frysk-sys/ChangeLog b/frysk-sys/ChangeLog index f2e5e9a..814a8e1 100644 --- a/frysk-sys/ChangeLog +++ b/frysk-sys/ChangeLog @@ -1,3 +1,8 @@ +2008-05-22 Andrew Cagney + + * Makefile.am (JniRunner): Add TestStatelessFile and + TestPseudoTerminal. + 2008-05-21 Andrew Cagney * Makefile.am (JniRunner): Add frysk.sys.termios. diff --git a/frysk-sys/Makefile.am b/frysk-sys/Makefile.am index d444764..e8ae3e6 100644 --- a/frysk-sys/Makefile.am +++ b/frysk-sys/Makefile.am @@ -100,8 +100,10 @@ JniRunner: | frysk-sys.jar libfrysk-sys-jni.so echo " frysk.sys.proc \\" >> $@.tmp echo " frysk.sys.termios \\" >> $@.tmp echo " frysk.sys.TestProcessIdentifier \\" >> $@.tmp + echo " frysk.sys.TestPseudoTerminal \\" >> $@.tmp echo " frysk.sys.TestSignal \\" >> $@.tmp echo " frysk.sys.TestSignalSet \\" >> $@.tmp + echo " frysk.sys.TestStatelessFile \\" >> $@.tmp echo " inua \\" >> $@.tmp echo " jnixx \\" >> $@.tmp echo " lib.stdcpp \\" >> $@.tmp diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog index 2f3a67b..8bd46c2 100644 --- a/frysk-sys/frysk/sys/ChangeLog +++ b/frysk-sys/frysk/sys/ChangeLog @@ -1,3 +1,10 @@ +2008-05-22 Andrew Cagney + + * jni/Poll.cxx: Implement. + * jni/AuditLibs.cxx: Implement. + * jni/StatelessFile.cxx: Implement. + * jni/Uname.cxx: Implement. + 2008-05-21 Andrew Cagney * jni/Pipe.cxx: Implement. diff --git a/frysk-sys/frysk/sys/jni/AuditLibs.cxx b/frysk-sys/frysk/sys/jni/AuditLibs.cxx index b358932..9614942 100644 --- a/frysk-sys/frysk/sys/jni/AuditLibs.cxx +++ b/frysk-sys/frysk/sys/jni/AuditLibs.cxx @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2008, Red Hat Inc. +// Copyright 2005, 2008, Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -37,4 +37,29 @@ // version and license this file solely under the GPL without // exception. +#include +#include +#include + #include "jni.hxx" + +#include "jnixx/elements.hxx" + +using namespace java::lang; + +String +frysk::sys::AuditLibs::syscallToName(jnixx::env env, jint syscall, + jint machine) { + const char* syscall_name = audit_syscall_to_name(syscall, machine); + if(syscall_name == NULL){ + return String(env, NULL); + } + return String::NewStringUTF(env, syscall_name); +} + +jint +frysk::sys::AuditLibs::nameToSyscall(jnixx::env env, String name, + jint machine) { + StringChars syscall_name = StringChars(env, name); + return audit_name_to_syscall(syscall_name.elements(), machine); +} diff --git a/frysk-sys/frysk/sys/jni/StatelessFile.cxx b/frysk-sys/frysk/sys/jni/StatelessFile.cxx index b358932..6f49760 100644 --- a/frysk-sys/frysk/sys/jni/StatelessFile.cxx +++ b/frysk-sys/frysk/sys/jni/StatelessFile.cxx @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2008, Red Hat Inc. +// Copyright 2005, 2007, 2008, Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -10,11 +10,11 @@ // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with FRYSK; if not, write to the Free Software Foundation, // Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. -// +// // In addition, as a special exception, Red Hat, Inc. gives You the // additional right to link the code of FRYSK with code not covered // under the GNU General Public License ("Non-GPL Code") and to @@ -37,4 +37,73 @@ // version and license this file solely under the GPL without // exception. +#include +#include +#include +#include +#include +#include + #include "jni.hxx" + +#include "jnixx/bounds.hxx" +#include "jnixx/exceptions.hxx" +#include "jnixx/elements.hxx" + +using namespace java::lang; + +jint +frysk::sys::StatelessFile::pread(jnixx::env env, jlong fileOffset, + jnixx::byteArray bytes, + jint start, jint length) { + verifyBounds(env, bytes, start, length); + + ArrayBytes unixPath = ArrayBytes(env, GetUnixPath(env)); + int fd = ::open((const char *)unixPath.elements(), O_RDONLY); + if (fd < 0) + errnoException(env, errno, "open", "filename %s", + (const char *)unixPath.elements()); + unixPath.release(); + + // XXX: 64-bit? + ArrayBytes buffer = ArrayBytes(env, bytes); + ssize_t rc = ::pread64 (fd, start + buffer.elements(), length, fileOffset); + if (rc < 0) { + int savedErrno = errno; + ::close (fd); + errnoException(env, savedErrno, "pread", "fd %d, count %d, offset %ld", + fd, (int) length, (long)fileOffset); + } + buffer.release(); + + ::close (fd); + return rc; +} + +jint +frysk::sys::StatelessFile::pwrite(jnixx::env env, jlong fileOffset, + jnixx::byteArray bytes, + jint start, jint length) { + verifyBounds (env, bytes, start, length); + + ArrayBytes unixPath = ArrayBytes(env, GetUnixPath(env)); + int fd = ::open((const char *)unixPath.elements(), O_WRONLY); + if (fd < 0) + errnoException(env, errno, "open", "filename %s", + (const char *)unixPath.elements()); + unixPath.release(); + + // XXX: 64-bit? + ArrayBytes buffer = ArrayBytes(env, bytes); + ssize_t rc = ::pwrite64 (fd, start + buffer.elements(), length, fileOffset); + if (rc < 0) { + int savedErrno = errno; + ::close (fd); + errnoException(env, savedErrno, "pwrite", "fd %d, count %d, offset %ld", + fd, (int) length, (long)fileOffset); + } + buffer.release(); + + ::close (fd); + return rc; +} diff --git a/frysk-sys/frysk/sys/jni/Uname.cxx b/frysk-sys/frysk/sys/jni/Uname.cxx index b358932..e1a4f3f 100644 --- a/frysk-sys/frysk/sys/jni/Uname.cxx +++ b/frysk-sys/frysk/sys/jni/Uname.cxx @@ -1,6 +1,6 @@ // This file is part of the program FRYSK. // -// Copyright 2008, Red Hat Inc. +// Copyright 2006, 2008 Red Hat Inc. // // FRYSK is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by @@ -37,4 +37,29 @@ // version and license this file solely under the GPL without // exception. +#include +#include + #include "jni.hxx" + +using namespace java::lang; + +frysk::sys::Uname +frysk::sys::Uname::get(jnixx::env env) { + struct utsname names; + Uname retval = Uname::New(env); + + (void)::uname(&names); + + retval.SetSysname(env, String::NewStringUTF(env, names.sysname)); + retval.SetNodename(env, String::NewStringUTF(env, names.nodename)); + retval.SetRelease(env, String::NewStringUTF(env, names.release)); + retval.SetVersion(env, String::NewStringUTF(env, names.version)); + retval.SetMachine(env, String::NewStringUTF(env, names.machine)); +#ifdef _GNU_SOURCE + retval.SetDomainname(env, String::NewStringUTF(env, names.domainname)); +#else + retval.SetDomainname(env, NULL); +#endif + return retval; +} diff --git a/frysk-sys/jnixx/ChangeLog b/frysk-sys/jnixx/ChangeLog index 3ae3c54..d94d3ed 100644 --- a/frysk-sys/jnixx/ChangeLog +++ b/frysk-sys/jnixx/ChangeLog @@ -1,3 +1,9 @@ +2008-05-22 Andrew Cagney + + * exceptions.cxx (errnoException): Use vasprintf, not snprintf. + (runtimeException): Simplify exception checks; throw RuntimeException. + * print.cxx (vajprintf): Ditto. + 2008-05-21 Andrew Cagney * JniBindings.java: Add == for Object. diff --git a/frysk-sys/jnixx/exceptions.cxx b/frysk-sys/jnixx/exceptions.cxx index 2531868..f02d8f9 100644 --- a/frysk-sys/jnixx/exceptions.cxx +++ b/frysk-sys/jnixx/exceptions.cxx @@ -48,6 +48,8 @@ #include "jnixx/exceptions.hxx" #include "jnixx/print.hxx" +using namespace java::lang; + static void throwErrno(::jnixx::env& env, int error, const char *fmt, ...) __attribute__((noreturn)); void @@ -55,6 +57,7 @@ throwErrno(::jnixx::env& env, int error, const char *fmt, ...) { va_list ap; va_start(ap, fmt); java::lang::String message = vajprintf(env, fmt, ap); + va_end(ap); switch (error) { #ifdef EBADF case EBADF: @@ -95,47 +98,55 @@ throwErrno(::jnixx::env& env, int error, const char *fmt, ...) { default: frysk::sys::Errno::New(env, error, message).Throw(env); } - va_end(ap); } void errnoException(::jnixx::env& env, int error, const char *prefix) { - // Hack; for moment just throw something. throwErrno(env, errno, "%s: %s", prefix, strerror(error)); } void errnoException(::jnixx::env& env, int error, const char *prefix, const char *fmt, ...) { + // Allocate a copy of the message. va_list ap; va_start(ap, fmt); - char message[256]; - if (::snprintf(message, sizeof(message), fmt, ap) < 0) { - errnoException(env, errno, "malloc"); + char *message = NULL; + if (::vasprintf(&message, fmt, ap) < 0) { + // If this fails things are pretty much stuffed. + int err = errno; + fprintf(stderr, "warning: vasprintf in errnoException failed (%s)\n", + ::strerror(err)); + RuntimeException::ThrowNew(env, "vasprintf in errnoException failed"); } - throwErrno(env, errno, "%s: %s (%s)", prefix, strerror(error), message); va_end(ap); + try { + throwErrno(env, errno, "%s: %s (%s)", prefix, strerror(error), message); + } catch (java::lang::Throwable e) { + // always executed. + ::free(message); + throw e; + } } void runtimeException(::jnixx::env& env, const char *fmt, ...) { - jclass cls = env.FindClass("java/lang/RuntimeException"); va_list ap; va_start(ap, fmt); - char *msg = NULL; - int status = ::vasprintf(&msg, fmt, ap); - va_end(ap); - if (status < 0) { - fprintf(stderr, "runtimeException: vasprintf failed: %s", - ::strerror(errno)); - env.ThrowNew(cls, "runtimeException: vasprintf failed"); + char *message = NULL; + if (::vasprintf(&message, fmt, ap) < 0) { + // If this fails things are pretty much stuffed. + int err = errno; + fprintf(stderr, "warning: vasprintf in runtimeException failed: %s", + ::strerror(err)); + RuntimeException::ThrowNew(env, "vasprintf in runtimeException failed"); } + va_end(ap); try { - env.ThrowNew(cls, msg); + RuntimeException::ThrowNew(env, message); } catch (java::lang::Throwable e) { - // XXX: Work around lack of finally by catchching, then - // re-throwing, the exception - ::free(msg); + // Always executed. + ::free(message); throw e; } } diff --git a/frysk-sys/jnixx/print.cxx b/frysk-sys/jnixx/print.cxx index b3e4f3b..7653f97 100644 --- a/frysk-sys/jnixx/print.cxx +++ b/frysk-sys/jnixx/print.cxx @@ -39,6 +39,7 @@ #include #include +#include #include "jni.hxx" #include "jnixx/print.hxx" @@ -66,7 +67,11 @@ String vajprintf(::jnixx::env& env, const char *fmt, va_list ap) { char* message = NULL; if (::vasprintf(&message, fmt, ap) < 0) { - errnoException(env, errno, "vasprintf"); + // If this fails things are pretty much stuffed. + int err = errno; + fprintf(stderr, "warning: vasprintf in vajprintf failed (%s)\n", + ::strerror(err)); + RuntimeException::ThrowNew(env, "vasprintf in vajprintf failed"); } try { return String::NewStringUTF(env, message); hooks/post-receive -- frysk system monitor/debugger