⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proxy_ftp.c

📁 最新apache的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	if(!end||end<=start)              return HTTP_NOT_IMPLEMENTED;	       len=end-2-start;       if(len>255||len<=0)	       return HTTP_NOT_IMPLEMENTED;         memcpy(oldname,start,len);	start=end;	 /*find next CRLFCRLF*/	         while(*start)          {		 if(*start==13&&*(start+1)==10&&*(start+2)==13&&*(start+3)==10)		      break;		 start++;	   }       start+=4;	end=strstr(start,boundary);	if(!end||end<=start)              return HTTP_NOT_IMPLEMENTED;	       len=end-2-start;       if(len>32||len<=0)	       return HTTP_NOT_IMPLEMENTED;         memcpy(newname,start,len);       return APR_SUCCESS;}int ap_proxy_get_ftp_upload_file_name(char *data,char *boundary,char *upload_file_name){      char *start=NULL;      char *end=NULL;      char *temp=NULL;      int len=0;	        if(data==NULL||boundary==NULL||upload_file_name==NULL)	    return HTTP_INTERNAL_SERVER_ERROR;      temp=data;      temp=strstr(data,"filename=\"");      if(!temp)          return HTTP_NOT_IMPLEMENTED;      temp+=strlen("filename=\"");      end=temp;      while(*end)      	{      	      if(*end=='\"'&&*(end+1)==13&&*(end+2)==10)		    break;	      end++;      	}            if(*end!='\"')	   return HTTP_NOT_IMPLEMENTED;      start=end;      while(*start&&start>temp&&*start!='\\')	  	start--;      start++;      len=end-start;      if(len<=0||len>255)	  	return HTTP_NOT_IMPLEMENTED;            memcpy(upload_file_name,start,len);	        return APR_SUCCESS;}int ap_proxy_get_ftp_upload_file_len(char *data, request_rec *r, int boundary_len,int *file_len,int *head_info_len){	const char *p=NULL;	char *q=NULL;	int content_len=0;	int head_len=0;	int len=0;	int tail_len=0;		p=apr_table_get(r->headers_in, "Content-Length");	if(!p)		return HTTP_NOT_IMPLEMENTED;	content_len=atoi(p);	q=data;       while(*q)          {		 if(*q==13&&*(q+1)==10&&*(q+2)==13&&*(q+3)==10)		      break;		 q++;		 head_len++;	   }	head_len+=4;	tail_len=boundary_len+2;	tail_len+=45;	tail_len+=4;	tail_len+=6;	tail_len+=(boundary_len+4);	tail_len+=2;	len=content_len-head_len-tail_len;	if(len<0)		return HTTP_NOT_IMPLEMENTED;	*file_len=len;	*head_info_len=head_len;       return APR_SUCCESS;}int ap_proxy_ftp_build_folder_handler(char *data,request_rec *r,char *boundary,conn_rec *ftp_ctrl,apr_bucket_brigade *bb){      int rc=0;      char folder_name[33];      char *ftpmessage=NULL;      memset(folder_name,0,sizeof(folder_name));      rc=ap_proxy_get_ftp_build_folder_request_info(data,boundary,folder_name);      if(rc!=APR_SUCCESS)	    return rc;	        rc = proxy_ftp_command(apr_pstrcat(r->pool, "MKD ", folder_name, CRLF, NULL),r, ftp_ctrl, bb, &ftpmessage);       apr_brigade_cleanup(bb);      if(rc!=257)	   	    return HTTP_NOT_IMPLEMENTED;            return APR_SUCCESS;}int ap_proxy_ftp_rename_file_handler(char *data,request_rec *r,char *boundary,conn_rec *ftp_ctrl,apr_bucket_brigade *bb){      int rc=0;      char old_name[256];      char new_name[33];      char *ftpmessage=NULL;	        memset(old_name,0,sizeof(old_name));      memset(new_name,0,sizeof(new_name));      rc=ap_proxy_get_ftp_rename_request_info(data,boundary,old_name,new_name);      if(rc!=APR_SUCCESS)	     return rc;      rc = proxy_ftp_command(apr_pstrcat(r->pool, "RNFR ", old_name, CRLF, NULL),r, ftp_ctrl, bb, &ftpmessage);      apr_brigade_cleanup(bb);      if(rc!=350)	     return HTTP_NOT_IMPLEMENTED;      rc = proxy_ftp_command(apr_pstrcat(r->pool, "RNTO ", new_name, CRLF, NULL),r, ftp_ctrl, bb, &ftpmessage);       apr_brigade_cleanup(bb);      if(rc!=250)	     return HTTP_NOT_IMPLEMENTED;      return APR_SUCCESS;}int ap_proxy_ftp_delete_file_handler(request_rec *r,conn_rec *ftp_ctrl,apr_bucket_brigade *bb,char *file_name){       int rc=0;	char *ftpmessage=NULL;	rc = proxy_ftp_command(apr_pstrcat(r->pool, "DELE ", file_name, CRLF, NULL),r, ftp_ctrl, bb, &ftpmessage);       apr_brigade_cleanup(bb);	if(rc!=250)	     return HTTP_NOT_IMPLEMENTED;       return APR_SUCCESS;}int ap_proxy_ftp_delete_folder_handler(request_rec *r,proxy_server_conf *conf,conn_rec *ftp_ctrl_conn,apr_sockaddr_t *ftp_ctrl_addr,apr_socket_t *ftp_ctrl_sock,apr_bucket_brigade * bb,char *folder_absolute_path,char *folder_name){        int rc;	 apr_status_t rv;	 apr_pool_t *p = r->pool;	 conn_rec *c = r->connection;        char *ftpmessage = NULL;        apr_socket_t *local_sock =NULL;        apr_socket_t *data_sock = NULL;	 conn_rec *data_conn = NULL;	 apr_bucket *bucket;	 int eos_flag=FALSE;	 char file_list_buf[8192];	 int file_list_buf_left_len=8192;	 int file_num=0;	 char *startbuf=NULL;	 char tempbuf[256];	 int file_type=0;	 int file_name_len=0;        char next_name[256];        char next_path[2000];	         if(!r||!ftp_ctrl_conn||!ftp_ctrl_addr||!conf||!bb||!folder_absolute_path||!folder_name)		return HTTP_INTERNAL_SERVER_ERROR;	 rc = proxy_ftp_command(apr_pstrcat(p, "CWD ",folder_name,CRLF, NULL),r, ftp_ctrl_conn, bb, &ftpmessage);	 apr_brigade_cleanup(bb);        if(rc!=250)        	return HTTP_NOT_IMPLEMENTED;	 rc=ap_proxy_build_ftp_sock(r, conf, ftp_ctrl_addr, ftp_ctrl_conn, ftp_ctrl_sock, bb, &data_sock, &local_sock);	 apr_brigade_cleanup(bb);        if(rc!=APR_SUCCESS)	       return rc;	         ftp_set_TYPE('A', r, ftp_ctrl_conn, bb, NULL);	 apr_brigade_cleanup(bb);        rc = proxy_ftp_command("LIST -lg" CRLF,r, ftp_ctrl_conn, bb, &ftpmessage);        apr_brigade_cleanup(bb);        if(rc != 125 && rc != 150 && rc != 226 && rc != 250)            {                 if(data_sock)                 	{                          apr_socket_close(data_sock);			     data_sock=NULL;                 	}		   else if(local_sock)		   	{		   	     apr_socket_close(local_sock);			     local_sock=NULL;		   	}		   return HTTP_NOT_IMPLEMENTED;            }	 if(!data_sock&&local_sock)    	    {    	      	    rc=ap_proxy_build_ftp_port_data_sock(r, local_sock,&data_sock);	           if(rc!=APR_SUCCESS)	      	       {	      	             apr_socket_close(local_sock);			      local_sock=NULL;		  	      return rc;	      	       }	           apr_socket_close(local_sock);	           local_sock=NULL;    	    }	  if(data_sock==NULL)	  	return HTTP_INTERNAL_SERVER_ERROR;	           rc=ap_proxy_build_ftp_data_connection(r,data_sock,&data_conn);         if(rc!=APR_SUCCESS)	      {	            apr_socket_close(data_sock);		     data_sock=NULL;	            return rc;	      }	   memset(file_list_buf,0,sizeof(file_list_buf));	   memset(tempbuf,0,sizeof(tempbuf));          while (ap_get_brigade(data_conn->input_filters, bb, AP_MODE_READBYTES, APR_BLOCK_READ, conf->io_buffer_size) == APR_SUCCESS) 	      {	           while(1)	              {	                     int found=0;      	                     while (!found && !APR_BRIGADE_EMPTY(bb)) 				  {                                   char *pos, *response;                                   apr_size_t len, max;                                   apr_bucket *e;                                   e = APR_BRIGADE_FIRST(bb);                                   if (APR_BUCKET_IS_EOS(e)) 					    {                                            eos_flag = TRUE;                                            break;                                       }                                   if (APR_SUCCESS != (rv = apr_bucket_read(e, (const char **)&response, &len, APR_BLOCK_READ)))                                            return rv;                                                                      pos = memchr(response, APR_ASCII_LF, len);                                   if (pos != NULL) 					   {                                          if ((response + len) != (pos + 1)) 						   {                                                   len = pos - response + 1;                                                   apr_bucket_split(e, pos - response + 1);                                             }                                           found = 1;                                       }                                  max = sizeof(tempbuf) - strlen(tempbuf) - 1;                                  if (len > max)                                        len = max;                                  /* len+1 to leave space for the trailing nil char */                                 apr_cpystrn(tempbuf+strlen(tempbuf), response, len+1);                                 APR_BUCKET_REMOVE(e);                                 apr_bucket_destroy(e);                           }	      			      if(!found)				  	break;			       if(eos_flag==TRUE)				   	break;			      startbuf=file_list_buf+sizeof(file_list_buf)-file_list_buf_left_len;			      rc=ap_proxy_decode_directory_list_oneline_to_tlv(tempbuf,startbuf,&file_list_buf_left_len,&file_num);			      if(rc!=APR_SUCCESS)				  	return rc;			      memset(tempbuf,0,sizeof(tempbuf));	              }		    apr_brigade_cleanup(bb);	           if(eos_flag==TRUE)			 break;	                           }         proxy_ftp_command(NULL, r, ftp_ctrl_conn, bb, &ftpmessage);         apr_brigade_cleanup(bb);     	  startbuf=file_list_buf;	  while(file_num>0&&*startbuf)	  	{		      file_type=0;		      file_name_len=0;		      memset(next_name,0,sizeof(next_name));		      memset(next_path,0,sizeof(next_path));		      file_type=(int)(*startbuf-'0');		      startbuf++;		      file_name_len=(int)*startbuf;		      startbuf++;		      if(file_name_len>255)			  	return HTTP_NOT_IMPLEMENTED;		      memcpy(next_name,startbuf,file_name_len);		      startbuf+=file_name_len;		      if(strlen(folder_absolute_path)+file_name_len>1998)			  	return HTTP_NOT_IMPLEMENTED;		      sprintf(next_path,"%s/%s",folder_absolute_path,next_name);		      if(file_type==0)		      	{			      rv=ap_proxy_ftp_delete_folder_handler(r, conf,ftp_ctrl_conn, ftp_ctrl_addr, ftp_ctrl_sock,bb, next_path, next_name);			      apr_brigade_cleanup(bb);			      if(rv!=APR_SUCCESS)				  	return HTTP_NOT_IMPLEMENTED;		      	}		      else		      	{		      	      rc = proxy_ftp_command(apr_pstrcat(r->pool, "DELE ", next_name, CRLF, NULL),r, ftp_ctrl_conn, bb, &ftpmessage);			      apr_brigade_cleanup(bb);			      if(rc!=250)					return HTTP_NOT_IMPLEMENTED;		      	}	  		     file_num--;      	  	}	 rc = proxy_ftp_command(apr_pstrcat(p, "CDUP ",folder_name,CRLF, NULL),r, ftp_ctrl_conn, bb, &ftpmessage);	 apr_brigade_cleanup(bb);        if(rc!=250)        	return HTTP_NOT_IMPLEMENTED;		        apr_brigade_cleanup(bb);	 rc=proxy_ftp_command(apr_pstrcat(r->pool, "RMD ", folder_absolute_path, CRLF, NULL),r, ftp_ctrl_conn, bb, &ftpmessage);	 if(rc!=250)	  	return -1;        return APR_SUCCESS;}int ap_proxy_ftp_delete_file_or_folder_handler(char *data,request_rec *r,char *boundary,proxy_server_conf * conf,conn_rec *ftp_ctrl_conn,apr_sockaddr_t * ftp_ctrl_addr,apr_socket_t * ftp_ctrl_sock,apr_bucket_brigade *bb){        const char *pwd=NULL;        char delete_info[HUGE_STRING_LEN];	 char file_name[256];	 int file_name_len=0;	 int file_type=0;	 int rc;	 char *start=NULL;	 char *p=NULL;	 char folder_path[2000];	 pwd = apr_table_get(r->notes, "Directory-PWD");	 if(pwd==NULL)		return HTTP_NOT_IMPLEMENTED;	 memset(delete_info,0,sizeof(delete_info));	 rc=ap_proxy_get_ftp_delete_request_info(data,boundary,delete_info);	 if(rc!=APR_SUCCESS)	 	return rc;	 start=delete_in

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -