/**
 * @file modules.h
 * @author Ambroz Bizjak <ambrop7@gmail.com>
 * 
 * @section LICENSE
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the author nor the
 *    names of its contributors may be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef BADVPN_NCD_MODULES_MODULES_H
#define BADVPN_NCD_MODULES_MODULES_H

#include <stddef.h>

#include <ncd/NCDModule.h>

extern const struct NCDModuleGroup ncdmodule_var;
extern const struct NCDModuleGroup ncdmodule_list;
extern const struct NCDModuleGroup ncdmodule_depend;
extern const struct NCDModuleGroup ncdmodule_multidepend;
extern const struct NCDModuleGroup ncdmodule_dynamic_depend;
extern const struct NCDModuleGroup ncdmodule_concat;
extern const struct NCDModuleGroup ncdmodule_if;
extern const struct NCDModuleGroup ncdmodule_strcmp;
extern const struct NCDModuleGroup ncdmodule_logical;
extern const struct NCDModuleGroup ncdmodule_sleep;
extern const struct NCDModuleGroup ncdmodule_print;
extern const struct NCDModuleGroup ncdmodule_blocker;
extern const struct NCDModuleGroup ncdmodule_spawn;
extern const struct NCDModuleGroup ncdmodule_imperative;
extern const struct NCDModuleGroup ncdmodule_ref;
extern const struct NCDModuleGroup ncdmodule_index;
extern const struct NCDModuleGroup ncdmodule_alias;
extern const struct NCDModuleGroup ncdmodule_process_manager;
extern const struct NCDModuleGroup ncdmodule_ondemand;
extern const struct NCDModuleGroup ncdmodule_foreach;
extern const struct NCDModuleGroup ncdmodule_choose;
extern const struct NCDModuleGroup ncdmodule_from_string;
extern const struct NCDModuleGroup ncdmodule_to_string;
extern const struct NCDModuleGroup ncdmodule_value;
extern const struct NCDModuleGroup ncdmodule_try;
extern const struct NCDModuleGroup ncdmodule_exit;
extern const struct NCDModuleGroup ncdmodule_getargs;
extern const struct NCDModuleGroup ncdmodule_arithmetic;
extern const struct NCDModuleGroup ncdmodule_parse;
extern const struct NCDModuleGroup ncdmodule_valuemetic;
extern const struct NCDModuleGroup ncdmodule_file;
extern const struct NCDModuleGroup ncdmodule_netmask;
extern const struct NCDModuleGroup ncdmodule_implode;
extern const struct NCDModuleGroup ncdmodule_call2;
extern const struct NCDModuleGroup ncdmodule_assert;
extern const struct NCDModuleGroup ncdmodule_explode;
extern const struct NCDModuleGroup ncdmodule_net_ipv4_addr_in_network;
extern const struct NCDModuleGroup ncdmodule_net_ipv6_addr_in_network;
extern const struct NCDModuleGroup ncdmodule_timer;
extern const struct NCDModuleGroup ncdmodule_file_open;
extern const struct NCDModuleGroup ncdmodule_backtrack;
extern const struct NCDModuleGroup ncdmodule_depend_scope;
extern const struct NCDModuleGroup ncdmodule_substr;
extern const struct NCDModuleGroup ncdmodule_log;
extern const struct NCDModuleGroup ncdmodule_getenv;
extern const struct NCDModuleGroup ncdmodule_basic_functions;
extern const struct NCDModuleGroup ncdmodule_objref;
#ifndef BADVPN_EMSCRIPTEN
extern const struct NCDModuleGroup ncdmodule_regex_match;
extern const struct NCDModuleGroup ncdmodule_run;
extern const struct NCDModuleGroup ncdmodule_runonce;
extern const struct NCDModuleGroup ncdmodule_daemon;
extern const struct NCDModuleGroup ncdmodule_net_backend_waitdevice;
extern const struct NCDModuleGroup ncdmodule_net_backend_waitlink;
extern const struct NCDModuleGroup ncdmodule_net_backend_badvpn;
extern const struct NCDModuleGroup ncdmodule_net_backend_wpa_supplicant;
#ifdef BADVPN_USE_LINUX_RFKILL
extern const struct NCDModuleGroup ncdmodule_net_backend_rfkill;
#endif
extern const struct NCDModuleGroup ncdmodule_net_up;
extern const struct NCDModuleGroup ncdmodule_net_dns;
extern const struct NCDModuleGroup ncdmodule_net_iptables;
extern const struct NCDModuleGroup ncdmodule_net_ipv4_addr;
extern const struct NCDModuleGroup ncdmodule_net_ipv4_route;
extern const struct NCDModuleGroup ncdmodule_net_ipv4_dhcp;
extern const struct NCDModuleGroup ncdmodule_net_ipv4_arp_probe;
extern const struct NCDModuleGroup ncdmodule_net_watch_interfaces;
extern const struct NCDModuleGroup ncdmodule_sys_watch_input;
extern const struct NCDModuleGroup ncdmodule_sys_watch_usb;
#ifdef BADVPN_USE_LINUX_INPUT
extern const struct NCDModuleGroup ncdmodule_sys_evdev;
#endif
#ifdef BADVPN_USE_INOTIFY
extern const struct NCDModuleGroup ncdmodule_sys_watch_directory;
#endif
extern const struct NCDModuleGroup ncdmodule_sys_request_server;
extern const struct NCDModuleGroup ncdmodule_net_ipv6_wait_dynamic_addr;
extern const struct NCDModuleGroup ncdmodule_sys_request_client;
extern const struct NCDModuleGroup ncdmodule_reboot;
extern const struct NCDModuleGroup ncdmodule_net_ipv6_addr;
extern const struct NCDModuleGroup ncdmodule_net_ipv6_route;
extern const struct NCDModuleGroup ncdmodule_socket;
extern const struct NCDModuleGroup ncdmodule_sys_start_process;
extern const struct NCDModuleGroup ncdmodule_load_module;
#endif

static const struct NCDModuleGroup *ncd_modules[] = {
    &ncdmodule_var,
    &ncdmodule_list,
    &ncdmodule_depend,
    &ncdmodule_multidepend,
    &ncdmodule_dynamic_depend,
    &ncdmodule_concat,
    &ncdmodule_if,
    &ncdmodule_strcmp,
    &ncdmodule_logical,
    &ncdmodule_sleep,
    &ncdmodule_print,
    &ncdmodule_blocker,
    &ncdmodule_spawn,
    &ncdmodule_imperative,
    &ncdmodule_ref,
    &ncdmodule_index,
    &ncdmodule_alias,
    &ncdmodule_process_manager,
    &ncdmodule_ondemand,
    &ncdmodule_foreach,
    &ncdmodule_choose,
    &ncdmodule_from_string,
    &ncdmodule_to_string,
    &ncdmodule_value,
    &ncdmodule_try,
    &ncdmodule_exit,
    &ncdmodule_getargs,
    &ncdmodule_arithmetic,
    &ncdmodule_parse,
    &ncdmodule_valuemetic,
    &ncdmodule_file,
    &ncdmodule_netmask,
    &ncdmodule_implode,
    &ncdmodule_call2,
    &ncdmodule_assert,
    &ncdmodule_explode,
    &ncdmodule_net_ipv4_addr_in_network,
    &ncdmodule_net_ipv6_addr_in_network,
    &ncdmodule_timer,
    &ncdmodule_file_open,
    &ncdmodule_backtrack,
    &ncdmodule_depend_scope,
    &ncdmodule_substr,
    &ncdmodule_log,
    &ncdmodule_getenv,
    &ncdmodule_basic_functions,
    &ncdmodule_objref,
#ifndef BADVPN_EMSCRIPTEN
    &ncdmodule_regex_match,
    &ncdmodule_run,
    &ncdmodule_runonce,
    &ncdmodule_daemon,
    &ncdmodule_net_backend_waitdevice,
    &ncdmodule_net_backend_waitlink,
    &ncdmodule_net_backend_badvpn,
    &ncdmodule_net_backend_wpa_supplicant,
#ifdef BADVPN_USE_LINUX_RFKILL
    &ncdmodule_net_backend_rfkill,
#endif
    &ncdmodule_net_up,
    &ncdmodule_net_dns,
    &ncdmodule_net_iptables,
    &ncdmodule_net_ipv4_addr,
    &ncdmodule_net_ipv4_route,
    &ncdmodule_net_ipv4_dhcp,
    &ncdmodule_net_ipv4_arp_probe,
    &ncdmodule_net_watch_interfaces,
    &ncdmodule_sys_watch_input,
    &ncdmodule_sys_watch_usb,
#ifdef BADVPN_USE_LINUX_INPUT
    &ncdmodule_sys_evdev,
#endif
#ifdef BADVPN_USE_INOTIFY
    &ncdmodule_sys_watch_directory,
#endif
    &ncdmodule_sys_request_server,
    &ncdmodule_net_ipv6_wait_dynamic_addr,
    &ncdmodule_sys_request_client,
    &ncdmodule_reboot,
    &ncdmodule_net_ipv6_addr,
    &ncdmodule_net_ipv6_route,
    &ncdmodule_socket,
    &ncdmodule_sys_start_process,
    &ncdmodule_load_module,
#endif
    NULL
};

#endif
