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);