#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include "php.h"
#include "php_syslog.h"
#include "zend.h"
#include "zend_smart_string.h"
#ifdef HAVE_STD_SYSLOG
#define syslog std_syslog
#endif
#ifdef PHP_WIN32
PHPAPI void php_syslog(int priority, const char *format, ...)
{
va_list args;
if (!PG(have_called_openlog)) {
php_openlog(PG(syslog_ident), 0, PG(syslog_facility));
}
va_start(args, format);
vsyslog(priority, format, args);
va_end(args);
}
#else
PHPAPI void php_syslog(int priority, const char *format, ...)
{
const char *ptr;
unsigned char c;
smart_string fbuf = {0};
smart_string sbuf = {0};
va_list args;
if (!PG(have_called_openlog)) {
php_openlog(PG(syslog_ident), 0, PG(syslog_facility));
}
va_start(args, format);
zend_printf_to_smart_string(&fbuf, format, args);
smart_string_0(&fbuf);
va_end(args);
if (PG(syslog_filter) == PHP_SYSLOG_FILTER_RAW) {
syslog(priority, "%.*s", (int)fbuf.len, fbuf.c);
smart_string_free(&fbuf);
return;
}
for (ptr = fbuf.c; ; ++ptr) {
c = *ptr;
if (c == '\0') {
syslog(priority, "%.*s", (int)sbuf.len, sbuf.c);
break;
}
if (((0x20 <= c) && (c <= 0x7e)))
smart_string_appendc(&sbuf, c);
else if ((c >= 0x80) && (PG(syslog_filter) != PHP_SYSLOG_FILTER_ASCII))
smart_string_appendc(&sbuf, c);
else if (c == '\n') {
syslog(priority, "%.*s", (int)sbuf.len, sbuf.c);
smart_string_reset(&sbuf);
} else if ((c < 0x20) && (PG(syslog_filter) == PHP_SYSLOG_FILTER_ALL))
smart_string_appendc(&sbuf, c);
else {
const char xdigits[] = "0123456789abcdef";
smart_string_appendl(&sbuf, "\\x", 2);
smart_string_appendc(&sbuf, xdigits[(c / 0x10)]);
c &= 0x0f;
smart_string_appendc(&sbuf, xdigits[c]);
}
}
smart_string_free(&fbuf);
smart_string_free(&sbuf);
}
#endif