diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-08-12 18:18:26 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2013-08-12 18:34:11 +0200 |
commit | 78de22fd21b348fc00dde6fa0bfec73abb8fd651 (patch) | |
tree | 1efa14c85f33648a05fb2927ff3dcaf12724ed23 | |
parent | d351a2403c5946d07ae6e6b6e075ff9896c6bcb6 (diff) | |
download | fastd-78de22fd21b348fc00dde6fa0bfec73abb8fd651.tar fastd-78de22fd21b348fc00dde6fa0bfec73abb8fd651.zip |
Improve interface name handling
-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; |