diff --git a/srcs/parsing.c b/srcs/parsing.c index 9aa2034..938ce89 100644 --- a/srcs/parsing.c +++ b/srcs/parsing.c @@ -6,48 +6,52 @@ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/26 17:01:53 by tomoron #+# #+# */ -/* Updated: 2025/08/20 16:42:02 by tomoron ### ########.fr */ +/* Updated: 2025/08/20 17:07:58 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ #include "includes/ft_ping.h" int get_set_int(char *arg, t_settings *set) { - char *tmp; + long value; + char *end; - tmp = arg; - while(*tmp) + value = strtol(arg, &end, 10); + if(*end) { - if(!isdigit(*tmp)) - { - fprintf(stderr, "%s: invalid value (`%s' near `%s')\n", set->name, arg, tmp); - set->err = 1; - return(0); - } - tmp++; + fprintf(stderr, "%s: invalid value (`%s' near `%s')\n", set->name, arg, end); + set->err = 1; + return(0); } - return(atoi(arg)); + if(errno == ERANGE || value > INT32_MAX || value < INT32_MIN) + { + fprintf(stderr, "%s: option value too big : %s", set->name, arg); + set->err = 1; + return(0); + } + return((int) value); } double get_set_float(char *arg, t_settings *set) { - char *tmp; - int point; + float value; + char *end; - tmp = arg; - while(*tmp) + value = strtol(arg, &end, 10); + if(*end) { - if((!isdigit(*tmp) && *tmp != '.') || (*tmp == '.' && point)) - { - fprintf(stderr, "%s: invalid value (`%s' near `%s')\n", set->name, arg, tmp); - set->err = 1; - return(0); - } - if(*tmp == '.') - point = 1; - tmp++; + fprintf(stderr, "%s: invalid value (`%s' near `%s')\n", set->name, arg, end); + set->err = 1; + return(0); } - return(atof(arg)); + if(errno == ERANGE) + { + fprintf(stderr, "%s: option value too big : %s", set->name, arg); + set->err = 1; + return(0); + } + return(value); + } int check_values(t_settings *set, char *name) @@ -59,7 +63,7 @@ int check_values(t_settings *set, char *name) fprintf(stderr, "%s: option value too small: %d\n", name, set->ttl); return(0); } - else if (set->ttl >= 256) + else if (set->ttl >= 256 || set->ttl < 0) { fprintf(stderr, "%s: option value too big: %d\n", name, set->ttl); return(0); @@ -145,6 +149,9 @@ int parse_args(int argc, char **argv, t_settings *set) } } + if(set->err) + return(1); + while (optind < argc) { if (!add_host(set, argv[optind]))