diff --git a/sys/shell/commands/sc_sntp.c b/sys/shell/commands/sc_sntp.c index 9733167b57..d9c3f905bd 100644 --- a/sys/shell/commands/sc_sntp.c +++ b/sys/shell/commands/sc_sntp.c @@ -31,7 +31,7 @@ static void _usage(char *cmd) { - printf("Usage: %s []\n", cmd); + printf("Usage: %s [%%] []\n", cmd); puts("default: timeout = 5000"); } @@ -44,12 +44,37 @@ int _ntpdate(int argc, char **argv) return 1; } sock_udp_ep_t server = { .port = NTP_PORT, .family = AF_INET6 }; - ipv6_addr_from_str((ipv6_addr_t *)&server.addr, argv[1]); + ipv6_addr_t *addr = (ipv6_addr_t *)&server.addr; - if (ipv6_addr_is_link_local((ipv6_addr_t *)&server.addr)) { - /* choose first interface when address is link local */ - gnrc_netif_t *netif = gnrc_netif_iter(NULL); - server.netif = (uint16_t)netif->pid; + int src_iface = ipv6_addr_split_iface(argv[1]); + if (src_iface == -1) { + src_iface = KERNEL_PID_UNDEF; + } + + if (ipv6_addr_from_str(addr, argv[1]) == NULL) { + puts("error: malformed address"); + return 1; + } + + if (ipv6_addr_is_link_local(addr) || (src_iface != KERNEL_PID_UNDEF)) { + size_t ifnum = gnrc_netif_numof(); + + if (src_iface == KERNEL_PID_UNDEF) { + if (ifnum == 1) { + src_iface = gnrc_netif_iter(NULL)->pid; + } + else { + puts("error: link local target needs interface parameter (use \"
%\")\n"); + return 1; + } + } + else { + if (gnrc_netif_get_by_pid(src_iface) == NULL) { + printf("error: %"PRIkernel_pid" is not a valid interface.\n", src_iface); + return 1; + } + } + server.netif = src_iface; } if (argc > 2) {