unix/fiss

src/fsvs/service.h in master
Repositories | Summary | Log | Files | LICENSE

service.h (4443B) download


  1#pragma once
  2
  3#include "../../config.h"
  4#include "types.h"
  5#include "util.h"
  6
  7#include <stdbool.h>
  8#include <stdint.h>
  9#include <time.h>
 10
 11
 12enum service_command {
 13	X_UP    = 'u',    // starts the services, pin as started
 14	X_DOWN  = 'd',    // stops the service, pin as stopped
 15	X_ONCE  = 'o',    // starts the service, pin as once
 16	X_TERM  = 't',    // same as down
 17	X_KILL  = 'k',    // sends kill, pin as stopped
 18	X_PAUSE = 'p',    // pauses the service
 19	X_CONT  = 'c',    // resumes the service
 20	X_RESET = 'r',    // resets the service
 21	X_ALARM = 'a',    // sends alarm
 22	X_HUP   = 'h',    // sends hup
 23	X_INT   = 'i',    // sends interrupt
 24	X_QUIT  = 'q',    // sends quit
 25	X_USR1  = '1',    // sends usr1
 26	X_USR2  = '2',    // sends usr2
 27	X_EXIT  = 'x',    // does nothing
 28};
 29
 30enum service_state {
 31	STATE_INACTIVE,             // not started
 32	STATE_SETUP,                // ./setup running
 33	STATE_STARTING,             // ./start running
 34	STATE_ACTIVE_FOREGROUND,    // ./run running
 35	STATE_ACTIVE_BACKGROUND,    // ./start finished, ./stop not called yet
 36	STATE_ACTIVE_DUMMY,         // dependencies started
 37	STATE_STOPPING,             // ./stop running
 38	STATE_FINISHING,            // ./finish running
 39	STATE_DONE,                 // ./stop finished
 40	STATE_ERROR,                // something went wrong
 41};
 42
 43enum service_exit {
 44	EXIT_NONE,        // never exited
 45	EXIT_NORMAL,      // exited
 46	EXIT_SIGNALED,    // crashed
 47};
 48
 49enum service_restart {
 50	S_DOWN,       // service should not be started
 51	S_ONCE,       // service should
 52	S_RESTART,    // service should be started
 53};
 54
 55struct service_serial {
 56	uint8_t status_change[8];
 57	uint8_t state;
 58	uint8_t return_code;
 59	uint8_t fail_count;
 60	uint8_t flags;
 61	uint8_t pid[4];
 62	uint8_t paused;
 63	uint8_t restart;
 64	uint8_t force_down;
 65	uint8_t state_runit;
 66};
 67
 68struct service {
 69	char                 name[NAME_MAX];    // name of service
 70	enum service_state   state;             // current state
 71	pid_t                pid;               // pid of run
 72	int                  dir;               // dirfd
 73	int                  control;           // fd to supervise/control
 74	time_t               state_change;      // last status change
 75	enum service_restart restart;           // should restart on exit
 76	enum service_exit    last_exit;         // stopped signaled or exited
 77	int                  return_code;       // return code or signal
 78	uint8_t              fail_count;        // current fail cound
 79	bool                 is_log_service;    // is a log service
 80	bool                 paused;            // is paused
 81	time_t               stop_timeout;      // stop start-time
 82	pipe_t               log_pipe;          // pipe for logging
 83	struct service*      log_service;       // has a log_server otherwise NULL
 84	int                  parents_size;      // count of service depending on
 85	struct service*      parents[10];       // service depending on
 86	int                  children_size;     // count of dependencies
 87	struct service*      children[10];      // dependencies
 88};
 89
 90extern struct service services[];
 91extern int            services_size;
 92extern int            null_fd;
 93extern bool           daemon_running;
 94extern const char*    service_dir_path;
 95extern int            service_dir;
 96
 97
 98void            service_encode(struct service* s, struct service_serial* buffer);
 99struct service* service_get(const char* name);
100void            service_handle_command(struct service* s, char command);
101void            service_handle_exit(struct service* s, bool signaled, int return_code);
102void            service_kill(struct service* s, int signal);
103bool            service_need_restart(struct service* s);
104int             service_refresh_directory(void);
105struct service* service_register(int dir, const char* name, bool is_log_service);
106void            service_run(struct service* s);
107int             service_send_command(char command, char extra, const char* service, struct service* response, int response_max);
108void            service_start(struct service* s);
109const char*     service_status_name(struct service* s);
110void            service_stop(struct service* s);
111int             service_supervise(const char* service_dir_, const char* service, bool once);
112void            service_update_dependency(struct service* s);
113bool            service_is_dependency(struct service* s);
114void            service_update_state(struct service* s, int state);
115void            service_write(struct service* s);