-
Notifications
You must be signed in to change notification settings - Fork 241
/
output.c
125 lines (103 loc) · 2.5 KB
/
output.c
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
123
124
125
#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);
}
if (logging == LOGGING_DISABLED)
return;
log_handle = find_logfile_handle();
if (log_handle != NULL) {
fprintf(log_handle, "%s", buffer);
fflush(log_handle);
}
}