20#define FTP_NET_ERROR 802
21#define FTP_FILE_ERROR 803
22#define FTP_RESPONSE_ERROR 804
23#define FTP_INVALID_ARG 805
26static char bars[] =
"/-\\|";
45 struct sockaddr_in bind_addr;
58 if (WSAStartup(MAKEWORD(1, 1), &WSAData) != 0)
63 if ((sock =
socket(AF_INET, SOCK_STREAM, 0)) == -1) {
70 memset(&bind_addr, 0,
sizeof(bind_addr));
71 bind_addr.sin_family = AF_INET;
72 bind_addr.sin_addr.s_addr = 0;
73 bind_addr.sin_port = htons(port);
80 memcpy((
char *) &(bind_addr.sin_addr), &host_addr, 4);
89 memcpy((
char *) &(bind_addr.sin_addr), phe->h_addr, phe->h_length);
94 status = connect(sock, (
struct sockaddr *) &bind_addr,
sizeof(bind_addr));
97 }
while (
status == -1 && errno == EINTR);
99 status = connect(sock, (
struct sockaddr *) &bind_addr,
sizeof(bind_addr));
103 sprintf(
str,
"cannot connect to host %s, port %d",
host_name, port);
114 memset(
str, 0,
sizeof(
str));
135 if (send(con->
sock,
"\r\n", 2, 0) == -1)
167 va_start(args,
param);
171 code = va_arg(args,
int);
178 }
while (!result_ok);
230 va_start(args, number);
234 code = va_arg(args,
int);
253 struct sockaddr_in
data, from;
254 struct hostent *host;
256 int listen_socket, data_socket;
257 unsigned int len =
sizeof(
data), fromlen =
sizeof(from);
262 memset(&from, 0,
sizeof(from));
267 if ((host = (
struct hostent *) gethostbyname(
host_name)) == 0)
270 if ((listen_socket =
socket(AF_INET, SOCK_STREAM, 0)) == -1)
273 if (setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR,
274 (
char *) &one,
sizeof(one)) < 0) {
279 data.sin_family = AF_INET;
280 data.sin_port = htons(0);
281 data.sin_addr.s_addr = *(
unsigned long *) *(host->h_addr_list);
283 if (bind(listen_socket, (
struct sockaddr *) &
data,
sizeof(
data)) == -1) {
289 if (getsockname(listen_socket, (
struct sockaddr *) &
data, (
int *)&len) < 0) {
291 if (getsockname(listen_socket, (
struct sockaddr *) &
data, &len) < 0) {
297 if (listen(listen_socket, 1) != 0) {
302 a = (
char *) &
data.sin_addr;
303 b = (
char *) &
data.sin_port;
315 data_socket = accept(listen_socket, (
struct sockaddr *) &from, (
int *)&fromlen);
317 data_socket = accept(listen_socket, (
struct sockaddr *) &from, &fromlen);
320 if (data_socket == -1) {
327 con->
data = data_socket;
346int ftp_send(
int sock,
const char *buffer,
int n_bytes_to_write)
349 int n_bytes_left, n_written;
351 n_bytes_left = n_bytes_to_write;
353 while (n_bytes_left > 0) {
354 n_written = send(sock, buffer, n_bytes_left > 8192 ? 8192 : n_bytes_left, 0);
356 return n_bytes_to_write - n_bytes_left;
358 n_bytes_left -= n_written;
362 return n_bytes_to_write;
374 count = recv(sock, buffer +
i, bsize - 1 -
i, 0);
389 const char *user,
const char *password,
const char *account)
444 sprintf(cmd,
"PORT %d,%d,%d,%d,%d,%d", a, b,
c,
d,
e, f);
468 return ftp_command(con,
"RNTO %s", newname, 200, 250, EOF);
489 if ((fh = open(local_name, O_RDWR | O_CREAT | O_TRUNC |
O_BINARY, 0644)) == -1)
498 printf(
"%c\r",
bars[(
i++) % 4]);
508 sprintf(
str,
"%ld bytes received in %1.2f seconds (%1.2lf kB/sec).",
509 total, (stop - start) / 1000.0,
total / 1024.0 / ((stop - start) / 1000.0));
532 if ((fh = open(local_name,
O_BINARY)) == -1)
537 while ((
count =
read(fh, buff, 8192)) > 0) {
540 printf(
"%c\r",
bars[(
i++) % 4]);
550 sprintf(
str,
"%ld bytes sent in %1.2f seconds (%1.2lf kB/sec).",
551 total, (stop - start) / 1000.0,
total / 1024.0 / ((stop - start) / 1000.0));
563 static char str[256];
580 sscanf(tmp,
"%*[^\"]%*c%[^\"]%*s",
str);
590 char command[256], buffer[8192];
593 strcpy(command,
"LIST");
595 sprintf(command,
"LIST %s",
file);
597 if (
ftp_data(con, command,
"") >= 0)
601 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)
int ftp_port(FTP_CON *con, int a, int b, int c, int d, int e, int f)
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)