#include "config.h"
#include "winrc/win_svc.h"
#include "winrc/w_inst.h"
#include "daemon/daemon.h"
#include "daemon/worker.h"
#include "daemon/remote.h"
#include "util/config_file.h"
#include "util/netevent.h"
#include "util/winsock_event.h"
Functions | |
static void | report_status (DWORD state, DWORD exitcode, DWORD wait) |
Report current service status to service control manager. | |
static void | hdlr (DWORD ctrl) |
Service control handler. | |
static void | reportev (const char *str) |
report event to system event log For use during startup and shutdown. | |
static char * | lookup_reg_str (const char *key, const char *name) |
Obtain registry string (if it exists). | |
static int | lookup_reg_int (const char *key, const char *name) |
Obtain registry integer (if it exists). | |
static int | service_init (int r, struct daemon **d, struct config_file **c) |
Init service. | |
static void | service_deinit (struct daemon *daemon, struct config_file *cfg) |
Deinit the service. | |
static void | service_main (DWORD argc, LPTSTR *argv) |
The main function for the service. | |
static void | service_start (const char *cfgfile, int v, int c) |
start the service | |
void | wsvc_command_option (const char *wopt, const char *cfgfile, int v, int c) |
Handle commandline service for windows. | |
void | worker_win_stop_cb (int fd, short ev, void *arg) |
windows worker stop event callback handler | |
static void | waitforit (PROCESS_INFORMATION *pinfo) |
wait for cron process to finish | |
static void * | win_do_cron (void *arg) |
Do the cron action and wait for result exit value. | |
static void | set_cron_timer () |
Set the timer for cron for the next wake up. | |
void | wsvc_cron_cb (void *arg) |
windows cron timer callback handler | |
void | wsvc_setup_worker (struct worker *worker) |
Setup lead worker events. | |
void | wsvc_desetup_worker (struct worker *worker) |
Desetup lead worker events. | |
Variables | |
static SERVICE_STATUS | service_status |
global service status | |
static SERVICE_STATUS_HANDLE | service_status_handle |
global service status handle | |
static WSAEVENT | service_stop_event = NULL |
global service stop event | |
static struct event | service_stop_ev |
event struct for stop callbacks | |
static int | service_stop_shutdown = 0 |
if stop even means shutdown or restart | |
static char * | service_cfgfile = CONFIGFILE |
config file to open. | |
static int | service_cmdline_verbose = 0 |
commandline verbosity. | |
static struct comm_timer * | service_cron = NULL |
the cron callback | |
static ub_thread_t | cron_thread = NULL |
the cron thread | |
static int | cron_was_quick = 0 |
if cron has already done its quick check |
This means it handles the commandline switches to install and remove the service (via CreateService and DeleteService), it handles the ServiceMain() main service entry point when started as a service, and it handles the Handler[_ex]() to process requests to the service (such as start and stop and status).
static void report_status | ( | DWORD | state, | |
DWORD | exitcode, | |||
DWORD | wait | |||
) | [static] |
Report current service status to service control manager.
state,: | current state | |
exitcode,: | error code (when stopped) | |
wait,: | pending operation estimated time in milliseconds. |
References service_status, and service_status_handle.
Referenced by hdlr(), service_init(), and service_main().
static void hdlr | ( | DWORD | ctrl | ) | [static] |
Service control handler.
Called by serviceControlManager when a control code is sent to the service (with ControlService).
ctrl,: | control code |
References log_err(), report_status(), service_status, service_stop_event, and service_stop_shutdown.
Referenced by service_main().
static void reportev | ( | const char * | str | ) | [static] |
report event to system event log For use during startup and shutdown.
str,: | the error |
References MSG_GENERIC_ERR, SERVICE_NAME, and wsvc_err2str().
Referenced by lookup_reg_int(), lookup_reg_str(), service_main(), and service_start().
static char* lookup_reg_str | ( | const char * | key, | |
const char * | name | |||
) | [static] |
Obtain registry string (if it exists).
key,: | key string | |
name,: | name of value to fetch. |
References reportev().
Referenced by service_init(), and win_do_cron().
static int lookup_reg_int | ( | const char * | key, | |
const char * | name | |||
) | [static] |
Obtain registry integer (if it exists).
key,: | key string | |
name,: | name of value to fetch. |
References reportev().
Referenced by set_cron_timer().
static int service_init | ( | int | r, | |
struct daemon ** | d, | |||
struct config_file ** | c | |||
) | [static] |
Init service.
Keeps calling status pending to tell service control manager that this process is not hanging.
r,: | restart, true on restart | |
d,: | daemon returned here. | |
c,: | config file returned here. |
References daemon::chroot, config_file::chrootdir, config_create(), config_delete(), config_read(), daemon_apply_cfg(), daemon_delete(), daemon_init(), daemon_open_shared_ports(), daemon_remote_create(), config_file::directory, fatal_exit(), log_err(), log_init(), log_warn(), config_file::logfile, lookup_reg_str(), daemon::rc, report_status(), service_cfgfile, service_cmdline_verbose, config_file::use_syslog, VERB_QUERY, verbose(), config_file::verbosity, and verbosity.
Referenced by service_main().
static void service_main | ( | DWORD | argc, | |
LPTSTR * | argv | |||
) | [static] |
The main function for the service.
Called by the services API when starting unbound on windows in background. Arguments could have been present in the string 'path'.
argc,: | nr args | |
argv,: | arg text. |
References config_delete(), daemon_cleanup(), daemon_fork(), hdlr(), log_err(), report_status(), reportev(), service_cfgfile, service_deinit(), service_init(), SERVICE_NAME, service_status, service_status_handle, service_stop_event, service_stop_shutdown, VERB_ALGO, VERB_QUERY, and verbose().
Referenced by service_start().
void wsvc_command_option | ( | const char * | wopt, | |
const char * | cfgfile, | |||
int | v, | |||
int | c | |||
) |
Handle commandline service for windows.
wopt,: | windows option string (install, remove, service). | |
cfgfile,: | configfile to open (default or passed with -c). | |
v,: | amount of commandline verbosity added with -v. | |
c,: | true if cfgfile was set by commandline -c option. |
References fatal_exit(), log_assert, service_start(), wsvc_install(), and wsvc_remove().
void wsvc_setup_worker | ( | struct worker * | worker | ) |
Setup lead worker events.
References worker::base, comm_base_internal(), comm_timer_create(), fatal_exit(), service_stop_ev, service_stop_event, set_cron_timer(), worker_win_stop_cb(), and wsvc_cron_cb().
void wsvc_desetup_worker | ( | struct worker * | worker | ) |
char* service_cfgfile = CONFIGFILE [static] |
config file to open.
global communication to service_main()
Referenced by service_init(), service_main(), and service_start().
int service_cmdline_verbose = 0 [static] |
commandline verbosity.
global communication to service_main()
Referenced by service_init(), and service_start().