41
39
starter_pluto_pid(void)
47
45
starter_pluto_sigchild(pid_t pid)
49
if (pid == _pluto_pid)
47
if (pid == _pluto_pid)
54
plog("pluto has died -- restart scheduled (%dsec)"
55
, PLUTO_RESTART_DELAY);
56
alarm(PLUTO_RESTART_DELAY); // restart in 5 sec
52
plog("pluto has died -- restart scheduled (%dsec)"
53
, PLUTO_RESTART_DELAY);
54
alarm(PLUTO_RESTART_DELAY); // restart in 5 sec
56
unlink(PLUTO_PID_FILE);
58
unlink(PLUTO_PID_FILE);
63
61
starter_stop_pluto (void)
66
pid_t pid = _pluto_pid;
72
if (starter_whack_shutdown() == 0)
64
pid_t pid = _pluto_pid;
74
for (i = 0; i < 400; i++)
76
usleep(20000); /* sleep for 20 ms */
70
if (starter_whack_shutdown() == 0)
72
for (i = 0; i < 400; i++)
74
usleep(20000); /* sleep for 20 ms */
77
plog("pluto stopped after %d ms", 20*(i+1));
82
/* be more and more aggressive */
83
for (i = 0; i < 20 && (pid = _pluto_pid) != 0; i++)
93
plog("starter_stop_pluto(): pluto does not respond, sending KILL");
99
usleep(100000); /* sleep for 100 ms */
77
101
if (_pluto_pid == 0)
79
plog("pluto stopped after %d ms", 20*(i+1));
103
plog("pluto stopped after %d ms", 8000 + 100*i);
84
/* be more and more aggressive */
85
for (i = 0; i < 20 && (pid = _pluto_pid) != 0; i++)
95
plog("starter_stop_pluto(): pluto does not respond, sending KILL");
101
usleep(100000); /* sleep for 100 ms */
105
plog("pluto stopped after %d ms", 8000 + 100*i);
108
plog("starter_stop_pluto(): can't stop pluto !!!");
106
plog("starter_stop_pluto(): can't stop pluto !!!");
111
plog("stater_stop_pluto(): pluto is not started...");
113
plog("stater_stop_pluto(): pluto is not started...");
118
116
#define ADD_DEBUG(v) { \
119
for (l = cfg->setup.plutodebug; l && *l; l++) if (streq(*l, v)) \
120
arg[argc++] = "--debug-" v; \
117
for (l = cfg->setup.plutodebug; l && *l; l++) if (streq(*l, v)) \
118
arg[argc++] = "--debug-" v; \
124
starter_start_pluto (starter_config_t *cfg, bool no_fork)
122
starter_start_pluto (starter_config_t *cfg, bool no_fork, bool attach_gdb)
132
PLUTO_CMD, "--nofork"
133
, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
134
, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
135
, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
136
, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
139
printf ("starter_start_pluto entered\n");
141
if (cfg->setup.plutostderrlog || no_fork)
143
arg[argc++] = "--stderrlog";
145
if (cfg->setup.uniqueids)
147
arg[argc++] = "--uniqueids";
154
ADD_DEBUG("emitting")
156
ADD_DEBUG("lifecycle")
161
ADD_DEBUG("controlmore")
163
if (cfg->setup.crlcheckinterval > 0)
165
static char buf1[15];
167
arg[argc++] = "--crlcheckinterval";
168
snprintf(buf1, sizeof(buf1), "%u", cfg->setup.crlcheckinterval);
171
if (cfg->setup.cachecrls)
173
arg[argc++] = "--cachecrls";
175
if (cfg->setup.strictcrlpolicy)
177
arg[argc++] = "--strictcrlpolicy";
179
if (cfg->setup.nocrsend)
181
arg[argc++] = "--nocrsend";
183
if (cfg->setup.nat_traversal)
185
arg[argc++] = "--nat_traversal";
187
if (cfg->setup.force_keepalive)
189
arg[argc++] = "--force_keepalive";
191
if (cfg->setup.keep_alive)
193
static char buf2[15];
195
arg[argc++] = "--keep_alive";
196
snprintf(buf2, sizeof(buf2), "%u", cfg->setup.keep_alive);
199
if (cfg->setup.virtual_private)
201
arg[argc++] = "--virtual_private";
202
arg[argc++] = cfg->setup.virtual_private;
204
if (cfg->setup.pkcs11module)
206
arg[argc++] = "--pkcs11module";
207
arg[argc++] = cfg->setup.pkcs11module;
209
if (cfg->setup.pkcs11initargs)
211
arg[argc++] = "--pkcs11initargs";
212
arg[argc++] = cfg->setup.pkcs11initargs;
214
if (cfg->setup.pkcs11keepstate)
216
arg[argc++] = "--pkcs11keepstate";
218
if (cfg->setup.pkcs11proxy)
220
arg[argc++] = "--pkcs11proxy";
225
plog("starter_start_pluto(): pluto already started...");
130
PLUTO_CMD, "--nofork"
131
, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
132
, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
133
, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
134
, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
137
printf ("starter_start_pluto entered\n");
142
arg[argc++] = "/usr/bin/gdb";
143
arg[argc++] = "--args";
144
arg[argc++] = PLUTO_CMD;
145
arg[argc++] = "--nofork";
147
if (cfg->setup.plutostderrlog || no_fork)
149
arg[argc++] = "--stderrlog";
151
if (cfg->setup.uniqueids)
153
arg[argc++] = "--uniqueids";
160
ADD_DEBUG("emitting")
162
ADD_DEBUG("lifecycle")
167
ADD_DEBUG("controlmore")
169
if (cfg->setup.crlcheckinterval > 0)
171
static char buf1[15];
173
arg[argc++] = "--crlcheckinterval";
174
snprintf(buf1, sizeof(buf1), "%u", cfg->setup.crlcheckinterval);
177
if (cfg->setup.cachecrls)
179
arg[argc++] = "--cachecrls";
181
if (cfg->setup.strictcrlpolicy)
183
arg[argc++] = "--strictcrlpolicy";
185
if (cfg->setup.nocrsend)
187
arg[argc++] = "--nocrsend";
189
if (cfg->setup.nat_traversal)
191
arg[argc++] = "--nat_traversal";
193
if (cfg->setup.force_keepalive)
195
arg[argc++] = "--force_keepalive";
197
if (cfg->setup.keep_alive)
199
static char buf2[15];
201
arg[argc++] = "--keep_alive";
202
snprintf(buf2, sizeof(buf2), "%u", cfg->setup.keep_alive);
205
if (cfg->setup.virtual_private)
207
arg[argc++] = "--virtual_private";
208
arg[argc++] = cfg->setup.virtual_private;
210
if (cfg->setup.pkcs11module)
212
arg[argc++] = "--pkcs11module";
213
arg[argc++] = cfg->setup.pkcs11module;
215
if (cfg->setup.pkcs11initargs)
217
arg[argc++] = "--pkcs11initargs";
218
arg[argc++] = cfg->setup.pkcs11initargs;
220
if (cfg->setup.pkcs11keepstate)
222
arg[argc++] = "--pkcs11keepstate";
224
if (cfg->setup.pkcs11proxy)
226
arg[argc++] = "--pkcs11proxy";
231
plog("starter_start_pluto(): pluto already started...");
236
unlink(PLUTO_CTL_FILE);
239
if (cfg->setup.prepluto)
240
ignore_result(system(cfg->setup.prepluto));
246
plog("can't fork(): %s", strerror(errno));
250
if (cfg->setup.plutostderrlog)
252
int f = creat(cfg->setup.plutostderrlog, 00644);
254
/* redirect stderr to file */
257
plog("couldn't open stderr redirection file '%s'",
258
cfg->setup.plutostderrlog);
266
sigprocmask(SIG_SETMASK, 0, NULL);
267
/* disable glibc's malloc checker, conflicts with leak detective */
268
setenv("MALLOC_CHECK_", "0", 1);
270
plog("can't execv(%s,...): %s", arg[0], strerror(errno));
275
for (i = 0; i < 500 && _pluto_pid; i++)
277
/* wait for pluto for a maximum of 500 x 20 ms = 10 s */
279
if (stat(PLUTO_CTL_FILE, &stb) == 0)
281
plog("pluto (%d) started after %d ms", _pluto_pid, 20*(i+1));
282
if (cfg->setup.postpluto)
284
ignore_result(system(cfg->setup.postpluto));
291
/* If pluto is started but with no ctl file, stop it */
292
plog("pluto too long to start... - kill kill");
293
for (i = 0; i < 20 && (pid = _pluto_pid) != 0; i++)
303
usleep(20000); /* sleep for 20 ms */
308
plog("pluto refused to be started");
230
unlink(PLUTO_CTL_FILE);
233
if (cfg->setup.prepluto)
234
ignore_result(system(cfg->setup.prepluto));
240
plog("can't fork(): %s", strerror(errno));
244
if (cfg->setup.plutostderrlog)
246
int f = creat(cfg->setup.plutostderrlog, 00644);
248
/* redirect stderr to file */
251
plog("couldn't open stderr redirection file '%s'",
252
cfg->setup.plutostderrlog);
260
sigprocmask(SIG_SETMASK, 0, NULL);
262
plog("can't execv(%s,...): %s", arg[0], strerror(errno));
267
for (i = 0; i < 500 && _pluto_pid; i++)
269
/* wait for pluto for a maximum of 500 x 20 ms = 10 s */
271
if (stat(PLUTO_CTL_FILE, &stb) == 0)
273
plog("pluto (%d) started after %d ms", _pluto_pid, 20*(i+1));
274
if (cfg->setup.postpluto)
276
ignore_result(system(cfg->setup.postpluto));
283
/* If pluto is started but with no ctl file, stop it */
284
plog("pluto too long to start... - kill kill");
285
for (i = 0; i < 20 && (pid = _pluto_pid) != 0; i++)
295
usleep(20000); /* sleep for 20 ms */
300
plog("pluto refused to be started");