C   10

ftp.c

Guest on 25th July 2021 05:11:25 PM

  1. #define _GNU_SOURCE
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<sys/socket.h>
  5. #include<netinet/in.h>
  6. #include<netdb.h>
  7. #include<sys/stat.h>
  8. #include<string.h>
  9. #include<time.h>
  10. #include<sys/select.h>
  11. #include<sys/types.h>
  12. #include<fcntl.h>
  13. #include<signal.h>
  14. #include<unistd.h>
  15. //telnet 140.112.30.90
  16.  
  17. char buffer[8192] = {0}, databuffer[8192] = {0};
  18. int srvdata_fd, readbytes, writebytes, info_num;
  19. char argument[1024] = {0}, pathname[1024] = {0};
  20. struct sockaddr_in data_srv;
  21.  
  22. void PASV(int);
  23.  
  24. int main(int argc, char* argv[])
  25. {
  26.         int sockfd, filedes;
  27.         struct sockaddr_in srv;
  28.         int port = atoi(argv[2]);
  29.         char *addr = argv[1];
  30.         char command[1024], username[100], password[100];
  31.                                        
  32. //create socket
  33.         if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0 ){
  34.                 fprintf(stderr, "socket error.\n");
  35.                 exit(1);
  36.         }
  37. //converting strings to numerical address & initialization
  38.         srv.sin_addr.s_addr = inet_addr( addr );
  39.         if(srv.sin_addr.s_addr == (in_addr_t) -1) {
  40.                 fprintf(stderr, "inet_addr failed.\n");
  41.                 exit(1);
  42.         }
  43.         srv.sin_family = AF_INET;
  44.         srv.sin_port = htons(port);
  45. //client connect to a server
  46.         if (connect(sockfd, (struct sockaddr*)&srv, sizeof(srv)) < 0){
  47.                 fprintf(stderr, "connect failed.\n");
  48.                 exit(1);
  49.         }
  50. //read  welcome
  51.         if(( readbytes = read(sockfd, buffer, sizeof(buffer))) < 0 ){
  52.                 fprintf(stderr, "read error.\n");
  53.                 exit(1);
  54.         }
  55.        
  56.         printf("%s",buffer);
  57.         sscanf(buffer, "%d", &info_num);
  58.         if(info_num != 220){
  59.                 printf("connect error.\n");
  60.         }
  61. //login
  62.         while(1){
  63.                 printf("%d", info_num);
  64.                 if(info_num != 331){
  65.                         printf("Username:");
  66.                         scanf("%s",username);
  67.                         writebytes = sprintf(buffer, "USER %s\r\n", username);
  68.                         write(sockfd, buffer, writebytes);
  69.                         readbytes = read(sockfd, buffer, sizeof(buffer));
  70.                         buffer[readbytes] = '\0';
  71.                         sscanf(buffer, "%d", &info_num);
  72.                         printf("%s", buffer);
  73.                 }
  74.                 else if(info_num == 331){
  75.                         printf("Password:");
  76.                         scanf("%s",password);
  77.                         writebytes=sprintf(buffer, "PASS %s\r\n", password);
  78.                         write(sockfd, buffer, writebytes);
  79.                         readbytes = read(sockfd, buffer, sizeof(buffer));
  80.  
  81.                         buffer[readbytes] = 0;
  82.                         sscanf(buffer, "%d", &info_num);
  83.                         printf("%s", buffer);
  84.                 }
  85.                 if(info_num == 230){
  86.                 //if logged in, auto send a LIST
  87.                         PASV(sockfd);
  88.                         write(sockfd, "LIST\r\n", 6);
  89.                         readbytes = read(sockfd, buffer, sizeof(buffer));
  90.                         buffer[readbytes] = '\0';
  91.                         printf("%s\n", buffer);
  92.                         sscanf(buffer, "%d", &info_num);
  93.                         if(info_num == 150){
  94.                                 while( (readbytes = read(srvdata_fd, databuffer, sizeof(databuffer)) ) > 0 ){
  95.                                         databuffer[readbytes] = '\0';
  96.                                         printf("%s");
  97.                                 }
  98.                         }
  99.                         close(srvdata_fd);
  100.                         readbytes = read(sockfd, buffer, sizeof(buffer));
  101.                         buffer[readbytes] = '\0';
  102.                         printf("%s\n", buffer);
  103.                         break;
  104.                 }
  105.  
  106.         }
  107. //handling command line
  108.         while(1){
  109.                 printf("Please enter your command:");
  110.                 scanf("%s", command);
  111. //              FTPcommand(sockfd, command);
  112.                 if( !strcmp(command, "PWD") || !strcmp(command,"pwd") ){
  113.                         //PWD
  114.                         write(sockfd, "PWD\r\n", 5);
  115.                         readbytes = read(sockfd, buffer, sizeof(buffer));
  116.                         buffer[readbytes] = '\0';
  117.                         printf("%s\n", buffer);
  118.                 }
  119.                 else if( !strcmp(command, "PASV") || !strcmp(command, "pasv") ){
  120.                         //PASV
  121.                         PASV(sockfd);
  122.                         close(srvdata_fd);
  123.                 }
  124.                 else if( !strcmp(command, "LIST") || !strcmp(command, "list") ){
  125.                         //LIST
  126.                         PASV(sockfd);
  127.                         write(sockfd, "LIST\r\n", 6);
  128.                         readbytes = read(sockfd, buffer, sizeof(buffer));
  129.                         buffer[readbytes] = '\0';
  130.                         printf("%s\n", buffer);
  131.                         sscanf(buffer, "%d", &info_num);
  132.                         if(info_num == 150){
  133.                                 while( (readbytes = read(srvdata_fd, databuffer, sizeof(databuffer)) ) > 0 ){
  134.                                         databuffer[readbytes] = '\0';
  135.                                         printf("%s");
  136.                                 }
  137.                         }
  138.                         close(srvdata_fd);
  139.                         readbytes = read(sockfd, buffer, sizeof(buffer));
  140.                         buffer[readbytes] = '\0';
  141.                         printf("%s\n", buffer);
  142.                 }
  143.                 else if( !strcmp(command, "CWD") || !strcmp(command, "cwd") ){
  144.                         //CWD
  145.                         //printf("Target:");
  146.                         scanf("%s", command);
  147.                         writebytes = sprintf(buffer, "CWD %s\r\n", command);
  148.                         printf("%s", buffer);
  149.                         write(sockfd, buffer, writebytes);
  150.                         readbytes = read(sockfd, buffer, sizeof(buffer));
  151.                         buffer[readbytes] = '\0';
  152.                         printf("%s", buffer);
  153.                 }
  154.                 else if( !strcmp(command, "TYPE") || !strcmp(command, "type") ){
  155.                         //TYPE
  156.                         writebytes = sprintf(buffer, "TYPE I\r\n", argument);
  157.                         write(sockfd, buffer, writebytes);
  158.                         readbytes = read(sockfd, buffer, sizeof(buffer));
  159.                         buffer[readbytes] = '\0';
  160.                         printf("%s\n", buffer);//200 Type set to I
  161.                 }
  162.                 else if( !strcmp(command, "RETR") || !strcmp(command, "retr") ){
  163.                         //RETR
  164.                         scanf("%*c");
  165.                         fgets(argument, sizeof(argument), stdin);
  166.                         argument[strlen(argument) - 1] = '\0';
  167.                         writebytes = sprintf(buffer, "TYPE I\r\n", argument);
  168.                         write(sockfd, buffer, writebytes);
  169.                         readbytes = read(sockfd, buffer, sizeof(buffer));
  170.                         buffer[readbytes] = '\0';
  171.                         printf("%s\n", buffer);//220 ready
  172.                         PASV(sockfd);
  173.                         writebytes = sprintf(buffer, "RETR %s\r\n", argument);
  174.                         write(sockfd, buffer, writebytes);
  175.                         readbytes = read(sockfd, buffer, sizeof(buffer));
  176.                         buffer[readbytes] = '\0';
  177.                         printf("%s\n", buffer);//150 data connection
  178.                         sscanf(buffer, "%d", &info_num);
  179.                         if(info_num == 150){
  180.                                 sprintf(pathname, "./%s", argument);
  181.                                 filedes = open(pathname, O_RDWR | O_APPEND | O_CREAT, S_IWUSR | S_IRUSR);
  182.                                 while( (readbytes = read(srvdata_fd, databuffer, sizeof(databuffer))) > 0 )
  183.                                         write(filedes, databuffer, readbytes);
  184.                                 readbytes = read(sockfd, buffer, sizeof(buffer));
  185.                                 buffer[readbytes] = '\0';
  186.                                 printf("%s\n", buffer);//226 Transfer OK
  187.                         }
  188.                         close(srvdata_fd);
  189.                 }
  190.                 else if( !strcmp(command, "QUIT") || !strcmp(command, "quit") || !strcmp(command, "LOGOUT") || !strcmp(command, "logout") || !strcmp(command, "EXIT") || !strcmp(command, "exit") )
  191.                         exit(0);
  192.         }
  193.         exit(0);
  194. }
  195.  
  196.  
  197. void PASV(int fd){
  198.         char ip_addr[100], data_ip_addr[100];
  199.         char tmp1[100], tmp2[100], tmp3[100];
  200.         int tmp, ip1, ip2, ip3, ip4, ip5, ip6;
  201.  
  202.         write(fd, "PASV\r\n", 6);
  203.         readbytes = read(fd, buffer, sizeof(buffer));
  204.         buffer[readbytes] = '\0';
  205.         printf("%s", buffer);//227 entering passive mode(163.112.28.104.19.196)
  206.         sscanf(buffer, "%d %s %s %s %s",&tmp, tmp1, tmp2, tmp3, ip_addr);
  207.         sscanf(ip_addr, "(%d,%d,%d,%d,%d,%d)", &ip1, &ip2, &ip3, &ip4, &ip5, &ip6);
  208.         sprintf(data_ip_addr, "%d.%d.%d.%d\0", ip1, ip2, ip3, ip4);
  209.         if((srvdata_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
  210.                 fprintf(stderr, "socket error.\n");
  211.                 exit(1);
  212.         }
  213.         data_srv.sin_addr.s_addr = inet_addr( data_ip_addr );
  214.         if(data_srv.sin_addr.s_addr == (in_addr_t) -1) {
  215.                 fprintf(stderr, "inet_addr failed.\n");
  216.                 exit(1);
  217.         }
  218.        data_srv.sin_family = AF_INET;
  219.        data_srv.sin_port = htons((ip5*256)+ip6);
  220.        if (connect(srvdata_fd, (struct sockaddr*)&data_srv, sizeof(data_srv)) < 0){
  221.                 fprintf(stderr, "connect error.\n");
  222.                 exit(1);
  223.        }       
  224. }

Raw Paste


Login or Register to edit or fork this paste. It's free.