20#define FTP_NET_ERROR 802
21#define FTP_FILE_ERROR 803
22#define FTP_RESPONSE_ERROR 804
23#define FTP_INVALID_ARG 805
27#define FTP_INVALID_SOCKET INVALID_SOCKET
30#define FTP_INVALID_SOCKET (-1)
34#define FTP_RECEIVE_TIMEOUT_MSEC 30000
36static char bars[] =
"/-\\|";
66 if (WSAStartup(MAKEWORD(1, 1), &WSAData) != 0)
74 struct sockaddr_in bind_addr;
83 memset(&bind_addr, 0,
sizeof(bind_addr));
84 bind_addr.sin_family = AF_INET;
85 bind_addr.sin_port = htons(port);
87 memcpy((
char *) &(bind_addr.sin_addr), &host_addr, 4);
89 status = connect(sock, (
struct sockaddr *) &bind_addr,
sizeof(bind_addr));
92 struct addrinfo hints;
93 struct addrinfo *addresses = NULL;
96 memset(&hints, 0,
sizeof(hints));
97 hints.ai_family = AF_UNSPEC;
98 hints.ai_socktype = SOCK_STREAM;
99 hints.ai_protocol = IPPROTO_TCP;
100 snprintf(service,
sizeof(service),
"%u", port);
110 for (
struct addrinfo *address = addresses; address != NULL; address = address->ai_next) {
111 sock =
socket(address->ai_family, address->ai_socktype, address->ai_protocol);
117 status = connect(sock, address->ai_addr, address->ai_addrlen);
118 }
while (
status == -1 && errno == EINTR);
120 status = connect(sock, address->ai_addr, address->ai_addrlen);
130 freeaddrinfo(addresses);
134 sprintf(
str,
"cannot connect to host %s, port %d",
host_name, port);
142 (*con)->
sock = (int) sock;
145 memset(
str, 0,
sizeof(
str));
166 if (send(con->
sock,
"\r\n", 2, 0) == -1)
198 va_start(args,
param);
202 code = va_arg(args,
int);
209 }
while (!result_ok);
261 va_start(args, number);
265 code = va_arg(args,
int);
284 struct sockaddr_in
data, from;
287 unsigned int len =
sizeof(
data), fromlen =
sizeof(from);
292 memset(&from, 0,
sizeof(from));
300 memcpy(&
data.sin_addr, &host_addr,
sizeof(
data.sin_addr));
303 struct addrinfo hints;
304 struct addrinfo *addresses = NULL;
306 memset(&hints, 0,
sizeof(hints));
307 hints.ai_family = AF_INET;
308 hints.ai_socktype = SOCK_STREAM;
309 hints.ai_protocol = IPPROTO_TCP;
312 if (
status != 0 || addresses == NULL) {
313 if (addresses != NULL)
314 freeaddrinfo(addresses);
318 data.sin_addr = ((
const struct sockaddr_in *) addresses->ai_addr)->sin_addr;
319 freeaddrinfo(addresses);
325 if (setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR,
326 (
char *) &one,
sizeof(one)) < 0) {
331 data.sin_family = AF_INET;
332 data.sin_port = htons(0);
334 if (bind(listen_socket, (
struct sockaddr *) &
data,
sizeof(
data)) == -1) {
340 if (getsockname(listen_socket, (
struct sockaddr *) &
data, (
int *)&len) < 0) {
342 if (getsockname(listen_socket, (
struct sockaddr *) &
data, &len) < 0) {
348 if (listen(listen_socket, 1) != 0) {
353 a = (
char *) &
data.sin_addr;
354 b = (
char *) &
data.sin_port;
366 data_socket = accept(listen_socket, (
struct sockaddr *) &from, (
int *)&fromlen);
368 data_socket = accept(listen_socket, (
struct sockaddr *) &from, &fromlen);
378 con->
data = (int) data_socket;
397int ftp_send(
int sock,
const char *buffer,
int n_bytes_to_write)
400 int n_bytes_left, n_written;
402 n_bytes_left = n_bytes_to_write;
404 while (n_bytes_left > 0) {
405 n_written = send(sock, buffer, n_bytes_left > 8192 ? 8192 : n_bytes_left, 0);
407 return n_bytes_to_write - n_bytes_left;
409 n_bytes_left -= n_written;
413 return n_bytes_to_write;
426 struct timeval timeout;
431 if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (
char *) &timeout,
sizeof(timeout)) != 0)
436 count = recv(sock, buffer +
i, bsize - 1 -
i, 0);
451 const char *user,
const char *password,
const char *account)
506 sprintf(cmd,
"PORT %d,%d,%d,%d,%d,%d", a, b,
c,
d,
e, f);
530 return ftp_command(con,
"RNTO %s", newname, 200, 250, EOF);
551 if ((fh = open(local_name, O_RDWR | O_CREAT | O_TRUNC |
O_BINARY, 0644)) == -1)
560 printf(
"%c\r",
bars[(
i++) % 4]);
570 sprintf(
str,
"%ld bytes received in %1.2f seconds (%1.2lf kB/sec).",
571 total, (stop - start) / 1000.0,
total / 1024.0 / ((stop - start) / 1000.0));
594 if ((fh = open(local_name,
O_BINARY)) == -1)
599 while ((
count =
read(fh, buff, 8192)) > 0) {
602 printf(
"%c\r",
bars[(
i++) % 4]);
612 sprintf(
str,
"%ld bytes sent in %1.2f seconds (%1.2lf kB/sec).",
613 total, (stop - start) / 1000.0,
total / 1024.0 / ((stop - start) / 1000.0));
625 static char str[256];
642 sscanf(tmp,
"%*[^\"]%*c%[^\"]%*s",
str);
652 char command[256], buffer[8192];
655 strcpy(command,
"LIST");
657 sprintf(command,
"LIST %s",
file);
659 if (
ftp_data(con, command,
"") >= 0)
663 printf(
"%s", buffer);
int(* ftp_debug_func)(const char *message)
int ftp_login(FTP_CON **con, const char *host, unsigned short port, const char *user, const char *password, const char *account)
int ftp_close(FTP_CON *con)
int(* ftp_error_func)(const char *message)
int ftp_command(FTP_CON *con, const char *command, const char *param,...)
int ftp_send_message(FTP_CON *con, const char *message)
int ftp_dir(FTP_CON *con, const char *file)
#define FTP_RESPONSE_ERROR
char * ftp_pwd(FTP_CON *con)
void ftp_debug(int(*debug_func)(const char *message), int(*error_func)(const char *message))
int ftp_send(int sock, const char *buffer, int n_bytes_to_write)
int ftp_get_message(FTP_CON *con, char *message)
int ftp_connect(FTP_CON **con, const char *host_name, unsigned short port)
int ftp_data(FTP_CON *con, const char *command, const char *file)
int ftp_receive(int sock, char *buffer, int bsize)
int ftp_put(FTP_CON *con, const char *local_name, const char *remote_name)
#define FTP_RECEIVE_TIMEOUT_MSEC
int ftp_port(FTP_CON *con, int a, int b, int c, int d, int e, int f)
#define FTP_INVALID_SOCKET
int ftp_bye(FTP_CON *con)
int ftp_get(FTP_CON *con, const char *local_name, const char *remote_name)
BOOL ftp_good(int number,...)
int ftp_move(FTP_CON *con, const char *oldname, const char *newname)
#define ftp_open_read(ftp, file)
#define ftp_account(ftp, acc)
#define ftp_password(ftp, pas)
#define ftp_open_write(ftp, file)
#define ftp_user(ftp, user)
char host_name[HOST_NAME_LENGTH]
#define message(type, str)
#define write(n, a, f, d)