#include <string.h>
#include <time.h>
#include <unistd.h>
+#include <math.h>
#include <vector>
-#include "client.h"
-#include "log.h"
#include "input.h"
#include "input_stats.h"
+#include "log.h"
#include "util.h"
using namespace std;
while (!should_stop()) {
int fd;
FILE *fp;
- vector<ClientStats> client_stats;
+ time_t now;
// Open a new, temporary file.
char *filename = strdup((stats_file + ".new.XXXXXX").c_str());
- fd = mkostemp(filename, O_WRONLY);
+ fd = mkostemp(filename, O_WRONLY | O_CLOEXEC);
if (fd == -1) {
log_perror(filename);
free(filename);
}
fp = fdopen(fd, "w");
- if (fp == NULL) {
+ if (fp == nullptr) {
log_perror("fdopen");
safe_close(fd);
if (unlink(filename) == -1) {
goto sleep;
}
+ now = time(nullptr);
for (size_t i = 0; i < inputs.size(); ++i) {
InputStats stats = inputs[i]->get_stats();
- fprintf(fp, "%s %llu %llu\n", stats.url.c_str(),
+ for (const char ch : stats.url) {
+ if (isspace(ch) || !isprint(ch)) {
+ putc('_', fp);
+ } else {
+ putc(ch, fp);
+ }
+ }
+ fprintf(fp, " %llu %llu",
(long long unsigned)(stats.bytes_received),
(long long unsigned)(stats.data_bytes_received));
+ if (stats.connect_time == -1) {
+ fprintf(fp, " -");
+ } else {
+ fprintf(fp, " %d", int(now - stats.connect_time));
+ }
+ fprintf(fp, " %llu", (long long unsigned)(stats.metadata_bytes_received));
+ if (!isfinite(stats.latency_sec)) {
+ fprintf(fp, " -");
+ } else {
+ fprintf(fp, " %.6f", stats.latency_sec);
+ }
+ fprintf(fp, "\n");
}
if (fclose(fp) == EOF) {
log_perror("fclose");