44 |
static sigjmp_buf timeout; |
static sigjmp_buf timeout; |
45 |
|
|
46 |
/* Private Prototypes */ |
/* Private Prototypes */ |
47 |
|
static void mark_dependants(Process_T); |
48 |
|
static void depend_validate(Process_T, int); |
49 |
static void do_validate(Process_T); |
static void do_validate(Process_T); |
50 |
static void do_restart(Process_T, char *, ...) ; |
static void do_restart(Process_T, char *, ...) ; |
51 |
static void do_start(Process_T, char *, ...) ; |
static void do_start(Process_T, char *, ...) ; |
81 |
|
|
82 |
/* ---------------------------------------------------------------- Public */ |
/* ---------------------------------------------------------------- Public */ |
83 |
|
|
|
|
|
|
/** |
|
|
* Walk the process-list and validate each process |
|
|
*/ |
|
84 |
void validate() { |
void validate() { |
85 |
|
|
86 |
Process_T p; |
Process_T p; |
87 |
|
|
88 |
if ( ! update_loadavg() ) { |
if ( ! update_loadavg() ) { |
90 |
log("Update of loadavg has failed!\n"); |
log("Update of loadavg has failed!\n"); |
91 |
|
|
92 |
} |
} |
93 |
|
|
94 |
for (p= processlist; p; p= p->next) { |
for (p= processlist; p; p= p->next) { |
95 |
|
|
96 |
do_validate(p); |
p->do_depend_validate= TRUE; |
97 |
|
|
98 |
|
} |
99 |
|
|
100 |
|
for (p= processlist; p; p= p->next) { |
101 |
|
|
102 |
|
if (p->dependantlist != NULL) { |
103 |
|
mark_dependants(p); |
104 |
|
} |
105 |
|
|
106 |
|
} |
107 |
|
|
108 |
|
for (p= processlist; p; p= p->next) { |
109 |
|
|
110 |
|
depend_validate(p, p->do_depend_validate); |
111 |
|
|
112 |
} |
} |
|
|
|
113 |
} |
} |
114 |
|
|
115 |
|
|
116 |
|
|
117 |
|
|
118 |
/* --------------------------------------------------------------- Private */ |
/* --------------------------------------------------------------- Private */ |
119 |
|
|
120 |
|
void mark_dependants(Process_T p) { |
121 |
|
|
122 |
|
Dependant_T d; |
123 |
|
|
124 |
|
for (d= p->dependantlist; d; d= p->dependantlist->next) { |
125 |
|
if (d->dependant == NULL) { |
126 |
|
break; |
127 |
|
} |
128 |
|
|
129 |
|
get_process(d->dependant)->do_depend_validate= FALSE; |
130 |
|
if (d->next == NULL) { |
131 |
|
break; |
132 |
|
} |
133 |
|
|
134 |
|
} |
135 |
|
|
136 |
|
} |
137 |
|
|
138 |
|
/** |
139 |
|
* Walk the process-list and validate each process |
140 |
|
*/ |
141 |
|
void depend_validate(Process_T p, int depend_validate_flag) { |
142 |
|
|
143 |
|
Process_T dp; |
144 |
|
Dependant_T d; |
145 |
|
|
146 |
|
if (depend_validate_flag == FALSE) { |
147 |
|
return; |
148 |
|
} |
149 |
|
|
150 |
|
if (!do_not_validate(p)) { |
151 |
|
do_validate(p); |
152 |
|
} |
153 |
|
|
154 |
|
/* Now check dependants */ |
155 |
|
for (d= p->dependantlist; d; d= p->dependantlist->next) { |
156 |
|
if (d->dependant == NULL) { |
157 |
|
break; |
158 |
|
} else { |
159 |
|
dp= get_process(d->dependant); |
160 |
|
if (!do_not_validate(dp)) { |
161 |
|
depend_validate(dp, TRUE); |
162 |
|
if (d->next == NULL) { |
163 |
|
break; |
164 |
|
} |
165 |
|
} |
166 |
|
} |
167 |
|
} |
168 |
|
} |
169 |
|
|
170 |
/** |
/** |
171 |
* Validate the given process - If the process is not running, |
* Validate the given process - If the process is not running, |
183 |
sigset_t ns,os; |
sigset_t ns,os; |
184 |
char report[STRLEN]; |
char report[STRLEN]; |
185 |
|
|
|
|
|
|
/* First, check for pre-conditions */ |
|
|
if (do_not_validate(p)) return; |
|
|
|
|
186 |
/* Set a SIGTERM block */ |
/* Set a SIGTERM block */ |
187 |
sigemptyset(&ns); |
sigemptyset(&ns); |
188 |
sigaddset(&ns, SIGTERM); |
sigaddset(&ns, SIGTERM); |