/* This function is always called from a fuzzing child. */ void output_syscall_prefix(const unsigned int childno, const unsigned int syscallno) { FILE *log_handle; pid_t pid; /* Exit if should not continue at all. */ if (logging == FALSE && quiet_level < MAX_LOGLEVEL) return; pid = getpid(); /* Find the log file handle */ log_handle = robust_find_logfile_handle(); /* do not output any ascii control symbols to files */ if ((logging == TRUE) && (log_handle != NULL)) output_syscall_prefix_to_fd(childno, pid, syscallno, log_handle, TRUE); /* Output to stdout only if -q param is not specified */ if (quiet_level == MAX_LOGLEVEL) output_syscall_prefix_to_fd(childno, pid, syscallno, stdout, monochrome); }
/* * level defines whether it gets displayed to the screen with printf. * (it always logs). * 0 = everything, even all the registers * 1 = Watchdog prints syscall count * 2 = Just the reseed values * */ void output(unsigned char level, const char *fmt, ...) { va_list args; int n; FILE *handle; unsigned int len, i, j; pid_t pid; char outputbuf[BUFSIZE]; char monobuf[BUFSIZE]; char *prefix = NULL; char watchdog_prefix[]="[watchdog]"; char init_prefix[]="[init]"; char main_prefix[]="[main]"; char child_prefix[]="[childNN:1234567890]"; unsigned int slot; if (logging == FALSE && level >= quiet_level) return; /* prefix preparation */ pid = getpid(); if (pid == watchdog_pid) prefix = watchdog_prefix; if (pid == initpid) prefix = init_prefix; if (pid == shm->mainpid) prefix = main_prefix; if (prefix == NULL) { slot = find_pid_slot(pid); sprintf(child_prefix, "[child%d:%d]", slot, pid); prefix = child_prefix; } /* 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 == FALSE) return; handle = robust_find_logfile_handle(); if (!handle) return; /* If we've specified monochrome, we can just dump the buffer into * the logfile as is, because there shouldn't be any ANSI codes * in the buffer to be stripped out. */ if (monochrome == FALSE) { /* copy buffer, sans ANSI codes */ len = strlen(outputbuf); for (i = 0, j = 0; (i < len) && (i + 2 < BUFSIZE) && (j < BUFSIZE); i++) { if (outputbuf[i] == '') { if (outputbuf[i + 2] == '1') i += 6; // ANSI_COLOUR else i += 3; // ANSI_RESET } else { monobuf[j] = outputbuf[i]; j++; } } monobuf[j] = '\0'; fprintf(handle, "%s %s", prefix, monobuf); } else { fprintf(handle, "%s %s", prefix, outputbuf); } (void)fflush(handle); }
/* * level defines whether it gets displayed to the screen with printf. * (it always logs). * 0 = everything, even all the registers * 1 = Watchdog prints syscall count * 2 = Just the reseed values * */ void output(unsigned char level, const char *fmt, ...) { va_list args; int n; FILE *handle; pid_t pid; char outputbuf[BUFSIZE]; char *prefix = NULL; char watchdog_prefix[]="[watchdog]"; char init_prefix[]="[init]"; char main_prefix[]="[main]"; char child_prefix[32]; if (logging == FALSE && level >= quiet_level) return; /* prefix preparation */ pid = getpid(); if (pid == watchdog_pid) prefix = watchdog_prefix; if (pid == initpid) prefix = init_prefix; if (pid == shm->mainpid) prefix = main_prefix; 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; } /* 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); if (getpid() == shm->mainpid) exit_main_fail(); else 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 == FALSE) return; handle = robust_find_logfile_handle(); if (!handle) return; strip_ansi(outputbuf, BUFSIZE); fprintf(handle, "%s %s", prefix, outputbuf); (void)fflush(handle); }