X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdaemon.h;h=a5f99d58f81da1698e261a911a676cbe5b437ce0;hb=fd9164cd5aa087e1acc671aad36d66b4ba267c34;hp=06280ac24c3dbf60d2874f1d64354a36d7f50306;hpb=58fda1dab104041fc693032475ec4662c1a52849;p=sliver-openvswitch.git diff --git a/lib/daemon.h b/lib/daemon.h index 06280ac24..a5f99d58f 100644 --- a/lib/daemon.h +++ b/lib/daemon.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,18 +21,35 @@ #include #include -enum { - OPT_DETACH = UCHAR_MAX + 2048, - OPT_NO_CHDIR, - OPT_OVERWRITE_PIDFILE, - OPT_PIDFILE, -}; +/* This file provides an interface for utilities to run in the background + * as daemons on POSIX platforms like Linux or as services on Windows platform. + * Some of the functionalities defined in this file are only applicable to + * POSIX platforms and some are applicable only on Windows. As such, the + * function definitions unique to each platform are separated out with + * ifdef macros. More descriptive comments on individual functions are provided + * in daemon.c (for Linux) and daemon-windows.c (for Windows). -#define DAEMON_LONG_OPTIONS \ - {"detach", no_argument, 0, OPT_DETACH}, \ - {"no-chdir", no_argument, 0, OPT_NO_CHDIR}, \ - {"pidfile", optional_argument, 0, OPT_PIDFILE}, \ - {"overwrite-pidfile", no_argument, 0, OPT_OVERWRITE_PIDFILE} + * The DAEMON_OPTION_ENUMS, DAEMON_LONG_OPTIONS and DAEMON_OPTION_HANDLERS + * macros are useful for parsing command-line options in individual utilities. + * For e.g., the command-line option "--monitor" is recognized on Linux + * and results in calling the daemon_set_monitor() function. The same option is + * not recognized on Windows platform. + */ + +#ifndef _WIN32 +#define DAEMON_OPTION_ENUMS \ + OPT_DETACH, \ + OPT_NO_CHDIR, \ + OPT_OVERWRITE_PIDFILE, \ + OPT_PIDFILE, \ + OPT_MONITOR + +#define DAEMON_LONG_OPTIONS \ + {"detach", no_argument, NULL, OPT_DETACH}, \ + {"no-chdir", no_argument, NULL, OPT_NO_CHDIR}, \ + {"pidfile", optional_argument, NULL, OPT_PIDFILE}, \ + {"overwrite-pidfile", no_argument, NULL, OPT_OVERWRITE_PIDFILE}, \ + {"monitor", no_argument, NULL, OPT_MONITOR} #define DAEMON_OPTION_HANDLERS \ case OPT_DETACH: \ @@ -49,19 +66,68 @@ enum { \ case OPT_OVERWRITE_PIDFILE: \ ignore_existing_pidfile(); \ + break; \ + \ + case OPT_MONITOR: \ + daemon_set_monitor(); \ break; -char *make_pidfile_name(const char *name); -void set_pidfile(const char *name); -const char *get_pidfile(void); -void set_no_chdir(void); -bool is_chdir_enabled(void); void set_detach(void); +void daemon_set_monitor(void); +void set_no_chdir(void); +void ignore_existing_pidfile(void); +pid_t read_pidfile(const char *name); +#else +#define DAEMON_OPTION_ENUMS \ + OPT_DETACH, \ + OPT_NO_CHDIR, \ + OPT_PIDFILE, \ + OPT_PIPE_HANDLE, \ + OPT_SERVICE, \ + OPT_SERVICE_MONITOR + +#define DAEMON_LONG_OPTIONS \ + {"detach", no_argument, NULL, OPT_DETACH}, \ + {"no-chdir", no_argument, NULL, OPT_NO_CHDIR}, \ + {"pidfile", optional_argument, NULL, OPT_PIDFILE}, \ + {"pipe-handle", required_argument, NULL, OPT_PIPE_HANDLE}, \ + {"service", no_argument, NULL, OPT_SERVICE}, \ + {"service-monitor", no_argument, NULL, OPT_SERVICE_MONITOR} + +#define DAEMON_OPTION_HANDLERS \ + case OPT_DETACH: \ + break; \ + \ + case OPT_NO_CHDIR: \ + break; \ + \ + case OPT_PIDFILE: \ + set_pidfile(optarg); \ + break; \ + \ + case OPT_PIPE_HANDLE: \ + set_pipe_handle(optarg); \ + break; \ + \ + case OPT_SERVICE: \ + break; \ + \ + case OPT_SERVICE_MONITOR: \ + break; + +void control_handler(DWORD request); +void set_pipe_handle(const char *pipe_handle); +#endif /* _WIN32 */ + bool get_detach(void); +void daemon_save_fd(int fd); void daemonize(void); -void die_if_already_running(void); -void ignore_existing_pidfile(void); +void daemonize_start(void); +void daemonize_complete(void); void daemon_usage(void); -pid_t read_pidfile(const char *name); +void service_start(int *argcp, char **argvp[]); +void service_stop(void); +bool should_service_stop(void); +void set_pidfile(const char *name); #endif /* daemon.h */