#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#if NS_TARGET_MAJOR == 3
#include <libc.h>
#endif
#include "log.h"
static char *msg_str = NULL;
#define LOGSTAMP_TIME 1
#define LOGSTAMP_HOSTNAME 0
#define LOGSTAMP_PROGRAMNAME 0
#define LOGSTAMP_PID 0
#define LOGSTAMP_LOGMSG 1
char *formattimevalue(struct nfstime *t, char *str, size_t stringlength) {
if (stringlength < FORMATTED_TIME_LEN) return "";
ctime_r((time_t *)&t->seconds, str);
sprintf(&str[19], ".%06d", t->useconds);
return str;
}
void
sys_openlog(char *str, int flags, int facility)
{
if (msg_str != NULL) free(msg_str);
msg_str = NULL;
if (str != NULL)
{
msg_str = malloc(strlen(str) + 1);
strcpy(msg_str, str);
}
openlog(msg_str, flags, facility);
}
#if LOGSTAMP_HOSTNAME
static int findhostname(char *hostname, size_t namelength, int shortenhostname) {
int result;
char *period;
result = gethostname(hostname, namelength);
if ((result == 0) && shortenhostname) {
period = strchr(hostname, '.');
if (period) *period = (char)0;
}
return result;
}
#endif
static void printlogentryheader(void) {
#if LOGSTAMP_TIME
struct timeval currenttime;
char datetime[26];
#endif
#if LOGSTAMP_HOSTNAME
char hostname[128];
#endif
#if LOGSTAMP_TIME
gettimeofday(¤ttime, NULL);
ctime_r((time_t *)¤ttime.tv_sec, datetime);
sprintf(&datetime[19], ".%03d", currenttime.tv_usec / 1000);
datetime[23] = (char)0;
fprintf(stderr, "%s", datetime);
#endif
#if LOGSTAMP_HOSTNAME
findhostname(hostname, sizeof(hostname), 1);
if (LOGSTAMP_TIME) fprintf(stderr, " ");
fprintf(stderr, "%s", hostname);
#endif
#if LOGSTAMP_PROGRAMNAME
if (LOGSTAMP_TIME || LOGSTAMP_HOSTNAME) fprintf(stderr, " ");
fprintf(stderr, "%s", getprogname());
#endif
#if LOGSTAMP_PID
if (!LOGSTAMP_PROGRAMNAME) fprintf(stderr, " ");
fprintf(stderr, "[%u]", getpid());
#endif
if (LOGSTAMP_TIME || LOGSTAMP_HOSTNAME || LOGSTAMP_PROGRAMNAME || LOGSTAMP_PID) {
if (!LOGSTAMP_LOGMSG) fprintf(stderr, ":");
fprintf(stderr, " ");
}
}
void
sys_msg(int debug, int priority, char *message, ...)
{
va_list ap;
if (debug == 0) return;
va_start(ap, message);
if (debug & DEBUG_SYSLOG)
vsyslog(priority, message, ap);
if (debug & DEBUG_STDERR)
{
printlogentryheader();
#if LOGSTAMP_LOGMSG
if (msg_str != NULL) fprintf(stderr, "%s[%u]: ", msg_str, getpid());
#endif
vfprintf(stderr, message, ap);
fprintf(stderr, "\n");
fflush(stderr);
}
va_end(ap);
}