diff options
-rw-r--r-- | include/net.h | 2 | ||||
-rw-r--r-- | lib/parameter.c | 7 | ||||
-rw-r--r-- | net/net.c | 32 | ||||
-rw-r--r-- | net/ping.c | 3 |
4 files changed, 27 insertions, 17 deletions
diff --git a/include/net.h b/include/net.h index 969aae583c..d59ae5caa7 100644 --- a/include/net.h +++ b/include/net.h @@ -398,7 +398,7 @@ static inline void NetCopyLong(ulong *to, ulong *from) char * ip_to_string (IPaddr_t x, char *s); /* Convert a string to ip address */ -IPaddr_t string_to_ip(const char *s); +int string_to_ip(const char *s, IPaddr_t *ip); /* Convert a VLAN id to a string */ void VLAN_to_string (ushort x, char *s); diff --git a/lib/parameter.c b/lib/parameter.c index 7c7338d48a..6d8ac485b2 100644 --- a/lib/parameter.c +++ b/lib/parameter.c @@ -58,7 +58,12 @@ const char *dev_get_param(struct device_d *dev, const char *name) #ifdef CONFIG_NET IPaddr_t dev_get_param_ip(struct device_d *dev, char *name) { - return string_to_ip(dev_get_param(dev, name)); + IPaddr_t ip; + + if (string_to_ip(dev_get_param(dev, name), &ip)) + return 0; + + return ip; } int dev_set_param_ip(struct device_d *dev, char *name, IPaddr_t ip) @@ -82,6 +82,8 @@ #include <param.h> #include <net.h> #include <driver.h> +#include <errno.h> +#include <linux/ctype.h> #include "bootp.h" #include "tftp.h" #include "rarp.h" @@ -1095,24 +1097,33 @@ char *ip_to_string (IPaddr_t x, char *s) return s; } -IPaddr_t string_to_ip(const char *s) +int string_to_ip(const char *s, IPaddr_t *ip) { - IPaddr_t addr; + IPaddr_t addr = 0; char *e; int i; if (!s) - return 0; + return -EINVAL; - for (addr = 0, i = 0; i < 4; ++i) { - ulong val = s ? simple_strtoul(s, &e, 10) : 0; + for (i = 0; i < 4; i++) { + ulong val; + + if (!isdigit(*s)) + return -EINVAL; + + val = simple_strtoul(s, &e, 10); addr <<= 8; addr |= (val & 0xFF); - if (s) - s = *e ? e + 1 : e; + + if (*e != '.' && i != 3) + return -EINVAL; + + s = e + 1; } - return htonl(addr); + *ip = htonl(addr); + return 0; } void VLAN_to_string(ushort x, char *s) @@ -1152,11 +1163,6 @@ void print_IPaddr (IPaddr_t x) puts (tmp); } -IPaddr_t getenv_IPaddr (char *var) -{ - return (string_to_ip(getenv(var))); -} - ushort getenv_VLAN(char *var) { return (string_to_VLAN(getenv(var))); diff --git a/net/ping.c b/net/ping.c index 4d61532b1e..14224c6b91 100644 --- a/net/ping.c +++ b/net/ping.c @@ -93,8 +93,7 @@ int do_ping (cmd_tbl_t *cmdtp, int argc, char *argv[]) if (argc < 2) return -1; - NetPingIP = string_to_ip(argv[1]); - if (NetPingIP == 0) { + if (string_to_ip(argv[1], &NetPingIP)) { printf ("Usage:\n%s\n", cmdtp->usage); return -1; } |