add: description to paring struct && create setting.c
This commit is contained in:
64
src/main.c
64
src/main.c
@@ -1,7 +1,6 @@
|
||||
#include "dns.h"
|
||||
#include "host.h"
|
||||
#include "packet.h"
|
||||
#include "parsing.h"
|
||||
#include "print.h"
|
||||
#include "setting.h"
|
||||
#include "statistics.h"
|
||||
@@ -26,7 +25,6 @@
|
||||
#include <stdbool.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
#include <ctype.h>
|
||||
#include <net/ethernet.h>
|
||||
|
||||
bool loop = true;
|
||||
@@ -37,68 +35,6 @@ static void signal_handler(int code)
|
||||
loop = false;
|
||||
}
|
||||
|
||||
static int parsing_number(const char *str, size_t min, size_t max, size_t *out)
|
||||
{
|
||||
size_t number = 0;
|
||||
const char *start = str;
|
||||
|
||||
while (*start != '\0')
|
||||
{
|
||||
if (!isdigit(*start))
|
||||
goto value_error;
|
||||
size_t tmp = number * 10 + *start - '0';
|
||||
if (tmp < number)
|
||||
goto range_error;
|
||||
number = tmp;
|
||||
start++;
|
||||
}
|
||||
|
||||
if (min > number || number > max)
|
||||
goto range_error;
|
||||
|
||||
*out = number;
|
||||
|
||||
return 0;
|
||||
|
||||
range_error:
|
||||
print_err("invalid argument: '%s': out of range: %zu <= value <= %zu", str, min, max);
|
||||
return 1;
|
||||
|
||||
value_error:
|
||||
print_err("invalid argument: in '%s' '%c' is not a digit", str, *start);
|
||||
return 2;
|
||||
}
|
||||
|
||||
static int get_setting(char * const *av, struct setting *settings)
|
||||
{
|
||||
struct param parameters[] = {
|
||||
{NULL, "?", OPTION, false},
|
||||
{NULL, "v", OPTION, false},
|
||||
{NULL, "n", OPTION, false},
|
||||
{"ttl", NULL, ARGUMENT, "116"},
|
||||
{NULL, "s", ARGUMENT, "56"},
|
||||
{NULL, "p", ARGUMENT, "0"},
|
||||
{NULL, NULL, 0, NULL},
|
||||
};
|
||||
char *hostname = parsing(av, parameters);
|
||||
if (hostname == NULL)
|
||||
return 1;
|
||||
settings->dest.hostname = hostname;
|
||||
|
||||
settings->help = parameters[0].value;
|
||||
settings->verbose = parameters[1].value;
|
||||
settings->numeric_only = parameters[2].value;
|
||||
size_t ttl;
|
||||
if (parsing_number(parameters[3].value, 1, 255, &ttl))
|
||||
return 2;
|
||||
settings->ttl = ttl;
|
||||
if (parsing_number(parameters[4].value, 0, 2147483647, &settings->payload_size))
|
||||
return 3;
|
||||
if (parsing_number(parameters[5].value, 0, 2147483647, &settings->preload))
|
||||
return 4;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int create_socket(struct setting const *settings)
|
||||
{
|
||||
int ret;
|
||||
|
||||
Reference in New Issue
Block a user