Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <errno.h>
- #include <string.h>
- #include <netdb.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h>
- #include <arpa/inet.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include <sys/stat.h>
- #include <sys/sendfile.h>
- #include <unistd.h>
- void grumble(char* error) {
- printf("%s", error);
- exit(EXIT_FAILURE);
- }
- int main(int argc, char * argv[]) {
- struct addrinfo * info;
- struct addrinfo hints;
- int sc, ai, sd, sca;
- struct sockaddr_in server, client, peer;
- char *cmd, *serveraddr, *user, *pwd, *str, *req, *res, * clientaddr;
- void * ptr;
- printf("ftp> ");
- int bool_ = 1;
- int port;
- //char serveraddr[100];
- while(bool_) {
- cmd = malloc(sizeof(char)*10);
- serveraddr = malloc(sizeof(char)*100);
- clientaddr = malloc(sizeof(char)*100);
- scanf("%s %s", cmd, serveraddr);
- memset(&hints, 0, sizeof(struct addrinfo));
- hints.ai_family = AF_INET;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_protocol = IPPROTO_TCP;
- req= malloc(sizeof(char)*100);
- char res[1024];
- if(strcmp(cmd, "open") == 0 || strcmp(cmd, "OPEN") == 0) {
- if ((sc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
- grumble("socket");
- ai = getaddrinfo(serveraddr, NULL, &hints, &info);
- if(ai!=0)
- grumble("getaddrinfo\n");
- inet_ntop(info->ai_family, info->ai_addr->sa_data, serveraddr, 100);
- switch(info->ai_family) {
- case AF_INET:
- ptr = &((struct sockaddr_in *)info->ai_addr)->sin_addr;
- // ((struct sockaddr_in *)info->ai_addr)->sin_port ;
- //port = ((struct sockaddr_in *)info->ai_addr)->sin_port;
- break;
- case AF_INET6:
- ptr = &((struct sockaddr_in6 *)info->ai_addr)->sin6_addr;
- // port = ((struct sockaddr_in *)info->ai_addr)->sin_port;
- break;
- }
- inet_ntop(info->ai_family, ptr, serveraddr, 100);
- //printf("%s\n", serveraddr);
- server.sin_addr.s_addr = inet_addr(serveraddr);
- server.sin_family = AF_INET;
- server.sin_port =htons(21)
- ;
- if (connect(sc, (struct sockaddr *)&server, sizeof(server)) < 0) {
- grumble("Unable to connect\n");
- }
- /* if(bind(sc, (struct sockaddr *) &server, sizeof(server)) < 0) {
- grumble("bind");
- }
- // printf("%d\n",port);
- /* while(read(sc, res, strlen(res))) {
- printf("%s\n", res);
- }*/
- /*int n =0;
- char * pt;
- pt = res;
- n = recv(sc, res, strlen(res), 0);
- if(n>0) {
- printf("%s\n", res);
- }
- memset((char*)&res, 0, sizeof(res));
- while((*pt++ = getchar()) != '\n');
- *pt = '\0';*/
- /*msg = ntohs(msg);
- printf("%d\n", msg);*/
- // recv(sc, res, 2000, 0);
- //printf("%s\n", info->ai_addr);
- /*printf("Connected to %s\n", serveraddr);
- //recup code serveur
- printf("220--> Please login with user anonymous or ftp to access our archive <-\n");
- printf("220\nUser : ");
- //sscanf(str, "%s\n", user);*/
- int n=0;
- char *com = malloc(50);
- read(sc, res, sizeof(res) - 1);
- write(fileno(stdout), res, strlen(res)-1);
- if((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
- {
- grumble("socket");
- }
- int len = sizeof(struct sockaddr_in);
- /*getsockname(sc, (struct sockaddr *) &server, &len);
- inet_ntop(AF_INET, &client.sin_addr, clientaddr, sizeof(clientaddr));
- client.sin_addr.s_addr = inet_addr(clientaddr);*/
- //client.sin_family = AF_INET;
- client.sin_port =htons(12345);
- //printf("%s\n", inet_ntoa(client.sin_addr));
- //printf("%s\n", serveraddr);
- /* Bind a special Port */
- //getoscketname pour recup port
- getsockname(sc, (struct sockaddr *) &client, &len);
- printf("%s\n", inet_ntoa(client.sin_addr));
- if(bind(sd, (struct sockaddr *) &client, sizeof(client)) < 0) {
- grumble("bind");
- }
- while (strncmp(req, "QUIT", 4) != 0) {
- /*scanf("%s", cmd);
- printf("%s\n", cmd);*/
- memset(res, 0x00, strlen(res));
- memset(req, 0x00, strlen(req));
- //write(fileno(stdout), "enter ftp cmd", 20);
- read(fileno(stdin), req, 1024);
- //printf("%s\n", req);
- send(sc, req, strlen(req),0);
- /*if(strcmp(req, "port 12345\n")==0) {
- printf("bla\n");
- b=0;
- break;
- }*/
- //memset(res, 0, 100);
- //memset(req, 0, 1024);
- memset(res, 0x00, strlen(res));
- memset(req, 0x00, strlen(req));
- read(sc, res, sizeof(res)-1);
- write(fileno(stdout), res, strlen(res)-1);
- printf("\n");
- if(listen(sd,10) == -1)
- {
- grumble("listen");
- }
- //printf("listen\n");
- /*int ss;
- ss = sizeof(struct sockaddr_in);*/
- //accept
- /*if(strcmp(req, "port 12345\n")==0) {
- if ((sca = accept(sd, (struct sockaddr *)&client, &ss)) == -1)
- {
- grumble("accept");
- }
- }*/
- /*if ((sca = accept(sd, (struct sockaddr *)&peer, &ss)) == -1)
- {
- grumble("accept");
- }
- int n=0;
- while(n=recv(sca, res, strlen(res), 0)) {
- printf("bla\n");
- }*/
- //}
- }
- /*int n1=0;
- printf("%s\n", inet_ntoa(peer.sin_addr));
- while(n1=recv(sca, res, strlen(res), 0)) {
- //printf("bla\n");
- write(fileno(stdout), res, strlen(res)-1);
- //printf("res\n");
- }*/
- user = malloc(sizeof(char)*50);
- scanf("%s",user);
- if (write(sc, user, strlen(user)) == -1) {
- grumble("write");
- }
- /*printf("---> USER %s\n",user);
- printf("331 Please specify the password.\n");
- printf("Password : ");*/
- //sscanf("%s\n", pwd);
- pwd = malloc(sizeof(char)*50);
- scanf("%s",pwd);
- if (write(sc, pwd, strlen(pwd)) == -1) {
- grumble("write");
- }
- //printf("---> PASS \n");
- //write*/
- if(strcmp(cmd, "exit") == 0 || strcmp(cmd, "EXIT") == 0) {
- bool_=0;
- printf("exit\n");
- }
- if(strcmp(cmd, "ciao") == 0 || strcmp(cmd, "CIAO") == 0) {
- close(sc);
- printf("Connection closed\n");
- }
- if(strcmp(cmd, "dir") == 0 || strcmp(cmd, "DIR") == 0) {
- strcpy(req, "dir ");
- strcat(req, ".");
- write(sc, req, strlen(req));
- printf("write %s\n", req);
- recv(sc, res, 2, 0);
- printf("recv %s\n", res);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement