]>
git.ipfire.org Git - people/ms/strongswan.git/blob - src/starter/args.c
56b286bebb0106b781c3ce6188fdbce40ff86fe8
1 /* automatic handling of confread struct arguments
2 * Copyright (C) 2006 Andreas Steffen
3 * Hochschule fuer Technik Rapperswil, Switzerland
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 * RCSID $Id: args.c,v 1.9 2006/04/17 10:32:36 as Exp $
24 #include "../pluto/constants.h"
25 #include "../pluto/defs.h"
26 #include "../pluto/log.h"
47 /* various keyword lists */
49 static const char *LST_bool
[] = {
55 static const char *LST_sendcert
[] = {
64 static const char *LST_dpd_action
[] = {
72 static const char *LST_startup
[] = {
80 static const char *LST_packetdefault
[] = {
87 static const char *LST_keyexchange
[] = {
96 static const char *LST_pfsgroup
[] = {
107 static const char *LST_plutodebug
[] = {
125 static const char *LST_klipsdebug
[] = {
148 static const token_info_t token_info
[] =
150 /* config setup keywords */
151 { ARG_LST
, offsetof(starter_config_t
, setup
.interfaces
), NULL
},
152 { ARG_STR
, offsetof(starter_config_t
, setup
.dumpdir
), NULL
},
155 { ARG_LST
, offsetof(starter_config_t
, setup
.plutodebug
), LST_plutodebug
},
156 { ARG_STR
, offsetof(starter_config_t
, setup
.prepluto
), NULL
},
157 { ARG_STR
, offsetof(starter_config_t
, setup
.postpluto
), NULL
},
158 { ARG_ENUM
, offsetof(starter_config_t
, setup
.uniqueids
), LST_bool
},
159 { ARG_UINT
, offsetof(starter_config_t
, setup
.overridemtu
), NULL
},
160 { ARG_TIME
, offsetof(starter_config_t
, setup
.crlcheckinterval
), NULL
},
161 { ARG_ENUM
, offsetof(starter_config_t
, setup
.cachecrls
), LST_bool
},
162 { ARG_ENUM
, offsetof(starter_config_t
, setup
.strictcrlpolicy
), LST_bool
},
163 { ARG_ENUM
, offsetof(starter_config_t
, setup
.nocrsend
), LST_bool
},
164 { ARG_ENUM
, offsetof(starter_config_t
, setup
.nat_traversal
), LST_bool
},
165 { ARG_TIME
, offsetof(starter_config_t
, setup
.keep_alive
), NULL
},
166 { ARG_STR
, offsetof(starter_config_t
, setup
.virtual_private
), NULL
},
167 { ARG_STR
, offsetof(starter_config_t
, setup
.pkcs11module
), NULL
},
168 { ARG_ENUM
, offsetof(starter_config_t
, setup
.pkcs11keepstate
), LST_bool
},
169 { ARG_ENUM
, offsetof(starter_config_t
, setup
.pkcs11proxy
), LST_bool
},
172 { ARG_LST
, offsetof(starter_config_t
, setup
.klipsdebug
), LST_klipsdebug
},
173 { ARG_ENUM
, offsetof(starter_config_t
, setup
.fragicmp
), LST_bool
},
174 { ARG_STR
, offsetof(starter_config_t
, setup
.packetdefault
), LST_packetdefault
},
175 { ARG_ENUM
, offsetof(starter_config_t
, setup
.hidetos
), LST_bool
},
177 /* conn section keywords */
178 { ARG_STR
, offsetof(starter_conn_t
, name
), NULL
},
179 { ARG_ENUM
, offsetof(starter_conn_t
, startup
), LST_startup
},
180 { ARG_ENUM
, offsetof(starter_conn_t
, keyexchange
), LST_keyexchange
},
181 { ARG_MISC
, 0, NULL
/* KW_TYPE */ },
182 { ARG_MISC
, 0, NULL
/* KW_PFS */ },
183 { ARG_MISC
, 0, NULL
/* KW_COMPRESS */ },
184 { ARG_MISC
, 0, NULL
/* KW_AUTH */ },
185 { ARG_MISC
, 0, NULL
/* KW_AUTHBY */ },
186 { ARG_TIME
, offsetof(starter_conn_t
, sa_ike_life_seconds
), NULL
},
187 { ARG_TIME
, offsetof(starter_conn_t
, sa_ipsec_life_seconds
), NULL
},
188 { ARG_TIME
, offsetof(starter_conn_t
, sa_rekey_margin
), NULL
},
189 { ARG_ULNG
, offsetof(starter_conn_t
, sa_keying_tries
), NULL
},
190 { ARG_PCNT
, offsetof(starter_conn_t
, sa_rekey_fuzz
), NULL
},
191 { ARG_MISC
, 0, NULL
/* KW_REKEY */ },
192 { ARG_STR
, offsetof(starter_conn_t
, ike
), NULL
},
193 { ARG_STR
, offsetof(starter_conn_t
, esp
), NULL
},
194 { ARG_STR
, offsetof(starter_conn_t
, pfsgroup
), LST_pfsgroup
},
195 { ARG_TIME
, offsetof(starter_conn_t
, dpd_delay
), NULL
},
196 { ARG_TIME
, offsetof(starter_conn_t
, dpd_timeout
), NULL
},
197 { ARG_ENUM
, offsetof(starter_conn_t
, dpd_action
), LST_dpd_action
},
199 /* ca section keywords */
200 { ARG_STR
, offsetof(starter_ca_t
, name
), NULL
},
201 { ARG_ENUM
, offsetof(starter_ca_t
, startup
), LST_startup
},
202 { ARG_STR
, offsetof(starter_ca_t
, cacert
), NULL
},
203 { ARG_STR
, offsetof(starter_ca_t
, ldaphost
), NULL
},
204 { ARG_STR
, offsetof(starter_ca_t
, ldapbase
), NULL
},
205 { ARG_STR
, offsetof(starter_ca_t
, crluri
), NULL
},
206 { ARG_STR
, offsetof(starter_ca_t
, crluri2
), NULL
},
207 { ARG_STR
, offsetof(starter_ca_t
, ocspuri
), NULL
},
210 { ARG_MISC
, 0, NULL
/* KW_HOST */ },
211 { ARG_MISC
, 0, NULL
/* KW_NEXTHOP */ },
212 { ARG_MISC
, 0, NULL
/* KW_SUBNET */ },
213 { ARG_MISC
, 0, NULL
/* KW_SUBNETWITHIN */ },
214 { ARG_MISC
, 0, NULL
/* KW_PROTOPORT */ },
215 { ARG_MISC
, 0, NULL
/* KW_SOURCEIP */ },
216 { ARG_ENUM
, offsetof(starter_end_t
, firewall
), LST_bool
},
217 { ARG_ENUM
, offsetof(starter_end_t
, hostaccess
), LST_bool
},
218 { ARG_STR
, offsetof(starter_end_t
, updown
), NULL
},
219 { ARG_STR
, offsetof(starter_end_t
, id
), NULL
},
220 { ARG_STR
, offsetof(starter_end_t
, rsakey
), NULL
},
221 { ARG_STR
, offsetof(starter_end_t
, cert
), NULL
},
222 { ARG_ENUM
, offsetof(starter_end_t
, sendcert
), LST_sendcert
},
223 { ARG_STR
, offsetof(starter_end_t
, ca
), NULL
},
224 { ARG_STR
, offsetof(starter_end_t
, groups
), NULL
},
225 { ARG_STR
, offsetof(starter_end_t
, iface
), NULL
}
229 free_list(char **list
)
233 for (s
= list
; *s
; s
++)
239 new_list(char *value
)
241 char *val
, *b
, *e
, *end
, **ret
;
244 val
= value
? clone_str(value
, "list value") : NULL
;
247 end
= val
+ strlen(val
);
248 for (b
= val
, count
= 0; b
< end
;)
250 for (e
= b
; ((*e
!= ' ') && (*e
!= '\0')); e
++);
261 ret
= (char **)alloc_bytes((count
+1) * sizeof(char *), "list");
263 for (b
= val
, count
= 0; b
< end
; )
265 for (e
= b
; (*e
!= '\0'); e
++);
267 ret
[count
++] = clone_str(b
, "list value");
277 * assigns an argument value to a struct field
280 assign_arg(kw_token_t token
, kw_token_t first
, kw_list_t
*kw
, char *base
283 char *p
= base
+ token_info
[token
].offset
;
284 const char **list
= token_info
[token
].list
;
286 int index
= -1; /* used for enumeration arguments */
288 lset_t
*seen
= (lset_t
*)base
; /* seen flags are at the top of the struct */
289 lset_t f
= LELEM(token
- first
); /* compute flag position of argument */
294 DBG_log(" %s=%s", kw
->entry
->name
, kw
->value
)
299 plog("# duplicate '%s' option", kw
->entry
->name
);
303 /* set flag that this argument has been seen */
306 /* is there a keyword list? */
307 if (list
!= NULL
&& token_info
[token
].type
!= ARG_LST
)
311 while (*list
!= NULL
&& !match
)
314 match
= streq(kw
->value
, *list
++);
318 plog("# bad value: %s=%s", kw
->entry
->name
, kw
->value
);
323 switch (token_info
[token
].type
)
326 plog("# option '%s' not supported yet", kw
->entry
->name
);
334 plog("# bad enumeration value: %s=%s (%d)"
335 , kw
->entry
->name
, kw
->value
, index
);
345 u_int
*u
= (u_int
*)p
;
347 *u
= strtoul(kw
->value
, &endptr
, 10);
351 plog("# bad integer value: %s=%s", kw
->entry
->name
, kw
->value
);
360 unsigned long *l
= (unsigned long *)p
;
362 *l
= strtoul(kw
->value
, &endptr
, 10);
364 if (token_info
[token
].type
== ARG_ULNG
)
368 plog("# bad integer value: %s=%s", kw
->entry
->name
, kw
->value
);
374 if ((*endptr
!= '%') || (endptr
[1] != '\0') || endptr
== kw
->value
)
376 plog("# bad percent value: %s=%s", kw
->entry
->name
, kw
->value
);
386 time_t *t
= (time_t *)p
;
388 *t
= strtoul(kw
->value
, &endptr
, 10);
390 /* time in seconds? */
391 if (*endptr
== '\0' || (*endptr
== 's' && endptr
[1] == '\0'))
394 if (endptr
[1] == '\0')
396 if (*endptr
== 'm') /* time in minutes? */
401 if (*endptr
== 'h') /* time in hours? */
406 if (*endptr
== 'd') /* time in days? */
412 plog("# bad duration value: %s=%s", kw
->entry
->name
, kw
->value
);
417 char **cp
= (char **)p
;
419 /* free any existing string */
422 /* assign the new string */
423 *cp
= clone_str(kw
->value
, "str_value");
428 char ***listp
= (char ***)p
;
430 /* free any existing list */
434 /* create a new list and assign values */
435 *listp
= new_list(kw
->value
);
437 /* is there a keyword list? */
442 for (lst
= *listp
; lst
&& *lst
; lst
++)
446 list
= token_info
[token
].list
;
448 while (*list
!= NULL
&& !match
)
450 match
= streq(*lst
, *list
++);
454 plog("# bad value: %s=%s", kw
->entry
->name
, *lst
);
469 * frees all dynamically allocated arguments in a struct
472 free_args(kw_token_t first
, kw_token_t last
, char *base
)
476 for (token
= first
; token
<= last
; token
++)
478 char *p
= base
+ token_info
[token
].offset
;
480 switch (token_info
[token
].type
)
484 char **cp
= (char **)p
;
492 char ***listp
= (char ***)p
;
508 * clone all dynamically allocated arguments in a struct
511 clone_args(kw_token_t first
, kw_token_t last
, char *base1
, char *base2
)
515 for (token
= first
; token
<= last
; token
++)
517 if (token_info
[token
].type
== ARG_STR
)
519 char **cp1
= (char **)(base1
+ token_info
[token
].offset
);
520 char **cp2
= (char **)(base2
+ token_info
[token
].offset
);
522 *cp1
= clone_str(*cp2
, "cloned str");
528 cmp_list(char **list1
, char **list2
)
530 if ((list1
== NULL
) && (list2
== NULL
))
532 if ((list1
== NULL
) || (list2
== NULL
))
535 for ( ; *list1
&& *list2
; list1
++, list2
++)
537 if (strcmp(*list1
,*list2
) != 0)
541 if ((*list1
!= NULL
) || (*list2
!= NULL
))
548 * compare all arguments in a struct
551 cmp_args(kw_token_t first
, kw_token_t last
, char *base1
, char *base2
)
555 for (token
= first
; token
<= last
; token
++)
557 char *p1
= base1
+ token_info
[token
].offset
;
558 char *p2
= base2
+ token_info
[token
].offset
;
560 switch (token_info
[token
].type
)
573 u_int
*u1
= (u_int
*)p1
;
574 u_int
*u2
= (u_int
*)p2
;
583 unsigned long *l1
= (unsigned long *)p1
;
584 unsigned long *l2
= (unsigned long *)p2
;
592 time_t *t1
= (time_t *)p1
;
593 time_t *t2
= (time_t *)p2
;
601 char **cp1
= (char **)p1
;
602 char **cp2
= (char **)p2
;
604 if (*cp1
== NULL
&& *cp2
== NULL
)
606 if (*cp1
== NULL
|| *cp2
== NULL
|| strcmp(*cp1
, *cp2
) != 0)
612 char ***listp1
= (char ***)p1
;
613 char ***listp2
= (char ***)p2
;
615 if (!cmp_list(*listp1
, *listp2
))