unix/fiss

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

service.c (1738B) download


 1#include "service.h"
 2
 3#include <dirent.h>
 4#include <errno.h>
 5#include <limits.h>
 6#include <stdio.h>
 7#include <string.h>
 8#include <sys/stat.h>
 9#include <sys/wait.h>
10#include <unistd.h>
11
12
13struct service services[SV_SERVICE_MAX];
14int            services_size = 0;
15char           runlevel[SV_NAME_MAX];
16int            service_dir;
17const char*    service_dir_path;
18int            null_fd;
19bool           daemon_running;
20
21struct service* service_get(const char* name) {
22	for (int i = 0; i < services_size; i++) {
23		if (streq(services[i].name, name))
24			return &services[i];
25	}
26	return NULL;
27}
28
29int service_refresh_directory(void) {
30	DIR*            dp;
31	struct dirent*  ep;
32	struct stat     st;
33	struct service* s;
34
35	if ((dp = opendir(service_dir_path)) == NULL) {
36		fprint(1, "error: cannot open service directory: %r\n");
37		return -1;
38	}
39
40	for (int i = 0; i < services_size; i++) {
41		s = &services[i];
42		if (fstat(s->dir, &st) == -1 || !S_ISDIR(st.st_mode)) {
43			service_stop(s);
44			close(s->dir);
45			close(s->control);
46		}
47	}
48
49	while ((ep = readdir(dp)) != NULL) {
50		if (ep->d_name[0] == '.')
51			continue;
52
53		if (fstatat(service_dir, ep->d_name, &st, 0) == -1 || !S_ISDIR(st.st_mode))
54			continue;
55
56		service_register(service_dir, ep->d_name, false);
57	}
58
59	closedir(dp);
60
61	for (int i = 0; i < services_size; i++) {
62		services[i].children_size = 0;
63		services[i].parents_size  = 0;
64	}
65
66	for (int i = 0; i < services_size; i++)
67		service_update_dependency(&services[i]);
68
69	return 0;
70}
71
72
73bool service_need_restart(struct service* s) {
74	if (!daemon_running)
75		return false;
76
77	if (s->restart == S_RESTART)
78		return true;
79
80	for (int i = 0; i < s->parents_size; i++) {
81		if (service_need_restart(s->parents[i]))
82			return true;
83	}
84
85	return false;
86}