diff options
author | Pierre GRANDIN <pgrandin@users.noreply.github.com> | 2017-04-29 10:57:42 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-29 10:57:42 -0700 |
commit | 283ae3e7e4b1479a5e3b135bbc4ebb0c5a25c113 (patch) | |
tree | 7a2f955638045468b5b2208f99dbd6c57ef16b49 /navit/gui | |
parent | 658060b86596efb270cfcd21e118a9071f5d5092 (diff) | |
download | navit-283ae3e7e4b1479a5e3b135bbc4ebb0c5a25c113.tar.gz |
Add network info menu in gui/internal for Linux (#228)
* Add network info menu in gui/internal for Linux
* Ensures that ifaddrs.h is available before enabling network info code
* Add network info to sailfish config as well
* Prevent linker and undefined reference errors for non-unix builds
Diffstat (limited to 'navit/gui')
-rw-r--r-- | navit/gui/internal/gui_internal_command.c | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/navit/gui/internal/gui_internal_command.c b/navit/gui/internal/gui_internal_command.c index d26bd677d..43e788c10 100644 --- a/navit/gui/internal/gui_internal_command.c +++ b/navit/gui/internal/gui_internal_command.c @@ -36,6 +36,10 @@ #include "gui_internal_search.h" #include "gui_internal_poi.h" #include "gui_internal_command.h" +#if HAS_IFADDRS +#include <ifaddrs.h> +#include <arpa/inet.h> +#endif extern char *version; @@ -776,6 +780,56 @@ gui_internal_cmd2_locale(struct gui_priv *this, char *function, struct attr **in graphics_draw_mode(this->gra, draw_mode_end); } +/** + * @brief display basic networking information + * + * @return nothing + * + * This function displays basic networking information, currently + * only the interface name and the associated IP address(es). + * Currently only works on non Windows systems. + * + */ +static void +gui_internal_cmd2_network_info(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) +{ +#if HAS_IFADDRS + struct widget *menu,*wb,*w; + char *text; + + graphics_draw_mode(this->gra, draw_mode_begin); + menu=gui_internal_menu(this, _("Network info")); + menu->spx=this->spacing*10; + wb=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill); + gui_internal_widget_append(menu, wb); + + struct ifaddrs *addrs, *tmp; + getifaddrs(&addrs); + tmp = addrs; + + while (tmp) + { + if (tmp->ifa_addr && tmp->ifa_addr->sa_family == AF_INET) + { + struct sockaddr_in *pAddr = (struct sockaddr_in *)tmp->ifa_addr; + if(g_ascii_strncasecmp(tmp->ifa_name,"lo",2 ) ) { + text=g_strdup_printf("%s: %s", tmp->ifa_name, inet_ntoa(pAddr->sin_addr)); + gui_internal_widget_append(wb, w=gui_internal_label_new(this, text)); + w->flags=gravity_bottom_center|orientation_horizontal|flags_fill; + g_free(text); + } + } + tmp = tmp->ifa_next; + } + freeifaddrs(addrs); + + gui_internal_menu_render(this); + graphics_draw_mode(this->gra, draw_mode_end); +#else + dbg(lvl_error, "Cannot show network info: ifaddr.h not found\n"); +#endif +} + static void gui_internal_cmd_formerdests(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) { @@ -1220,6 +1274,8 @@ gui_internal_cmd2(struct gui_priv *this, char *function, struct attr **in, struc gui_internal_cmd_formerdests(this, function, in, out, valid); else if(!strcmp(function, "locale")) gui_internal_cmd2_locale(this, function, in, out, valid); + else if(!strcmp(function, "network_info")) + gui_internal_cmd2_network_info(this, function, in, out, valid); else if(!strcmp(function, "position")) gui_internal_cmd2_position(this, function, in, out, valid); else if(!strcmp(function, "pois")) @@ -1279,7 +1335,9 @@ static struct command_table commands[] = { {"waypoints",command_cast(gui_internal_cmd2)}, {"write",command_cast(gui_internal_cmd_write)}, {"about",command_cast(gui_internal_cmd2)}, - +#if HAS_IFADDRS + {"network_info",command_cast(gui_internal_cmd2)}, +#endif }; void |