1/* 2 File: LogMessage.c 3 4 Contains: xxx put contents here xxx 5 6 Version: xxx put version here xxx 7 8 Copyright: � 2001-2011 by Apple Computer, Inc., all rights reserved. 9 10 File Ownership: 11 12 DRI: xxx put dri here xxx 13 14 Other Contact: xxx put other contact here xxx 15 16 Technology: xxx put technology here xxx 17 18 Writers: 19 20 (bms) Brad Suinn 21 22 Change History is in CVS: 23*/ 24 25#include <stdarg.h> 26#include <sys/malloc.h> 27#include <stdio.h> 28#include <stdlib.h> 29#include <string.h> 30#include <sys/syslog.h> 31 32#include "LogMessage.h" 33#include "webdavd.h" 34#include "webdav_utils.h" 35 36/* ------------------------------------------------------------------------- 37 Debug printing defines 38 ------------------------------------------------------------------------- */ 39u_int32_t gPrintLevel = kNone | kSysLog | kAll; 40 41 42void LogMessage(u_int32_t level, char *format, ...) 43{ 44 u_int8_t* findex; 45 int8_t c; 46 int32_t intarg; 47 u_int32_t uintarg; 48 int8_t* strarg; 49// float floatarg; 50 u_int64_t ulonglongarg; 51 char chararg; 52 void* pointerarg; 53 va_list arglist; 54 int8_t *buffer = NULL; 55 int8_t *bufPtr; 56 int len = 0; 57 58#if !DEBUG 59 if (!(level & kSysLog)) { 60 /* if we are not debugging, then only allow the syslog entries through */ 61 return; 62 } 63#endif 64 if (level & gPrintLevel) { 65 buffer = malloc (300); 66 if (buffer == NULL) 67 return; 68 bzero (buffer, 300); 69 70 bufPtr = buffer; 71 72 va_start(arglist, format); 73 74 findex = (u_int8_t*) format; 75 while (*findex != 0) { 76 c = *findex; 77 if (c == '%') { 78 ++findex; 79 c = *findex; 80 switch (c) { 81 case 'i': 82 case 'd': 83 intarg = va_arg(arglist, int32_t); 84 len += snprintf((char*) bufPtr, 300 - len, "%d", intarg); 85 bufPtr += len; 86 break; 87 case 'X': 88 case 'x': 89 uintarg = va_arg(arglist, u_int32_t); 90 len += snprintf((char*) bufPtr, 300 - len, "%X", uintarg); 91 bufPtr += len; 92 break; 93 case 'p': 94 pointerarg = va_arg(arglist, void*); 95 len += snprintf((char*) bufPtr, 300 - len, "%p", pointerarg); 96 bufPtr += len; 97 break; 98 case 'f': 99 ulonglongarg = va_arg(arglist, u_int64_t); 100 len += snprintf((char*) bufPtr, 300 - len, "%llx", (u_int64_t) ulonglongarg); 101 bufPtr += len; 102 break; 103 case 's': 104 strarg = va_arg(arglist, int8_t*); 105 if (strarg != NULL) 106 len += snprintf((char*) bufPtr, 300 - len, "%s", strarg); 107 else 108 len += snprintf((char*) bufPtr, 300 - len, "NULLSTR"); 109 bufPtr += len; 110 break; 111 case 'c': 112 chararg = va_arg(arglist, int); 113 len += snprintf((char*) bufPtr, 300 - len, "%c", chararg); 114 bufPtr += len; 115 break; 116 default: 117 len += snprintf((char*) bufPtr, 300 - len, "%c", c); 118 bufPtr += len; 119 break; 120 } 121 } 122 else { 123 len += snprintf((char*) bufPtr, 300 - len, "%c", c); 124 bufPtr += len; 125 } 126 ++findex; 127 } 128 129 if (level & kSysLog) { 130 syslog(LOG_DEBUG, "webdavfs: %s", buffer); 131 level &= ~kSysLog; 132 } 133 134 if (level & gPrintLevel) 135 syslog(LOG_DEBUG, "webdavfs: %s", buffer); 136 //fprintf (stderr, (char*) "webdavfs: %s", buffer); 137 138 va_end(arglist); 139 } 140 141 if (buffer != NULL) { 142 free(buffer); 143 buffer = NULL; 144 } 145} 146 147void logDebugCFString(const char *msg, CFStringRef str) 148{ 149 char *cstr = NULL; 150 151 if (str != NULL) 152 cstr = createUTF8CStringFromCFString(str); 153 154 if (msg == NULL) { 155 if (cstr == NULL) 156 return; // nothing to do 157 syslog(LOG_DEBUG, "%s\n", cstr); 158 } 159 else { 160 if (cstr != NULL) 161 syslog(LOG_DEBUG, "%s %s\n", msg, cstr); 162 else 163 syslog(LOG_DEBUG, "%s\n", msg); 164 } 165 166 if (cstr != NULL) 167 free(cstr); 168} 169 170void logDebugCFURL(const char *msg, CFURLRef url) 171{ 172 CFStringRef str = NULL; 173 174 if (url != NULL) { 175 str = CFURLGetString(url); 176 CFRetain(str); 177 } 178 179 logDebugCFString(msg, str); 180 181 if (str != NULL) 182 CFRelease(str); 183} 184 185