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