#include "core/or/or.h"
#include "core/mainloop/netstatus.h"
#include "core/mainloop/mainloop.h"
#include "core/mainloop/mainloop_state_st.h"
#include "app/config/config.h"
#include "feature/hibernate/hibernate.h"
#include "app/config/or_state_st.h"
int
net_is_disabled(void)
{
return get_options()->DisableNetwork || we_are_hibernating();
}
int
net_is_completely_disabled(void)
{
return get_options()->DisableNetwork || we_are_fully_hibernating();
}
static time_t last_user_activity_seen = 0;
static bool participating_on_network = false;
void
note_user_activity(time_t now)
{
last_user_activity_seen = MAX(now, last_user_activity_seen);
if (! participating_on_network) {
log_notice(LD_GENERAL, "Tor is no longer dormant.");
set_network_participation(true);
schedule_rescan_periodic_events();
}
}
void
reset_user_activity(time_t now)
{
last_user_activity_seen = now;
}
time_t
get_last_user_activity_time(void)
{
return last_user_activity_seen;
}
void
set_network_participation(bool participation)
{
participating_on_network = participation;
}
bool
is_participating_on_network(void)
{
return participating_on_network;
}
void
netstatus_flush_to_state(mainloop_state_t *state, time_t now)
{
state->Dormant = ! participating_on_network;
if (participating_on_network) {
time_t sec_since_activity = MAX(0, now - last_user_activity_seen);
state->MinutesSinceUserActivity = (int)(sec_since_activity / 60);
} else {
state->MinutesSinceUserActivity = 0;
}
}
void
netstatus_load_from_state(const mainloop_state_t *state, time_t now)
{
time_t last_activity;
if (state->Dormant == -1) { if (get_options()->DormantOnFirstStartup) {
last_activity = 0;
participating_on_network = false;
} else {
last_activity = now;
participating_on_network = true;
}
} else if (state->Dormant) {
last_activity = 0;
participating_on_network = false;
} else {
last_activity = now - 60 * state->MinutesSinceUserActivity;
participating_on_network = true;
}
if (get_options()->DormantCanceledByStartup) {
last_activity = now;
participating_on_network = true;
}
if (! get_options()->DormantTimeoutEnabled) {
participating_on_network = true;
}
reset_user_activity(last_activity);
}
void
netstatus_note_clock_jumped(time_t seconds_diff)
{
time_t last_active = get_last_user_activity_time();
if (last_active)
reset_user_activity(last_active + seconds_diff);
}