Welcome, guest! Login / Register - Why register?
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&#40;name, "wb"&#41;;
  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&#40;name, "rb"&#41;;
  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&#40;"hostname"&#41;; 
 close(dsc); dup2(save, 1);
 F = fopen&#40;TMPFILE, "r"&#41;; 
 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&#40;TMPFILE&#41;;
 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

Your Name: Code Language: