/*
 *  OpenVPN -- An application to securely tunnel IP networks
 *             over a single TCP/UDP port, with support for SSL/TLS-based
 *             session authentication and key exchange,
 *             packet encryption, packet authentication, and
 *             packet compression.
 *
 *  Copyright (C) 2002-2018 OpenVPN Inc <sales@openvpn.net>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2
 *  as published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef INIT_H
#define INIT_H

#include "openvpn.h"

/*
 * Baseline maximum number of events
 * to wait for.
 */
#define BASE_N_EVENTS 4

void context_clear(struct context *c);

void context_clear_1(struct context *c);

void context_clear_2(struct context *c);

void context_init_1(struct context *c);

void context_clear_all_except_first_time(struct context *c);

bool init_static(void);

void uninit_static(void);

#define IVM_LEVEL_1 (1<<0)
#define IVM_LEVEL_2 (1<<1)
void init_verb_mute(struct context *c, unsigned int flags);

void init_options_dev(struct options *options);

bool print_openssl_info(const struct options *options);

bool do_genkey(const struct options *options);

bool do_persist_tuntap(const struct options *options, openvpn_net_ctx_t *ctx);

bool possibly_become_daemon(const struct options *options);

void pre_setup(const struct options *options);

void init_instance_handle_signals(struct context *c, const struct env_set *env, const unsigned int flags);

void init_instance(struct context *c, const struct env_set *env, const unsigned int flags);

/**
 * Query for private key and auth-user-pass username/passwords.
 */
void init_query_passwords(const struct context *c);

void do_route(const struct options *options,
              struct route_list *route_list,
              struct route_ipv6_list *route_ipv6_list,
              const struct tuntap *tt,
              const struct plugin_list *plugins,
              struct env_set *es,
              openvpn_net_ctx_t *ctx);

void close_instance(struct context *c);

bool do_test_crypto(const struct options *o);

void context_gc_free(struct context *c);

bool do_up(struct context *c,
           bool pulled_options,
           unsigned int option_types_found);

unsigned int pull_permission_mask(const struct context *c);

const char *format_common_name(struct context *c, struct gc_arena *gc);

void reset_coarse_timers(struct context *c);

bool do_deferred_options(struct context *c, const unsigned int found);

void inherit_context_child(struct context *dest,
                           const struct context *src);

void inherit_context_top(struct context *dest,
                         const struct context *src);

#define CC_GC_FREE          (1<<0)
#define CC_USR1_TO_HUP      (1<<1)
#define CC_HARD_USR1_TO_HUP (1<<2)
#define CC_NO_CLOSE         (1<<3)

void close_context(struct context *c, int sig, unsigned int flags);

struct context_buffers *init_context_buffers(const struct frame *frame);

void free_context_buffers(struct context_buffers *b);

#define ISC_ERRORS (1<<0)
#define ISC_SERVER (1<<1)
void initialization_sequence_completed(struct context *c, const unsigned int flags);

#ifdef ENABLE_MANAGEMENT

void init_management(void);

bool open_management(struct context *c);

void close_management(void);

void management_show_net_callback(void *arg, const int msglevel);

#endif

void init_management_callback_p2p(struct context *c);

void uninit_management_callback(void);

#ifdef ENABLE_PLUGIN
void init_plugins(struct context *c);

void open_plugins(struct context *c, const bool import_options, int init_point);

#endif

void tun_abort(void);

void write_pid_file(const char *filename, const char *chroot_dir);
void remove_pid_file(void);

#endif /* ifndef INIT_H */
