Skip to content

Instantly share code, notes, and snippets.

@nqn
Last active December 24, 2015 15:09
Show Gist options
  • Save nqn/6818064 to your computer and use it in GitHub Desktop.
Save nqn/6818064 to your computer and use it in GitHub Desktop.
split_stream.cpp
#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>
#include <vector>
struct split_stream_pair {
FILE* original_stream;
FILE* auxiliary_stream;
split_stream_pair(FILE* original_stream, FILE* auxiliary_stream) :
original_stream(original_stream),
auxiliary_stream(auxiliary_stream) { }
};
std::vector<split_stream_pair*> split_stream_pairs;
int split_stream_callback(void *cookie, const char *string, int bytes) {
split_stream_pair* pair = (split_stream_pair*)cookie;
if (!pair)
return 0;
fprintf(pair->original_stream, "%s", string);
fprintf(pair->auxiliary_stream, "%s", string);
syslog(LOG_WARNING, "%s", string);
return bytes;
}
FILE* split_stream(FILE* in, FILE* out) {
split_stream_pair* pair = new split_stream_pair(in, out);
split_stream_pairs.push_back(pair);
return fwopen((void*)pair, split_stream_callback);
}
void cleanup_split_streams() {
std::vector<split_stream_pair*>::iterator it = split_stream_pairs.begin();
for(; it != split_stream_pairs.end(); it++) {
split_stream_pair* pair = *it;
delete pair;
}
split_stream_pairs.clear();
}
int main(int argc, char** argv) {
FILE* out = fopen("out.txt", "w+");
FILE* split_stderr = split_stream(stderr, out);
fprintf(split_stderr, "%d + %d = %d\n", 2, 3, 5);
cleanup_split_streams();
fclose(split_stderr);
fclose(out);
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment