d69b2ced288a7e77e2311390e197b2c20c90545e
1 /* strongSwan charon launcher
2 * Copyright (C) 2001-2002 Mathieu Lafon - Arkoon Network Security
3 * Copyright (C) 2006 Martin Willi - Hochschule fuer Technik Rapperswil
5 * Ported from invokepluto.c to fit charons needs.
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 #include <sys/types.h>
30 #include "../pluto/constants.h"
31 #include "../pluto/defs.h"
32 #include "../pluto/log.h"
35 #include "invokecharon.h"
38 static int _charon_pid
= 0;
39 static int _stop_requested
;
42 starter_charon_pid(void)
48 starter_charon_sigchild(pid_t pid
)
50 if (pid
== _charon_pid
)
55 plog("charon has died -- restart scheduled (%dsec)"
56 , CHARON_RESTART_DELAY
);
57 alarm(CHARON_RESTART_DELAY
); // restart in 5 sec
59 unlink(CHARON_PID_FILE
);
64 starter_stop_charon (void)
74 /* be more and more aggressive */
75 for (i
= 0; i
< 20 && (pid
= _charon_pid
) != 0; i
++)
84 plog("starter_stop_charon(): charon does not respond, sending KILL");
92 plog("starter_stop_charon(): can't stop charon !!!");
97 plog("stater_stop_charon(): charon is not started...");
104 starter_start_charon (starter_config_t
*cfg
, bool debug
)
108 char buffer
[BUF_LEN
], buffer1
[BUF_LEN
];
111 CHARON_CMD
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
112 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
113 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
114 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
119 arg
[argc
++] = "--use-syslog";
121 if (cfg
->setup
.cachecrls
)
123 arg
[argc
++] = "--cachecrls";
125 if (cfg
->setup
.crlcheckinterval
> 0)
127 snprintf(buffer1
, BUF_LEN
, "%u", cfg
->setup
.crlcheckinterval
);
128 arg
[argc
++] = "--crlcheckinterval";
129 arg
[argc
++] = buffer1
;
132 { /* parse debug string */
133 char *pos
, *level
, *buf_pos
, type
[4];
134 pos
= cfg
->setup
.charondebug
;
136 while (pos
&& sscanf(pos
, "%4s %d,", type
, &level
) == 2)
138 snprintf(buf_pos
, buffer
+ sizeof(buffer
) - buf_pos
, "--debug-%s", type
);
139 arg
[argc
++] = buf_pos
;
140 buf_pos
+= strlen(buf_pos
) + 1;
141 if (buf_pos
>= buffer
+ sizeof(buffer
))
145 snprintf(buf_pos
, buffer
+ sizeof(buffer
) - buf_pos
, "%d", level
);
146 arg
[argc
++] = buf_pos
;
147 buf_pos
+= strlen(buf_pos
) + 1;
148 if (buf_pos
>= buffer
+ sizeof(buffer
))
154 pos
= strchr(pos
, ',');
164 plog("starter_start_charon(): charon already started...");
169 unlink(CHARON_CTL_FILE
);
172 /* if ipsec.secrets file is missing then generate RSA default key pair */
173 if (stat(SECRETS_FILE
, &stb
) != 0)
178 plog("no %s file, generating RSA key", SECRETS_FILE
);
181 system("ipsec scepclient --out pkcs1 --out cert-self --quiet");
185 /* ipsec.secrets is root readable only */
186 oldmask
= umask(0066);
188 f
= fopen(SECRETS_FILE
, "w");
191 fprintf(f
, "# /etc/ipsec.secrets - strongSwan IPsec secrets file\n");
193 fprintf(f
, ": RSA myKey.der\n");
196 chown(SECRETS_FILE
, IPSEC_UID
, IPSEC_GID
);
204 plog("can't fork(): %s", strerror(errno
));
209 sigprocmask(SIG_SETMASK
, 0, NULL
);
210 /* disable glibc's malloc checker, conflicts with leak detective */
211 setenv("MALLOC_CHECK_", "0", 1);
213 plog("can't execv(%s,...): %s", arg
[0], strerror(errno
));
218 for (i
= 0; i
< 50 && _charon_pid
; i
++)
220 /* wait for charon */
222 if (stat(CHARON_PID_FILE
, &stb
) == 0)
225 DBG_log("charon (%d) started", _charon_pid
)
232 /* If charon is started but with no ctl file, stop it */
233 plog("charon too long to start... - kill kill");
234 for (i
= 0; i
< 20 && (pid
= _charon_pid
) != 0; i
++)
247 plog("charon refused to be started");