Blame Esm/ib/src/linux/log/common/vslog.c

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