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

📄 proxy_ftp.c

📁 最新apache的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
     return APR_SUCCESS;}int ap_proxy_build_ftp_sock(request_rec *r,proxy_server_conf *conf,apr_sockaddr_t *connect_addr,conn_rec *ftp_ctrl,apr_socket_t *ctrl_sock,apr_bucket_brigade * bb,apr_socket_t **data_sock,apr_socket_t **listen_sock){      int rc;      apr_status_t rv;      apr_socket_t *sock=NULL;      apr_socket_t *local_sock=NULL;      rc=ap_proxy_build_ftp_epsv_data_sock(r, conf, connect_addr, ftp_ctrl, ctrl_sock, bb, &sock);      if(rc!=APR_SUCCESS)	  	return rc;      if(sock==NULL)      	{	  	rc=ap_proxy_build_ftp_pasv_data_sock(r, conf, connect_addr, ftp_ctrl, bb, &sock);		if(rc!=APR_SUCCESS)			return rc;      	}      if(sock==NULL)      	{      	       rc=ap_proxy_build_ftp_port_listen_sock(r, connect_addr,ftp_ctrl, ctrl_sock, bb,&local_sock);		if(rc!=APR_SUCCESS)			return rc;      	}      if((sock==NULL&&local_sock==NULL)||(sock&&local_sock))	  	return HTTP_INTERNAL_SERVER_ERROR;      if(local_sock==NULL)	  	*data_sock=sock;      else	  	*listen_sock=local_sock;	        return APR_SUCCESS;}int ap_proxy_build_ftp_port_data_sock(request_rec *r,apr_socket_t * listen_sock,apr_socket_t **data_sock){       apr_status_t rv;	apr_socket_t *sock=NULL;       /* signal that we must use the EPRT/PORT loop */       for (;;) {            rv = apr_accept(&sock, listen_sock, r->pool);            if (rv == APR_EINTR) {                    continue;                  }            else if (rv == APR_SUCCESS) {		    *data_sock=sock;                  break;               }            else {                  ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,                            "proxy: FTP: failed to accept data connection");                  return HTTP_BAD_GATEWAY;              }       }	return APR_SUCCESS;}int ap_proxy_build_ftp_data_connection(request_rec *r,apr_socket_t * data_sock,conn_rec **data_con){       int rc;       conn_rec *data=NULL;       apr_pool_t *p = r->pool;	conn_rec *c = r->connection;       data = ap_run_create_connection(p, r->server, data_sock, r->connection->id,r->connection->sbh, c->bucket_alloc);       if (!data) 	      return HTTP_INTERNAL_SERVER_ERROR;        ap_proxy_ssl_disable(data);		    /* set up the connection filters */       rc = ap_run_pre_connection(data, data_sock);       if (rc != OK && rc != DONE)            {                   data->aborted = 1;		     return HTTP_INTERNAL_SERVER_ERROR;            }	*data_con=data;	return APR_SUCCESS;}/*将目录列表的一行中的文件名称解析成tlv结构,存放入结构buf*/int ap_proxy_decode_directory_list_oneline_to_tlv(char *data,char *buf_start,int *buf_left_len,int *num){       char *p;	char *search=NULL;       char *q=NULL;	int countFlag=0;       int count=0;			  	char *file_name_point=NULL;	int file_name_len=0;	int type=0;   /*1--file,0--folder*/       char len;  	if(data==NULL||buf_start==NULL||buf_left_len==NULL||num==NULL)		return -1;	p=data;	/*format is right?*/	if(!(p[0]=='d'||p[0]=='-'||p[0]=='l'||apr_isdigit(p[0])))		return HTTP_INTERNAL_SERVER_ERROR;	if(apr_isdigit(p[0])) /*MS-DOS*/		{		      search=NULL;		      search = strstr(p, "<DIR>");                    if(search)				type=0;		      else			  	type=1;		      countFlag=3;		}	else     /*UNIX*/		{		      if(p[0]=='d')			  	type=0;		      else			  	type=1;  		      countFlag=8;		}		search=NULL;       q=p;       while(*q)          {		  search=strchr(q,' ');	         if(search==NULL)			 return -1;		  q=search+1;		  count++;		  while(*q&&*q==' ')			q++;		  if(count==countFlag)			break;	    }		      	  	file_name_point=q;	if(data[0]!='l')	    {	        while(*q)	           {		         if(*q==13&&*(q+1)==10)		             break;		         q++;		         file_name_len++;	           }	    }	else	    {	         while(*q)	           {	                if((*q==13&&*(q+1)==10)||(*q==' '&&*(q+1)=='-'&&*(q+2)=='>'))				break;			  q++;		         file_name_len++;	           }	    }		if(file_name_len==0||file_name_len>255)		return HTTP_NOT_IMPLEMENTED;	if(*buf_left_len<(file_name_len+2)||*buf_left_len<=2)		return HTTP_NOT_IMPLEMENTED;	*buf_left_len-=(file_name_len+2);	*num=*num+1;	if(type==1)		buf_start[0]='1';	else		buf_start[0]='0';	len=(char)file_name_len;	buf_start[1]=len;	memcpy(buf_start+2,file_name_point,file_name_len);	return APR_SUCCESS;}/*type kind0--folder1--text2--exe3--pdf4--doc5--ppt6--execl7--media8--image9--zip10--unknown*/int ap_proxy_decode_file_type(char *name,int name_len,int *type){      char *p=NULL;      int len=0;            p=name+name_len-1;      while(*p&&*p!='.'&&len<name_len)      	{      	      len++;	      p--;      	}      p++;      if((len==3&&!strncasecmp(p,"txt", len))||(len==4&&!strncasecmp(p,"text", len)))      	{      	      *type=1;	      return APR_SUCCESS;      	}      if(len==3&&!strncasecmp(p,"exe", len))	{      	      *type=2;	      return APR_SUCCESS;      	}      if(len==3&&!strncasecmp(p,"pdf", len))	{      	      *type=3;	      return APR_SUCCESS;      	}       if(len==3&&!strncasecmp(p,"doc", len))	{      	      *type=4;	      return APR_SUCCESS;      	}      if(len==3&&!strncasecmp(p,"ppt", len))	{      	      *type=5;	      return APR_SUCCESS;      	}      if(len==3&&!strncasecmp(p,"xls", len))	{      	      *type=6;	      return APR_SUCCESS;      	}      if((len==3&&!strncasecmp(p,"wma", len))||(len==3&&!strncasecmp(p,"mp3", len))||(len==2&&!strncasecmp(p,"rm", len))||(len==4&&!strncasecmp(p,"rmvb", len))||(len==3&&!strncasecmp(p,"avi", len)))	{      	      *type=7;	      return APR_SUCCESS;      	}      if((len==3&&!strncasecmp(p,"bmp", len))||(len==3&&!strncasecmp(p,"jpg", len))||(len==3&&!strncasecmp(p,"gif", len)))	{      	      *type=8;	      return APR_SUCCESS;      	}      if((len==3&&!strncasecmp(p,"zip", len))||(len==3&&!strncasecmp(p,"rar", len))||(len==2&&!strncasecmp(p,"gz", len)))	{      	      *type=9;	      return APR_SUCCESS;      	}      *type=10;      return APR_SUCCESS;}int ap_proxy_format_size(char *size){      char str[32];      int sizelen=0;      int num=0;      int loop=0;      int count=0;      sizelen=strlen(size);      if(sizelen>32||sizelen<=0)	  	return -1;      num=(sizelen+2)/3-1;      if((num+sizelen)>32)	  	return -1;      memset(str,0,sizeof(str));      memcpy(str,size,sizelen);      memset(size,0,strlen(size));	        for(loop=sizelen-1;loop>=0;loop--)      	{      	      size[loop+num]=str[loop];	      count++;	      if(count==3)	      	{	      	      count=0;		      num--;		      size[loop+num]=',';	      	}      	}	        return APR_SUCCESS;}int ap_proxy_decode_dos_format_directory_list(char *data,char *name,int *type,char *size,char *time){       char *p=NULL;	char *q=NULL;	int len=0;	int temp_len=0;	int flag=FALSE;       int rc=0;       	p=data;       q=p;	/*decode time*/           len=0;       while(*p&&(*p!=' '))	  {		p++;	       len++;         }  	if(len>32)	     return -1;	memcpy(time,q,len);       time[len]=' ';	len++;	while(*p&&(*p==' '))	      p++;       q=p;	temp_len=0;	while(*p&&(*p!=' '))	    {		   p++;		   temp_len++;	    }	if((len+temp_len)>32)	        return -1;	memcpy(time+len,q,temp_len);	while(*p&&(*p==' '))	       p++;		q=p;	len=0;	while(*p&&(*p!=' '))	     {		    p++;		    len++;	     }	if(len==5&&strncmp(q,"<DIR>",len)==0)	    {		    memcpy(size,"未知大小",sizeof("未知大小"));		    flag=TRUE;		    *type=0;	    }        else        	{        	      if(len>32)			    return -1;		      memcpy(size,q,len);        	}        /*decode name*/	 while(*p&&(*p==' '))		 p++;			          len=0;        q=p;        while(*p)	    {		  if(*p==13&&*(p+1)==10)		             break;		  p++;		  len++;

⌨️ 快捷键说明

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