commit cb353cbe3cab09813a52e039fea8ea95f29cebac Author: Jack Halford Date: Sun Apr 2 21:44:59 2017 +0200 first commit diff --git a/ftp/.gitmodules b/ftp/.gitmodules new file mode 100644 index 00000000..ea1279ca --- /dev/null +++ b/ftp/.gitmodules @@ -0,0 +1,3 @@ +[submodule "libft"] + path = libft + url = http://github.com/jzck/libft.git diff --git a/ftp/Makefile b/ftp/Makefile new file mode 100644 index 00000000..3924b232 --- /dev/null +++ b/ftp/Makefile @@ -0,0 +1,109 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: wescande +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2016/08/29 21:32:58 by wescande #+# #+# # +# Updated: 2017/04/02 21:32:01 by jhalford ### ########.fr # +# # +# **************************************************************************** # + +NAME = server client + +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/ + +LIBS = + +SRC_DIR = srcs/ +INC_DIR = includes/ +OBJ_DIR = objs/ + +SERVER_OBJ = $(OBJ_DIR)server.o +CLIENT_OBJ = $(OBJ_DIR)client.o + +SRC_BASE = \ +client.c\ +server.c\ +test.c + +SRCS = $(addprefix $(SRC_DIR), $(SRC_BASE)) +OBJS = $(addprefix $(OBJ_DIR), $(SRC_BASE:.c=.o)) +OBJS := $(filter-out $(SERVER_OBJ), $(OBJS)) +OBJS := $(filter-out $(CLIENT_OBJ), $(OBJS)) +NB = $(words $(SRC_BASE)) +INDEX = 0 + +all : + @make -C $(LIBFT_DIR) + @make -j $(NAME) + +server: $(LIBFT_LIB) $(OBJ_DIR) $(OBJS) $(SERVER_OBJ) + @$(CC) $(OBJS) -o $@ \ + -I $(INC_DIR) \ + -I $(LIBFT_INC) \ + $(LIBS) $(LIBFT_LIB) $(SERVER_OBJ) $(FLAGS) + @printf "\r\033[38;5;117m✓ MAKE $@ \033[0m\033[K\n" + +client: $(LIBFT_LIB) $(OBJ_DIR) $(OBJS) $(CLIENT_OBJ) + @$(CC) $(OBJS) -o $@ \ + -I $(INC_DIR) \ + -I $(LIBFT_INC) \ + $(LIBS) $(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/ftp/client b/ftp/client new file mode 100755 index 00000000..9322ef44 Binary files /dev/null and b/ftp/client differ diff --git a/ftp/includes/ft_p.h b/ftp/includes/ft_p.h new file mode 100644 index 00000000..fd858b4b --- /dev/null +++ b/ftp/includes/ft_p.h @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_p.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/04/02 19:18:58 by jhalford #+# #+# */ +/* Updated: 2017/04/02 20:23:38 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_P_H +# define FT_P_H + +#include "libft.h" +#include "sys/socket.h" +#include "netdb.h" +#include "netinet/in.h" +#include "arpa/inet.h" + +#endif diff --git a/ftp/libft b/ftp/libft new file mode 160000 index 00000000..ab685ea7 --- /dev/null +++ b/ftp/libft @@ -0,0 +1 @@ +Subproject commit ab685ea78b2fd776d07e2a150a8a2a884a48c80f diff --git a/ftp/server b/ftp/server new file mode 100755 index 00000000..d74b8653 Binary files /dev/null and b/ftp/server differ diff --git a/ftp/srcs/client.c b/ftp/srcs/client.c new file mode 100644 index 00000000..c8583581 --- /dev/null +++ b/ftp/srcs/client.c @@ -0,0 +1,50 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* client.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/04/02 19:18:31 by jhalford #+# #+# */ +/* Updated: 2017/04/02 21:40:32 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_p.h" + +#define FTP_CLIENT_USAGE "%s " + +int create_client(char *addr, int port) +{ + int sock; + struct protoent *proto; + struct sockaddr_in sin; + + if (!(proto = getprotobyname("tcp"))) + return (-1); + sock = socket(PF_INET, SOCK_STREAM, proto->p_proto); + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + sin.sin_addr.s_addr = inet_addr(addr); + if (connect(sock, (const struct sockaddr *)&sin, sizeof(sin)) < 0) + return (-1); + return (sock); +} + +int main(int ac, char **av) +{ + int port; + int sock; + + if (ac != 3) + ft_usage(FTP_CLIENT_USAGE, av[0]); + port = ft_atoi(av[2]); + if ((sock = create_client(av[1], port)) < 0) + { + perror(av[0]); + return (1); + } + write(sock, "bonjour\n", 8); + close(sock); + return (0); +} diff --git a/ftp/srcs/server.c b/ftp/srcs/server.c new file mode 100644 index 00000000..6dc79f60 --- /dev/null +++ b/ftp/srcs/server.c @@ -0,0 +1,76 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* server.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/04/02 15:02:48 by jhalford #+# #+# */ +/* Updated: 2017/04/02 21:40:33 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_p.h" + +#define FTP_SERVER_USAGE "%s " + +int create_server(int port) +{ + int sock; + struct protoent *proto; + struct sockaddr_in sin; + + if (!(proto = getprotobyname("tcp"))) + return (-1); + sock = socket(PF_INET, SOCK_STREAM, proto->p_proto); + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + sin.sin_addr.s_addr = htonl(INADDR_ANY); + if (bind(sock, (const struct sockaddr *)&sin, sizeof(sin)) < 0) + return (-1); + listen(sock, 42); + return (sock); +} + +int main(int ac, char **av) +{ + int port; + int sock; + int cs; + struct sockaddr_in csin; + socklen_t cslen; + int r; + char buf[1024]; + pid_t pid; + + if (ac != 2) + ft_usage(FTP_SERVER_USAGE, av[0]); + port = ft_atoi(av[1]); + if ((sock = create_server(port)) < 0) + { + perror(av[0]); + return (1); + } + while (1) + { + cs = accept(sock, (struct sockaddr*)&csin, &cslen); + if ((pid = fork()) < 0) + { + perror(av[0]); + return (1); + } + if (pid == 0) + { + while ((r = read(cs, buf, 1023)) > 0) + { + buf[r - 1] = 0; + ft_printf("==%i== received %i bytes: [%s]\n", getpid(), r, buf); + } + close(cs); + exit (0); + } + close(cs); + } + close(sock); + return (0); +} diff --git a/ftp/srcs/test.c b/ftp/srcs/test.c new file mode 100644 index 00000000..5d0d8f50 --- /dev/null +++ b/ftp/srcs/test.c @@ -0,0 +1,4 @@ +int test(void) +{ + return (0); +}