/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* main.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: tomoron +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/04/24 00:03:56 by tomoron #+# #+# */ /* Updated: 2025/08/08 22:30:18 by tomoron ### ########.fr */ /* */ /* ************************************************************************** */ #include "includes/ft_ping.h" int g_stop = 0; void show_help(t_settings *set, char *name) { set->stop = 1; printf("Usage: %s %s", name, HELP_MESSAGE); } int init_socket(char *name) { int res; res = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if(res == -1) { if(errno == EPERM) fprintf(stderr, "%s: socket creation permission denied, make sure you are runing as root\n", name); else fprintf(stderr, "%s: can't initialize socket\n", name); return(-1); } return(res); } uint16_t get_id(void) { struct timeval time; uint16_t res; gettimeofday(&time,0); res = (uint8_t)time.tv_sec; res |= (uint8_t)time.tv_usec << 8; return(res); } void signal_handler(int signum) { (void)signum; g_stop = 1; } int main(int argc, char **argv) { t_settings settings; settings = parse_args(argc, argv); if(settings.stop) goto early_stop; settings.socket = init_socket(argv[0]); settings.id = get_id(); settings.name = argv[0]; signal(SIGINT, signal_handler); if(settings.stop || settings.err || settings.socket == -1) { early_stop: free_hosts(settings.hosts); return((settings.err != 0) * 64); } if(!settings.hosts) { fprintf(stderr, "%s: missing host operand\n", argv[0]); return(64); } send_pings(&settings); free_hosts(settings.hosts); return(0); }