1*08b48e0bSAndroid Build Coastguard Worker /*
2*08b48e0bSAndroid Build Coastguard Worker * This implements rpc.statsd support, see docs/rpc_statsd.md
3*08b48e0bSAndroid Build Coastguard Worker *
4*08b48e0bSAndroid Build Coastguard Worker */
5*08b48e0bSAndroid Build Coastguard Worker
6*08b48e0bSAndroid Build Coastguard Worker #include <stdio.h>
7*08b48e0bSAndroid Build Coastguard Worker #include <stdlib.h>
8*08b48e0bSAndroid Build Coastguard Worker #include <sys/socket.h>
9*08b48e0bSAndroid Build Coastguard Worker #include <arpa/inet.h>
10*08b48e0bSAndroid Build Coastguard Worker #include <string.h>
11*08b48e0bSAndroid Build Coastguard Worker #include <sys/types.h>
12*08b48e0bSAndroid Build Coastguard Worker #include <netdb.h>
13*08b48e0bSAndroid Build Coastguard Worker #include <unistd.h>
14*08b48e0bSAndroid Build Coastguard Worker #include "afl-fuzz.h"
15*08b48e0bSAndroid Build Coastguard Worker
16*08b48e0bSAndroid Build Coastguard Worker #define MAX_STATSD_PACKET_SIZE 4096
17*08b48e0bSAndroid Build Coastguard Worker #define MAX_TAG_LEN 200
18*08b48e0bSAndroid Build Coastguard Worker #define METRIC_PREFIX "fuzzing"
19*08b48e0bSAndroid Build Coastguard Worker
20*08b48e0bSAndroid Build Coastguard Worker /* Tags format for metrics
21*08b48e0bSAndroid Build Coastguard Worker DogStatsD:
22*08b48e0bSAndroid Build Coastguard Worker metric.name:<value>|<type>|#key:value,key2:value2
23*08b48e0bSAndroid Build Coastguard Worker
24*08b48e0bSAndroid Build Coastguard Worker InfluxDB
25*08b48e0bSAndroid Build Coastguard Worker metric.name,key=value,key2=value2:<value>|<type>
26*08b48e0bSAndroid Build Coastguard Worker
27*08b48e0bSAndroid Build Coastguard Worker Librato
28*08b48e0bSAndroid Build Coastguard Worker metric.name#key=value,key2=value2:<value>|<type>
29*08b48e0bSAndroid Build Coastguard Worker
30*08b48e0bSAndroid Build Coastguard Worker SignalFX
31*08b48e0bSAndroid Build Coastguard Worker metric.name[key=value,key2=value2]:<value>|<type>
32*08b48e0bSAndroid Build Coastguard Worker
33*08b48e0bSAndroid Build Coastguard Worker */
34*08b48e0bSAndroid Build Coastguard Worker
35*08b48e0bSAndroid Build Coastguard Worker // after the whole metric.
36*08b48e0bSAndroid Build Coastguard Worker #define DOGSTATSD_TAGS_FORMAT "|#banner:%s,afl_version:%s"
37*08b48e0bSAndroid Build Coastguard Worker
38*08b48e0bSAndroid Build Coastguard Worker // just after the metric name.
39*08b48e0bSAndroid Build Coastguard Worker #define LIBRATO_TAGS_FORMAT "#banner=%s,afl_version=%s"
40*08b48e0bSAndroid Build Coastguard Worker #define INFLUXDB_TAGS_FORMAT ",banner=%s,afl_version=%s"
41*08b48e0bSAndroid Build Coastguard Worker #define SIGNALFX_TAGS_FORMAT "[banner=%s,afl_version=%s]"
42*08b48e0bSAndroid Build Coastguard Worker
43*08b48e0bSAndroid Build Coastguard Worker // For DogstatsD
44*08b48e0bSAndroid Build Coastguard Worker #define STATSD_TAGS_TYPE_SUFFIX 1
45*08b48e0bSAndroid Build Coastguard Worker #define STATSD_TAGS_SUFFIX_METRICS \
46*08b48e0bSAndroid Build Coastguard Worker METRIC_PREFIX \
47*08b48e0bSAndroid Build Coastguard Worker ".cycle_done:%llu|g%s\n" METRIC_PREFIX \
48*08b48e0bSAndroid Build Coastguard Worker ".cycles_wo_finds:%llu|g%s\n" METRIC_PREFIX \
49*08b48e0bSAndroid Build Coastguard Worker ".execs_done:%llu|g%s\n" METRIC_PREFIX \
50*08b48e0bSAndroid Build Coastguard Worker ".execs_per_sec:%0.02f|g%s\n" METRIC_PREFIX \
51*08b48e0bSAndroid Build Coastguard Worker ".corpus_count:%u|g%s\n" METRIC_PREFIX \
52*08b48e0bSAndroid Build Coastguard Worker ".corpus_favored:%u|g%s\n" METRIC_PREFIX \
53*08b48e0bSAndroid Build Coastguard Worker ".corpus_found:%u|g%s\n" METRIC_PREFIX \
54*08b48e0bSAndroid Build Coastguard Worker ".corpus_imported:%u|g%s\n" METRIC_PREFIX \
55*08b48e0bSAndroid Build Coastguard Worker ".max_depth:%u|g%s\n" METRIC_PREFIX ".cur_item:%u|g%s\n" METRIC_PREFIX \
56*08b48e0bSAndroid Build Coastguard Worker ".pending_favs:%u|g%s\n" METRIC_PREFIX \
57*08b48e0bSAndroid Build Coastguard Worker ".pending_total:%u|g%s\n" METRIC_PREFIX \
58*08b48e0bSAndroid Build Coastguard Worker ".corpus_variable:%u|g%s\n" METRIC_PREFIX \
59*08b48e0bSAndroid Build Coastguard Worker ".saved_crashes:%llu|g%s\n" METRIC_PREFIX \
60*08b48e0bSAndroid Build Coastguard Worker ".saved_hangs:%llu|g%s\n" METRIC_PREFIX \
61*08b48e0bSAndroid Build Coastguard Worker ".total_crashes:%llu|g%s\n" METRIC_PREFIX \
62*08b48e0bSAndroid Build Coastguard Worker ".slowest_exec_ms:%u|g%s\n" METRIC_PREFIX \
63*08b48e0bSAndroid Build Coastguard Worker ".edges_found:%u|g%s\n" METRIC_PREFIX \
64*08b48e0bSAndroid Build Coastguard Worker ".var_byte_count:%u|g%s\n" METRIC_PREFIX ".havoc_expansion:%u|g%s\n"
65*08b48e0bSAndroid Build Coastguard Worker
66*08b48e0bSAndroid Build Coastguard Worker // For Librato, InfluxDB, SignalFX
67*08b48e0bSAndroid Build Coastguard Worker #define STATSD_TAGS_TYPE_MID 2
68*08b48e0bSAndroid Build Coastguard Worker #define STATSD_TAGS_MID_METRICS \
69*08b48e0bSAndroid Build Coastguard Worker METRIC_PREFIX \
70*08b48e0bSAndroid Build Coastguard Worker ".cycle_done%s:%llu|g\n" METRIC_PREFIX \
71*08b48e0bSAndroid Build Coastguard Worker ".cycles_wo_finds%s:%llu|g\n" METRIC_PREFIX \
72*08b48e0bSAndroid Build Coastguard Worker ".execs_done%s:%llu|g\n" METRIC_PREFIX \
73*08b48e0bSAndroid Build Coastguard Worker ".execs_per_sec%s:%0.02f|g\n" METRIC_PREFIX \
74*08b48e0bSAndroid Build Coastguard Worker ".corpus_count%s:%u|g\n" METRIC_PREFIX \
75*08b48e0bSAndroid Build Coastguard Worker ".corpus_favored%s:%u|g\n" METRIC_PREFIX \
76*08b48e0bSAndroid Build Coastguard Worker ".corpus_found%s:%u|g\n" METRIC_PREFIX \
77*08b48e0bSAndroid Build Coastguard Worker ".corpus_imported%s:%u|g\n" METRIC_PREFIX \
78*08b48e0bSAndroid Build Coastguard Worker ".max_depth%s:%u|g\n" METRIC_PREFIX ".cur_item%s:%u|g\n" METRIC_PREFIX \
79*08b48e0bSAndroid Build Coastguard Worker ".pending_favs%s:%u|g\n" METRIC_PREFIX \
80*08b48e0bSAndroid Build Coastguard Worker ".pending_total%s:%u|g\n" METRIC_PREFIX \
81*08b48e0bSAndroid Build Coastguard Worker ".corpus_variable%s:%u|g\n" METRIC_PREFIX \
82*08b48e0bSAndroid Build Coastguard Worker ".saved_crashes%s:%llu|g\n" METRIC_PREFIX \
83*08b48e0bSAndroid Build Coastguard Worker ".saved_hangs%s:%llu|g\n" METRIC_PREFIX \
84*08b48e0bSAndroid Build Coastguard Worker ".total_crashes%s:%llu|g\n" METRIC_PREFIX \
85*08b48e0bSAndroid Build Coastguard Worker ".slowest_exec_ms%s:%u|g\n" METRIC_PREFIX \
86*08b48e0bSAndroid Build Coastguard Worker ".edges_found%s:%u|g\n" METRIC_PREFIX \
87*08b48e0bSAndroid Build Coastguard Worker ".var_byte_count%s:%u|g\n" METRIC_PREFIX ".havoc_expansion%s:%u|g\n"
88*08b48e0bSAndroid Build Coastguard Worker
statsd_setup_format(afl_state_t * afl)89*08b48e0bSAndroid Build Coastguard Worker void statsd_setup_format(afl_state_t *afl) {
90*08b48e0bSAndroid Build Coastguard Worker
91*08b48e0bSAndroid Build Coastguard Worker if (afl->afl_env.afl_statsd_tags_flavor &&
92*08b48e0bSAndroid Build Coastguard Worker strcmp(afl->afl_env.afl_statsd_tags_flavor, "dogstatsd") == 0) {
93*08b48e0bSAndroid Build Coastguard Worker
94*08b48e0bSAndroid Build Coastguard Worker afl->statsd_tags_format = DOGSTATSD_TAGS_FORMAT;
95*08b48e0bSAndroid Build Coastguard Worker afl->statsd_metric_format = STATSD_TAGS_SUFFIX_METRICS;
96*08b48e0bSAndroid Build Coastguard Worker afl->statsd_metric_format_type = STATSD_TAGS_TYPE_SUFFIX;
97*08b48e0bSAndroid Build Coastguard Worker
98*08b48e0bSAndroid Build Coastguard Worker } else if (afl->afl_env.afl_statsd_tags_flavor &&
99*08b48e0bSAndroid Build Coastguard Worker
100*08b48e0bSAndroid Build Coastguard Worker strcmp(afl->afl_env.afl_statsd_tags_flavor, "librato") == 0) {
101*08b48e0bSAndroid Build Coastguard Worker
102*08b48e0bSAndroid Build Coastguard Worker afl->statsd_tags_format = LIBRATO_TAGS_FORMAT;
103*08b48e0bSAndroid Build Coastguard Worker afl->statsd_metric_format = STATSD_TAGS_MID_METRICS;
104*08b48e0bSAndroid Build Coastguard Worker afl->statsd_metric_format_type = STATSD_TAGS_TYPE_MID;
105*08b48e0bSAndroid Build Coastguard Worker
106*08b48e0bSAndroid Build Coastguard Worker } else if (afl->afl_env.afl_statsd_tags_flavor &&
107*08b48e0bSAndroid Build Coastguard Worker
108*08b48e0bSAndroid Build Coastguard Worker strcmp(afl->afl_env.afl_statsd_tags_flavor, "influxdb") == 0) {
109*08b48e0bSAndroid Build Coastguard Worker
110*08b48e0bSAndroid Build Coastguard Worker afl->statsd_tags_format = INFLUXDB_TAGS_FORMAT;
111*08b48e0bSAndroid Build Coastguard Worker afl->statsd_metric_format = STATSD_TAGS_MID_METRICS;
112*08b48e0bSAndroid Build Coastguard Worker afl->statsd_metric_format_type = STATSD_TAGS_TYPE_MID;
113*08b48e0bSAndroid Build Coastguard Worker
114*08b48e0bSAndroid Build Coastguard Worker } else if (afl->afl_env.afl_statsd_tags_flavor &&
115*08b48e0bSAndroid Build Coastguard Worker
116*08b48e0bSAndroid Build Coastguard Worker strcmp(afl->afl_env.afl_statsd_tags_flavor, "signalfx") == 0) {
117*08b48e0bSAndroid Build Coastguard Worker
118*08b48e0bSAndroid Build Coastguard Worker afl->statsd_tags_format = SIGNALFX_TAGS_FORMAT;
119*08b48e0bSAndroid Build Coastguard Worker afl->statsd_metric_format = STATSD_TAGS_MID_METRICS;
120*08b48e0bSAndroid Build Coastguard Worker afl->statsd_metric_format_type = STATSD_TAGS_TYPE_MID;
121*08b48e0bSAndroid Build Coastguard Worker
122*08b48e0bSAndroid Build Coastguard Worker } else {
123*08b48e0bSAndroid Build Coastguard Worker
124*08b48e0bSAndroid Build Coastguard Worker // No tags at all.
125*08b48e0bSAndroid Build Coastguard Worker afl->statsd_tags_format = "";
126*08b48e0bSAndroid Build Coastguard Worker // Still need to pick a format. Doesn't change anything since if will be
127*08b48e0bSAndroid Build Coastguard Worker // replaced by the empty string anyway.
128*08b48e0bSAndroid Build Coastguard Worker afl->statsd_metric_format = STATSD_TAGS_MID_METRICS;
129*08b48e0bSAndroid Build Coastguard Worker afl->statsd_metric_format_type = STATSD_TAGS_TYPE_MID;
130*08b48e0bSAndroid Build Coastguard Worker
131*08b48e0bSAndroid Build Coastguard Worker }
132*08b48e0bSAndroid Build Coastguard Worker
133*08b48e0bSAndroid Build Coastguard Worker }
134*08b48e0bSAndroid Build Coastguard Worker
statsd_socket_init(afl_state_t * afl)135*08b48e0bSAndroid Build Coastguard Worker int statsd_socket_init(afl_state_t *afl) {
136*08b48e0bSAndroid Build Coastguard Worker
137*08b48e0bSAndroid Build Coastguard Worker /* Default port and host.
138*08b48e0bSAndroid Build Coastguard Worker Will be overwritten by AFL_STATSD_PORT and AFL_STATSD_HOST environment
139*08b48e0bSAndroid Build Coastguard Worker variable, if they exists.
140*08b48e0bSAndroid Build Coastguard Worker */
141*08b48e0bSAndroid Build Coastguard Worker u16 port = STATSD_DEFAULT_PORT;
142*08b48e0bSAndroid Build Coastguard Worker char *host = STATSD_DEFAULT_HOST;
143*08b48e0bSAndroid Build Coastguard Worker
144*08b48e0bSAndroid Build Coastguard Worker if (afl->afl_env.afl_statsd_port) {
145*08b48e0bSAndroid Build Coastguard Worker
146*08b48e0bSAndroid Build Coastguard Worker port = atoi(afl->afl_env.afl_statsd_port);
147*08b48e0bSAndroid Build Coastguard Worker
148*08b48e0bSAndroid Build Coastguard Worker }
149*08b48e0bSAndroid Build Coastguard Worker
150*08b48e0bSAndroid Build Coastguard Worker if (afl->afl_env.afl_statsd_host) { host = afl->afl_env.afl_statsd_host; }
151*08b48e0bSAndroid Build Coastguard Worker
152*08b48e0bSAndroid Build Coastguard Worker int sock;
153*08b48e0bSAndroid Build Coastguard Worker if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
154*08b48e0bSAndroid Build Coastguard Worker
155*08b48e0bSAndroid Build Coastguard Worker FATAL("Failed to create socket");
156*08b48e0bSAndroid Build Coastguard Worker
157*08b48e0bSAndroid Build Coastguard Worker }
158*08b48e0bSAndroid Build Coastguard Worker
159*08b48e0bSAndroid Build Coastguard Worker memset(&afl->statsd_server, 0, sizeof(afl->statsd_server));
160*08b48e0bSAndroid Build Coastguard Worker afl->statsd_server.sin_family = AF_INET;
161*08b48e0bSAndroid Build Coastguard Worker afl->statsd_server.sin_port = htons(port);
162*08b48e0bSAndroid Build Coastguard Worker
163*08b48e0bSAndroid Build Coastguard Worker struct addrinfo *result;
164*08b48e0bSAndroid Build Coastguard Worker struct addrinfo hints;
165*08b48e0bSAndroid Build Coastguard Worker
166*08b48e0bSAndroid Build Coastguard Worker memset(&hints, 0, sizeof(struct addrinfo));
167*08b48e0bSAndroid Build Coastguard Worker hints.ai_family = AF_INET;
168*08b48e0bSAndroid Build Coastguard Worker hints.ai_socktype = SOCK_DGRAM;
169*08b48e0bSAndroid Build Coastguard Worker
170*08b48e0bSAndroid Build Coastguard Worker if ((getaddrinfo(host, NULL, &hints, &result))) {
171*08b48e0bSAndroid Build Coastguard Worker
172*08b48e0bSAndroid Build Coastguard Worker FATAL("Fail to getaddrinfo");
173*08b48e0bSAndroid Build Coastguard Worker
174*08b48e0bSAndroid Build Coastguard Worker }
175*08b48e0bSAndroid Build Coastguard Worker
176*08b48e0bSAndroid Build Coastguard Worker memcpy(&(afl->statsd_server.sin_addr),
177*08b48e0bSAndroid Build Coastguard Worker &((struct sockaddr_in *)result->ai_addr)->sin_addr,
178*08b48e0bSAndroid Build Coastguard Worker sizeof(struct in_addr));
179*08b48e0bSAndroid Build Coastguard Worker freeaddrinfo(result);
180*08b48e0bSAndroid Build Coastguard Worker
181*08b48e0bSAndroid Build Coastguard Worker return sock;
182*08b48e0bSAndroid Build Coastguard Worker
183*08b48e0bSAndroid Build Coastguard Worker }
184*08b48e0bSAndroid Build Coastguard Worker
statsd_send_metric(afl_state_t * afl)185*08b48e0bSAndroid Build Coastguard Worker int statsd_send_metric(afl_state_t *afl) {
186*08b48e0bSAndroid Build Coastguard Worker
187*08b48e0bSAndroid Build Coastguard Worker char buff[MAX_STATSD_PACKET_SIZE] = {0};
188*08b48e0bSAndroid Build Coastguard Worker
189*08b48e0bSAndroid Build Coastguard Worker /* afl->statsd_sock is set once in the initialisation of afl-fuzz and reused
190*08b48e0bSAndroid Build Coastguard Worker each time If the sendto later fail, we reset it to 0 to be able to recreates
191*08b48e0bSAndroid Build Coastguard Worker it.
192*08b48e0bSAndroid Build Coastguard Worker */
193*08b48e0bSAndroid Build Coastguard Worker if (!afl->statsd_sock) {
194*08b48e0bSAndroid Build Coastguard Worker
195*08b48e0bSAndroid Build Coastguard Worker afl->statsd_sock = statsd_socket_init(afl);
196*08b48e0bSAndroid Build Coastguard Worker if (!afl->statsd_sock) {
197*08b48e0bSAndroid Build Coastguard Worker
198*08b48e0bSAndroid Build Coastguard Worker WARNF("Cannot create socket");
199*08b48e0bSAndroid Build Coastguard Worker return -1;
200*08b48e0bSAndroid Build Coastguard Worker
201*08b48e0bSAndroid Build Coastguard Worker }
202*08b48e0bSAndroid Build Coastguard Worker
203*08b48e0bSAndroid Build Coastguard Worker }
204*08b48e0bSAndroid Build Coastguard Worker
205*08b48e0bSAndroid Build Coastguard Worker statsd_format_metric(afl, buff, MAX_STATSD_PACKET_SIZE);
206*08b48e0bSAndroid Build Coastguard Worker if (sendto(afl->statsd_sock, buff, strlen(buff), 0,
207*08b48e0bSAndroid Build Coastguard Worker (struct sockaddr *)&afl->statsd_server,
208*08b48e0bSAndroid Build Coastguard Worker sizeof(afl->statsd_server)) == -1) {
209*08b48e0bSAndroid Build Coastguard Worker
210*08b48e0bSAndroid Build Coastguard Worker if (!close(afl->statsd_sock)) { PFATAL("Cannot close socket"); }
211*08b48e0bSAndroid Build Coastguard Worker afl->statsd_sock = 0;
212*08b48e0bSAndroid Build Coastguard Worker WARNF("Cannot sendto");
213*08b48e0bSAndroid Build Coastguard Worker return -1;
214*08b48e0bSAndroid Build Coastguard Worker
215*08b48e0bSAndroid Build Coastguard Worker }
216*08b48e0bSAndroid Build Coastguard Worker
217*08b48e0bSAndroid Build Coastguard Worker return 0;
218*08b48e0bSAndroid Build Coastguard Worker
219*08b48e0bSAndroid Build Coastguard Worker }
220*08b48e0bSAndroid Build Coastguard Worker
statsd_format_metric(afl_state_t * afl,char * buff,size_t bufflen)221*08b48e0bSAndroid Build Coastguard Worker int statsd_format_metric(afl_state_t *afl, char *buff, size_t bufflen) {
222*08b48e0bSAndroid Build Coastguard Worker
223*08b48e0bSAndroid Build Coastguard Worker char tags[MAX_TAG_LEN * 2] = {0};
224*08b48e0bSAndroid Build Coastguard Worker if (afl->statsd_tags_format) {
225*08b48e0bSAndroid Build Coastguard Worker
226*08b48e0bSAndroid Build Coastguard Worker snprintf(tags, MAX_TAG_LEN * 2, afl->statsd_tags_format, afl->sync_id,
227*08b48e0bSAndroid Build Coastguard Worker VERSION);
228*08b48e0bSAndroid Build Coastguard Worker
229*08b48e0bSAndroid Build Coastguard Worker }
230*08b48e0bSAndroid Build Coastguard Worker
231*08b48e0bSAndroid Build Coastguard Worker /* Sends multiple metrics with one UDP Packet.
232*08b48e0bSAndroid Build Coastguard Worker bufflen will limit to the max safe size.
233*08b48e0bSAndroid Build Coastguard Worker */
234*08b48e0bSAndroid Build Coastguard Worker if (afl->statsd_metric_format_type == STATSD_TAGS_TYPE_SUFFIX) {
235*08b48e0bSAndroid Build Coastguard Worker
236*08b48e0bSAndroid Build Coastguard Worker snprintf(
237*08b48e0bSAndroid Build Coastguard Worker buff, bufflen, afl->statsd_metric_format,
238*08b48e0bSAndroid Build Coastguard Worker afl->queue_cycle ? (afl->queue_cycle - 1) : 0, tags,
239*08b48e0bSAndroid Build Coastguard Worker afl->cycles_wo_finds, tags, afl->fsrv.total_execs, tags,
240*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.total_execs /
241*08b48e0bSAndroid Build Coastguard Worker ((double)(get_cur_time() + afl->prev_run_time - afl->start_time) /
242*08b48e0bSAndroid Build Coastguard Worker 1000),
243*08b48e0bSAndroid Build Coastguard Worker tags, afl->queued_items, tags, afl->queued_favored, tags,
244*08b48e0bSAndroid Build Coastguard Worker afl->queued_discovered, tags, afl->queued_imported, tags,
245*08b48e0bSAndroid Build Coastguard Worker afl->max_depth, tags, afl->current_entry, tags, afl->pending_favored,
246*08b48e0bSAndroid Build Coastguard Worker tags, afl->pending_not_fuzzed, tags, afl->queued_variable, tags,
247*08b48e0bSAndroid Build Coastguard Worker afl->saved_crashes, tags, afl->saved_hangs, tags, afl->total_crashes,
248*08b48e0bSAndroid Build Coastguard Worker tags, afl->slowest_exec_ms, tags,
249*08b48e0bSAndroid Build Coastguard Worker count_non_255_bytes(afl, afl->virgin_bits), tags, afl->var_byte_count,
250*08b48e0bSAndroid Build Coastguard Worker tags, afl->expand_havoc, tags);
251*08b48e0bSAndroid Build Coastguard Worker
252*08b48e0bSAndroid Build Coastguard Worker } else if (afl->statsd_metric_format_type == STATSD_TAGS_TYPE_MID) {
253*08b48e0bSAndroid Build Coastguard Worker
254*08b48e0bSAndroid Build Coastguard Worker snprintf(
255*08b48e0bSAndroid Build Coastguard Worker buff, bufflen, afl->statsd_metric_format, tags,
256*08b48e0bSAndroid Build Coastguard Worker afl->queue_cycle ? (afl->queue_cycle - 1) : 0, tags,
257*08b48e0bSAndroid Build Coastguard Worker afl->cycles_wo_finds, tags, afl->fsrv.total_execs, tags,
258*08b48e0bSAndroid Build Coastguard Worker afl->fsrv.total_execs /
259*08b48e0bSAndroid Build Coastguard Worker ((double)(get_cur_time() + afl->prev_run_time - afl->start_time) /
260*08b48e0bSAndroid Build Coastguard Worker 1000),
261*08b48e0bSAndroid Build Coastguard Worker tags, afl->queued_items, tags, afl->queued_favored, tags,
262*08b48e0bSAndroid Build Coastguard Worker afl->queued_discovered, tags, afl->queued_imported, tags,
263*08b48e0bSAndroid Build Coastguard Worker afl->max_depth, tags, afl->current_entry, tags, afl->pending_favored,
264*08b48e0bSAndroid Build Coastguard Worker tags, afl->pending_not_fuzzed, tags, afl->queued_variable, tags,
265*08b48e0bSAndroid Build Coastguard Worker afl->saved_crashes, tags, afl->saved_hangs, tags, afl->total_crashes,
266*08b48e0bSAndroid Build Coastguard Worker tags, afl->slowest_exec_ms, tags,
267*08b48e0bSAndroid Build Coastguard Worker count_non_255_bytes(afl, afl->virgin_bits), tags, afl->var_byte_count,
268*08b48e0bSAndroid Build Coastguard Worker tags, afl->expand_havoc);
269*08b48e0bSAndroid Build Coastguard Worker
270*08b48e0bSAndroid Build Coastguard Worker }
271*08b48e0bSAndroid Build Coastguard Worker
272*08b48e0bSAndroid Build Coastguard Worker return 0;
273*08b48e0bSAndroid Build Coastguard Worker
274*08b48e0bSAndroid Build Coastguard Worker }
275*08b48e0bSAndroid Build Coastguard Worker
276