C++程序  |  75行  |  1.72 KB

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