Develop and Download Open Source Software

Browse Subversion Repository

Contents of /tags/REL-1.1/ftplist.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 14 - (show annotations) (download) (as text)
Mon Feb 23 02:24:24 2009 UTC (15 years, 1 month ago) by hirohitohigashi
File MIME type: text/x-csrc
File size: 4389 byte(s)
Tag release 1.1
1 /*
2
3 libftp 1.0 (stable): this is an FTP library to simplify the work to a Developer
4 who want to work with FTP servers (RFC 959).
5 Copyright (C) 2007/2008 omnipresent - omnipresent[at]email.it
6
7 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
19
20 */
21
22 #include <stdio.h>
23 #include <string.h>
24 #include <errno.h>
25 #include <stdlib.h>
26 #include <unistd.h>
27 #include <sys/types.h>
28 #include <sys/time.h>
29 #include <sys/socket.h>
30 #include <sys/stat.h>
31 #include <netinet/in.h>
32 #include <netdb.h>
33 #include <fcntl.h>
34
35 #include "ftp_main.h"
36
37 /***
38 ftp_list:
39 - int sck => Socket Descriptor
40 - int verbose => Verbose?
41 . 0 Do not Print
42 . 1 Print
43 - ret => Success?
44 . 0 Success
45 .-1 Error
46 .-3 Error
47 ***/
48
49 #define DATA_CONNECTION_ERROR -3
50 #define WRONG_DATA_P -3
51
52 extern struct sockaddr_in ftp_connection;
53
54 int ftp_list (int sck, int verbose)
55 {
56 FILE *list;
57 char *buffer;
58 int n = 0;
59 int flags;
60 int sock;
61 int con_err = 0;
62 struct timeval tm; //tv_sec - tv_usec
63 fd_set readfds;
64
65 extern int data_port;
66 extern struct sockaddr_in ftp_connection;
67
68
69 buffer = (char *)malloc(1024 * sizeof(char));
70 if (buffer == NULL) {
71 printf("Unable to alloc 1024 bytes to buffer (ftp_list)\n");
72 return -1;
73 }
74
75 memset(buffer, 0x0, 1024);
76
77
78 if (data_port == 0) {
79 free(buffer);
80 return WRONG_DATA_P;
81 }
82
83
84 if (write(sck, "LIST\n", strlen("LIST\n")) == -1) {
85
86 if (verbose) {
87 if (errno == EBADF) {
88 fprintf(stderr, "Socket Descriptor Not Valid!\n");
89 free(buffer);
90 return -1;
91
92 } else if (errno == EIO) {
93
94 fprintf(stderr, "I/O Error!\n");
95 free(buffer);
96
97 return -1;
98
99 } else if (errno == EINTR) {
100
101 fprintf(stderr, "Signal Interrupted The write() Function\n");
102 free(buffer);
103
104 return -1;
105 }
106
107 } else {
108
109 if (errno == EBADF) {
110 free(buffer);
111
112 return -1;
113
114 } else if (errno == EIO) {
115 free(buffer);
116
117 return -1;
118
119 } else if (errno == EINTR) {
120 free(buffer);
121
122 return -1;
123 }
124
125 }
126
127 free(buffer);
128
129 return -1;
130
131 }
132
133
134 sock = socket(AF_INET, SOCK_STREAM, 0);
135 if (sock == -1) {
136
137 free(buffer);
138 if (verbose) {
139 perror("Socket");
140 }
141 return -1;
142 }
143
144 ftp_connection.sin_port = htons(data_port);
145
146
147 sleep(1);
148
149
150 if ( (con_err = connect(sock, (struct sockaddr *)&ftp_connection, sizeof(struct sockaddr)) ) != 0) {
151
152 data_port = 0;
153 n = recv(sck, buffer, 1024, 0);
154 memset(buffer, 0x0, 1024);
155 return DATA_CONNECTION_ERROR;
156 }
157
158 if ( (flags=fcntl(sock, F_GETFL,0)) < 0) {
159 printf("--[ fcntl get flags error.\n");
160 free(buffer);
161
162 exit(1);
163 }
164
165 flags |= O_NONBLOCK;
166
167 if ( fcntl (sock, F_SETFL, flags ) < 0 ) {
168 printf("--[ Non Blocking Socket Error.\n");
169 free(buffer);
170
171 exit(1);
172 }
173
174 n = 0;
175 list = fopen("LIST.txt", "w");
176
177 if (list == NULL) {
178 printf("Unable to open LIST file..\n");
179 free(buffer);
180
181 return -1;
182 }
183
184 buffer[1023] = '\0';
185
186 while (1) {
187
188 n = recv(sock, buffer, 1022, 0);
189
190 if (n == 0) {
191 sleep(1); //end of Data.. wait a second..
192 break;
193 }
194
195 buffer[n] = '\0';
196
197 n = 0;
198
199 fprintf(list, "%s", buffer);
200
201 }
202
203 fclose(list);
204 close(sock);
205
206 tm.tv_sec = 4;
207 tm.tv_usec = 5000;
208 sleep(1);
209
210
211 FD_ZERO(&readfds);
212
213 FD_SET(sck, &readfds);
214
215 if (select(sck+1, &readfds, NULL, NULL, &tm) < 0 ) {
216
217 if (verbose) {
218 perror("select()");
219 }
220 free(buffer);
221
222 return -1;
223 } else {
224
225
226 if (FD_ISSET(sck, &readfds)) {
227
228 if ( (n = recv(sck, buffer, 1022, 0)) < 0) {
229 if (verbose) {
230 perror("recv()");
231 }
232 free(buffer);
233
234 return -1;
235 }
236
237 if (verbose)
238 printf("[Server] %s\n", buffer);
239
240 }
241 else {
242 if (verbose)
243 printf("[-] Timeout\n");
244
245 return -1;
246 }
247 }
248
249 buffer[n] = '\0';
250
251
252
253 free(buffer);
254
255
256 return 0;
257
258 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26