Psst.. new poll here.
[email protected] webmail now available. Want one? Go here.
Cannot use outlook/hotmail/live here to register as they blocking our mail servers. #microsoftdeez
Obey the Epel!
Paste
Pasted as C++ by komis ( 14 years ago )
#include <stdio.h>
//#include <termio.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netdb.h>
#pragma warning(disable:4996)
#define TMPFILE "fhosttmp"
#define TRUE 1
#define FALSE 0
typedef int bool_t;
typedef unsigned char uchar_t;
char host_name_str[256];
#define PORT (65000)
#define MAX_STR_BUF (5 * 1024)
#define MAX_FNAME_LENG (256)
#define HOSTNAME host_name_str
#define FTP_PORT (21)
int cur_port = 50500;
int is_put = 0;
int setconn(const char *name, unsigned short port)
{
int sock = -1;
struct servent *srv = NULL;
struct hostent *host = NULL;
struct sockaddr_in sin;
char buf[512];
int len = 0;
memset(&sin;, 0, sizeof(sin));
memset(buf, 0, sizeof(buf));
if ( (sock = socket(AF_INET, SOCK_STREAM, 0)) == (-1))
{
return sock;
}
host = gethostbyname(name);
if (!host)
{
return (-1);
}
memcpy(&(sin.sin_addr), host->h_addr_list[0], host->h_length);
sin.sin_family = AF_INET;
sin.sin_port = htons((u_short)port);
if (sin.sin_addr.s_addr == (-1))
{
close(sock);
return (-1);
}
if (connect(sock, (sockaddr*)&sin;, sizeof(sin)) != 0)
{
close(sock);
return (-1);
}
len = recv(sock, buf, sizeof(buf), 0);
buf[len] = 0;
if ((buf[0] == '2') && (buf[1] == '2') && (buf[2] == '0'))
{
return sock;
}
close(sock);
return (-1);
}
bool_t auth(int sock, char *user, char *pass)
{
char buf[512];
int len = 0;
if (sock == -1)
{
return FALSE;
}
memset(buf, 0, sizeof(buf));
strcat(buf, "user "); strcat(buf, user); strcat(buf, "\r\n");
send(sock, buf, strlen(buf), 0);
len = recv(sock, buf, sizeof(buf), 0); buf[len] = 0;
if (!((buf[0] == '3') && (buf[1] == '3') && (buf[2] == '1')))
{
return FALSE;
}
memset(buf, 0, sizeof(buf));
strcat(buf, "pass "); strcat(buf, pass); strcat(buf, "\r\n");
send(sock, buf, strlen(buf), 0);
len = recv(sock, buf, sizeof(buf), 0); buf[len] = 0;
if (!((buf[0] == '2') && (buf[1] == '3') && (buf[2] == '0')))
{
return FALSE;
}
return TRUE;
}
int active_mod(int sock, const char *name, char *list, int lsize)
{
int sock_new = -1, sock_srv = -1;
struct hostent *host = NULL;
struct sockaddr_in sin;
char buf[512];
int len = 0;
memset(&sin;, 0, sizeof(sin));
memset(buf, 0, sizeof(buf));
if ( (sock_new = socket(AF_INET, SOCK_STREAM, 0)) == (-1))
{
return sock_new;
}
host = gethostbyname(name);
if (!host)
{
return (-1);
}
cur_port++;
memcpy(&(sin.sin_addr), host->h_addr_list[0], host->h_length);
sin.sin_family = AF_INET;
sin.sin_port = htons((u_short)cur_port);
if (sin.sin_addr.s_addr == (-1))
{
close(sock_new);
return (-1);
}
if (bind(sock_new, (struct sockaddr*)&sin;, sizeof(sin)) != 0)
{
close(sock_new);
return (-1);
}
if (is_put)
{
is_put = 0;
recv(sock, buf, sizeof(buf), 0);
}
buf[0] = 0;
sprintf(buf, "PORT %d,%d,%d,%d,%d,%d\r\n", (uchar_t)host->h_addr_list[0][0], (uchar_t)host->h_addr_list[0][1],
(uchar_t)host->h_addr_list[0][2], (uchar_t)host->h_addr_list[0][3],
(uchar_t)(cur_port>>8), (uchar_t)cur_port);
cur_port++;
if (listen(sock_new, 1))
{
close(sock_new);
return (-1);
}
send(sock, buf, strlen(buf), 0);
recv(sock, buf, sizeof(buf), 0);
if (!((buf[0] == '2') && (buf[1] == '0') && (buf[2] == '0')))
{
close(sock_new);
return (-1);
}
if (list)
{
len = sizeof(sin);
buf[0] = 0; strcat(buf, "list\r\n"); send(sock, buf, strlen(buf), 0);
recv(sock, buf, sizeof(buf), 0);
if (!((buf[0] == '1') && (buf[1] == '5') && (buf[2] == '0')))
{
close(sock_new);
return (-1);
}
sock_srv = accept(sock_new, (struct sockaddr*)&sin;, (socklen_t*)&len;);
if (sock_srv != -1) len = recv(sock_srv, list, lsize, 0);
if (len != -1) list[len] = 0;
close(sock_new);
return sock_srv;
}
return sock_new;
}
int ftpcopy(int ssock, int *rsock, char *name)
{
char buf[512], *p = 0;
char list[MAX_STR_BUF];
int len = 0, srvsock = -1;
struct sockaddr_in sin;
int slen = sizeof(sin), flen = 0, rcv = 0;
FILE *Fsave = NULL;
buf[0] = 0;
close(*rsock);
len = recv(ssock, buf, sizeof(buf), 0); if (len != -1) buf[len] = 0;
if (!((buf[0] == '2') && (buf[1] == '2') && (buf[2] == '6')))
{
return (-1);
}
srvsock = active_mod(ssock, HOSTNAME, NULL, 0);
if (srvsock != -1)
{
buf[0] = 0;
strcat(buf, "retr "); strcat(buf, name); strcat(buf, "\r\n");
send(ssock, buf, strlen(buf), 0);
len = recv(ssock, buf, sizeof(buf), 0); buf[len] = 0;
if (!(buf[0] == '1') && (buf[1] == '5') && (buf[2] == '0'))
{
close(srvsock);
*rsock = active_mod(ssock, HOSTNAME, list, sizeof(list));
printf("> Err: file not found.\n");
return (-1);
}
p = strchr(buf, '(');
if (!((p) && sscanf(p + 1, "%d", &flen;) == 1))
{
close(srvsock);
return -1;
}
*rsock = accept(srvsock, (sockaddr*)&sin;, (socklen_t*)&slen;);
close(srvsock);
Fsave = fopen(name, "wb");
if (!Fsave)
{
return (-1);
}
printf("> Size of file: %d.\n", flen);
printf("> Receiving... ");
rcv = 0;
while (rcv < flen)
{
len = recv(*rsock, buf, sizeof(buf), 0);
if (!len) return (-1);
//printf("%d ",len);
rcv += len;
fwrite(buf, len, 1, Fsave);
}
printf("done.\n");
fclose(Fsave);
if (rcv != flen)
{
printf("> Err: invalid size of file.\n");
return -2;
}
}
return 0;
}
int ftpput(int ssock, int *rsock, char *name)
{
char buf[512];
char list[MAX_STR_BUF];
int len = 0, srvsock = -1;
struct sockaddr_in sin;
int slen = sizeof(sin), sended = 0;
FILE *Fput = NULL;
buf[0] = 0;
close(*rsock);
len = recv(ssock, buf, sizeof(buf), 0); if (len != -1) buf[len] = 0;
if (!((buf[0] == '2') && (buf[1] == '2') && (buf[2] == '6')))
{
return (-1);
}
srvsock = active_mod(ssock, HOSTNAME, NULL, 0);
if (srvsock != -1)
{
buf[0] = 0;
strcat(buf, "stor "); strcat(buf, name); strcat(buf, "\r\n");
send(ssock, buf, strlen(buf), 0);
len = recv(ssock, buf, sizeof(buf), 0); buf[len] = 0;
printf("\n> %s.\n", buf);
if (!(buf[0] == '1') && (buf[1] == '5') && (buf[2] == '0'))
{
close(srvsock);
*rsock = active_mod(ssock, HOSTNAME, list, sizeof(list));
printf("> Err: file not found.\n");
return (-1);
}
*rsock = accept(srvsock, (sockaddr*)&sin;, (socklen_t*)&slen;);
close(srvsock);
Fput = fopen(name, "rb");
if (!Fput)
{
return (-1);
}
printf("> Sending.\n");
len = 0;
while ( !feof(Fput) )
{
len += fread(buf,sizeof(char),sizeof(buf),Fput);
send(*rsock, buf, len, 0);
memset(buf,0,sizeof(buf));
}
printf("> All %d bytes were send.\n",len*sizeof(char));
fclose(Fput);
}
cur_port++;
is_put = 1;
return 0;
}
int ftpcd(int ssock, int *rsock, char *dir)
{
char buf[512]; buf[0] = 0;
int len = 0;
close(*rsock);
len = recv(ssock, buf, sizeof(buf), 0); if (len != -1) buf[len] = 0;
if (!((buf[0] == '2') && (buf[1] == '2') && (buf[2] == '6')))
{
return (-1);
}
buf[0] = 0;
strcat(buf, "cwd "); strcat(buf, dir); strcat(buf, "\r\n");
send(ssock, buf, strlen(buf), 0);
len = recv(ssock, buf, sizeof(buf), 0); buf[len] = 0;
if ((buf[0] == '5') && (buf[1] == '5') && (buf[2] == '0'))
{
printf("> No directory\n> Content of current directory:\n");
} else printf("> List of content:\n");
*rsock = active_mod(ssock, HOSTNAME, buf, sizeof(buf));
if (buf[0] == 0) printf("> Empty.\n");
if (buf[0] == ' ') return (-1);
else printf("%s\n", buf);
return 0;
}
void workcycle(int ssock, int rsock)
{
char cmdl = 0, cmdm = 0, cmdh = 0, cmd[256];
char cpfile[MAX_FNAME_LENG];
int len = 0;
cmd[0] = 0;
while (1)
{ printf("> ftp# ");
scanf("%s", cmd); cmdh = cmd[2]; cmdm = cmd[1]; cmdl = cmd[0];
if ((cmdl == 'p') && (cmdm == 'u') && (cmdh == 't'))
{
cpfile[0] = 0;
scanf("%s", cpfile);
ftpput(ssock, &rsock;, cpfile);
}
if ((cmdl == 'c') && (cmdm == 'p'))
{
cpfile[0] = 0;
scanf("%s", cpfile);
ftpcopy(ssock, &rsock;, cpfile);
}
if ((cmdl == 'c') && (cmdm == 'd'))
{
cpfile[0] = 0;
scanf("%s", cpfile);
ftpcd(ssock, &rsock;, cpfile);
}
if ((cmdl == 'e') && (cmdm == 'x'))
{
printf("> Good bye.\n");
break;
}
}
}
bool_t get_pcname(char *str)
{
char buf[256], *p = NULL;
int dsc = -1, save = -1;
FILE *F = NULL;
dsc = open(TMPFILE, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
if (dsc == -1)
{
return FALSE;
}
save = dup(1);
dup2(dsc, 1); system("hostname");
close(dsc); dup2(save, 1);
F = fopen(TMPFILE, "r");
if (!F)
{
return FALSE;
}
buf[0] = 0; fgets(buf, sizeof(buf), F);
if (buf[0] == 0)
{
return FALSE;
}
strcpy(str, buf);
if ((p = strchr(str, '\r')) != NULL) *p = 0; p = NULL;
if ((p = strchr(str, '\n')) != NULL) *p = 0; p = NULL;
fclose(F);
unlink(TMPFILE);
return TRUE;
}
int usage(char *name)
{
printf("Mini FTP-client.\nUsage: %s <server> <login> <password>\n",name);
return (-1);
}
int main(int argc, char* argv[])
{
int sock = -1;
int rsock = 1;
char content[MAX_STR_BUF];
if (argc != 4)
{
return usage(argv[0]);
}
if (!get_pcname(HOSTNAME))
{
printf("> Err: can't define pc name.\n");
return -1;
}
printf("> Hostname: %s.\n", HOSTNAME);
printf("> Connecting... ");
if ((sock = setconn(argv[1], FTP_PORT)) == -1)
{
printf("> Err: can't connect to server %s\n",argv[1]);
return 1;
}
printf("done.\n");
printf("> Starting autentification process... ");
if (!auth(sock, argv[2], argv[3]))
{
printf("> List of content:\n%s", content);
printf("> Err: login or password is incorrect.\n");
return 2;
}
printf("done. Login & pass accepted, permisions assigned.\n");
rsock = active_mod(sock, HOSTNAME, content, sizeof(content));
if (rsock == -1)
{
close(rsock);close(sock);
printf("> Err: can't enter active mode.\n");
return 3;
}
printf("> List of content:\n%s", content);
workcycle(sock, rsock);
close(rsock);
close(sock);
return 0;
}
Revise this Paste