first commit
This commit is contained in:
commit
cb353cbe3c
9 changed files with 265 additions and 0 deletions
3
ftp/.gitmodules
vendored
Normal file
3
ftp/.gitmodules
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "libft"]
|
||||||
|
path = libft
|
||||||
|
url = http://github.com/jzck/libft.git
|
||||||
109
ftp/Makefile
Normal file
109
ftp/Makefile
Normal file
|
|
@ -0,0 +1,109 @@
|
||||||
|
# **************************************************************************** #
|
||||||
|
# #
|
||||||
|
# ::: :::::::: #
|
||||||
|
# Makefile :+: :+: :+: #
|
||||||
|
# +:+ +:+ +:+ #
|
||||||
|
# By: wescande <wescande@student.42.fr> +#+ +:+ +#+ #
|
||||||
|
# +#+#+#+#+#+ +#+ #
|
||||||
|
# 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)
|
||||||
BIN
ftp/client
Executable file
BIN
ftp/client
Executable file
Binary file not shown.
22
ftp/includes/ft_p.h
Normal file
22
ftp/includes/ft_p.h
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* ft_p.h :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* 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
|
||||||
1
ftp/libft
Submodule
1
ftp/libft
Submodule
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit ab685ea78b2fd776d07e2a150a8a2a884a48c80f
|
||||||
BIN
ftp/server
Executable file
BIN
ftp/server
Executable file
Binary file not shown.
50
ftp/srcs/client.c
Normal file
50
ftp/srcs/client.c
Normal file
|
|
@ -0,0 +1,50 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* client.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* 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 <addr> <port>"
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
76
ftp/srcs/server.c
Normal file
76
ftp/srcs/server.c
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* server.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* 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 <port>"
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
4
ftp/srcs/test.c
Normal file
4
ftp/srcs/test.c
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
int test(void)
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue