diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/irm/irm_ipcp_enroll.c | 63 |
1 files changed, 52 insertions, 11 deletions
diff --git a/src/tools/irm/irm_ipcp_enroll.c b/src/tools/irm/irm_ipcp_enroll.c index 5b6caf55..082f2c52 100644 --- a/src/tools/irm/irm_ipcp_enroll.c +++ b/src/tools/irm/irm_ipcp_enroll.c @@ -46,24 +46,46 @@ #include <string.h> -#define NORMAL "normal" +#define NORMAL "unicast" #define BROADCAST "broadcast" static void usage(void) { printf("Usage: irm ipcp enroll\n" " name <ipcp name>\n" - " layer <layer to enroll in>\n" - " [type [TYPE], default = normal]\n" + " [layer <layer to enroll with>]\n" + " [dst <destination to enroll with>]\n" + " [type [TYPE], default = " NORMAL "]\n" " [autobind]\n" "where TYPE = {" NORMAL " " BROADCAST "}\n"); } +static int get_layer_name(const char * ipcp, + char * layer_name) +{ + struct ipcp_info * ipcps; + size_t len; + size_t i; + + len = irm_list_ipcps(&ipcps); + for (i = 0; i < len; i++) + if (strcmp(ipcps[i].name, ipcp) == 0) { + strcpy(layer_name, ipcps[i].layer); + free(ipcps); + return 0; + } + + free(ipcps); + + return -1; +} + int do_enroll_ipcp(int argc, char ** argv) { char * ipcp = NULL; char * layer = NULL; + char * dst = NULL; struct ipcp_info * ipcps; pid_t pid = -1; ssize_t len = 0; @@ -81,6 +103,8 @@ int do_enroll_ipcp(int argc, ipcp_type = *(argv + 1); } else if (matches(*argv, "layer") == 0) { layer = *(argv + 1); + } else if (matches(*argv, "dst") == 0) { + dst = *(argv + 1); } else if (matches(*argv, "autobind") == 0) { autobind = true; cargs = 1; @@ -94,11 +118,14 @@ int do_enroll_ipcp(int argc, argv += cargs; } - if (layer == NULL || ipcp == NULL) { + if ((layer == NULL && dst == NULL) || ipcp == NULL) { usage(); return -1; } + if (dst == NULL) + dst = layer; + if (strcmp(ipcp_type, NORMAL) == 0) type = IPCP_NORMAL; else if (strcmp(ipcp_type, BROADCAST) == 0) @@ -121,22 +148,36 @@ int do_enroll_ipcp(int argc, for (i = 0; i < len; i++) { if (ipcps[i].type != type) continue; + if (wildcard_match(ipcps[i].name, ipcp) == 0) { + char enr_layer[LAYER_NAME_SIZE]; + pid = ipcps[i].pid; - if (autobind && irm_bind_process(pid, ipcp)) { - printf("Failed to bind %d to %s.\n", pid, ipcp); + + if (irm_enroll_ipcp(pid, dst)) { + printf("Failed to enroll IPCP.\n"); goto fail; } - if (irm_enroll_ipcp(pid, layer)) { - if (autobind) - irm_unbind_process(pid, ipcp); + if (get_layer_name(ipcps[i].name, enr_layer)) { + printf("Could not get layer name.\n"); + goto fail; + } + + if (layer != NULL && strcmp(enr_layer, layer)) { + printf("Enrollment destination does not " + "match requested layer.\n"); + goto fail; + } + + if (autobind && irm_bind_process(pid, ipcp)) { + printf("Failed to bind %d to %s.\n", pid, ipcp); goto fail; } - if (autobind && irm_bind_process(pid, layer)) { + if (autobind && irm_bind_process(pid, enr_layer)) { printf("Failed to bind %d to %s.\n", - pid, layer); + pid, enr_layer); goto fail; } } |