📄 proxy_ftp.c
字号:
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 + -