ftp_funcs.c
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:3k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /* Nessuslib -- the Nessus Library
  2.  * Copyright (C) 1998 Renaud Deraison
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Library General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Library General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Library General Public
  15.  * License along with this library; if not, write to the Free
  16.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  *
  18.  * handy FTP functions
  19.  */
  20. #define EXPORTING
  21. #include <includes.h>
  22. ExtFunc int ftp_log_in(int soc, char * username, char * passwd)
  23. {
  24.  char buf[1024];
  25.  int n;
  26.  int counter;
  27.  
  28.  buf[sizeof(buf) - 1] = '';
  29.  n = recv_line(soc, buf, sizeof(buf) - 1);
  30.  if(n <= 0)
  31.  return(1);
  32.  
  33.  if( strncmp(buf, "220", 3) != 0 )
  34.  { 
  35.   return 1;
  36.  }
  37.  
  38.  counter = 0;
  39.  while(buf[3]=='-' && n > 0 && counter < 1024)
  40.  {
  41.   n = recv_line(soc, buf, sizeof(buf) - 1);
  42.   counter ++;
  43.  }
  44.  
  45.  if(counter >= 1024)
  46.   return 1; /* Rogue FTP server */
  47.  if(n <= 0)
  48.  return 1;
  49.  snprintf(buf, sizeof(buf), "USER %srn", username);
  50.  write_stream_connection(soc, buf, strlen(buf));
  51.  n = recv_line(soc, buf, sizeof(buf) - 1);
  52.  if(n <= 0)
  53.  return 1;
  54.  if(strncmp(buf, "230", 3) == 0)
  55.  {
  56.   counter = 0;
  57.   while(buf[3]=='-' && n > 0 && counter < 1024 )
  58.    {
  59.    n = recv_line(soc, buf, sizeof(buf) - 1);
  60. counter ++;
  61. }
  62.   return 0;
  63.  }
  64.  
  65.  if(strncmp(buf, "331", 3) != 0)
  66.  {
  67.   return 1;
  68.  }
  69.  
  70.  counter = 0; n = 1;
  71.  while(buf[3]=='-' && n > 0 && counter < 1024 )
  72.  {
  73.   n = recv_line(soc,buf, sizeof(buf) - 1);
  74.   counter ++;
  75.  }
  76.  
  77.  if(counter >= 1024)
  78.   return 1;
  79.  
  80.  snprintf(buf, sizeof(buf), "PASS %srn", passwd);
  81.  write_stream_connection(soc, buf, strlen(buf));
  82.  n = recv_line(soc, buf, sizeof(buf) - 1);
  83.  if( n <= 0 )
  84.   return 1;
  85.  if(strncmp(buf, "230", 3) != 0 )
  86.  {
  87.   return 1;
  88.  }
  89.  
  90.  counter = 0; n = 1;
  91.  while(buf[3]=='-' && n > 0 &&  counter < 1024  )
  92.  {
  93.   n = recv_line(soc, buf, sizeof(buf) - 1 );
  94.   counter ++;
  95.  }
  96.  
  97.  return 0;
  98. }
  99. ExtFunc int ftp_get_pasv_address(int soc, struct sockaddr_in * addr)
  100. {
  101.  char buf[512];
  102.  char * t,*s;
  103.  unsigned char l[6];
  104.  unsigned long  * a;
  105.  unsigned short * p;
  106.  
  107.  sprintf(buf, "PASVrn");
  108.  write_stream_connection(soc, buf, strlen(buf));
  109.  bzero(buf, sizeof(buf));
  110.  bzero(addr, sizeof(struct sockaddr_in));
  111.  recv_line(soc, buf, sizeof(buf) - 1);
  112.  
  113.  if(strncmp(buf, "227", 3) != 0 ) 
  114.   return 1;
  115.    
  116.  t = strchr(buf, '(');
  117.  if( t == NULL )
  118.   return 1;
  119.  t++;
  120.  s = strchr(t, ',');
  121.  if( s == NULL )
  122.   return 1;
  123.  s[0] = '';
  124.  
  125.  l[0] = (unsigned char)atoi(t);
  126.  s++;
  127.  t = strchr(s, ',');if( t == NULL )return 1;
  128.  t[0]=0;
  129.  l[1] = (unsigned char)atoi(s);
  130.  t++;
  131.  s = strchr(t, ',');if( s == NULL )return 1;
  132.  s[0]=0;
  133.  l[2] = (unsigned char)atoi(t);
  134.  s++;
  135.  t = strchr(s, ',');if( t == NULL )return 1;
  136.  t[0]=0;
  137.  l[3] = (unsigned char)atoi(s);
  138.  t++;
  139.  s = strchr(t, ',');if( s == NULL )return 1;
  140.  s[0]=0;
  141.  l[4] = (unsigned char)atoi(t);
  142.  s++;
  143.  t = strchr(s, ')');if( t == NULL )return 1;
  144.  t[0]=0;
  145.  l[5] = (unsigned char)atoi(s);
  146.  a = (unsigned long*)l;
  147.  p = (unsigned short*)(l+4);
  148.  
  149.  addr->sin_addr.s_addr = *a;
  150.  addr->sin_port=*p;
  151.  addr->sin_family = AF_INET;
  152.  return 0;