Index: c/error.c |
diff --git a/c/error.c b/c/error.c |
index f93d10ab1fc1acc8381b8426be556b015f46ec97..671cdb7d0d7bbf828853ecdf7f4cf7270bc6138e 100644 |
--- a/c/error.c |
+++ b/c/error.c |
@@ -1,3 +1,18 @@ |
+/* |
+ * Copyright 2016 The Netty Project |
+ * |
+ * The Netty Project 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. |
+ */ |
/* 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. |
@@ -14,27 +29,9 @@ |
* limitations under the License. |
*/ |
-/* |
- * |
- * @author Mladen Turk |
- * @version $Id: error.c 1442587 2013-02-05 13:49:48Z rjung $ |
- */ |
- |
#include "tcn.h" |
+#include "apr_strings.h" |
-static const char *tcn_errors[] = { |
- "Unknown user error", |
- /* TCN_TIMEUP */ "Operation timed out", |
- /* TCN_EAGAIN */ "There is no data ready", |
- /* TCN_EINTR */ "Interrupted system call", |
- /* TCN_EINPROGRESS */ "Operation in progress", |
- /* TCN_ETIMEDOUT */ "Connection timed out", |
- NULL |
-}; |
- |
-/* Merge IS_ETIMEDOUT with APR_TIMEUP |
- */ |
-#define TCN_STATUS_IS_ETIMEDOUT(x) (APR_STATUS_IS_ETIMEDOUT((x)) || ((x) == APR_TIMEUP)) |
/* |
* Convenience function to help throw an java.lang.Exception. |
*/ |
@@ -52,34 +49,6 @@ void tcn_ThrowException(JNIEnv *env, const char *msg) |
} |
-void tcn_ThrowMemoryException(JNIEnv *env, const char *file, int line, const char *msg) |
-{ |
- jclass javaExceptionClass; |
- javaExceptionClass = (*env)->FindClass(env, "java/lang/OutOfMemoryError"); |
- if (javaExceptionClass == NULL) { |
- fprintf(stderr, "Cannot find java/lang/OutOfMemoryError\n"); |
- return; |
- } |
- |
- if (file) { |
- char fmt[TCN_BUFFER_SZ]; |
- char *f = (char *)(file + strlen(file) - 1); |
- while (f != file && '\\' != *f && '/' != *f) { |
- f--; |
- } |
- if (f != file) { |
- f++; |
- } |
- sprintf(fmt, "%s for [%04d@%s]", msg, line, f); |
- (*env)->ThrowNew(env, javaExceptionClass, &fmt[0]); |
- } |
- else |
- (*env)->ThrowNew(env, javaExceptionClass, msg); |
- (*env)->DeleteLocalRef(env, javaExceptionClass); |
- |
-} |
- |
- |
void tcn_Throw(JNIEnv *env, const char *fmt, ...) |
{ |
char msg[TCN_BUFFER_SZ] = {'\0'}; |
@@ -91,158 +60,10 @@ void tcn_Throw(JNIEnv *env, const char *fmt, ...) |
va_end(ap); |
} |
-/* |
- * Convenience function to help throw an APR Exception |
- * from native error code. |
- */ |
void tcn_ThrowAPRException(JNIEnv *e, apr_status_t err) |
{ |
- jclass aprErrorClass; |
- jmethodID constructorID = 0; |
- jobject throwObj; |
- jstring jdescription; |
char serr[512] = {0}; |
- aprErrorClass = (*e)->FindClass(e, TCN_ERROR_CLASS); |
- if (aprErrorClass == NULL) { |
- fprintf(stderr, "Cannot find " TCN_ERROR_CLASS " class\n"); |
- return; |
- } |
- |
- /* Find the constructor ID */ |
- constructorID = (*e)->GetMethodID(e, aprErrorClass, |
- "<init>", |
- "(ILjava/lang/String;)V"); |
- if (constructorID == NULL) { |
- fprintf(stderr, |
- "Cannot find constructor for " TCN_ERROR_CLASS " class\n"); |
- goto cleanup; |
- } |
- |
apr_strerror(err, serr, 512); |
- /* Obtain the string objects */ |
- jdescription = AJP_TO_JSTRING(serr); |
- if (jdescription == NULL) { |
- fprintf(stderr, |
- "Cannot allocate description for " TCN_ERROR_CLASS " class\n"); |
- goto cleanup; |
- } |
- /* Create the APR Error object */ |
- throwObj = (*e)->NewObject(e, aprErrorClass, constructorID, |
- (jint)err, jdescription); |
- if (throwObj == NULL) { |
- fprintf(stderr, |
- "Cannot allocate new " TCN_ERROR_CLASS " object\n"); |
- goto cleanup; |
- } |
- |
- (*e)->Throw(e, throwObj); |
-cleanup: |
- (*e)->DeleteLocalRef(e, aprErrorClass); |
-} |
- |
- |
-TCN_IMPLEMENT_CALL(jint, Error, osError)(TCN_STDARGS) |
-{ |
- UNREFERENCED_STDARGS; |
- return (jint)apr_get_os_error(); |
-} |
- |
-TCN_IMPLEMENT_CALL(jint, Error, netosError)(TCN_STDARGS) |
-{ |
- UNREFERENCED_STDARGS; |
- return (jint)apr_get_netos_error(); |
-} |
- |
-TCN_IMPLEMENT_CALL(jstring, Error, strerror)(TCN_STDARGS, jint err) |
-{ |
- char serr[512] = {0}; |
- jstring jerr; |
- |
- UNREFERENCED(o); |
- if (err >= TCN_TIMEUP && err <= TCN_ETIMEDOUT) { |
- err -= TCN_TIMEUP; |
- jerr = AJP_TO_JSTRING(tcn_errors[err + 1]); |
- } |
- else { |
- apr_strerror(err, serr, 512); |
- jerr = AJP_TO_JSTRING(serr); |
- } |
- return jerr; |
-} |
- |
-TCN_IMPLEMENT_CALL(jboolean, Status, is)(TCN_STDARGS, jint err, jint idx) |
-{ |
-#define APR_IS(I, E) case I: if (E(err)) return JNI_TRUE; break |
-#define APR_ISX(I, E, T) case I: if (E(err) || (err == T)) return JNI_TRUE; break |
- |
- UNREFERENCED_STDARGS; |
- switch (idx) { |
- APR_IS(1, APR_STATUS_IS_ENOSTAT); |
- APR_IS(2, APR_STATUS_IS_ENOPOOL); |
- /* empty slot: +3 */ |
- APR_IS(4, APR_STATUS_IS_EBADDATE); |
- APR_IS(5, APR_STATUS_IS_EINVALSOCK); |
- APR_IS(6, APR_STATUS_IS_ENOPROC); |
- APR_IS(7, APR_STATUS_IS_ENOTIME); |
- APR_IS(8, APR_STATUS_IS_ENODIR); |
- APR_IS(9, APR_STATUS_IS_ENOLOCK); |
- APR_IS(10, APR_STATUS_IS_ENOPOLL); |
- APR_IS(11, APR_STATUS_IS_ENOSOCKET); |
- APR_IS(12, APR_STATUS_IS_ENOTHREAD); |
- APR_IS(13, APR_STATUS_IS_ENOTHDKEY); |
- APR_IS(14, APR_STATUS_IS_EGENERAL); |
- APR_IS(15, APR_STATUS_IS_ENOSHMAVAIL); |
- APR_IS(16, APR_STATUS_IS_EBADIP); |
- APR_IS(17, APR_STATUS_IS_EBADMASK); |
- /* empty slot: +18 */ |
- APR_IS(19, APR_STATUS_IS_EDSOOPEN); |
- APR_IS(20, APR_STATUS_IS_EABSOLUTE); |
- APR_IS(21, APR_STATUS_IS_ERELATIVE); |
- APR_IS(22, APR_STATUS_IS_EINCOMPLETE); |
- APR_IS(23, APR_STATUS_IS_EABOVEROOT); |
- APR_IS(24, APR_STATUS_IS_EBADPATH); |
- APR_IS(25, APR_STATUS_IS_EPATHWILD); |
- APR_IS(26, APR_STATUS_IS_ESYMNOTFOUND); |
- APR_IS(27, APR_STATUS_IS_EPROC_UNKNOWN); |
- APR_IS(28, APR_STATUS_IS_ENOTENOUGHENTROPY); |
- |
- |
- /* APR_Error */ |
- APR_IS(51, APR_STATUS_IS_INCHILD); |
- APR_IS(52, APR_STATUS_IS_INPARENT); |
- APR_IS(53, APR_STATUS_IS_DETACH); |
- APR_IS(54, APR_STATUS_IS_NOTDETACH); |
- APR_IS(55, APR_STATUS_IS_CHILD_DONE); |
- APR_IS(56, APR_STATUS_IS_CHILD_NOTDONE); |
- APR_ISX(57, APR_STATUS_IS_TIMEUP, TCN_TIMEUP); |
- APR_IS(58, APR_STATUS_IS_INCOMPLETE); |
- /* empty slot: +9 */ |
- /* empty slot: +10 */ |
- /* empty slot: +11 */ |
- APR_IS(62, APR_STATUS_IS_BADCH); |
- APR_IS(63, APR_STATUS_IS_BADARG); |
- APR_IS(64, APR_STATUS_IS_EOF); |
- APR_IS(65, APR_STATUS_IS_NOTFOUND); |
- /* empty slot: +16 */ |
- /* empty slot: +17 */ |
- /* empty slot: +18 */ |
- APR_IS(69, APR_STATUS_IS_ANONYMOUS); |
- APR_IS(70, APR_STATUS_IS_FILEBASED); |
- APR_IS(71, APR_STATUS_IS_KEYBASED); |
- APR_IS(72, APR_STATUS_IS_EINIT); |
- APR_IS(73, APR_STATUS_IS_ENOTIMPL); |
- APR_IS(74, APR_STATUS_IS_EMISMATCH); |
- APR_IS(75, APR_STATUS_IS_EBUSY); |
- /* Socket errors */ |
- APR_ISX(90, APR_STATUS_IS_EAGAIN, TCN_EAGAIN); |
- APR_ISX(91, TCN_STATUS_IS_ETIMEDOUT, TCN_ETIMEDOUT); |
- APR_IS(92, APR_STATUS_IS_ECONNABORTED); |
- APR_IS(93, APR_STATUS_IS_ECONNRESET); |
- APR_ISX(94, APR_STATUS_IS_EINPROGRESS, TCN_EINPROGRESS); |
- APR_ISX(95, APR_STATUS_IS_EINTR, TCN_EINTR); |
- APR_IS(96, APR_STATUS_IS_ENOTSOCK); |
- APR_IS(97, APR_STATUS_IS_EINVAL); |
- } |
- return JNI_FALSE; |
+ tcn_ThrowException(e, serr); |
} |