1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
#include <errno.h>
#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>
#include "arg-decoder.h"
#include "log.h"
#include "pids.h"
#include "params.h" // quiet_level
#include "shm.h"
#define BUFSIZE 1024 // decoded syscall args are fprintf'd directly, this is for everything else.
/*
* level defines whether it gets displayed to the screen with printf.
* (it always logs).
* 0 = everything, even all the registers
* 1 = prints syscall count
* 2 = Just the reseed values
*
*/
void output(char level, const char *fmt, ...)
{
va_list args;
int n;
FILE *handle;
pid_t pid;
char outputbuf[BUFSIZE];
char *prefix = NULL;
char main_prefix[]="[main] ";
char continuationtxt[]="";
char child_prefix[32];
if (level >= quiet_level)
return;
if (level == CONT) {
prefix = continuationtxt;
goto skip_pid;
}
/* prefix preparation */
pid = getpid();
if (pid == mainpid)
prefix = main_prefix;
else if (prefix == NULL) {
unsigned int childno;
childno = find_childno(pid);
snprintf(child_prefix, sizeof(child_prefix), "[child%u:%u] ", childno, pid);
prefix = child_prefix;
shm->children[childno]->logdirty = TRUE;
}
skip_pid:
/* formatting output */
va_start(args, fmt);
n = vsnprintf(outputbuf, sizeof(outputbuf), fmt, args);
va_end(args);
if (n < 0) {
outputerr("## Something went wrong in output() [%d]\n", n);
exit(EXIT_FAILURE);
}
/* stdout output if needed */
if (quiet_level >= level) {
printf("%s%s", prefix, outputbuf);
(void)fflush(stdout);
}
/* go on with file logs only if enabled */
if (logging == LOGGING_FILES) {
handle = find_logfile_handle();
if (!handle)
return;
fprintf(handle, "%s %s", prefix, outputbuf);
(void)fflush(handle);
}
}
/*
* Used as a way to consolidated all printf calls if someones one to redirect it to somewhere else.
* note: this function ignores quiet_level since it main purpose is error output.
*/
void outputerr(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
}
void outputstd(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
vfprintf(stdout, fmt, args);
va_end(args);
}
void output_rendered_buffer(char *buffer)
{
FILE *log_handle;
/* Output to stdout only if -q param is not specified */
if (quiet_level == MAX_LOGLEVEL) {
fprintf(stdout, "%s", buffer);
fflush(stdout);
}
log_handle = find_logfile_handle();
if (log_handle != NULL) {
fprintf(log_handle, "%s", buffer);
fflush(log_handle);
}
}
|