From 9179675a5b2be21747d7ac86c0185668e57059a3 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sun, 23 Apr 2017 18:19:00 +0200 Subject: [PATCH 1/8] first commit --- strace/.gitmodules | 3 + strace/Makefile | 93 ++++++++++++++++++++++++ strace/includes/ft_ping.h | 33 +++++++++ strace/libft | 1 + strace/srcs/ping.c | 146 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 276 insertions(+) create mode 100644 strace/.gitmodules create mode 100644 strace/Makefile create mode 100644 strace/includes/ft_ping.h create mode 160000 strace/libft create mode 100644 strace/srcs/ping.c diff --git a/strace/.gitmodules b/strace/.gitmodules new file mode 100644 index 00000000..c82793fb --- /dev/null +++ b/strace/.gitmodules @@ -0,0 +1,3 @@ +[submodule "libft"] + path = libft + url = https://github.com/jzck/libft diff --git a/strace/Makefile b/strace/Makefile new file mode 100644 index 00000000..8023554f --- /dev/null +++ b/strace/Makefile @@ -0,0 +1,93 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: wescande +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2016/08/29 21:32:58 by wescande #+# #+# # +# Updated: 2017/04/22 19:26:34 by jhalford ### ########.fr # +# # +# **************************************************************************** # + +NAME = ft_ping + +CC = gcc +W_FLAGS = -Wall -Wextra -Werror +D_FLAGS = +FLAGS = $(W_FLAGS) $(D_FLAGS) + +LEN_NAME = `printf "%s" $(NAME) |wc -c` +DELTA = $$(echo "$$(tput cols)-31-$(LEN_NAME)"|bc) + +LIBFT_DIR = libft/ +LIBFT_LIB = $(LIBFT_DIR)libft.a +LIBFT_INC = $(LIBFT_DIR)includes/ + +SRC_DIR = srcs/ +INC_DIR = includes/ +OBJ_DIR = objs/ + +SRC_BASE = \ +ping.c\ + +SRCS = $(addprefix $(SRC_DIR), $(SRC_BASE)) +OBJS = $(addprefix $(OBJ_DIR), $(SRC_BASE:.c=.o)) +NB = $(words $(SRC_BASE)) +INDEX = 0 + +all : + @make -C $(LIBFT_DIR) + @make -j $(NAME) + +$(NAME): $(LIBFT_LIB) $(OBJ_DIR) $(OBJS) $(CLIENT_OBJ) + @$(CC) $(OBJS) -o $@ \ + -I $(INC_DIR) \ + -I $(LIBFT_INC) \ + $(LIBFT_LIB) $(CLIENT_OBJ) $(FLAGS) + @printf "\r\033[38;5;117m✓ MAKE $@ \033[0m\033[K\n" + +$(LIBFT_LIB): + @make -C $(LIBFT_DIR) + +$(OBJ_DIR) : + @mkdir -p $(OBJ_DIR) + +$(OBJ_DIR)%.o : $(SRC_DIR)%.c | $(OBJ_DIR) + @$(eval DONE=$(shell echo $$(($(INDEX)*20/$(NB))))) + @$(eval PERCENT=$(shell echo $$(($(INDEX)*100/$(NB))))) + @$(eval TO_DO=$(shell echo $$((20-$(INDEX)*20/$(NB) - 1)))) + @$(eval COLOR=$(shell list=(160 196 202 208 215 221 226 227 190 154 118 82 46); index=$$(($(PERCENT) * $${#list[@]} / 100)); echo "$${list[$$index]}")) + @printf "\r\033[38;5;%dm⌛ [%s]: %2d%% `printf '█%.0s' {0..$(DONE)}`%*s❙%*.*s\033[0m\033[K" $(COLOR) ft_p $(PERCENT) $(TO_DO) "" $(DELTA) $(DELTA) "$(shell echo "$@" | sed 's/^.*\///')" + @$(CC) $(FLAGS) $(OBJ_FLAG) -MMD -c $< -o $@\ + -I $(INC_DIR)\ + -I $(LIBFT_INC) + @$(eval INDEX=$(shell echo $$(($(INDEX)+1)))) + +clean: cleanlib + @if [ -e $(OBJ_DIR) ]; then \ + rm -rf $(OBJ_DIR); \ + printf "\r\033[38;5;202m✗ clean $(NAME) \033[0m\033[K\n"; \ + fi; + +cleanlib: + @make -C $(LIBFT_DIR) clean + +fclean: clean fcleanlib + @for file in $(NAME); do \ + if [ -e $$file ]; then \ + rm -f $$file ; \ + printf "\r\033[38;5;196m✗ fclean $$file\033[0m\033[K\n"; \ + fi; \ + done; + +fcleanlib: cleanlib + @make -C $(LIBFT_DIR) fclean + +re: fclean all + +relib: fcleanlib $(LIBFT_LIB) + +.PHONY : fclean clean re relib cleanlib fcleanlib + +-include $(OBJS:.o=.d) diff --git a/strace/includes/ft_ping.h b/strace/includes/ft_ping.h new file mode 100644 index 00000000..9c727acf --- /dev/null +++ b/strace/includes/ft_ping.h @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_ping.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/04/22 14:10:24 by jhalford #+# #+# */ +/* Updated: 2017/04/22 15:52:07 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_PING_H +# define FT_PING_H + +# include "libft.h" +# include +# include +# include +# include +# include +# include +# include +# include + +#define PACKETSIZE 64 +struct s_packet +{ + struct icmp icmp; + char msg[PACKETSIZE-sizeof(struct icmp)]; +}; + +#endif diff --git a/strace/libft b/strace/libft new file mode 160000 index 00000000..61ecc913 --- /dev/null +++ b/strace/libft @@ -0,0 +1 @@ +Subproject commit 61ecc913bbc31dafab3fff2386e1cbfffd34596a diff --git a/strace/srcs/ping.c b/strace/srcs/ping.c new file mode 100644 index 00000000..a40cee6e --- /dev/null +++ b/strace/srcs/ping.c @@ -0,0 +1,146 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/04/22 14:10:24 by jhalford #+# #+# */ +/* Updated: 2017/04/23 18:18:41 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_ping.h" + +int g_pid=-1; + +unsigned short checksum(void *b, int len) +{ + unsigned short *buf = b; + unsigned int sum=0; + unsigned short result; + + for (sum = 0; len > 1; len -= 2) + sum += *buf++; + if (len == 1) + sum += *(unsigned char*)buf; + sum = (sum >> 16) + (sum & 0xFFFF); + sum += (sum >> 16); + result = ~sum; + return (result); +} + +void display(void *buf, int bytes, struct sockaddr_in *addr) +{ + int i; + struct ip *ip = buf; + struct icmp *icmp = buf + ip->ip_hl*4; + + printf("%d bytes from %s: ttl=%i\n", + ip->ip_len, inet_ntoa(addr->sin_addr), ip->ip_ttl); + printf("IPv%d: hrd-size=%d, pkt-size=%d, id=%d, frag-off=%d, protocol=%c\n, ttl=%i", + ip->ip_v, ip->ip_hl, ip->ip_len, ip->ip_id, ip->ip_off, ip->ip_p, ip->ip_ttl); + if (icmp->icmp_hun.ih_idseq.icd_id == g_pid) + { + printf("ICMP: type[%d/%d] checksum[%d] id[%d] seq[%d]\n", + icmp->icmp_type, icmp->icmp_code, ntohs(icmp->icmp_cksum), + icmp->icmp_hun.ih_idseq.icd_id, icmp->icmp_hun.ih_idseq.icd_seq); + (void)bytes; + } + for (i=0; i < bytes; i++) + { + if ( !(i & 15) ) printf("\n%i: ", i); + printf("%c ", ((char*)buf)[i]); + } + printf("\n"); +} + +void listener(struct sockaddr_in *addr) +{ + int sd; + struct sockaddr_in r_addr; + int bytes; + socklen_t len; + unsigned char buf[1024]; + + if ((sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_ICMP)) < 0) + { + perror("socket"); + exit(0); + } + for (;;) + { + bzero(buf, sizeof(buf)); + len = sizeof(r_addr); + bytes = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr*)&r_addr, &len); + if (bytes > 0) + display(buf, bytes, addr); + else + perror("recvfrom"); + } +} + +void ping(struct sockaddr_in *addr) +{ + const int val; + int i; + int sd; + int cnt; + socklen_t len; + struct s_packet pkt; + struct sockaddr_in r_addr; + + if ((sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_ICMP)) < 0) + { + perror("socket"); + return ; + } + if (setsockopt(sd, 0, IP_TTL, &val, sizeof(val)) != 0) + perror("set TTL option"); + if (fcntl(sd, F_SETFL, O_NONBLOCK) != 0) + perror("Request non blocking IO"); + cnt = 1; + while (1) + { + len = sizeof(r_addr); + recvfrom(sd, &pkt, sizeof(pkt), 0, (struct sockaddr*)&r_addr, &len); + bzero(&pkt, sizeof(pkt)); + pkt.icmp.icmp_type = ICMP_ECHO; + pkt.icmp.icmp_hun.ih_idseq.icd_id = g_pid; + for (i=0; i < (int)sizeof(pkt.msg); i++) + pkt.msg[i] = i+'0'; + pkt.msg[i] = 0; + pkt.icmp.icmp_hun.ih_idseq.icd_seq = cnt++; + pkt.icmp.icmp_cksum = checksum(&pkt, sizeof(pkt)); + if (sendto(sd, &pkt, sizeof(pkt), 0, (struct sockaddr*)addr, sizeof(*addr)) <= 0) + perror("sendto"); + sleep(1); + } +} + +int main(int ac, char **av) +{ + struct sockaddr_in *addr; + struct addrinfo *result; + + if (ac != 2) + { + printf("usage: %s \n", av[0]); + exit(1); + } + if (getaddrinfo(av[1], NULL, NULL, &result) != 0) + { + perror("getaddrinfo"); + exit(1); + } + addr = (struct sockaddr_in*)result->ai_addr; + if (fork() == 0) + { + listener(addr); + exit(0); + } + else + ping(addr); + wait(0); + return (0); +} From cd3ceba89832c81fd0098c612c7ba1f680c71b41 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 13 May 2017 23:15:50 +0200 Subject: [PATCH 2/8] much progress, need to remove non blocking IO because its not allowed --- strace/.gitignore | 1 + strace/includes/{ft_ping.h => ping.h} | 6 +- strace/libft | 2 +- strace/srcs/ping.c | 126 +++++++++++++++++--------- 4 files changed, 87 insertions(+), 48 deletions(-) create mode 100644 strace/.gitignore rename strace/includes/{ft_ping.h => ping.h} (93%) diff --git a/strace/.gitignore b/strace/.gitignore new file mode 100644 index 00000000..7c63a771 --- /dev/null +++ b/strace/.gitignore @@ -0,0 +1 @@ +ft_ping diff --git a/strace/includes/ft_ping.h b/strace/includes/ping.h similarity index 93% rename from strace/includes/ft_ping.h rename to strace/includes/ping.h index 9c727acf..c3343d9d 100644 --- a/strace/includes/ft_ping.h +++ b/strace/includes/ping.h @@ -17,6 +17,7 @@ # include # include # include +# include # include # include # include @@ -24,10 +25,11 @@ # include #define PACKETSIZE 64 + struct s_packet { - struct icmp icmp; - char msg[PACKETSIZE-sizeof(struct icmp)]; + struct icmp hdr; + char msg[PACKETSIZE - sizeof(struct icmp)]; }; #endif diff --git a/strace/libft b/strace/libft index 61ecc913..23c69f13 160000 --- a/strace/libft +++ b/strace/libft @@ -1 +1 @@ -Subproject commit 61ecc913bbc31dafab3fff2386e1cbfffd34596a +Subproject commit 23c69f13242ecbff493356c57cb1384eb1dd45f5 diff --git a/strace/srcs/ping.c b/strace/srcs/ping.c index a40cee6e..c3589fca 100644 --- a/strace/srcs/ping.c +++ b/strace/srcs/ping.c @@ -10,9 +10,11 @@ /* */ /* ************************************************************************** */ -#include "ft_ping.h" +#include "ping.h" -int g_pid=-1; +int g_pid=-1; +int g_pkt_rec=0; +char g_domain[256]; unsigned short checksum(void *b, int len) { @@ -32,63 +34,67 @@ unsigned short checksum(void *b, int len) void display(void *buf, int bytes, struct sockaddr_in *addr) { - int i; struct ip *ip = buf; - struct icmp *icmp = buf + ip->ip_hl*4; + struct icmp *icmp; + struct s_packet *pkt; + int hlen; + char addrstr[INET_ADDRSTRLEN]; + struct timeval start, end, triptime; + double diff; - printf("%d bytes from %s: ttl=%i\n", - ip->ip_len, inet_ntoa(addr->sin_addr), ip->ip_ttl); - printf("IPv%d: hrd-size=%d, pkt-size=%d, id=%d, frag-off=%d, protocol=%c\n, ttl=%i", - ip->ip_v, ip->ip_hl, ip->ip_len, ip->ip_id, ip->ip_off, ip->ip_p, ip->ip_ttl); - if (icmp->icmp_hun.ih_idseq.icd_id == g_pid) - { - printf("ICMP: type[%d/%d] checksum[%d] id[%d] seq[%d]\n", - icmp->icmp_type, icmp->icmp_code, ntohs(icmp->icmp_cksum), - icmp->icmp_hun.ih_idseq.icd_id, icmp->icmp_hun.ih_idseq.icd_seq); - (void)bytes; - } - for (i=0; i < bytes; i++) - { - if ( !(i & 15) ) printf("\n%i: ", i); - printf("%c ", ((char*)buf)[i]); - } - printf("\n"); + (void)bytes; + hlen = ip->ip_hl << 2; + pkt = (struct s_packet*)(buf + hlen); + icmp = &pkt->hdr; + start = *(struct timeval*)&pkt->msg; + + if (gettimeofday(&end, NULL) != 0) + return ; + timersub(&end, &start, &triptime); + diff = (triptime.tv_sec + triptime.tv_usec / 1000000.0) * 1000.0; + rs_push(diff); + g_pkt_rec++; + printf("%d bytes from %s: icmp_seq=%d ttl=%i time=%.3f ms\n", + ip->ip_len, + inet_ntop(AF_INET, &(addr->sin_addr), addrstr, INET_ADDRSTRLEN), + icmp->icmp_seq, ip->ip_ttl, diff); } -void listener(struct sockaddr_in *addr) -{ - int sd; - struct sockaddr_in r_addr; - int bytes; - socklen_t len; - unsigned char buf[1024]; - - if ((sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_ICMP)) < 0) +void listener(void) +{ int sd; + struct sockaddr_in addr; + unsigned char buf[1024]; + + sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_ICMP); + if ( sd < 0 ) { perror("socket"); exit(0); } for (;;) - { + { int bytes; + socklen_t len=sizeof(addr); + bzero(buf, sizeof(buf)); - len = sizeof(r_addr); - bytes = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr*)&r_addr, &len); - if (bytes > 0) - display(buf, bytes, addr); + bytes = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr*)&addr, &len); + if ( bytes > 0 ) + display(buf, bytes, &addr); else perror("recvfrom"); } + exit(0); } void ping(struct sockaddr_in *addr) { - const int val; + const int val = 255; int i; int sd; int cnt; socklen_t len; struct s_packet pkt; struct sockaddr_in r_addr; + struct timeval time; if ((sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_ICMP)) < 0) { @@ -99,44 +105,74 @@ void ping(struct sockaddr_in *addr) perror("set TTL option"); if (fcntl(sd, F_SETFL, O_NONBLOCK) != 0) perror("Request non blocking IO"); - cnt = 1; + cnt = 0; while (1) { len = sizeof(r_addr); - recvfrom(sd, &pkt, sizeof(pkt), 0, (struct sockaddr*)&r_addr, &len); bzero(&pkt, sizeof(pkt)); - pkt.icmp.icmp_type = ICMP_ECHO; - pkt.icmp.icmp_hun.ih_idseq.icd_id = g_pid; + pkt.hdr.icmp_type = ICMP_ECHO; + pkt.hdr.icmp_id = g_pid; + pkt.hdr.icmp_seq = cnt++; + for (i=0; i < (int)sizeof(pkt.msg); i++) pkt.msg[i] = i+'0'; pkt.msg[i] = 0; - pkt.icmp.icmp_hun.ih_idseq.icd_seq = cnt++; - pkt.icmp.icmp_cksum = checksum(&pkt, sizeof(pkt)); + if (gettimeofday(&time, NULL) != 0) + return ; + ft_memcpy(pkt.msg, (void*)&time, sizeof(time)); + time = *(struct timeval*)&pkt.msg; + pkt.hdr.icmp_cksum = checksum(&pkt, sizeof(pkt)); if (sendto(sd, &pkt, sizeof(pkt), 0, (struct sockaddr*)addr, sizeof(*addr)) <= 0) perror("sendto"); sleep(1); } } +void sigint_handler(int signo) +{ + double loss; + + (void)signo; + rs_calcmore(); + loss = g_rs.count ? 100 * ((float) (g_rs.count - g_pkt_rec) / (float)g_rs.count) : 0; + printf("\n--- %s ping statistics ---", g_domain); + printf("\n%d packets transmitted, %d packets received, %0.1f%% packet loss", g_rs.count, g_pkt_rec, loss); + printf("\nround-trip min/avg/max/stddev = %.3f/%.3f/%.3f/%.3f ms", g_rs.min, g_rs.avg, g_rs.max, g_rs.stdev); + exit(0); +} + int main(int ac, char **av) { struct sockaddr_in *addr; - struct addrinfo *result; + struct addrinfo *result, hints; + char addrstr[INET_ADDRSTRLEN]; if (ac != 2) { printf("usage: %s \n", av[0]); exit(1); } - if (getaddrinfo(av[1], NULL, NULL, &result) != 0) + memset (&hints, 0, sizeof (hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags |= AI_CANONNAME; + if (getaddrinfo(av[1], NULL, &hints, &result) != 0) { perror("getaddrinfo"); exit(1); } addr = (struct sockaddr_in*)result->ai_addr; + inet_ntop(AF_INET, &(addr->sin_addr), addrstr, INET_ADDRSTRLEN); + g_pid = getpid(); + ft_strcpy(g_domain, addrstr); + if (result->ai_canonname) + ft_strcpy(g_domain, result->ai_canonname); + printf("PING %s (%s): %i data bytes\n", FT_TRY(result->ai_canonname, addrstr), addrstr, 64); if (fork() == 0) { - listener(addr); + signal(SIGINT, sigint_handler); + rs_clear(); + listener(); exit(0); } else From 8bcbafd05c37d65f36326b5901af09989a964e5b Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Wed, 2 Aug 2017 19:21:37 +0200 Subject: [PATCH 3/8] stuff --- strace/Makefile | 5 +++- strace/includes/ping.h | 1 + strace/libft | 2 +- strace/srcs/ping.c | 64 ++++++++++++------------------------------ 4 files changed, 24 insertions(+), 48 deletions(-) diff --git a/strace/Makefile b/strace/Makefile index 8023554f..57f53f08 100644 --- a/strace/Makefile +++ b/strace/Makefile @@ -10,6 +10,8 @@ # # # **************************************************************************** # +SHELL := bash + NAME = ft_ping CC = gcc @@ -44,7 +46,8 @@ $(NAME): $(LIBFT_LIB) $(OBJ_DIR) $(OBJS) $(CLIENT_OBJ) @$(CC) $(OBJS) -o $@ \ -I $(INC_DIR) \ -I $(LIBFT_INC) \ - $(LIBFT_LIB) $(CLIENT_OBJ) $(FLAGS) + $(LIBFT_LIB) $(CLIENT_OBJ) $(FLAGS) \ + -lm @printf "\r\033[38;5;117m✓ MAKE $@ \033[0m\033[K\n" $(LIBFT_LIB): diff --git a/strace/includes/ping.h b/strace/includes/ping.h index c3343d9d..62399797 100644 --- a/strace/includes/ping.h +++ b/strace/includes/ping.h @@ -23,6 +23,7 @@ # include # include # include +# include #define PACKETSIZE 64 diff --git a/strace/libft b/strace/libft index 23c69f13..dd612f58 160000 --- a/strace/libft +++ b/strace/libft @@ -1 +1 @@ -Subproject commit 23c69f13242ecbff493356c57cb1384eb1dd45f5 +Subproject commit dd612f58c973b6fe9d825557bfa0f62df1e237ef diff --git a/strace/srcs/ping.c b/strace/srcs/ping.c index c3589fca..8255115a 100644 --- a/strace/srcs/ping.c +++ b/strace/srcs/ping.c @@ -15,21 +15,20 @@ int g_pid=-1; int g_pkt_rec=0; char g_domain[256]; +struct s_stats g_rs; -unsigned short checksum(void *b, int len) +unsigned short ping_cksum(void *b, int len) { unsigned short *buf = b; unsigned int sum=0; - unsigned short result; for (sum = 0; len > 1; len -= 2) - sum += *buf++; + sum += *((unsigned short*)buf++); if (len == 1) sum += *(unsigned char*)buf; + sum = (sum >> 16) + (sum & 0xFFFF); - sum += (sum >> 16); - result = ~sum; - return (result); + return (~(sum + (sum >> 16))); } void display(void *buf, int bytes, struct sockaddr_in *addr) @@ -48,6 +47,8 @@ void display(void *buf, int bytes, struct sockaddr_in *addr) icmp = &pkt->hdr; start = *(struct timeval*)&pkt->msg; + if (icmp->icmp_id != g_pid) + return ; if (gettimeofday(&end, NULL) != 0) return ; timersub(&end, &start, &triptime); @@ -60,30 +61,6 @@ void display(void *buf, int bytes, struct sockaddr_in *addr) icmp->icmp_seq, ip->ip_ttl, diff); } -void listener(void) -{ int sd; - struct sockaddr_in addr; - unsigned char buf[1024]; - - sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_ICMP); - if ( sd < 0 ) - { - perror("socket"); - exit(0); - } - for (;;) - { int bytes; - socklen_t len=sizeof(addr); - - bzero(buf, sizeof(buf)); - bytes = recvfrom(sd, buf, sizeof(buf), 0, (struct sockaddr*)&addr, &len); - if ( bytes > 0 ) - display(buf, bytes, &addr); - else - perror("recvfrom"); - } - exit(0); -} void ping(struct sockaddr_in *addr) { @@ -91,24 +68,16 @@ void ping(struct sockaddr_in *addr) int i; int sd; int cnt; - socklen_t len; struct s_packet pkt; - struct sockaddr_in r_addr; struct timeval time; - if ((sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_ICMP)) < 0) - { - perror("socket"); - return ; - } + if ((sd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) + return (perror("sender socket")); if (setsockopt(sd, 0, IP_TTL, &val, sizeof(val)) != 0) perror("set TTL option"); - if (fcntl(sd, F_SETFL, O_NONBLOCK) != 0) - perror("Request non blocking IO"); cnt = 0; while (1) { - len = sizeof(r_addr); bzero(&pkt, sizeof(pkt)); pkt.hdr.icmp_type = ICMP_ECHO; pkt.hdr.icmp_id = g_pid; @@ -121,14 +90,14 @@ void ping(struct sockaddr_in *addr) return ; ft_memcpy(pkt.msg, (void*)&time, sizeof(time)); time = *(struct timeval*)&pkt.msg; - pkt.hdr.icmp_cksum = checksum(&pkt, sizeof(pkt)); + pkt.hdr.icmp_cksum = ping_cksum(&pkt, sizeof(pkt)); if (sendto(sd, &pkt, sizeof(pkt), 0, (struct sockaddr*)addr, sizeof(*addr)) <= 0) perror("sendto"); sleep(1); } } -void sigint_handler(int signo) +void stats_recap(int signo) { double loss; @@ -152,6 +121,7 @@ int main(int ac, char **av) printf("usage: %s \n", av[0]); exit(1); } + memset (&hints, 0, sizeof (hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; @@ -163,6 +133,7 @@ int main(int ac, char **av) } addr = (struct sockaddr_in*)result->ai_addr; inet_ntop(AF_INET, &(addr->sin_addr), addrstr, INET_ADDRSTRLEN); + g_pid = getpid(); ft_strcpy(g_domain, addrstr); if (result->ai_canonname) @@ -170,13 +141,14 @@ int main(int ac, char **av) printf("PING %s (%s): %i data bytes\n", FT_TRY(result->ai_canonname, addrstr), addrstr, 64); if (fork() == 0) { - signal(SIGINT, sigint_handler); + signal(SIGINT, stats_recap); rs_clear(); - listener(); - exit(0); + listener(PF_INET, SOCK_RAW, IPPROTO_ICMP, &display); } else + { ping(addr); - wait(0); + wait(0); + } return (0); } From 4822730e19e21250640bc2d46634ea17d5a23da5 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sun, 3 Sep 2017 23:15:54 +0200 Subject: [PATCH 4/8] Misc. fixes --- strace/Makefile | 9 +- strace/includes/ping.h | 36 ---- strace/includes/strace.h | 367 +++++++++++++++++++++++++++++++++++++++ strace/srcs/ping.c | 154 ---------------- strace/srcs/strace.c | 112 ++++++++++++ strace/test.c | 11 ++ 6 files changed, 494 insertions(+), 195 deletions(-) delete mode 100644 strace/includes/ping.h create mode 100644 strace/includes/strace.h delete mode 100644 strace/srcs/ping.c create mode 100644 strace/srcs/strace.c create mode 100644 strace/test.c diff --git a/strace/Makefile b/strace/Makefile index 57f53f08..0bc06537 100644 --- a/strace/Makefile +++ b/strace/Makefile @@ -12,7 +12,7 @@ SHELL := bash -NAME = ft_ping +NAME = ft_strace CC = gcc W_FLAGS = -Wall -Wextra -Werror @@ -31,7 +31,7 @@ INC_DIR = includes/ OBJ_DIR = objs/ SRC_BASE = \ -ping.c\ +strace.c\ SRCS = $(addprefix $(SRC_DIR), $(SRC_BASE)) OBJS = $(addprefix $(OBJ_DIR), $(SRC_BASE:.c=.o)) @@ -42,12 +42,11 @@ all : @make -C $(LIBFT_DIR) @make -j $(NAME) -$(NAME): $(LIBFT_LIB) $(OBJ_DIR) $(OBJS) $(CLIENT_OBJ) +$(NAME): $(LIBFT_LIB) $(OBJ_DIR) $(OBJS) @$(CC) $(OBJS) -o $@ \ -I $(INC_DIR) \ -I $(LIBFT_INC) \ - $(LIBFT_LIB) $(CLIENT_OBJ) $(FLAGS) \ - -lm + $(LIBFT_LIB) $(FLAGS) @printf "\r\033[38;5;117m✓ MAKE $@ \033[0m\033[K\n" $(LIBFT_LIB): diff --git a/strace/includes/ping.h b/strace/includes/ping.h deleted file mode 100644 index 62399797..00000000 --- a/strace/includes/ping.h +++ /dev/null @@ -1,36 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* ft_ping.h :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/04/22 14:10:24 by jhalford #+# #+# */ -/* Updated: 2017/04/22 15:52:07 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#ifndef FT_PING_H -# define FT_PING_H - -# include "libft.h" -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include - -#define PACKETSIZE 64 - -struct s_packet -{ - struct icmp hdr; - char msg[PACKETSIZE - sizeof(struct icmp)]; -}; - -#endif diff --git a/strace/includes/strace.h b/strace/includes/strace.h new file mode 100644 index 00000000..09331ee0 --- /dev/null +++ b/strace/includes/strace.h @@ -0,0 +1,367 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_ping.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/04/22 14:10:24 by jhalford #+# #+# */ +/* Updated: 2017/04/22 15:52:07 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_STRACE_H +# define FT_STRACE_H + +# include "libft.h" +# include +# include +# include + +enum e_param { + PARAM_NUMBER = 1, + PARAM_STRING, + PARAM_ADDR, +}; + +struct s_syscall { + char name[40]; + enum e_param params[7]; +}; + +typedef struct s_syscall t_syscall; + +t_syscall g_syscalls[] = { + {"read", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"write", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"open", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"close", {PARAM_NUMBER, 0}}, + + {"stat", {PARAM_STRING, PARAM_ADDR, 0}}, + {"fstat", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"lstat", {PARAM_STRING, PARAM_ADDR, 0}}, + {"poll", {PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"lseek", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mmap", {PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mprotect", {PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"munmap", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"brk", {PARAM_ADDR, 0}}, + {"rt_sigaction", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"rt_sigprocmask", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"rt_sigreturn", {PARAM_NUMBER, 0}}, + {"ioctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pread64", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pwrite64", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"readv", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"writev", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"access", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"pipe", {PARAM_ADDR, 0}}, + {"select", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"sched_yield", {0}}, + {"mremap", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"msync", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mincore", {PARAM_NUMBER, PARAM_NUMBER, PARAM_STRING, 0}}, + {"madvise", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"shmget", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"shmat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"shmctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"dup", {PARAM_NUMBER, 0}}, + {"dup2", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pause", {0}}, + {"nanosleep", {PARAM_ADDR, PARAM_ADDR, 0}}, + {"getitimer", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"alarm", {PARAM_NUMBER, 0}}, + {"setitimer", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"getpid", {0}}, + {"sendfile", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"socket", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"connect", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"accept", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"sendto", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"recvfrom", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"sendmsg", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"recvmsg", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"shutdown", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"bind", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"listen", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getsockname", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"getpeername", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"socketpair", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"setsockopt", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"getsockopt", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, 0}}, + {"clone", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"fork", {0}}, + {"vfork", {0}}, + {"execve", {PARAM_STRING, PARAM_ADDR, PARAM_ADDR, 0}}, + {"exit", {PARAM_NUMBER, 0}}, + {"wait4", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"kill", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"uname", {PARAM_ADDR, 0}}, + {"semget", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"semop", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"semctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"shmdt", {PARAM_STRING, 0}}, + {"msgget", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"msgsnd", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"msgrcv", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"msgctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"fcntl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"flock", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"fsync", {PARAM_NUMBER, 0}}, + {"fdatasync", {PARAM_NUMBER, 0}}, + {"truncate", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"ftruncate", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getdents", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"getcwd", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"chdir", {PARAM_STRING, 0}}, + {"fchdir", {PARAM_NUMBER, 0}}, + {"rename", {PARAM_STRING, PARAM_STRING, 0}}, + {"mkdir", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"rmdir", {PARAM_STRING, 0}}, + {"creat", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"link", {PARAM_STRING, PARAM_STRING, 0}}, + {"unlink", {PARAM_STRING, 0}}, + {"symlink", {PARAM_STRING, PARAM_STRING, 0}}, + {"readlink", {PARAM_STRING, PARAM_STRING, PARAM_NUMBER, 0}}, + {"chmod", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"fchmod", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"chown", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"fchown", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"lchown", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"umask", {PARAM_NUMBER, 0}}, + {"gettimeofday", {PARAM_ADDR, PARAM_ADDR, 0}}, + {"getrlimit", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"getrusage", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sysinfo", {PARAM_ADDR, 0}}, + {"times", {PARAM_ADDR, 0}}, + {"ptrace", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getuid", {0}}, + {"syslog", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"getgid", {0}}, + {"setuid", {PARAM_NUMBER, 0}}, + {"setgid", {PARAM_NUMBER, 0}}, + {"geteuid", {0}}, + {"getegid", {0}}, + {"setpgid", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getppid", {0}}, + {"getpgrp", {0}}, + {"setsid", {0}}, + {"setreuid", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"setregid", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getgroups", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"setgroups", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"setresuid", {PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"getresuid", {PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"setresgid", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getresgid", {PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"getpgid", {PARAM_NUMBER, 0}}, + {"setfsuid", {PARAM_NUMBER, 0}}, + {"setfsgid", {PARAM_NUMBER, 0}}, + {"getsid", {PARAM_NUMBER, 0}}, + {"capget", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"capset", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"rt_sigpending", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"rt_sigtimedwait", {PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"rt_sigqueueinfo", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"rt_sigsuspend", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"sigaltstack", {PARAM_ADDR, PARAM_ADDR, 0}}, + {"utime", {PARAM_STRING, PARAM_ADDR, 0}}, + {"mknod", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"uselib", {PARAM_NUMBER, 0}}, + {"personality", {PARAM_NUMBER, 0}}, + {"ustat", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"statfs", {PARAM_STRING, PARAM_ADDR, 0}}, + {"fstatfs", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sysfs", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getpriority", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"setpriority", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"sched_setparam", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sched_getparam", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sched_setscheduler", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sched_getscheduler", {PARAM_NUMBER, 0}}, + {"sched_get_priority_max", {PARAM_NUMBER, 0}}, + {"sched_get_priority_min", {PARAM_NUMBER, 0}}, + {"sched_rr_get_interval", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"mlock", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"munlock", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mlockall", {PARAM_NUMBER, 0}}, + {"munlockall", {0}}, + {"vhangup", {0}}, + {"modify_ldt", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"pivot_root", {PARAM_STRING, PARAM_STRING, 0}}, + {"_sysctl", {PARAM_ADDR, 0}}, + {"prctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"arch_prctl", {PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"adjtimex", {PARAM_ADDR, 0}}, + {"setrlimit", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"chroot", {PARAM_STRING, 0}}, + {"sync", {0}}, + {"acct", {PARAM_STRING, 0}}, + {"settimeofday", {PARAM_ADDR, PARAM_ADDR, 0}}, + {"mount", {PARAM_STRING, PARAM_STRING, PARAM_STRING, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"umount2", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"swapon", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"swapoff", {PARAM_STRING, 0}}, + {"reboot", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sethostname", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"setdomainname", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"iopl", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"ioperm", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"create_module", {PARAM_NUMBER, 0}}, + {"init_module", {PARAM_ADDR, PARAM_NUMBER, PARAM_STRING, 0}}, + {"delete_module", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"get_kernel_syms", {PARAM_NUMBER, 0}}, + {"query_module", {PARAM_NUMBER, 0}}, + {"quotactl", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"nfsservctl", {PARAM_NUMBER, 0}}, + {"getpmsg", {PARAM_NUMBER, 0}}, + {"putpmsg", {PARAM_NUMBER, 0}}, + {"afs_syscall", {PARAM_NUMBER, 0}}, + {"tuxcall", {PARAM_NUMBER, 0}}, + {"security", {PARAM_NUMBER, 0}}, + {"gettid", {0}}, + {"readahead", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"setxattr", {PARAM_STRING, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"lsetxattr", {PARAM_STRING, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"fsetxattr", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getxattr", {PARAM_STRING, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"lgetxattr", {PARAM_STRING, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"fgetxattr", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"listxattr", {PARAM_STRING, PARAM_STRING, PARAM_NUMBER, 0}}, + {"llistxattr", {PARAM_STRING, PARAM_STRING, PARAM_NUMBER, 0}}, + {"flistxattr", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"removexattr", {PARAM_STRING, PARAM_STRING, 0}}, + {"lremovexattr", {PARAM_STRING, PARAM_STRING, 0}}, + {"fremovexattr", {PARAM_NUMBER, PARAM_STRING, 0}}, + {"tkill", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"time", {PARAM_ADDR, 0}}, + {"futex", {PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"sched_setaffinity", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"sched_getaffinity", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"set_thread_area", {PARAM_NUMBER, 0}}, + {"io_setup", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"io_destroy", {PARAM_NUMBER, 0}}, + {"io_getevents", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"io_submit", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"io_cancel", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"get_thread_area", {PARAM_NUMBER, 0}}, + {"lookup_dcookie", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"epoll_create", {PARAM_NUMBER, 0}}, + {"epoll_ctl_old", {PARAM_NUMBER, 0}}, + {"epoll_wait_old", {PARAM_NUMBER, 0}}, + {"remap_file_pages", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getdents64", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"set_tid_address", {PARAM_ADDR, 0}}, + {"restart_syscall", {0}}, + {"semtimedop", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"fadvise64", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"timer_create", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"timer_settime", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"timer_gettime", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"timer_getoverrun", {PARAM_NUMBER, 0}}, + {"timer_delete", {PARAM_NUMBER, 0}}, + {"clock_settime", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"clock_gettime", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"clock_getres", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"clock_nanosleep", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"exit_group", {PARAM_NUMBER, 0}}, + {"epoll_wait", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"epoll_ctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"tgkill", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"utimes", {PARAM_STRING, PARAM_ADDR, 0}}, + {"vserver", {PARAM_NUMBER, 0}}, + {"mbind", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"set_mempolicy", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"get_mempolicy", {PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mq_open", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"mq_unlink", {PARAM_STRING, 0}}, + {"mq_timedsend", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"mq_timedreceive", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"mq_notify", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"mq_getsetattr", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"kexec_load", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"waitid", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"add_key", {PARAM_STRING, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"request_key", {PARAM_STRING, PARAM_STRING, PARAM_STRING, PARAM_NUMBER, 0}}, + {"keyctl", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"ioprio_set", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"ioprio_get", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"inotify_init", {0}}, + {"inotify_add_watch", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"inotify_rm_watch", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"migrate_pages", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"openat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mkdirat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"mknodat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"fchownat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"futimesat", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, 0}}, + {"newfstatat", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"unlinkat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"renameat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_STRING, 0}}, + {"linkat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"symlinkat", {PARAM_STRING, PARAM_NUMBER, PARAM_STRING, 0}}, + {"readlinkat", {PARAM_NUMBER, PARAM_STRING, PARAM_STRING, PARAM_NUMBER, 0}}, + {"fchmodat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"faccessat", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"pselect6", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"ppoll", {PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"unshare", {PARAM_NUMBER, 0}}, + {"set_robust_list", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"get_robust_list", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"splice", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"tee", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"sync_file_range", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"vmsplice", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"move_pages", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"utimensat", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"epoll_pwait", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"signalfd", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"timerfd_create", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"eventfd", {PARAM_NUMBER, 0}}, + {"fallocate", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"timerfd_settime", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"timerfd_gettime", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"accept4", {PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"signalfd4", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"eventfd2", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"epoll_create1", {PARAM_NUMBER, 0}}, + {"dup3", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pipe2", {PARAM_ADDR, PARAM_NUMBER, 0}}, + {"inotify_init1", {PARAM_NUMBER, 0}}, + {"preadv", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pwritev", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"rt_tgsigqueueinfo", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"perf_event_open", {PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"recvmmsg", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, 0}}, + {"fanotify_init", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"fanotify_mark", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"prlimit64", {PARAM_NUMBER, PARAM_NUMBER, PARAM_ADDR, PARAM_ADDR, 0}}, + {"name_to_handle_at", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"open_by_handle_at", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"clock_adjtime", {PARAM_NUMBER, PARAM_ADDR, 0}}, + {"syncfs", {PARAM_NUMBER, 0}}, + {"sendmmsg", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"setns", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"getcpu", {PARAM_ADDR, PARAM_ADDR, PARAM_ADDR, 0}}, + {"process_vm_readv", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"process_vm_writev", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"kcmp", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"finit_module", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"sched_setattr", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"sched_getattr", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"renameat2", {PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"seccomp", {PARAM_NUMBER, PARAM_NUMBER, PARAM_STRING, 0}}, + {"getrandom", {PARAM_STRING, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"memfd_create", {PARAM_STRING, PARAM_NUMBER, 0}}, + {"kexec_file_load", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_STRING, PARAM_NUMBER, 0}}, + {"bpf", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"stub_execveat", {PARAM_NUMBER, PARAM_STRING, PARAM_ADDR, PARAM_ADDR, PARAM_NUMBER, 0}}, + {"userfaultfd", {PARAM_NUMBER, 0}}, + {"membarrier", {PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"mlock2", {PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"copy_file_range", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"preadv2", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, + {"pwritev2", {PARAM_NUMBER, PARAM_ADDR, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, PARAM_NUMBER, 0}}, +}; + +#endif diff --git a/strace/srcs/ping.c b/strace/srcs/ping.c deleted file mode 100644 index 8255115a..00000000 --- a/strace/srcs/ping.c +++ /dev/null @@ -1,154 +0,0 @@ -/* ************************************************************************** */ -/* */ -/* ::: :::::::: */ -/* main.c :+: :+: :+: */ -/* +:+ +:+ +:+ */ -/* By: jhalford +#+ +:+ +#+ */ -/* +#+#+#+#+#+ +#+ */ -/* Created: 2017/04/22 14:10:24 by jhalford #+# #+# */ -/* Updated: 2017/04/23 18:18:41 by jhalford ### ########.fr */ -/* */ -/* ************************************************************************** */ - -#include "ping.h" - -int g_pid=-1; -int g_pkt_rec=0; -char g_domain[256]; -struct s_stats g_rs; - -unsigned short ping_cksum(void *b, int len) -{ - unsigned short *buf = b; - unsigned int sum=0; - - for (sum = 0; len > 1; len -= 2) - sum += *((unsigned short*)buf++); - if (len == 1) - sum += *(unsigned char*)buf; - - sum = (sum >> 16) + (sum & 0xFFFF); - return (~(sum + (sum >> 16))); -} - -void display(void *buf, int bytes, struct sockaddr_in *addr) -{ - struct ip *ip = buf; - struct icmp *icmp; - struct s_packet *pkt; - int hlen; - char addrstr[INET_ADDRSTRLEN]; - struct timeval start, end, triptime; - double diff; - - (void)bytes; - hlen = ip->ip_hl << 2; - pkt = (struct s_packet*)(buf + hlen); - icmp = &pkt->hdr; - start = *(struct timeval*)&pkt->msg; - - if (icmp->icmp_id != g_pid) - return ; - if (gettimeofday(&end, NULL) != 0) - return ; - timersub(&end, &start, &triptime); - diff = (triptime.tv_sec + triptime.tv_usec / 1000000.0) * 1000.0; - rs_push(diff); - g_pkt_rec++; - printf("%d bytes from %s: icmp_seq=%d ttl=%i time=%.3f ms\n", - ip->ip_len, - inet_ntop(AF_INET, &(addr->sin_addr), addrstr, INET_ADDRSTRLEN), - icmp->icmp_seq, ip->ip_ttl, diff); -} - - -void ping(struct sockaddr_in *addr) -{ - const int val = 255; - int i; - int sd; - int cnt; - struct s_packet pkt; - struct timeval time; - - if ((sd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) - return (perror("sender socket")); - if (setsockopt(sd, 0, IP_TTL, &val, sizeof(val)) != 0) - perror("set TTL option"); - cnt = 0; - while (1) - { - bzero(&pkt, sizeof(pkt)); - pkt.hdr.icmp_type = ICMP_ECHO; - pkt.hdr.icmp_id = g_pid; - pkt.hdr.icmp_seq = cnt++; - - for (i=0; i < (int)sizeof(pkt.msg); i++) - pkt.msg[i] = i+'0'; - pkt.msg[i] = 0; - if (gettimeofday(&time, NULL) != 0) - return ; - ft_memcpy(pkt.msg, (void*)&time, sizeof(time)); - time = *(struct timeval*)&pkt.msg; - pkt.hdr.icmp_cksum = ping_cksum(&pkt, sizeof(pkt)); - if (sendto(sd, &pkt, sizeof(pkt), 0, (struct sockaddr*)addr, sizeof(*addr)) <= 0) - perror("sendto"); - sleep(1); - } -} - -void stats_recap(int signo) -{ - double loss; - - (void)signo; - rs_calcmore(); - loss = g_rs.count ? 100 * ((float) (g_rs.count - g_pkt_rec) / (float)g_rs.count) : 0; - printf("\n--- %s ping statistics ---", g_domain); - printf("\n%d packets transmitted, %d packets received, %0.1f%% packet loss", g_rs.count, g_pkt_rec, loss); - printf("\nround-trip min/avg/max/stddev = %.3f/%.3f/%.3f/%.3f ms", g_rs.min, g_rs.avg, g_rs.max, g_rs.stdev); - exit(0); -} - -int main(int ac, char **av) -{ - struct sockaddr_in *addr; - struct addrinfo *result, hints; - char addrstr[INET_ADDRSTRLEN]; - - if (ac != 2) - { - printf("usage: %s \n", av[0]); - exit(1); - } - - memset (&hints, 0, sizeof (hints)); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags |= AI_CANONNAME; - if (getaddrinfo(av[1], NULL, &hints, &result) != 0) - { - perror("getaddrinfo"); - exit(1); - } - addr = (struct sockaddr_in*)result->ai_addr; - inet_ntop(AF_INET, &(addr->sin_addr), addrstr, INET_ADDRSTRLEN); - - g_pid = getpid(); - ft_strcpy(g_domain, addrstr); - if (result->ai_canonname) - ft_strcpy(g_domain, result->ai_canonname); - printf("PING %s (%s): %i data bytes\n", FT_TRY(result->ai_canonname, addrstr), addrstr, 64); - if (fork() == 0) - { - signal(SIGINT, stats_recap); - rs_clear(); - listener(PF_INET, SOCK_RAW, IPPROTO_ICMP, &display); - } - else - { - ping(addr); - wait(0); - } - return (0); -} diff --git a/strace/srcs/strace.c b/strace/srcs/strace.c new file mode 100644 index 00000000..3bd6f52a --- /dev/null +++ b/strace/srcs/strace.c @@ -0,0 +1,112 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/04/22 14:10:24 by jhalford #+# #+# */ +/* Updated: 2017/04/23 18:18:41 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "strace.h" + +extern char **environ; + +extern t_syscall g_syscalls[]; + +#define LOAD_PARAMS(params, regs) do { \ + ft_memcpy(params + 0, ®s->rdi, 8); \ + ft_memcpy(params + 1, ®s->rsi, 8); \ + ft_memcpy(params + 2, ®s->rdx, 8); \ + ft_memcpy(params + 3, ®s->rcx, 8); \ + ft_memcpy(params + 4, ®s->r8, 8); \ + ft_memcpy(params + 5, ®s->r9, 8); \ +} while (0) + +void print_syscall_params(t_syscall syscall, struct user_regs_struct *regs) +{ + enum e_param type; + unsigned long long params[7]; + + LOAD_PARAMS(params, regs); + for (int i = 0; syscall.params[i]; i++) { + type = syscall.params[i]; + if (i != 0) + printf(", "); + if (type == PARAM_NUMBER) + printf("%d", (int)params[i]); + if (type == PARAM_STRING) + { + if (params[i] == 0) + printf("NULL"); + /* else */ + /* printf("\"%s\"", (char *)params[i]); */ + } + if (type == PARAM_ADDR) + { + if (params[i] == 0) + printf("NULL"); + else + printf("%#llx", params[i]); + } + } +} + +void print_syscall_ret(unsigned long long ret) +{ + printf(") = "); + if ((signed long long)ret < 0) + printf("-1 (errno %lld)", -ret); + else if (ret >> 16) + printf("%#llx", ret); + else + printf("%lld", ret); + printf("\n"); +} + +int main(int ac, char **av) +{ + int child; + int status; + unsigned long old; + struct user_regs_struct regs; + + (void)ac; + if ((child = fork()) == 0) { + // child process + ptrace(PTRACE_TRACEME, child, 0, 0); + raise(SIGSTOP); + execve(av[1], av + 1, environ); + } + /* ptrace(PTRACE_SEIZE, child, 0, 0); */ + wait(&status); + ptrace(PTRACE_SETOPTIONS, child, NULL, PTRACE_O_TRACEEXEC); + ptrace(PTRACE_SETOPTIONS, child, NULL, PTRACE_O_TRACESYSGOOD); + while (1) { + ptrace(PTRACE_SYSCALL, child, NULL, NULL); + waitpid(child, &status, 0); + if (WIFEXITED(status)) + { + if (old != 0) + printf(") = ?\n+++ exited with %d +++\n", WEXITSTATUS(status)); + break ; + } + else if (!(WIFSTOPPED(status) && WSTOPSIG(status) & 0x80)) + continue ; + + ptrace(PTRACE_GETREGS, child, NULL, ®s); + if (old != regs.rip) { + printf("%s(", g_syscalls[regs.orig_rax].name); + print_syscall_params(g_syscalls[regs.orig_rax], ®s); + old = regs.rip; + } + else + { + print_syscall_ret(regs.rax); + old = 0; + } + } + return (0); +} diff --git a/strace/test.c b/strace/test.c new file mode 100644 index 00000000..e14c964b --- /dev/null +++ b/strace/test.c @@ -0,0 +1,11 @@ +#include +#include + +int main(void) +{ + write(1, "write in tracee\n", 16); + int fd = open("test.c", 0); + close(fd); + dup2(3, fd); + return 0; +} From 7611f0130544f0a33b2971eb9dc6f98fd7deab61 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sun, 3 Sep 2017 23:16:11 +0200 Subject: [PATCH 5/8] Misc. fixes --- strace/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/strace/.gitignore b/strace/.gitignore index 7c63a771..963fa282 100644 --- a/strace/.gitignore +++ b/strace/.gitignore @@ -1 +1 @@ -ft_ping +ft_strace From 3b44f178fcfe5eafdefb3fa6b89912e85c7da8d7 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sun, 3 Sep 2017 23:32:38 +0200 Subject: [PATCH 6/8] Misc. fixes --- strace/srcs/strace.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/strace/srcs/strace.c b/strace/srcs/strace.c index 3bd6f52a..27e77d49 100644 --- a/strace/srcs/strace.c +++ b/strace/srcs/strace.c @@ -75,15 +75,14 @@ int main(int ac, char **av) (void)ac; if ((child = fork()) == 0) { - // child process - ptrace(PTRACE_TRACEME, child, 0, 0); + /* ptrace(PTRACE_TRACEME, child, 0, 0); */ raise(SIGSTOP); execve(av[1], av + 1, environ); } - /* ptrace(PTRACE_SEIZE, child, 0, 0); */ + ptrace(PTRACE_SEIZE, child, 0, (void*)(PTRACE_O_TRACESYSGOOD)); + ptrace(PTRACE_INTERRUPT, child, 0, 0); wait(&status); - ptrace(PTRACE_SETOPTIONS, child, NULL, PTRACE_O_TRACEEXEC); - ptrace(PTRACE_SETOPTIONS, child, NULL, PTRACE_O_TRACESYSGOOD); + /* ptrace(PTRACE_SETOPTIONS, child, NULL, PTRACE_O_TRACEEXEC); */ while (1) { ptrace(PTRACE_SYSCALL, child, NULL, NULL); waitpid(child, &status, 0); From d2fb3d5c056392f739e30b01f9e559b2f2bacd8c Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sun, 3 Sep 2017 23:46:39 +0200 Subject: [PATCH 7/8] Misc. fixes --- strace/.gitmodules | 3 --- strace/libft | 1 - 2 files changed, 4 deletions(-) delete mode 160000 strace/libft diff --git a/strace/.gitmodules b/strace/.gitmodules index c82793fb..e69de29b 100644 --- a/strace/.gitmodules +++ b/strace/.gitmodules @@ -1,3 +0,0 @@ -[submodule "libft"] - path = libft - url = https://github.com/jzck/libft diff --git a/strace/libft b/strace/libft deleted file mode 160000 index dd612f58..00000000 --- a/strace/libft +++ /dev/null @@ -1 +0,0 @@ -Subproject commit dd612f58c973b6fe9d825557bfa0f62df1e237ef From fad9d1cfd071fda5a4df52e40f14b5ffeebde05b Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sun, 3 Sep 2017 23:51:49 +0200 Subject: [PATCH 8/8] removed libft from makefile --- strace/Makefile | 30 ++++++------------------------ strace/includes/strace.h | 5 ++++- strace/srcs/strace.c | 12 ++++++------ 3 files changed, 16 insertions(+), 31 deletions(-) diff --git a/strace/Makefile b/strace/Makefile index 0bc06537..a2b01c98 100644 --- a/strace/Makefile +++ b/strace/Makefile @@ -22,10 +22,6 @@ FLAGS = $(W_FLAGS) $(D_FLAGS) LEN_NAME = `printf "%s" $(NAME) |wc -c` DELTA = $$(echo "$$(tput cols)-31-$(LEN_NAME)"|bc) -LIBFT_DIR = libft/ -LIBFT_LIB = $(LIBFT_DIR)libft.a -LIBFT_INC = $(LIBFT_DIR)includes/ - SRC_DIR = srcs/ INC_DIR = includes/ OBJ_DIR = objs/ @@ -39,19 +35,14 @@ NB = $(words $(SRC_BASE)) INDEX = 0 all : - @make -C $(LIBFT_DIR) @make -j $(NAME) -$(NAME): $(LIBFT_LIB) $(OBJ_DIR) $(OBJS) +$(NAME): $(OBJ_DIR) $(OBJS) @$(CC) $(OBJS) -o $@ \ -I $(INC_DIR) \ - -I $(LIBFT_INC) \ - $(LIBFT_LIB) $(FLAGS) + $(FLAGS) @printf "\r\033[38;5;117m✓ MAKE $@ \033[0m\033[K\n" -$(LIBFT_LIB): - @make -C $(LIBFT_DIR) - $(OBJ_DIR) : @mkdir -p $(OBJ_DIR) @@ -62,20 +53,16 @@ $(OBJ_DIR)%.o : $(SRC_DIR)%.c | $(OBJ_DIR) @$(eval COLOR=$(shell list=(160 196 202 208 215 221 226 227 190 154 118 82 46); index=$$(($(PERCENT) * $${#list[@]} / 100)); echo "$${list[$$index]}")) @printf "\r\033[38;5;%dm⌛ [%s]: %2d%% `printf '█%.0s' {0..$(DONE)}`%*s❙%*.*s\033[0m\033[K" $(COLOR) ft_p $(PERCENT) $(TO_DO) "" $(DELTA) $(DELTA) "$(shell echo "$@" | sed 's/^.*\///')" @$(CC) $(FLAGS) $(OBJ_FLAG) -MMD -c $< -o $@\ - -I $(INC_DIR)\ - -I $(LIBFT_INC) + -I $(INC_DIR) @$(eval INDEX=$(shell echo $$(($(INDEX)+1)))) -clean: cleanlib +clean: @if [ -e $(OBJ_DIR) ]; then \ rm -rf $(OBJ_DIR); \ printf "\r\033[38;5;202m✗ clean $(NAME) \033[0m\033[K\n"; \ fi; -cleanlib: - @make -C $(LIBFT_DIR) clean - -fclean: clean fcleanlib +fclean: clean @for file in $(NAME); do \ if [ -e $$file ]; then \ rm -f $$file ; \ @@ -83,13 +70,8 @@ fclean: clean fcleanlib fi; \ done; -fcleanlib: cleanlib - @make -C $(LIBFT_DIR) fclean - re: fclean all -relib: fcleanlib $(LIBFT_LIB) - -.PHONY : fclean clean re relib cleanlib fcleanlib +.PHONY : fclean clean re -include $(OBJS:.o=.d) diff --git a/strace/includes/strace.h b/strace/includes/strace.h index 09331ee0..528f8ac0 100644 --- a/strace/includes/strace.h +++ b/strace/includes/strace.h @@ -13,7 +13,10 @@ #ifndef FT_STRACE_H # define FT_STRACE_H -# include "libft.h" +# include +# include +# include +# include # include # include # include diff --git a/strace/srcs/strace.c b/strace/srcs/strace.c index 27e77d49..d3d089c4 100644 --- a/strace/srcs/strace.c +++ b/strace/srcs/strace.c @@ -17,12 +17,12 @@ extern char **environ; extern t_syscall g_syscalls[]; #define LOAD_PARAMS(params, regs) do { \ - ft_memcpy(params + 0, ®s->rdi, 8); \ - ft_memcpy(params + 1, ®s->rsi, 8); \ - ft_memcpy(params + 2, ®s->rdx, 8); \ - ft_memcpy(params + 3, ®s->rcx, 8); \ - ft_memcpy(params + 4, ®s->r8, 8); \ - ft_memcpy(params + 5, ®s->r9, 8); \ + memcpy(params + 0, ®s->rdi, 8); \ + memcpy(params + 1, ®s->rsi, 8); \ + memcpy(params + 2, ®s->rdx, 8); \ + memcpy(params + 3, ®s->rcx, 8); \ + memcpy(params + 4, ®s->r8, 8); \ + memcpy(params + 5, ®s->r9, 8); \ } while (0) void print_syscall_params(t_syscall syscall, struct user_regs_struct *regs)