aboutsummaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
authorEugene Grosbein <eugen@FreeBSD.org>2022-05-05 12:02:29 +0000
committerEugene Grosbein <eugen@FreeBSD.org>2022-05-05 12:02:29 +0000
commit0aef8628458a7d03e3c7e63ae05e228191167eec (patch)
treeb31dd9c0f259d9c298b0485612cb0e86313aa24f /sbin
parent9f580526e45a28fdfabe1aa58798ad3883690af0 (diff)
downloadsrc-0aef8628458a7d03e3c7e63ae05e228191167eec.tar.gz
src-0aef8628458a7d03e3c7e63ae05e228191167eec.zip
If setkey(8) is used without ipsec.ko loaded beforehand,
its attempt to install SA/SPD into the kernel results in cryptic EINVAL error code. Let it be a bit more user-friendly and try to load ipsec.ko automatically if it is not loaded, just like ifconfig(8) does it for modules it needs. PR: 263379 MFC after: 2 weeks
Diffstat (limited to 'sbin')
-rw-r--r--sbin/setkey/setkey.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/sbin/setkey/setkey.c b/sbin/setkey/setkey.c
index d556a842f048..faf6373b312e 100644
--- a/sbin/setkey/setkey.c
+++ b/sbin/setkey/setkey.c
@@ -34,6 +34,8 @@
#include <sys/types.h>
#include <sys/param.h>
+#include <sys/linker.h>
+#include <sys/module.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <err.h>
@@ -67,6 +69,7 @@ void shortdump_hdr(void);
void shortdump(struct sadb_msg *);
static void printdate(void);
static int32_t gmt2local(time_t);
+static int modload(const char *name);
#define MODE_SCRIPT 1
#define MODE_CMDDUMP 2
@@ -102,6 +105,17 @@ usage(void)
exit(1);
}
+static int
+modload(const char *name)
+{
+ if (modfind(name) < 0)
+ if (kldload(name) < 0 || modfind(name) < 0) {
+ warn("%s: module not found", name);
+ return 0;
+ }
+ return 1;
+}
+
int
main(int ac, char **av)
{
@@ -165,6 +179,7 @@ main(int ac, char **av)
}
}
+ modload("ipsec");
so = pfkey_open();
if (so < 0) {
perror("pfkey_open");