]>
Commit | Line | Data |
---|---|---|
064af421 | 1 | /* |
e0edde6f | 2 | * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. |
064af421 | 3 | * |
a14bc59f BP |
4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | * you may not use this file except in compliance with the License. | |
6 | * You may obtain a copy of the License at: | |
064af421 | 7 | * |
a14bc59f BP |
8 | * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * | |
10 | * Unless required by applicable law or agreed to in writing, software | |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | |
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
13 | * See the License for the specific language governing permissions and | |
14 | * limitations under the License. | |
064af421 BP |
15 | */ |
16 | ||
17 | #ifndef DAEMON_H | |
18 | #define DAEMON_H 1 | |
19 | ||
91a1e24d | 20 | #include <limits.h> |
064af421 BP |
21 | #include <stdbool.h> |
22 | #include <sys/types.h> | |
23 | ||
fda546bd GS |
24 | /* This file provides an interface for utilities to run in the background |
25 | * as daemons on POSIX platforms like Linux or as services on Windows platform. | |
26 | * Some of the functionalities defined in this file are only applicable to | |
27 | * POSIX platforms and some are applicable only on Windows. As such, the | |
28 | * function definitions unique to each platform are separated out with | |
29 | * ifdef macros. More descriptive comments on individual functions are provided | |
3834bcf2 | 30 | * in daemon-unix.c (for POSIX platforms) and daemon-windows.c (for Windows). |
fda546bd GS |
31 | |
32 | * The DAEMON_OPTION_ENUMS, DAEMON_LONG_OPTIONS and DAEMON_OPTION_HANDLERS | |
33 | * macros are useful for parsing command-line options in individual utilities. | |
4ec4776c GS |
34 | * For e.g., the command-line option "--monitor" is recognized on Linux |
35 | * and results in calling the daemon_set_monitor() function. The same option is | |
36 | * not recognized on Windows platform. | |
fda546bd GS |
37 | */ |
38 | ||
39 | #ifndef _WIN32 | |
8274ae95 BP |
40 | #define DAEMON_OPTION_ENUMS \ |
41 | OPT_DETACH, \ | |
81d2f75c | 42 | OPT_NO_SELF_CONFINEMENT, \ |
8274ae95 BP |
43 | OPT_NO_CHDIR, \ |
44 | OPT_OVERWRITE_PIDFILE, \ | |
45 | OPT_PIDFILE, \ | |
e91b927d AZ |
46 | OPT_MONITOR, \ |
47 | OPT_USER_GROUP | |
91a1e24d | 48 | |
e91b927d AZ |
49 | #define DAEMON_LONG_OPTIONS \ |
50 | {"detach", no_argument, NULL, OPT_DETACH}, \ | |
81d2f75c | 51 | {"no-self-confinement", no_argument, NULL, OPT_NO_SELF_CONFINEMENT}, \ |
e91b927d AZ |
52 | {"no-chdir", no_argument, NULL, OPT_NO_CHDIR}, \ |
53 | {"pidfile", optional_argument, NULL, OPT_PIDFILE}, \ | |
e3c17733 | 54 | {"overwrite-pidfile", no_argument, NULL, OPT_OVERWRITE_PIDFILE}, \ |
e91b927d AZ |
55 | {"monitor", no_argument, NULL, OPT_MONITOR}, \ |
56 | {"user", required_argument, NULL, OPT_USER_GROUP} | |
064af421 BP |
57 | |
58 | #define DAEMON_OPTION_HANDLERS \ | |
e7bd7d78 | 59 | case OPT_DETACH: \ |
064af421 BP |
60 | set_detach(); \ |
61 | break; \ | |
62 | \ | |
81d2f75c AA |
63 | case OPT_NO_SELF_CONFINEMENT: \ |
64 | daemon_disable_self_confinement(); \ | |
65 | break; \ | |
66 | \ | |
91a1e24d JP |
67 | case OPT_NO_CHDIR: \ |
68 | set_no_chdir(); \ | |
69 | break; \ | |
70 | \ | |
e7bd7d78 | 71 | case OPT_PIDFILE: \ |
064af421 BP |
72 | set_pidfile(optarg); \ |
73 | break; \ | |
74 | \ | |
e7bd7d78 | 75 | case OPT_OVERWRITE_PIDFILE: \ |
064af421 | 76 | ignore_existing_pidfile(); \ |
ff8decf1 BP |
77 | break; \ |
78 | \ | |
79 | case OPT_MONITOR: \ | |
80 | daemon_set_monitor(); \ | |
e91b927d AZ |
81 | break; \ |
82 | \ | |
83 | case OPT_USER_GROUP: \ | |
84 | daemon_set_new_user(optarg); \ | |
064af421 BP |
85 | break; |
86 | ||
fda546bd GS |
87 | void set_detach(void); |
88 | void daemon_set_monitor(void); | |
91a1e24d | 89 | void set_no_chdir(void); |
fda546bd GS |
90 | void ignore_existing_pidfile(void); |
91 | pid_t read_pidfile(const char *name); | |
92 | #else | |
4ec4776c GS |
93 | #define DAEMON_OPTION_ENUMS \ |
94 | OPT_DETACH, \ | |
81d2f75c | 95 | OPT_NO_SELF_CONFINEMENT, \ |
fd9164cd | 96 | OPT_NO_CHDIR, \ |
a9e9db79 | 97 | OPT_PIDFILE, \ |
4ec4776c GS |
98 | OPT_PIPE_HANDLE, \ |
99 | OPT_SERVICE, \ | |
f9280ca7 GS |
100 | OPT_SERVICE_MONITOR, \ |
101 | OPT_USER_GROUP | |
fda546bd | 102 | |
4ec4776c GS |
103 | #define DAEMON_LONG_OPTIONS \ |
104 | {"detach", no_argument, NULL, OPT_DETACH}, \ | |
117ec423 | 105 | {"no-self-confinement", no_argument, NULL, OPT_NO_SELF_CONFINEMENT}, \ |
fd9164cd | 106 | {"no-chdir", no_argument, NULL, OPT_NO_CHDIR}, \ |
a9e9db79 | 107 | {"pidfile", optional_argument, NULL, OPT_PIDFILE}, \ |
4ec4776c GS |
108 | {"pipe-handle", required_argument, NULL, OPT_PIPE_HANDLE}, \ |
109 | {"service", no_argument, NULL, OPT_SERVICE}, \ | |
f9280ca7 | 110 | {"service-monitor", no_argument, NULL, OPT_SERVICE_MONITOR}, \ |
e91b927d | 111 | {"user", required_argument, NULL, OPT_USER_GROUP} |
fda546bd GS |
112 | |
113 | #define DAEMON_OPTION_HANDLERS \ | |
4ec4776c GS |
114 | case OPT_DETACH: \ |
115 | break; \ | |
116 | \ | |
81d2f75c AA |
117 | case OPT_NO_SELF_CONFINEMENT: \ |
118 | daemon_disable_self_confinement(); \ | |
119 | break; \ | |
120 | \ | |
fd9164cd GS |
121 | case OPT_NO_CHDIR: \ |
122 | break; \ | |
123 | \ | |
a9e9db79 GS |
124 | case OPT_PIDFILE: \ |
125 | set_pidfile(optarg); \ | |
126 | break; \ | |
127 | \ | |
4ec4776c GS |
128 | case OPT_PIPE_HANDLE: \ |
129 | set_pipe_handle(optarg); \ | |
130 | break; \ | |
131 | \ | |
fda546bd GS |
132 | case OPT_SERVICE: \ |
133 | break; \ | |
134 | \ | |
135 | case OPT_SERVICE_MONITOR: \ | |
e91b927d AZ |
136 | break; \ |
137 | \ | |
138 | case OPT_USER_GROUP: \ | |
f9280ca7 | 139 | daemon_set_new_user(optarg); |
fda546bd GS |
140 | |
141 | void control_handler(DWORD request); | |
4ec4776c | 142 | void set_pipe_handle(const char *pipe_handle); |
fda546bd GS |
143 | #endif /* _WIN32 */ |
144 | ||
eb077b26 | 145 | bool get_detach(void); |
7d0c5973 | 146 | void daemon_save_fd(int fd); |
064af421 | 147 | void daemonize(void); |
e91b927d | 148 | void daemonize_start(bool access_datapath); |
95440284 | 149 | void daemonize_complete(void); |
e91b927d AZ |
150 | void daemon_set_new_user(const char * user_spec); |
151 | void daemon_become_new_user(bool access_datapath); | |
064af421 | 152 | void daemon_usage(void); |
81d2f75c AA |
153 | void daemon_disable_self_confinement(void); |
154 | bool daemon_should_self_confine(void); | |
fda546bd GS |
155 | void service_start(int *argcp, char **argvp[]); |
156 | void service_stop(void); | |
157 | bool should_service_stop(void); | |
a9e9db79 | 158 | void set_pidfile(const char *name); |
d6bc33f3 | 159 | void close_standard_fds(void); |
8aee05cc | 160 | |
064af421 | 161 | #endif /* daemon.h */ |