|
Packit Service |
3470d1 |
/* BEGIN_ICS_COPYRIGHT5 ****************************************
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
Copyright (c) 2018, Intel Corporation
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
Redistribution and use in source and binary forms, with or without
|
|
Packit Service |
3470d1 |
modification, are permitted provided that the following conditions are met:
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
* Redistributions of source code must retain the above copyright notice,
|
|
Packit Service |
3470d1 |
this list of conditions and the following disclaimer.
|
|
Packit Service |
3470d1 |
* Redistributions in binary form must reproduce the above copyright
|
|
Packit Service |
3470d1 |
notice, this list of conditions and the following disclaimer in the
|
|
Packit Service |
3470d1 |
documentation and/or other materials provided with the distribution.
|
|
Packit Service |
3470d1 |
* Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit Service |
3470d1 |
may be used to endorse or promote products derived from this software
|
|
Packit Service |
3470d1 |
without specific prior written permission.
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit Service |
3470d1 |
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit Service |
3470d1 |
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
Packit Service |
3470d1 |
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
Packit Service |
3470d1 |
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
Packit Service |
3470d1 |
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
Packit Service |
3470d1 |
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
Packit Service |
3470d1 |
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
Packit Service |
3470d1 |
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
Packit Service |
3470d1 |
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
* ** END_ICS_COPYRIGHT5 ****************************************/
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
#include <stdio.h>
|
|
Packit Service |
3470d1 |
#include <stdlib.h>
|
|
Packit Service |
3470d1 |
#include <unistd.h>
|
|
Packit Service |
3470d1 |
#include <stdarg.h>
|
|
Packit Service |
3470d1 |
#include <string.h>
|
|
Packit Service |
3470d1 |
#include <signal.h>
|
|
Packit Service |
3470d1 |
#include <errno.h>
|
|
Packit Service |
3470d1 |
#include "sys/file.h"
|
|
Packit Service |
3470d1 |
#include <time.h>
|
|
Packit Service |
3470d1 |
#include <sys/time.h>
|
|
Packit Service |
3470d1 |
#include <pthread.h>
|
|
Packit Service |
3470d1 |
#include <syslog.h>
|
|
Packit Service |
3470d1 |
#include <sys/stat.h>
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
#include <limits.h>
|
|
Packit Service |
3470d1 |
#include "ib_types.h"
|
|
Packit Service |
3470d1 |
#include "ib_status.h"
|
|
Packit Service |
3470d1 |
#include "cs_g.h"
|
|
Packit Service |
3470d1 |
#include "cs_log.h"
|
|
Packit Service |
3470d1 |
#include "vslog_l.h"
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
uint32_t log_to_console = 0;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
int logMode = 0;
|
|
Packit Service |
3470d1 |
uint32_t logLevel=1; // just used for show_masks option
|
|
Packit Service |
3470d1 |
FILE *log_file = NULL;
|
|
Packit Service |
3470d1 |
int output_fd = -1;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
#define MAX_SYSLOG_NAME 64
|
|
Packit Service |
3470d1 |
char vs_log_syslog_name[MAX_SYSLOG_NAME + 1] = "opafm";
|
|
Packit Service |
3470d1 |
uint32_t syslog_facility = LOG_LOCAL6;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
int vs_log_initialized;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
#define min(a,b) (((a)<(b))?(a):(b))
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
void vs_log_set_log_mode(int mode)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
logMode = mode;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
int
|
|
Packit Service |
3470d1 |
vs_log_get_syslog_level(uint32_t sev)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
switch(sev) {
|
|
Packit Service |
3470d1 |
case VS_LOG_NONE: return LOG_INFO;
|
|
Packit Service |
3470d1 |
case VS_LOG_FATAL: return LOG_CRIT;
|
|
Packit Service |
3470d1 |
case VS_LOG_CSM_ERROR: return LOG_ERR;
|
|
Packit Service |
3470d1 |
case VS_LOG_CSM_WARN: return LOG_WARNING;
|
|
Packit Service |
3470d1 |
case VS_LOG_CSM_NOTICE: return LOG_NOTICE;
|
|
Packit Service |
3470d1 |
case VS_LOG_CSM_INFO: return LOG_INFO;
|
|
Packit Service |
3470d1 |
case VS_LOG_ERROR: return LOG_ERR;
|
|
Packit Service |
3470d1 |
case VS_LOG_WARN: return LOG_WARNING;
|
|
Packit Service |
3470d1 |
case VS_LOG_NOTICE: return LOG_NOTICE;
|
|
Packit Service |
3470d1 |
case VS_LOG_INFINI_INFO: return LOG_INFO;
|
|
Packit Service |
3470d1 |
case VS_LOG_INFO: return LOG_DEBUG;
|
|
Packit Service |
3470d1 |
case VS_LOG_VERBOSE: return LOG_DEBUG;
|
|
Packit Service |
3470d1 |
case VS_LOG_DATA: return LOG_DEBUG;
|
|
Packit Service |
3470d1 |
case VS_LOG_DEBUG1: return LOG_DEBUG;
|
|
Packit Service |
3470d1 |
case VS_LOG_DEBUG2: return LOG_DEBUG;
|
|
Packit Service |
3470d1 |
case VS_LOG_DEBUG3: return LOG_DEBUG;
|
|
Packit Service |
3470d1 |
case VS_LOG_DEBUG4: return LOG_DEBUG;
|
|
Packit Service |
3470d1 |
case VS_LOG_ENTER: return LOG_DEBUG;
|
|
Packit Service |
3470d1 |
case VS_LOG_ARGS: return LOG_DEBUG;
|
|
Packit Service |
3470d1 |
case VS_LOG_EXIT: return LOG_DEBUG;
|
|
Packit Service |
3470d1 |
default: return LOG_DEBUG;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
// avoid conflict with vssappl.c fprintf version used in tests
|
|
Packit Service |
3470d1 |
#ifdef LINUX_USR_REL
|
|
Packit Service |
3470d1 |
void
|
|
Packit Service |
3470d1 |
vs_log_output(uint32_t sev, /* severity */
|
|
Packit Service |
3470d1 |
uint32_t modid, /* optional Module id */
|
|
Packit Service |
3470d1 |
const char *function, /* optional function name */
|
|
Packit Service |
3470d1 |
const char *vf, /* optional vFabric name */
|
|
Packit Service |
3470d1 |
const char *format, ...
|
|
Packit Service |
3470d1 |
)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
char buffer[1024];
|
|
Packit Service |
3470d1 |
va_list args;
|
|
Packit Service |
3470d1 |
FILE *f = NULL;
|
|
Packit Service |
3470d1 |
char vfstr[128];
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
va_start(args, format);
|
|
Packit Service |
3470d1 |
(void) vsnprintf (buffer, sizeof(buffer), format, args);
|
|
Packit Service |
3470d1 |
va_end (args);
|
|
Packit Service |
3470d1 |
buffer[sizeof(buffer)-1] = '\0';
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
if (vf)
|
|
Packit Service |
3470d1 |
snprintf(vfstr, sizeof(vfstr), "[VF:%s] ", vf);
|
|
Packit Service |
3470d1 |
else
|
|
Packit Service |
3470d1 |
*vfstr='\0';
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
if(log_to_console){
|
|
Packit Service |
3470d1 |
f = stdout;
|
|
Packit Service |
3470d1 |
} else if(output_fd != -1) {
|
|
Packit Service |
3470d1 |
f = log_file;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
if (f) {
|
|
Packit Service |
3470d1 |
struct tm *locTime;
|
|
Packit Service |
3470d1 |
char strTime[28];
|
|
Packit Service |
3470d1 |
time_t theCalTime=0;
|
|
Packit Service |
3470d1 |
uint32_t pid;
|
|
Packit Service |
3470d1 |
size_t lt=0;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
time(&theCalTime);
|
|
Packit Service |
3470d1 |
locTime = localtime(&theCalTime);
|
|
Packit Service |
3470d1 |
if (locTime) {
|
|
Packit Service |
3470d1 |
lt = strftime(strTime,
|
|
Packit Service |
3470d1 |
sizeof(strTime),
|
|
Packit Service |
3470d1 |
"%a %b %d %H:%M:%S %Y",
|
|
Packit Service |
3470d1 |
locTime);
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
if (lt==0) {
|
|
Packit Service |
3470d1 |
strncpy(strTime,"(unknown)", sizeof(strTime));
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
(void)vs_log_thread_pid(&pid;;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
fprintf(f, "%s: %s(%u): %s[%s]: %s%s%s%s%s\n",
|
|
Packit Service |
3470d1 |
strTime, vs_log_syslog_name, pid,
|
|
Packit Service |
3470d1 |
cs_log_get_sev_name(sev), vs_thread_name_str(),
|
|
Packit Service |
3470d1 |
cs_log_get_module_prefix(modid), vfstr,
|
|
Packit Service |
3470d1 |
function?function:"", function?": ":"",
|
|
Packit Service |
3470d1 |
buffer);
|
|
Packit Service |
3470d1 |
if (! sev || (sev & NONDEBUG_LOG_MASK))
|
|
Packit Service |
3470d1 |
fflush(f);
|
|
Packit Service |
3470d1 |
} else {
|
|
Packit Service |
3470d1 |
syslog(vs_log_get_syslog_level(sev), "%s[%s]: %s%s%s%s%s",
|
|
Packit Service |
3470d1 |
cs_log_get_sev_name(sev), vs_thread_name_str(),
|
|
Packit Service |
3470d1 |
cs_log_get_module_prefix(modid), vfstr,
|
|
Packit Service |
3470d1 |
function?function:"", function?": ":"",
|
|
Packit Service |
3470d1 |
buffer);
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
#endif
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
/* Outputs a messages to the syslog regardless of settings */
|
|
Packit Service |
3470d1 |
/* Also outputs to LogFile if configured */
|
|
Packit Service |
3470d1 |
void
|
|
Packit Service |
3470d1 |
vs_log_output_message(char *msg, int show_masks)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
if (show_masks) {
|
|
Packit Service |
3470d1 |
uint32_t log_masks[VIEO_LAST_MOD_ID+1];
|
|
Packit Service |
3470d1 |
uint32_t modid;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
cs_log_set_log_masks(logLevel, logMode, log_masks);
|
|
Packit Service |
3470d1 |
vs_log_output(VS_LOG_NONE, VIEO_NONE_MOD_ID,NULL,NULL,
|
|
Packit Service |
3470d1 |
"%s LogLevel: %u LogMode: %u", msg, logLevel, logMode);
|
|
Packit Service |
3470d1 |
for (modid=0; modid <= VIEO_LAST_MOD_ID; ++modid) {
|
|
Packit Service |
3470d1 |
if ( modid == VIEO_NONE_MOD_ID)
|
|
Packit Service |
3470d1 |
continue;
|
|
Packit Service |
3470d1 |
if (log_masks[modid] != cs_log_masks[modid])
|
|
Packit Service |
3470d1 |
vs_log_output(VS_LOG_NONE, VIEO_NONE_MOD_ID,NULL,NULL,
|
|
Packit Service |
3470d1 |
"%s %s_LogMask: 0x%x", msg, cs_log_get_module_name(modid), cs_log_masks[modid]);
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
} else {
|
|
Packit Service |
3470d1 |
vs_log_output(VS_LOG_NONE, VIEO_NONE_MOD_ID,NULL,NULL, "%s", msg);
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
void
|
|
Packit Service |
3470d1 |
vs_log_output_memory(uint32_t sev, /* severity */
|
|
Packit Service |
3470d1 |
uint32_t modid, /* optional Module id */
|
|
Packit Service |
3470d1 |
const char *function, /* optional function name */
|
|
Packit Service |
3470d1 |
const char *vf, /* optional vFabric name */
|
|
Packit Service |
3470d1 |
const char *prefix,
|
|
Packit Service |
3470d1 |
const void* addr,
|
|
Packit Service |
3470d1 |
uint32_t len
|
|
Packit Service |
3470d1 |
)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
char hex_buffer[80];
|
|
Packit Service |
3470d1 |
unsigned hex_offset = 0;
|
|
Packit Service |
3470d1 |
char char_buffer[80];
|
|
Packit Service |
3470d1 |
unsigned char_offset = 0;
|
|
Packit Service |
3470d1 |
unsigned offset;
|
|
Packit Service |
3470d1 |
const uint8_t *p = (uint8_t*)addr;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
if (! len) {
|
|
Packit Service |
3470d1 |
vs_log_output(sev, modid, function, vf, "%s: length is 0", prefix);
|
|
Packit Service |
3470d1 |
return;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
for (offset=0; offset < len; offset++ ) {
|
|
Packit Service |
3470d1 |
if ((offset & 15) == 0 && offset != 0 ) {
|
|
Packit Service |
3470d1 |
vs_log_output(sev, modid, function, vf, "%s: 0x%4.4x%s %s", prefix, offset-16, hex_buffer, char_buffer);
|
|
Packit Service |
3470d1 |
hex_offset = char_offset = 0;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
hex_offset += sprintf(&hex_buffer[hex_offset], " %2.2x", p[offset]);
|
|
Packit Service |
3470d1 |
if (p[offset] >= ' ' && p[offset] <= '~')
|
|
Packit Service |
3470d1 |
char_offset += sprintf(&char_buffer[char_offset], "%c", p[offset]);
|
|
Packit Service |
3470d1 |
else
|
|
Packit Service |
3470d1 |
char_offset += sprintf(&char_buffer[char_offset], ".");
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
if (offset & 15) {
|
|
Packit Service |
3470d1 |
// output residual
|
|
Packit Service |
3470d1 |
uint32 pad = 16 - (offset & 15);
|
|
Packit Service |
3470d1 |
hex_offset += sprintf(&hex_buffer[hex_offset], "%*s", pad*3, "");
|
|
Packit Service |
3470d1 |
vs_log_output(sev, modid, function, vf, "%s: 0x%4.4x%s %s", prefix, offset&~15, hex_buffer, char_buffer);
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
#if 0
|
|
Packit Service |
3470d1 |
// --------------------------------------------------------------------
|
|
Packit Service |
3470d1 |
// vs_log_time_get
|
|
Packit Service |
3470d1 |
// --------------------------------------------------------------------
|
|
Packit Service |
3470d1 |
// Return a 64 bit number of uSecs since some epoch. This function
|
|
Packit Service |
3470d1 |
// returns a monotonically increasing sequence.
|
|
Packit Service |
3470d1 |
//
|
|
Packit Service |
3470d1 |
// INPUTS
|
|
Packit Service |
3470d1 |
// loc Where to put the time value
|
|
Packit Service |
3470d1 |
//
|
|
Packit Service |
3470d1 |
// RETURNS
|
|
Packit Service |
3470d1 |
// VSTATUS_OK
|
|
Packit Service |
3470d1 |
// VSTATUS_ILLPARM
|
|
Packit Service |
3470d1 |
// --------------------------------------------------------------------
|
|
Packit Service |
3470d1 |
Status_t
|
|
Packit Service |
3470d1 |
vs_log_time_get(uint64_t * loc)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
struct timeval tv;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
if (NULL == loc)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
return VSTATUS_ILLPARM;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
gettimeofday(&tv, NULL);
|
|
Packit Service |
3470d1 |
*loc = ((uint64_t) (tv.tv_sec) * 1000000L) + (uint64_t) tv.tv_usec;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
return (VSTATUS_OK);
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
#endif
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
// --------------------------------------------------------------------
|
|
Packit Service |
3470d1 |
// vs_log_thread_pid
|
|
Packit Service |
3470d1 |
// --------------------------------------------------------------------
|
|
Packit Service |
3470d1 |
// Return the PID for the current thread.
|
|
Packit Service |
3470d1 |
//
|
|
Packit Service |
3470d1 |
// INPUTS
|
|
Packit Service |
3470d1 |
// Pointer to PID
|
|
Packit Service |
3470d1 |
//
|
|
Packit Service |
3470d1 |
// RETURNS
|
|
Packit Service |
3470d1 |
// VSTATUS_OK
|
|
Packit Service |
3470d1 |
// --------------------------------------------------------------------
|
|
Packit Service |
3470d1 |
Status_t
|
|
Packit Service |
3470d1 |
vs_log_thread_pid(uint32_t * pid)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
if (pid == NULL)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
return (VSTATUS_ILLPARM);
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
*pid = (uint32_t) getpid();
|
|
Packit Service |
3470d1 |
return (VSTATUS_OK);
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
//--------------------------------------------------------------------
|
|
Packit Service |
3470d1 |
// vs_fatal_error
|
|
Packit Service |
3470d1 |
//--------------------------------------------------------------------
|
|
Packit Service |
3470d1 |
// This function will panic() the process and report through the trace
|
|
Packit Service |
3470d1 |
// system a reason. The trace log (if being used) will be preserved so
|
|
Packit Service |
3470d1 |
// that perhaps a debugger can be connected to the system to figure out
|
|
Packit Service |
3470d1 |
// what went wrong.
|
|
Packit Service |
3470d1 |
//
|
|
Packit Service |
3470d1 |
// INPUTS
|
|
Packit Service |
3470d1 |
// string Pointer to string. Truncated to 63 characters
|
|
Packit Service |
3470d1 |
//
|
|
Packit Service |
3470d1 |
// RETURNS
|
|
Packit Service |
3470d1 |
// NEVER RETURNS
|
|
Packit Service |
3470d1 |
//--------------------------------------------------------------------
|
|
Packit Service |
3470d1 |
void
|
|
Packit Service |
3470d1 |
vs_fatal_error (uint8_t * string)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
/* make sure we get an entry to syslog, */
|
|
Packit Service |
3470d1 |
/* just in case logging not fully initialzed */
|
|
Packit Service |
3470d1 |
openlog("FATAL:", (LOG_NDELAY | LOG_PID), LOG_USER);
|
|
Packit Service |
3470d1 |
syslog(LOG_CRIT, "%s", string);
|
|
Packit Service |
3470d1 |
closelog();
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
abort();
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
#if 0
|
|
Packit Service |
3470d1 |
/*
|
|
Packit Service |
3470d1 |
* vslog_time_cvt
|
|
Packit Service |
3470d1 |
* Converts usec to hr:min:sec
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
* INPUTS
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
* RETURNS
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
*/
|
|
Packit Service |
3470d1 |
void
|
|
Packit Service |
3470d1 |
vslog_time_cvt(uint64_t val,
|
|
Packit Service |
3470d1 |
uint64_t * hh, uint64_t * mm, uint64_t * ss, uint64_t * us)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
uint64_t t,
|
|
Packit Service |
3470d1 |
tmp_us = 1000000ull;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
*us = (val % tmp_us);
|
|
Packit Service |
3470d1 |
t = (val / (tmp_us)); /* get seconds */
|
|
Packit Service |
3470d1 |
*ss = (t % (60ull));
|
|
Packit Service |
3470d1 |
t = (t / 60ull); /* get minutes */
|
|
Packit Service |
3470d1 |
*mm = ((t) % (60ull));
|
|
Packit Service |
3470d1 |
t = ((t) / (60ull)); /* get hrs */
|
|
Packit Service |
3470d1 |
*hh = (t % (24ull));
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
#endif
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
/*
|
|
Packit Service |
3470d1 |
* vs_log_init
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
*/
|
|
Packit Service |
3470d1 |
Status_t
|
|
Packit Service |
3470d1 |
vs_log_usr_init(void)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
if (strlen(vs_log_syslog_name) == 0)
|
|
Packit Service |
3470d1 |
sprintf(vs_log_syslog_name,"opafm");
|
|
Packit Service |
3470d1 |
//printf("openlog(%s, %x, %u)\n", vs_log_syslog_name, (LOG_CONS | LOG_PID), syslog_facility);
|
|
Packit Service |
3470d1 |
openlog(vs_log_syslog_name, (LOG_CONS | LOG_PID), syslog_facility);
|
|
Packit Service |
3470d1 |
vs_log_initialized = 1;
|
|
Packit Service |
3470d1 |
return VSTATUS_OK;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
/*
|
|
Packit Service |
3470d1 |
* vs_log_control
|
|
Packit Service |
3470d1 |
* Function used to pass cmds to the logging subsystem.
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
* INPUTS
|
|
Packit Service |
3470d1 |
* cmd Defines the action to carried out in the subsystem
|
|
Packit Service |
3470d1 |
* arg1 First arg type
|
|
Packit Service |
3470d1 |
* arg2 Second arg
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
* cmd == VS_LOG_STARTSYSLOG
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
* arg1, arg2 and arg3 is NULL.
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
* cmd == VS_LOG_SETFACILITY
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
* arg1 Contains facility
|
|
Packit Service |
3470d1 |
* arg2 and arg3 is NULL.
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
* cmd == VS_LOG_SETMASK
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
* arg1 Contains a new log_masks array
|
|
Packit Service |
3470d1 |
* arg2 log_level
|
|
Packit Service |
3470d1 |
* arg3 kernel module filter mask.
|
|
Packit Service |
3470d1 |
*
|
|
Packit Service |
3470d1 |
* RETURNS
|
|
Packit Service |
3470d1 |
* VSTATUS_OK
|
|
Packit Service |
3470d1 |
* VSTATUS_BAD
|
|
Packit Service |
3470d1 |
*/
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
Status_t
|
|
Packit Service |
3470d1 |
vs_log_control(int cmd, void *arg1, void *arg2, void *arg3)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
Status_t status;
|
|
Packit Service |
3470d1 |
FILE *old_log_file, *temp_file;
|
|
Packit Service |
3470d1 |
int old_output_fd, temp_fd;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
status = VSTATUS_BAD;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
switch (cmd)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
case VS_LOG_STARTSYSLOG:
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
if (! vs_log_initialized)
|
|
Packit Service |
3470d1 |
(void) vs_log_usr_init();
|
|
Packit Service |
3470d1 |
if (vs_log_initialized)
|
|
Packit Service |
3470d1 |
status = VSTATUS_OK;
|
|
Packit Service |
3470d1 |
else
|
|
Packit Service |
3470d1 |
return VSTATUS_BAD;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
break;
|
|
Packit Service |
3470d1 |
case VS_LOG_SETFACILITY:
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
syslog_facility = (uint32_t) (unint)arg1;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
break;
|
|
Packit Service |
3470d1 |
case VS_LOG_SETMASK:
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
if (arg1)
|
|
Packit Service |
3470d1 |
memcpy(cs_log_masks, (uint32_t*)arg1, sizeof(cs_log_masks));
|
|
Packit Service |
3470d1 |
logLevel = (uint32_t) (unint)arg2;
|
|
Packit Service |
3470d1 |
log_to_console = (int)(unint)arg3;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
status = VSTATUS_OK;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
break;
|
|
Packit Service |
3470d1 |
case VS_LOG_SETOUTPUTFILE:
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
old_log_file = log_file;
|
|
Packit Service |
3470d1 |
old_output_fd = output_fd;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
if((arg1 != NULL) && (strlen(arg1) > 0))
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
temp_fd = open((char*)arg1,
|
|
Packit Service |
3470d1 |
O_WRONLY | O_CREAT| O_APPEND,
|
|
Packit Service |
3470d1 |
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
if(temp_fd == -1)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
status = VSTATUS_BAD;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
else
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
status = VSTATUS_OK;
|
|
Packit Service |
3470d1 |
if((temp_file = fdopen(temp_fd, (void *)"a")) == NULL)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
close(temp_fd);
|
|
Packit Service |
3470d1 |
temp_fd = -1;
|
|
Packit Service |
3470d1 |
status = VSTATUS_BAD;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
if(status != VSTATUS_OK)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
syslog(LOG_ERR,"Failed to open output log file: %s\n",(char*)arg1);
|
|
Packit Service |
3470d1 |
printf("Failed to open output log file: %s\n",(char*)arg1);
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
} else
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
FILE *tempf;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
// Remap stdout and stderr to our logfile to catch lower level messages
|
|
Packit Service |
3470d1 |
tempf = freopen((char*)arg1, (void *)"a", stdout);
|
|
Packit Service |
3470d1 |
if (!tempf) {
|
|
Packit Service |
3470d1 |
syslog(LOG_ERR,"Failed to redirect stdout to %s\n",(char*)arg1);
|
|
Packit Service |
3470d1 |
printf("Failed to redirect stdout to %s\n",(char*)arg1);
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
tempf = freopen((char*)arg1, (void *)"a", stderr);
|
|
Packit Service |
3470d1 |
if (!tempf) {
|
|
Packit Service |
3470d1 |
syslog(LOG_ERR,"Failed to redirect stderr to %s\n",(char*)arg1);
|
|
Packit Service |
3470d1 |
printf("Failed to redirect stderr to %s\n",(char*)arg1);
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
output_fd = temp_fd;
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
log_file = temp_file;
|
|
Packit Service |
3470d1 |
if(old_output_fd != -1)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
if(old_log_file != NULL)
|
|
Packit Service |
3470d1 |
fclose(log_file);
|
|
Packit Service |
3470d1 |
log_file = NULL;
|
|
Packit Service |
3470d1 |
close(old_output_fd);
|
|
Packit Service |
3470d1 |
old_output_fd = -1;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
break;
|
|
Packit Service |
3470d1 |
case VS_LOG_SETSYSLOGNAME:
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
if((arg1 != NULL) && (strlen((char*)arg1) <= MAX_SYSLOG_NAME))
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
snprintf(vs_log_syslog_name, sizeof(vs_log_syslog_name), "%s",(char *)arg1);
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
else
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
return VSTATUS_BAD;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
break;
|
|
Packit Service |
3470d1 |
default:
|
|
Packit Service |
3470d1 |
return VSTATUS_BAD;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
return status;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|
|
Packit Service |
3470d1 |
FILE* vs_log_get_logfile_fd(void)
|
|
Packit Service |
3470d1 |
{
|
|
Packit Service |
3470d1 |
return log_file;
|
|
Packit Service |
3470d1 |
}
|
|
Packit Service |
3470d1 |
|