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
17 * RCSID $Id: invokecharon.c $
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
++)
87 plog("starter_stop_charon(): can't stop charon !!!");
92 plog("stater_stop_charon(): charon is not started...");
99 starter_start_charon (starter_config_t
*cfg
, bool debug
)
103 char buffer
[BUF_LEN
], buffer1
[BUF_LEN
];
106 CHARON_CMD
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
107 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
108 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
,
109 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
114 arg
[argc
++] = "--use-syslog";
116 if (cfg
->setup
.strictcrlpolicy
)
118 arg
[argc
++] = "--strictcrlpolicy";
119 arg
[argc
++] = cfg
->setup
.strictcrlpolicy
== STRICT_IFURI ?
"2":"1";
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
;
131 if (cfg
->setup
.eapdir
)
133 arg
[argc
++] = "--eapdir";
134 arg
[argc
++] = cfg
->setup
.eapdir
;
137 { /* parse debug string */
138 char *pos
, *level
, *buf_pos
, type
[4];
139 pos
= cfg
->setup
.charondebug
;
141 while (pos
&& sscanf(pos
, "%4s %d,", type
, &level
) == 2)
143 snprintf(buf_pos
, buffer
+ sizeof(buffer
) - buf_pos
, "--debug-%s", type
);
144 arg
[argc
++] = buf_pos
;
145 buf_pos
+= strlen(buf_pos
) + 1;
146 if (buf_pos
>= buffer
+ sizeof(buffer
))
150 snprintf(buf_pos
, buffer
+ sizeof(buffer
) - buf_pos
, "%d", level
);
151 arg
[argc
++] = buf_pos
;
152 buf_pos
+= strlen(buf_pos
) + 1;
153 if (buf_pos
>= buffer
+ sizeof(buffer
))
159 pos
= strchr(pos
, ',');
169 plog("starter_start_charon(): charon already started...");
174 unlink(CHARON_CTL_FILE
);
177 /* if ipsec.secrets file is missing then generate RSA default key pair */
178 if (stat(SECRETS_FILE
, &stb
) != 0)
183 plog("no %s file, generating RSA key", SECRETS_FILE
);
184 system("ipsec scepclient --out pkcs1 --out cert-self --quiet");
186 /* ipsec.secrets is root readable only */
187 oldmask
= umask(0066);
189 f
= fopen(SECRETS_FILE
, "w");
192 fprintf(f
, "# /etc/ipsec.secrets - strongSwan IPsec secrets file\n");
194 fprintf(f
, ": RSA myKey.der\n");
204 plog("can't fork(): %s", strerror(errno
));
209 sigprocmask(SIG_SETMASK
, 0, NULL
);
211 plog("can't execv(%s,...): %s", arg
[0], strerror(errno
));
216 for (i
= 0; i
< 50 && _charon_pid
; i
++)
218 /* wait for charon */
220 if (stat(CHARON_PID_FILE
, &stb
) == 0)
223 DBG_log("charon (%d) started", _charon_pid
)
230 /* If charon is started but with no ctl file, stop it */
231 plog("charon too long to start... - kill kill");
232 for (i
= 0; i
< 20 && (pid
= _charon_pid
) != 0; i
++)
245 plog("charon refused to be started");