On Wednesday 12 March 2014 17:04:47 Simon Wunderlich wrote:
> From: Simon Wunderlich <simon@open-mesh.com>
>
> Check if the interface supplied by -m (or bat0 by default) is actually a
> batman interface. The check is performed by testing if the sysfs path
> is available.
>
> This change is required since debugfs now contains originator tables per
> hard interface. This might be confusing for users as batctl -m eth0 o
> will now (accidently) print these tables without eth0 beeing a batman
> interface, assuming eth0 is a hard interface used by batman-adv.
>
> Some reordering of commands were required to first allow commands which
> don't depend on a (correctly set up) mesh interface, like bisect or
> interface.
>
> Signed-off-by: Simon Wunderlich <simon@open-mesh.com>
> ---
> Changes to PATCHv2:
>
> * fix VLAN check, this is now similar to the sysfs handling code
> ---
> main.c | 32 +++++++++++++++++---------------
> sys.c | 30 ++++++++++++++++++++++++++++++
> sys.h | 1 +
> 3 files changed, 48 insertions(+), 15 deletions(-)
Applied in revision da65d62.
Thanks,
Marek
@@ -137,7 +137,23 @@ int main(int argc, char **argv)
exit(EXIT_FAILURE);
}
- if ((strcmp(argv[1], "ping") == 0) || (strcmp(argv[1], "p") == 0)) {
+ if ((strcmp(argv[1], "interface") == 0) || (strcmp(argv[1], "if") == 0)) {
+
+ ret = interface(mesh_iface, argc - 1, argv + 1);
+
+ } else if ((strcmp(argv[1], "tcpdump") == 0) || (strcmp(argv[1], "td") == 0)) {
+
+ ret = tcpdump(argc - 1, argv + 1);
+
+#ifdef BATCTL_BISECT
+ } else if ((strcmp(argv[1], "bisect_iv") == 0)) {
+
+ ret = bisect_iv(argc - 1, argv + 1);
+#endif
+ } else if (check_mesh_iface(mesh_iface) < 0) {
+ fprintf(stderr, "Error - interface %s is not present or not a batman-adv interface\n", mesh_iface);
+ exit(EXIT_FAILURE);
+ } else if ((strcmp(argv[1], "ping") == 0) || (strcmp(argv[1], "p") == 0)) {
ret = ping(mesh_iface, argc - 1, argv + 1);
@@ -145,14 +161,6 @@ int main(int argc, char **argv)
ret = traceroute(mesh_iface, argc - 1, argv + 1);
- } else if ((strcmp(argv[1], "tcpdump") == 0) || (strcmp(argv[1], "td") == 0)) {
-
- ret = tcpdump(argc - 1, argv + 1);
-
- } else if ((strcmp(argv[1], "interface") == 0) || (strcmp(argv[1], "if") == 0)) {
-
- ret = interface(mesh_iface, argc - 1, argv + 1);
-
} else if ((strcmp(argv[1], "loglevel") == 0) || (strcmp(argv[1], "ll") == 0)) {
ret = handle_loglevel(mesh_iface, argc - 1, argv + 1);
@@ -179,12 +187,6 @@ int main(int argc, char **argv)
ret = translate(mesh_iface, argc - 1, argv + 1);
-#ifdef BATCTL_BISECT
- } else if ((strcmp(argv[1], "bisect_iv") == 0)) {
-
- ret = bisect_iv(argc - 1, argv + 1);
-#endif
-
} else {
for (i = 0; i < BATCTL_SETTINGS_NUM; i++) {
@@ -566,3 +566,33 @@ out:
free(path_buff);
return res;
}
+
+int check_mesh_iface(char *mesh_iface)
+{
+ char *base_dev = NULL;
+ char path_buff[PATH_BUFF_LEN];
+ int ret = -1, vid;
+ DIR *dir;
+
+ /* use the parent interface if this is a VLAN */
+ vid = vlan_get_link(mesh_iface, &base_dev);
+ if (vid >= 0)
+ snprintf(path_buff, PATH_BUFF_LEN, SYS_VLAN_PATH, base_dev, vid);
+ else
+ snprintf(path_buff, PATH_BUFF_LEN, SYS_BATIF_PATH_FMT, mesh_iface);
+ path_buff[PATH_BUFF_LEN - 1] = '\0';
+
+ /* try to open the mesh sys directory */
+ dir = opendir(path_buff);
+ if (!dir)
+ goto out;
+
+ closedir(dir);
+
+ ret = 0;
+out:
+ if (base_dev)
+ free(base_dev);
+
+ return ret;
+}
@@ -71,5 +71,6 @@ int interface(char *mesh_iface, int argc, char **argv);
int handle_loglevel(char *mesh_iface, int argc, char **argv);
int handle_sys_setting(char *mesh_iface, int setting, int argc, char **argv);
int handle_gw_setting(char *mesh_iface, int argc, char **argv);
+int check_mesh_iface(char *mesh_iface);
#endif