Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* //device/libs/android_runtime/android_util_Log.cpp
- **
- ** Copyright 2006, The Android Open Source Project
- **
- ** Licensed 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.
- */
- #define LOG_NAMESPACE "log.tag."
- #define LOG_TAG "Log_println"
- #include <assert.h>
- #include <cutils/properties.h>
- #include <utils/Log.h>
- #include <utils/String8.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include "jni.h"
- #include "JNIHelp.h"
- #include "utils/misc.h"
- #include "android_runtime/AndroidRuntime.h"
- #include "android_util_Log.h"
- #define MIN(a,b) ((a<b)?a:b)
- namespace android {
- static int loggingMode = -1;
- static int loggingUids [100];
- static int loggingUidsCount = 0;
- struct levels_t {
- jint verbose;
- jint debug;
- jint info;
- jint warn;
- jint error;
- jint assert;
- };
- static levels_t levels;
- static int toLevel(const char* value)
- {
- switch (value[0]) {
- case 'V': return levels.verbose;
- case 'D': return levels.debug;
- case 'I': return levels.info;
- case 'W': return levels.warn;
- case 'E': return levels.error;
- case 'A': return levels.assert;
- case 'S': return -1; // SUPPRESS
- }
- return levels.info;
- }
- static int canUidLog() {
- int uid = getuid();
- int i = 0;
- if (loggingMode == 2) { // Let everything log.
- return 1;
- } else if (loggingMode == -1) { // Default value and need to load settings.
- FILE *file;
- char line [50];
- /* Load the logging mode */
- file = fopen("/eos/uids_mode", "r");
- if (file == NULL) {
- loggingMode = -2; // Unknown, let everything log.
- return 1; // Let the application log.
- } else {
- if (fgets(line, sizeof(line), file) != NULL) {
- if (strncmp("whitelist", line, 9) == 0) {
- loggingMode = 1;
- } else if (strncmp("blacklist", line, 9) == 0) {
- loggingMode = 0;
- } else {
- loggingMode = 2;
- }
- }
- fclose(file);
- if (loggingMode == 2) {
- return 1;
- }
- }
- /* Load the user ids */
- file = fopen("/eos/uids_list", "r");
- if (file != NULL) {
- i = 0;
- while (fgets (line, sizeof(line), file) != NULL) {
- if (i < sizeof(loggingUids)) {
- loggingUids[i] = atoi(line);
- loggingUidsCount++;
- }
- }
- fclose(file);
- }
- }
- for (i = 0; i < loggingUidsCount && i < sizeof(loggingUids); i++) {
- if (uid == loggingUids[i]) return loggingMode;
- }
- return loggingMode == 1 ? 0 : 1;
- }
- static jboolean isLoggable(const char* tag, jint level) {
- String8 key;
- key.append(LOG_NAMESPACE);
- key.append(tag);
- char buf[PROPERTY_VALUE_MAX];
- if (property_get(key.string(), buf, "") <= 0) {
- buf[0] = '\0';
- }
- int logLevel = toLevel(buf);
- return logLevel >= 0 && level >= logLevel;
- }
- static jboolean android_util_Log_isLoggable(JNIEnv* env, jobject clazz, jstring tag, jint level)
- {
- if (tag == NULL) {
- return false;
- }
- const char* chars = env->GetStringUTFChars(tag, NULL);
- if (!chars) {
- return false;
- }
- jboolean result = false;
- if ((strlen(chars)+sizeof(LOG_NAMESPACE)) > PROPERTY_KEY_MAX) {
- char buf2[200];
- snprintf(buf2, sizeof(buf2), "Log tag \"%s\" exceeds limit of %d characters\n",
- chars, PROPERTY_KEY_MAX - sizeof(LOG_NAMESPACE));
- jniThrowException(env, "java/lang/IllegalArgumentException", buf2);
- } else {
- result = isLoggable(chars, level);
- }
- env->ReleaseStringUTFChars(tag, chars);
- return result;
- }
- bool android_util_Log_isVerboseLogEnabled(const char* tag) {
- return isLoggable(tag, levels.verbose);
- }
- /*
- * In class android.util.Log:
- * public static native int println_native(int buffer, int priority, String tag, String msg)
- */
- static jint android_util_Log_println_native(JNIEnv* env, jobject clazz,
- jint bufID, jint priority, jstring tagObj, jstring msgObj)
- {
- const char* tag = NULL;
- const char* msg = NULL;
- if (canUidLog() == 0) {
- return 0;
- }
- if (msgObj == NULL) {
- jniThrowNullPointerException(env, "println needs a message");
- return -1;
- }
- if (bufID < 0 || bufID >= LOG_ID_MAX) {
- jniThrowNullPointerException(env, "bad bufID");
- return -1;
- }
- if (tagObj != NULL)
- tag = env->GetStringUTFChars(tagObj, NULL);
- msg = env->GetStringUTFChars(msgObj, NULL);
- int res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg);
- if (tag != NULL)
- env->ReleaseStringUTFChars(tagObj, tag);
- env->ReleaseStringUTFChars(msgObj, msg);
- return res;
- }
- /*
- * JNI registration.
- */
- static JNINativeMethod gMethods[] = {
- /* name, signature, funcPtr */
- { "isLoggable", "(Ljava/lang/String;I)Z", (void*) android_util_Log_isLoggable },
- { "println_native", "(IILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println_native },
- };
- int register_android_util_Log(JNIEnv* env)
- {
- jclass clazz = env->FindClass("android/util/Log");
- if (clazz == NULL) {
- ALOGE("Can't find android/util/Log");
- return -1;
- }
- levels.verbose = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "VERBOSE", "I"));
- levels.debug = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "DEBUG", "I"));
- levels.info = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "INFO", "I"));
- levels.warn = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "WARN", "I"));
- levels.error = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ERROR", "I"));
- levels.assert = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ASSERT", "I"));
- return AndroidRuntime::registerNativeMethods(env, "android/util/Log", gMethods, NELEM(gMethods));
- }
- }; // namespace android
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement