1+ #include "func.h"
12/*
23List the contents of current working directory on server (`ls` and `ls -l` linux commands).
34*/
@@ -7,6 +8,10 @@ void list_content(char *arg, char *user_input, int sockfd)
78 int no_of_bytes ;
89 int port ;
910 int newsockfd ;
11+
12+ struct timeval tm ;/* time structure to set time wait for receive buffer */
13+ tm .tv_sec = 1 ;
14+ tm .tv_usec = 750000 ;
1015
1116 char message_from_server [MAXSZ ];
1217 char message_to_server [MAXSZ ];
@@ -21,22 +26,30 @@ void list_content(char *arg, char *user_input, int sockfd)
2126 while ((no_of_bytes = recv (sockfd ,message_from_server ,MAXSZ ,0 )) > 0 )
2227 {
2328 message_from_server [no_of_bytes ] = '\0' ;
24- printf ("%s\n " ,message_from_server );
29+ printf ("%s" ,message_from_server );
2530 fflush (stdout );
26- if (message_from_server [ no_of_bytes - 2 ] == '\r' && message_from_server [ no_of_bytes - 1 ] == '\n' )
31+ if (strstr ( message_from_server , "200 " ) > 0 || strstr ( message_from_server , "501 " ) > 0 || strstr ( message_from_server , "500 " ) > 0 || strstr ( message_from_server , "504 " ) > 0 || strstr ( message_from_server , "421 " ) > 0 || strstr ( message_from_server , "530 " ) > 0 )
2732 break ;
2833 }
29-
34+ printf ("\n" );
35+
36+ if (strstr (message_from_server ,"501 " ) > 0 || strstr (message_from_server ,"500 " ) > 0 || strstr (message_from_server ,"504 " ) > 0 || strstr (message_from_server ,"421 " ) > 0 || strstr (message_from_server ,"530 " ) > 0 )
37+ return ;
38+
3039 /* Request server to connect to PASSIVE port for file transfers */
3140 send (sockfd ,passive ,strlen (passive ),0 );
3241 while ((no_of_bytes = recv (sockfd ,message_from_server ,MAXSZ ,0 )) > 0 )
3342 {
3443 message_from_server [no_of_bytes ] = '\0' ;
35- printf ("%s\n " ,message_from_server );
44+ printf ("%s" ,message_from_server );
3645 fflush (stdout );
37- if (message_from_server [ no_of_bytes - 2 ] == '\r' && message_from_server [ no_of_bytes - 1 ] == '\n' )
46+ if (strstr ( message_from_server , "227 " ) > 0 || strstr ( message_from_server , "501 " ) > 0 || strstr ( message_from_server , "500 " ) > 0 || strstr ( message_from_server , "502 " ) > 0 || strstr ( message_from_server , "421 " ) > 0 || strstr ( message_from_server , "530 " ) > 0 )
3847 break ;
3948 }
49+ printf ("\n" );
50+
51+ if (strstr (message_from_server ,"501 " ) > 0 || strstr (message_from_server ,"500 " ) > 0 || strstr (message_from_server ,"502 " ) > 0 || strstr (message_from_server ,"421 " ) > 0 || strstr (message_from_server ,"530 " ) > 0 )
52+ return ;
4053
4154 /* Request acepted. Connect to PASSIVE port */
4255 if (strncmp (message_from_server ,"227" ,3 )== 0 )
@@ -55,33 +68,52 @@ void list_content(char *arg, char *user_input, int sockfd)
5568
5669 send (sockfd ,message_to_server ,strlen (message_to_server ),0 );
5770
58- no_of_bytes = recv (sockfd ,message_from_server ,MAXSZ ,0 );
59- message_from_server [no_of_bytes ] = '\0' ;
60- printf ("%s\n" ,message_from_server );
61- fflush (stdout );
6271
72+ while ((no_of_bytes = recv (sockfd ,message_from_server ,MAXSZ ,0 )) > 0 )
73+ {
74+ message_from_server [no_of_bytes ] = '\0' ;
75+ printf ("%s" ,message_from_server );
76+ fflush (stdout );
77+
78+ if (strstr (message_from_server ,"125 " ) > 0 || strstr (message_from_server ,"150 " ) > 0 || strstr (message_from_server ,"501 " ) > 0 || strstr (message_from_server ,"500 " ) > 0 || strstr (message_from_server ,"502 " ) > 0 || strstr (message_from_server ,"421 " ) > 0 || strstr (message_from_server ,"530 " ) > 0 )
79+ break ;
80+ }
81+ printf ("\n" );
82+
83+ if (strncmp (message_from_server ,"125" ,3 ) != 0 && strncmp (message_from_server ,"150" ,3 ) != 0 )
84+ return ;
85+
86+ func (newsockfd );
87+
6388 /* Read data on new PASSIVE socket */
6489
6590 while ((no_of_bytes = recv (newsockfd ,message_from_server ,MAXSZ ,0 )) > 0 )
6691 {
6792 message_from_server [no_of_bytes ] = '\0' ;
68- printf ("%s\n " ,message_from_server );
93+ printf ("%s" ,message_from_server );
6994 fflush (stdout );
70- if (message_from_server [no_of_bytes - 2 ] == '\r' && message_from_server [no_of_bytes - 1 ] == '\n' )
71- break ;
7295
7396 }
74-
97+ printf ("\n" );
98+
7599 close (newsockfd );/* Close PASSIVE connection */
100+
101+ /* Set time boundation on receive buffer */
102+ if (setsockopt (sockfd , SOL_SOCKET , SO_RCVTIMEO ,(char * )& tm ,sizeof (tm )) == -1 )
103+ {
104+ perror ("Error" );
105+ exit (1 );
106+ }
76107
77108 while ((no_of_bytes = recv (sockfd ,message_from_server ,MAXSZ ,0 )) > 0 )
78109 {
79110 message_from_server [no_of_bytes ] = '\0' ;
80- printf ("%s\n " ,message_from_server );
111+ printf ("%s" ,message_from_server );
81112 fflush (stdout );
82- if (message_from_server [ no_of_bytes - 2 ] == '\r' && message_from_server [ no_of_bytes - 1 ] == '\n' )
113+ if (strstr ( message_from_server , "226 " ) > 0 )
83114 break ;
84115 }
116+ printf ("\n" );
85117 }
86118
87119}
0 commit comments