00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __WVDAEMON_H
00010 #define __WVDAEMON_H
00011
00012 #include "wvstring.h"
00013 #include "wvargs.h"
00014 #include "wvlog.h"
00015
00016 class WvDaemon;
00017
00018 typedef WvCallback<void, WvDaemon &, void *> WvDaemonCallback;
00019
00020 #ifdef WEAVER_CODENAME
00021 #ifdef WEAVER_VER_STRING
00022 #define WVDAEMON_DEFAULT_VERSION WEAVER_CODENAME ": " WEAVER_VER_STRING
00023 #else
00024 #define WVDAEMON_DEFAULT_VERSION WEAVER_CODENAME
00025 #endif
00026 #else
00027 #ifdef WEAVER_VER_STRING
00028 #define WVDAEMON_DEFAULT_VERSION WEAVER_VER_STRING
00029 #else
00030 #define WVDAEMON_DEFAULT_VERSION "(unknown version)"
00031 #endif
00032 #endif
00033
00099 class WvDaemon
00100 {
00101
00102 static WvDaemon *singleton;
00103
00104 public:
00105
00107 WvString name;
00108 WvString version;
00111 WvString pid_file;
00114 bool daemonize;
00115
00118 WvArgs args;
00120 WvLog log;
00121 WvLog::LogLevel log_level;
00122 bool syslog;
00123
00124 public:
00125
00127 WvDaemonCallback load_callback;
00128 WvDaemonCallback start_callback;
00129 WvDaemonCallback run_callback;
00130 WvDaemonCallback stop_callback;
00131 WvDaemonCallback unload_callback;
00132
00133 protected:
00134
00135 virtual void do_load();
00136 virtual void do_start();
00137 virtual void do_run();
00138 virtual void do_stop();
00139 virtual void do_unload();
00140
00141 private:
00142
00143 void *ud;
00144
00145 volatile bool _want_to_die;
00146 volatile bool _want_to_restart;
00147 volatile int _exit_status;
00148
00149 void init(WvStringParm _name,
00150 WvStringParm _version,
00151 WvDaemonCallback _start_callback,
00152 WvDaemonCallback _run_callback,
00153 WvDaemonCallback _stop_callback,
00154 void *_ud);
00155
00156 int _run(const char *argv0);
00157
00158 bool set_daemonize(void *);
00159
00160 protected:
00161
00162 bool dec_log_level(void *)
00163 {
00164 if ((int)log_level > (int)WvLog::Critical)
00165 log_level = (WvLog::LogLevel)((int)log_level - 1);
00166 return true;
00167 }
00168
00169 bool inc_log_level(void *)
00170 {
00171 if ((int)log_level < (int)WvLog::Debug5)
00172 log_level = (WvLog::LogLevel)((int)log_level + 1);
00173 return true;
00174 }
00175
00176 WvStringList _extra_args;
00177
00178 public:
00179
00182 WvDaemon(WvStringParm _name, WvStringParm _version,
00183 WvDaemonCallback _start_callback,
00184 WvDaemonCallback _run_callback,
00185 WvDaemonCallback _stop_callback,
00186 void *_ud = NULL) :
00187 log(_name, WvLog::Debug)
00188 {
00189 init(_name, _version, _start_callback, _run_callback, _stop_callback, _ud);
00190 }
00193 WvDaemon(WvStringParm _name,
00194 WvDaemonCallback _start_callback,
00195 WvDaemonCallback _run_callback,
00196 WvDaemonCallback _stop_callback,
00197 void *_ud = NULL) :
00198 log(_name, WvLog::Debug)
00199 {
00200 init(_name, WVDAEMON_DEFAULT_VERSION, _start_callback, _run_callback, _stop_callback, _ud);
00201 }
00202 virtual ~WvDaemon();
00203
00205 int run(const char *argv0);
00207 int run(int argc, char **argv);
00208
00210 void restart()
00211 {
00212 _want_to_restart = true;
00213 }
00215 void die(int status = 0)
00216 {
00217 _want_to_die = true;
00218 _exit_status = status;
00219 }
00220
00222 bool want_to_restart() const
00223 {
00224 return _want_to_restart;
00225 }
00227 bool want_to_die() const
00228 {
00229 return _want_to_die;
00230 }
00231
00233 bool should_run() const
00234 {
00235 return !_want_to_die && !_want_to_restart;
00236 }
00237
00239 const WvStringList &extra_args() const
00240 {
00241 return _extra_args;
00242 }
00243
00244 static WvDaemon *me()
00245 {
00246 return singleton;
00247 }
00248
00249 public:
00250 const char *wstype() const { return "WvDaemon"; }
00251 };
00252
00253 #endif // __WVDAEMON_H