/*
* 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);
}