fix args parsing

This commit is contained in:
2025-08-20 17:08:18 +02:00
parent 64e027a391
commit 69b9ec2240

View File

@ -6,48 +6,52 @@
/* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */ /* By: tomoron <tomoron@student.42angouleme.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2025/04/26 17:01:53 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" #include "includes/ft_ping.h"
int get_set_int(char *arg, t_settings *set) int get_set_int(char *arg, t_settings *set)
{ {
char *tmp; long value;
char *end;
tmp = arg; value = strtol(arg, &end, 10);
while(*tmp) if(*end)
{ {
if(!isdigit(*tmp)) fprintf(stderr, "%s: invalid value (`%s' near `%s')\n", set->name, arg, end);
{
fprintf(stderr, "%s: invalid value (`%s' near `%s')\n", set->name, arg, tmp);
set->err = 1; set->err = 1;
return(0); return(0);
} }
tmp++; 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(atoi(arg)); return((int) value);
} }
double get_set_float(char *arg, t_settings *set) double get_set_float(char *arg, t_settings *set)
{ {
char *tmp; float value;
int point; char *end;
tmp = arg; value = strtol(arg, &end, 10);
while(*tmp) if(*end)
{ {
if((!isdigit(*tmp) && *tmp != '.') || (*tmp == '.' && point)) fprintf(stderr, "%s: invalid value (`%s' near `%s')\n", set->name, arg, end);
{
fprintf(stderr, "%s: invalid value (`%s' near `%s')\n", set->name, arg, tmp);
set->err = 1; set->err = 1;
return(0); return(0);
} }
if(*tmp == '.') if(errno == ERANGE)
point = 1; {
tmp++; fprintf(stderr, "%s: option value too big : %s", set->name, arg);
set->err = 1;
return(0);
} }
return(atof(arg)); return(value);
} }
int check_values(t_settings *set, char *name) 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); fprintf(stderr, "%s: option value too small: %d\n", name, set->ttl);
return(0); 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); fprintf(stderr, "%s: option value too big: %d\n", name, set->ttl);
return(0); return(0);
@ -145,6 +149,9 @@ int parse_args(int argc, char **argv, t_settings *set)
} }
} }
if(set->err)
return(1);
while (optind < argc) while (optind < argc)
{ {
if (!add_host(set, argv[optind])) if (!add_host(set, argv[optind]))