This repository has been archived on 2022-02-10. You can view files and clone it, but cannot push or open issues or pull requests.
fortuna/main.cpp
surtur a3daa722da
All checks were successful
continuous-integration/drone/push Build is passing
chore: print info msgs to stderr
2022-02-03 00:37:20 +01:00

99 lines
2.3 KiB
C++

#include "fortuna.h"
#include <fmt/core.h>
#include <chrono>
#include <csignal>
#include <cstdlib>
#include <exception>
#include <memory>
#include <thread>
#include <unistd.h>
namespace chance {
static constexpr const bool AUTOSTOP{false};
const std::unique_ptr<fortuna::Fortuna> f{std::make_unique<fortuna::Fortuna>()};
auto sigint_handler(int sig_n) -> void {
assert(sig_n == 2);
std::atomic<unsigned int> madness{100000};
try {
constexpr auto madmsg{"HAHA no not ending on SIGINT, send a SIGTERM"};
while (madness-- > 0) {
fmt::print(stderr, "{:<{}}\n", madmsg, 16);
}
}
catch (std::exception& e) {
fmt::print(
stderr, "[!] bailing, something (bad) happened: {}\n", e.what());
throw;
}
}
auto sigterm_handler(int sig_n) -> void {
assert(sig_n == 15);
try {
constexpr auto news{" BREAKING NEWS "};
fmt::print(stderr, "\n\n{:*^{}}\n\n", news, 79);
fmt::print(stderr,
"[i] main: received signal {} (SIGTERM)\n\tpid: {}\n\twill "
"attempt to stop\n",
sig_n,
getpid());
if (f) {
f->stop_running();
}
else {
throw("fortuna pointer is invalid");
}
}
catch (std::exception& e) {
fmt::print(
stderr, "[!] bailing, something (bad) happened: {}\n", e.what());
throw;
}
}
} // namespace chance
int main() {
fmt::print(stderr, "[*] doing evil stuff\n");
signal(SIGTERM, chance::sigterm_handler);
signal(SIGINT, chance::sigint_handler);
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
try {
using std::chrono_literals::operator""ms;
chance::f->random_data(4); // number of bytes requested
std::this_thread::sleep_for(7777ms); // enough time for p0 == 64
chance::f->random_data(4);
std::this_thread::sleep_for(120ms);
chance::f->random_data(3);
chance::f->random_data(3);
std::this_thread::sleep_for(10ms);
chance::f->random_data(3);
std::this_thread::sleep_for(5000ms);
chance::f->random_data(30);
std::this_thread::sleep_for(5000ms);
chance::f->random_data(30);
std::this_thread::sleep_for(2000ms);
if (chance::AUTOSTOP) {
auto err{chance::f->stop_running()};
if (err) {
fmt::print(stderr, "[!] ERROR: failed to stop Fortuna!\n");
throw std::runtime_error("failed to stop Fortuna nicely");
}
}
}
catch (std::exception& e) {
fmt::print(stderr, "[!] exiting due to \"{}\"\n", e.what());
exit(EXIT_FAILURE);
}
return 0;
}