diff options
-rw-r--r-- | src/config.c | 5 | ||||
-rw-r--r-- | src/tuntap.c | 37 |
2 files changed, 24 insertions, 18 deletions
diff --git a/src/config.c b/src/config.c index 8ad4f72..5ed7bc3 100644 --- a/src/config.c +++ b/src/config.c @@ -609,6 +609,11 @@ void fastd_configure(fastd_context_t *ctx, fastd_config_t *conf, int argc, char if (conf->generate_key || conf->show_key) return; + if (conf->ifname) { + if (strchr(conf->ifname, '/')) + exit_error(ctx, "config error: invalid interface name"); + } + if (conf->mode == MODE_TUN) { if (!conf->peers || conf->peers->next) exit_error(ctx, "config error: in TUN mode exactly one peer must be configured"); diff --git a/src/tuntap.c b/src/tuntap.c index bf0c49c..64633a8 100644 --- a/src/tuntap.c +++ b/src/tuntap.c @@ -157,22 +157,29 @@ void fastd_tuntap_open(fastd_context_t *ctx) { pr_debug(ctx, "initializing tun/tap device..."); char ifname[5+IFNAMSIZ] = "/dev/"; + const char *type; + + switch (ctx->conf->mode) { + case MODE_TAP: + type = "tap"; + break; + + case MODE_TUN: + type = "tun"; + break; + + default: + exit_bug(ctx, "invalid mode"); + } + if (ctx->conf->ifname) { + if (strncmp(ctx->conf->ifname, type, 3) != 0) + exit_error(ctx, "`%s' doesn't seem to be a %s device", ctx->conf->ifname, type); + strncat(ifname, ctx->conf->ifname, IFNAMSIZ-1); } else { - switch (ctx->conf->mode) { - case MODE_TAP: - strncat(ifname, "tap", IFNAMSIZ-1); - break; - - case MODE_TUN: - strncat(ifname, "tun", IFNAMSIZ-1); - break; - - default: - exit_bug(ctx, "invalid mode"); - } + strncat(ifname, type, IFNAMSIZ-1); } if ((ctx->tunfd = open(ifname, O_RDWR|O_CLOEXEC|O_NONBLOCK)) < 0) @@ -183,16 +190,10 @@ void fastd_tuntap_open(fastd_context_t *ctx) { switch (ctx->conf->mode) { case MODE_TAP: - if (strncmp(ctx->ifname, "tap", 3) != 0) - exit_error(ctx, "opened device doesn't seem to be a tap device"); - setup_tap(ctx); break; case MODE_TUN: - if (strncmp(ctx->ifname, "tun", 3) != 0) - exit_error(ctx, "opened device doesn't seem to be a tun device"); - setup_tun(ctx); break; |