aboutsummaryrefslogtreecommitdiff
path: root/src/proone-bne.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/proone-bne.c')
-rw-r--r--src/proone-bne.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/proone-bne.c b/src/proone-bne.c
index 89a5d7f..359b634 100644
--- a/src/proone-bne.c
+++ b/src/proone-bne.c
@@ -10,6 +10,7 @@
#include <fcntl.h>
#include <sys/stat.h>
#include <arpa/inet.h>
+#include <net/if.h>
#include <mbedtls/entropy.h>
@@ -41,6 +42,10 @@ struct {
struct {
struct {
+ char *addr;
+ uint32_t scope_id;
+ } arg;
+ struct {
uint8_t *m;
size_t l;
prne_cred_dict_t ctx;
@@ -102,6 +107,8 @@ static void init_g (void) {
}
static void free_g (void) {
+ prne_free(prog_g.arg.addr);
+ prog_g.arg.addr = NULL;
prne_free_llist(&prog_g.wkr_list);
mbedtls_ctr_drbg_free(&prog_g.ssl.ctr_drbg);
mbedtls_entropy_free(&prog_g.ssl.entropy);
@@ -143,6 +150,31 @@ static void load_str (char **dst, const char *str) {
}
}
+static bool load_addr (const char *addr) {
+ char *p;
+
+ prog_g.arg.addr = prne_redup_str(prog_g.arg.addr, addr);
+ prne_assert(prog_g.arg.addr != NULL);
+
+ p = strrchr(prog_g.arg.addr, '%');
+ if (p != NULL) {
+ *p = 0;
+ p += 1;
+ prog_g.arg.scope_id = if_nametoindex(p);
+
+ if (prog_g.arg.scope_id == 0 &&
+ 1 != sscanf(p, "%"SCNu32, &prog_g.arg.scope_id))
+ {
+ return false;
+ }
+ }
+ else {
+ prog_g.arg.scope_id = 0;
+ }
+
+ return true;
+}
+
static int parse_args (const int argc, char *const*args) {
static const struct option lopts[] = {
{ "cdict", required_argument, 0, 0 },
@@ -216,10 +248,16 @@ static int parse_args (const int argc, char *const*args) {
for (size_t i = 0; i < prog_conf.targets.cnt; i += 1, optind += 1) {
prne_ip_addr_t *p = prog_conf.targets.arr + i;
- if (inet_pton(AF_INET6, args[optind], p->addr)) {
+ if (!load_addr(args[optind])) {
+ fprintf(stderr, "%s: invalid scope id\n", args[optind]);
+ return 2;
+ }
+
+ if (inet_pton(AF_INET6, prog_g.arg.addr, p->addr)) {
p->ver = PRNE_IPV_6;
+ p->scope_id = prog_g.arg.scope_id;
}
- else if (inet_pton(AF_INET, args[optind], p->addr)) {
+ else if (inet_pton(AF_INET, prog_g.arg.addr, p->addr)) {
p->ver = PRNE_IPV_4;
}
else {