/* * Copyright 2007 The Android Open Source Project * * Debug-logging code. */ #include "Common.h" #include <stdio.h> #include <stdarg.h> #include <time.h> /* * Write a message to our private log file. This is a little awkward since * some or all of the system calls we want to use are being intercepted. */ void wsLog(const char* format, ...) { #if defined(HAVE_LOCALTIME_R) struct tm tmBuf; #endif struct tm* ptm; time_t now; char timeBuf[32]; char prefixBuf[64]; int prefixLen; char msgBuf[256]; int msgLen; if (gWrapSim.logFd < 0) return; /* * Create a prefix with a timestamp. */ now = time(NULL); #if defined(HAVE_LOCALTIME_R) ptm = localtime_r(&now, &tmBuf); #else ptm = localtime(&now); #endif //strftime(timeBuf, sizeof(timeBuf), "%m-%d %H:%M:%S", ptm); strftime(timeBuf, sizeof(timeBuf), "%H:%M:%S", ptm); prefixLen = snprintf(prefixBuf, sizeof(prefixBuf), "%s %5d ", timeBuf, (int) getpid()); /* * Format the message into a buffer. */ va_list args; va_start(args, format); msgLen = vsnprintf(msgBuf, sizeof(msgBuf), format, args); va_end(args); /* if we overflowed, trim and annotate */ if (msgLen >= (int) sizeof(msgBuf)) { msgBuf[sizeof(msgBuf)-2] = '!'; msgBuf[sizeof(msgBuf)-1] = '\n'; msgLen = sizeof(msgBuf); } /* * Write the whole thing in one shot. The log file was opened with * O_APPEND so we don't have to worry about clashes. */ struct iovec logVec[2]; logVec[0].iov_base = prefixBuf; logVec[0].iov_len = prefixLen; logVec[1].iov_base = msgBuf; logVec[1].iov_len = msgLen; (void) _ws_writev(gWrapSim.logFd, logVec, 2); }