1 /* 2 * Copyright 2007 The Android Open Source Project 3 * 4 * Debug-logging code. 5 */ 6 #include "Common.h" 7 8 #include <stdio.h> 9 #include <stdarg.h> 10 #include <time.h> 11 12 /* 13 * Write a message to our private log file. This is a little awkward since 14 * some or all of the system calls we want to use are being intercepted. 15 */ 16 void wsLog(const char* format, ...) 17 { 18 #if defined(HAVE_LOCALTIME_R) 19 struct tm tmBuf; 20 #endif 21 struct tm* ptm; 22 time_t now; 23 char timeBuf[32]; 24 char prefixBuf[64]; 25 int prefixLen; 26 char msgBuf[256]; 27 int msgLen; 28 29 if (gWrapSim.logFd < 0) 30 return; 31 32 /* 33 * Create a prefix with a timestamp. 34 */ 35 now = time(NULL); 36 #if defined(HAVE_LOCALTIME_R) 37 ptm = localtime_r(&now, &tmBuf); 38 #else 39 ptm = localtime(&now); 40 #endif 41 //strftime(timeBuf, sizeof(timeBuf), "%m-%d %H:%M:%S", ptm); 42 strftime(timeBuf, sizeof(timeBuf), "%H:%M:%S", ptm); 43 44 prefixLen = snprintf(prefixBuf, sizeof(prefixBuf), "%s %5d ", 45 timeBuf, (int) getpid()); 46 47 /* 48 * Format the message into a buffer. 49 */ 50 va_list args; 51 52 va_start(args, format); 53 msgLen = vsnprintf(msgBuf, sizeof(msgBuf), format, args); 54 va_end(args); 55 56 /* if we overflowed, trim and annotate */ 57 if (msgLen >= (int) sizeof(msgBuf)) { 58 msgBuf[sizeof(msgBuf)-2] = '!'; 59 msgBuf[sizeof(msgBuf)-1] = '\n'; 60 msgLen = sizeof(msgBuf); 61 } 62 63 /* 64 * Write the whole thing in one shot. The log file was opened with 65 * O_APPEND so we don't have to worry about clashes. 66 */ 67 struct iovec logVec[2]; 68 logVec[0].iov_base = prefixBuf; 69 logVec[0].iov_len = prefixLen; 70 logVec[1].iov_base = msgBuf; 71 logVec[1].iov_len = msgLen; 72 (void) _ws_writev(gWrapSim.logFd, logVec, 2); 73 } 74 75