Files
ft_ping/srcs/main.c

101 lines
2.8 KiB
C

#include <main.h>
const char* argp_program_version = "ft_ping 1.0";
const char* argp_program_bug_address = "<jrathelo@student.42nice.fr>";
static char doc[] = "Send ICMP ECHO_REQUEST packets to network hosts.\vMandatory or optional arguments to long options "
"are also mandatory or optional for any corresponding short options.\n\nOptions marked with (root "
"only) are available only to superuser.";
static char args_doc[] = "HOST ...";
#define ARG_TTL 256
static struct argp_option options[] = {
{0, 0, 0, 0, "Options valid for all request types:\n"},
{"verbose", 'v', 0, 0, "verbose output"},
{"ttl", ARG_TTL, "N", 0, "specify N as time-to-live"},
{0},
};
static error_t parse_opt(int key, char* arg, struct argp_state* state) {
struct arguments* arguments = state->input;
switch (key) {
case 'v':
arguments->verbose = 1;
break;
case ARG_TTL:
arguments->ttl = strtoul(arg, NULL, 10);
case ARGP_KEY_ARG:
if (state->arg_num >= 2)
argp_usage(state);
arguments->args[state->arg_num] = arg;
break;
case ARGP_KEY_END:
if (state->arg_num < 1)
argp_usage(state);
break;
default:
return ARGP_ERR_UNKNOWN;
}
return 0;
}
static struct argp argp = {options, parse_opt, args_doc, doc};
static bool stop = false;
int sock = 0;
void send_ping() {}
void sig_handler(int sig) {
if (sig == SIGINT) {
stop = true;
} else if (sig == SIGALRM) {
send_ping();
}
}
int main(int argc, char** argv) {
struct arguments arguments;
arguments.verbose = 0;
arguments.ttl = 64;
argp_parse(&argp, argc, argv, 0, 0, &arguments);
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (sock < 0) {
dprintf(STDERR_FILENO, "%s: socket() failed: %s\n", argv[0], strerror(errno));
exit(1);
}
if (setsockopt(sock, IPPROTO_IP, IP_TTL, &arguments.ttl, sizeof(arguments.ttl)) < 0) {
dprintf(STDERR_FILENO, "%s: setsockopt() failed: %s\n", argv[0], strerror(errno));
close(sock);
exit(1);
}
struct sigaction sig_handle;
sig_handle.sa_handler = sig_handler;
sigaction(SIGINT, &sig_handle, 0);
sigaction(SIGALRM, &sig_handle, 0);
// alarm(1);
unsigned long xmit = 0;
unsigned long recv = 0;
while (true) {
if (stop) {
break;
}
}
printf("---- %s ping statistics ----\n", arguments.args[0]);
printf("%zu packets transmitted, %zu packets received, %%zu%% packet loss\n", xmit,
recv /*, (xmit - recv) / xmit * 100*/);
// printf("round-trip min/avg/max/stddev = %f/%f/%f/%f ms\n");
close(sock);
}