| #include "ftp/lynq_ftp.h" |
| |
| int lynq_ftp_login(lynq_ftp_socker_info *FTP) |
| { |
| struct sockaddr_in serv_addr; |
| char recvdate; |
| char sendline[MAXSIZE] = "", recvline[MAXSIZE] = ""; |
| struct hostent *host = NULL; |
| |
| char name[MAXSIZE] = "", password[MAXSIZE] = ""; |
| LYDBGLOG("[%s-%d] ftp,enter the hostname = %s\n", __FUNCTION__, __LINE__, FTP->sevname); |
| |
| host = gethostbyname(FTP->sevname); |
| |
| if(host == NULL) |
| { |
| error = 35; |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| login_yes = 0; |
| } |
| else |
| { |
| FTP->control_sockfd = socket(AF_INET, SOCK_STREAM, 0); |
| if(FTP->control_sockfd < 0) |
| { |
| error = 50; |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| LYDBGLOG("[%s-%d]\n", __FUNCTION__, __LINE__); |
| login_yes = 0; |
| } |
| |
| bzero(&serv_addr, sizeof(serv_addr)); |
| |
| memset(&serv_addr, 0, sizeof(struct sockaddr_in)); |
| memcpy(&serv_addr.sin_addr.s_addr, host->h_addr, host->h_length); |
| serv_addr.sin_family = AF_INET; |
| serv_addr.sin_port = htons(FTP->portnum); |
| |
| if((connect(FTP->control_sockfd, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr))) < 0) |
| { |
| error = 33; |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| login_yes = 0; |
| } |
| |
| |
| recvdate = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| if(recvdate == -1) |
| { |
| error = 33; |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| login_yes = 0; |
| } |
| else if(strncmp(recvline, "220", 3) == 0) |
| { |
| LYDBGLOG("ftp,connect success\n"); |
| login_yes = 1; |
| } |
| else |
| { |
| error = 33; |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| login_yes = 0; |
| } |
| if(login_yes == 1) |
| { |
| int sendbytes, recvbytes; |
| |
| zeromery(name, 1024); |
| zeromery(password, 1024); |
| zeromery(recvline, 1024); |
| zeromery(sendline, 1024); |
| strcat(sendline, "USER "); |
| strcat(sendline, FTP->username); |
| strcat(sendline, "\r\n"); |
| //printf("[%s %d] --->%s\n",__FUNCTION__ , __LINE__,sendline); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes == -1) |
| { |
| error = 38; |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| login_yes = 0; |
| //return FTP_USER_ERROR; |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| if(strncmp(recvline, "331", 3) == 0) |
| { |
| LYDBGLOG("[%s %d] ftp,331 please specify the password.\n", __FUNCTION__ , __LINE__); |
| } |
| else |
| { |
| error = 38; |
| LYDBGLOG("[%s-%d] ftp,recv date is error.%d\n", __FUNCTION__ , __LINE__, error); |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| login_yes = 0; |
| } |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| //printf("ftp-> "); |
| strcat(sendline, "PASS "); |
| strcat(sendline, FTP->pw); |
| strcat(sendline, "\r\n"); |
| //printf("[%s %d]--->%s\n",__FUNCTION__, __LINE__, sendline); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes == -1) |
| { |
| error = 39; |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| login_yes = 0; |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| if(strncmp(recvline, "230", 3) == 0) |
| { |
| LYVERBLOG("+[ftp][login][session%d]: ok!!\n", FTP->session); |
| login_yes = 1; |
| } |
| else |
| { |
| error = 39; |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| login_yes = 0; |
| } |
| |
| #if 1 |
| //support rest |
| char str[255]; |
| sprintf(str, "%d", FTP->rest); |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| strcat(sendline, "REST "); |
| strcat(sendline, str); |
| strcat(sendline, "\r\n"); |
| //printf("[%s-%d]--->%s\n", __FUNCTION__, __LINE__, sendline); |
| sendbytes = send(FTP->control_sockfd,sendline,strlen(sendline),0); |
| if(sendbytes == -1) |
| { |
| error = 41; |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| login_yes = 0; |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline,sizeof(recvline),0); |
| if(recvbytes == -1) |
| { |
| error = 41; |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| login_yes = 0; |
| } |
| if(strncmp(recvline, "350",3) == 0) |
| { |
| LYDBGLOG("[%s-%d] support rest\n", __FUNCTION__, __LINE__); |
| login_yes = 1; |
| } |
| else |
| { |
| error = 41; |
| LYDBGLOG("[%s-%d] ftp,not support rest%d\n", __FUNCTION__, __LINE__, error); |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| login_yes = 0; |
| } |
| #endif |
| } |
| |
| } |
| return login_yes; |
| } |
| |
| void zeromery(char *a,int len) |
| { |
| int i; |
| len = sizeof(a); |
| for(i = 0; i < len; i++) |
| { |
| a[i] = 0; |
| } |
| } |
| |
| void lynq_ftp_pwd(int control_sockfd) |
| { |
| int recvbytes,sendbytes; |
| char sendline[1024], recvline[1024]; |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| strcat(sendline, "PWD"); |
| strcat(sendline, "\r\n"); |
| sendbytes = send(FTP->control_sockfd,sendline,strlen(sendline),0); |
| if(sendbytes < 0) |
| { |
| LYDBGLOG("[%s-%d] ftp,pwd,send is error\n", __FUNCTION__, __LINE__); |
| error = 52; |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline,sizeof(recvline),0); |
| if(strncmp(recvline, "257",3) == 0) |
| { |
| LYDBGLOG("[%s-%d] ftp,current directory is:%s\n", __FUNCTION__, __LINE__, recvline); |
| } |
| else |
| { |
| error = 51; |
| LYDBGLOG("[%s-%d] ftp,pwd,recv is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][login][session%d]: error num = %d\n", FTP->session, error); |
| } |
| } |
| |
| //rest |
| void lynq_ftp_rest(int control_sockfd) |
| { |
| |
| int recvbytes,sendbytes; |
| char sendline[1024], recvline[1024]; |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| strcat(sendline, "REST "); |
| strcat(sendline, "500"); |
| strcat(sendline, "\r\n"); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes < 0) |
| { |
| error = 52; |
| LYDBGLOG("[%s-%d] ftp,stru send is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][reset][session%d]: error num = %d\n", FTP->session, error); |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| if(recvbytes < 0) |
| { |
| error = 51; |
| LYVERBLOG("+[ftp][reset][session%d]: error num = %d\n", FTP->session, error); |
| } |
| if(strncmp(recvline, "350",3) == 0) |
| { |
| LYDBGLOG("[%s-%d] ftp,%s\n", __FUNCTION__, __LINE__, recvline); |
| } |
| } |
| |
| int strtosrv(char *str) |
| { |
| |
| int addr[6]; |
| //printf("%s\n",str); |
| sscanf(str, "%*[^(](%d,%d,%d,%d,%d,%d)", &addr[0], &addr[1], &addr[2], &addr[3], &addr[4], &addr[5]); |
| |
| LYDBGLOG("[%s-%d] ftp,%d,%d,%d,%d\n", __FUNCTION__, __LINE__, addr[0],addr[1],addr[2],addr[3]); |
| bzero(hoster, strlen(hoster)); |
| sprintf(hoster, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); |
| |
| LYDBGLOG("[%s-%d] ftp,hoster = %s", __FUNCTION__, __LINE__, hoster); |
| int port = addr[4]*256 + addr[5]; |
| LYDBGLOG("[%s-%d] ftp,port = %d\n", __FUNCTION__, __LINE__, port); |
| return port; |
| } |
| |
| |
| int lynq_ftp_download(lynq_ftp_socker_info* FTP) |
| { |
| char catbuf[1024]; |
| int data_sock; |
| int recvbytes, sendbytes; |
| char sendline[1024] = "", recvline[1024] = ""; |
| char getfilepath[FTP_MAX_ASCII_LEN+5] = "/tmp/"; |
| |
| #if 1 |
| //type |
| |
| zeromery(recvline, 1024); |
| zeromery(sendline, 1024); |
| strcat(sendline, "TYPE "); |
| strcat(sendline, FTP->file_type); |
| strcat(sendline, "\r\n"); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline),0); |
| if(sendbytes < 0) |
| { |
| error = 52;//FTP_SEND_ERROR |
| LYVERBLOG("+[ftp][get][session%d]: error num = %d\n", FTP->session, error); |
| return FTP_SEND_ERROR; |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| LYDBGLOG("[%s-%d] ftp,recvline = %s\n",__FUNCTION__, __LINE__, recvline); |
| if(strncmp(recvline, "200", 3) == 0) |
| { |
| LYDBGLOG("[%s-%d] ftp,binary transmisson\n",__FUNCTION__, __LINE__); |
| } |
| else |
| { |
| error = 46; //FTP_DOWNLOAD_ERROR |
| LYDBGLOG("[%s-%d] ftp,download error\n",__FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][get][session%d]: error num = %d\n", FTP->session, error); |
| return FTP_DOWNLOAD_ERROR; |
| } |
| #endif |
| |
| zeromery(recvline, 1024); |
| zeromery(sendline, 1024); |
| strcat(sendline, FTP->is_pasv_mode); |
| strcat(sendline, " \r\n"); |
| |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes < 0) |
| { |
| error = 52; //FTP_SEND_ERROR |
| LYDBGLOG("[%s-%d] type send is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][get][session%d]: error num = %d\n", FTP->session, error); |
| return FTP_SEND_ERROR; |
| } |
| |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| if(strncmp(recvline, "227", 3) == 0) |
| { |
| LYDBGLOG("[%s-%d] ftp,binary transmisson\n", __FUNCTION__, __LINE__); |
| } |
| else |
| { |
| error = 43;//FTP_ACTIVE_ERROR |
| LYVERBLOG("+[ftp][get][session%d]: error num = %d\n", FTP->session, error); |
| LYDBGLOG("[%s-%d] type recv is error!\n", __FUNCTION__, __LINE__); |
| return FTP_ACTIVE_ERROR; |
| } |
| |
| LYDBGLOG("-------- [%s-%d] recvline = %s\n", __FUNCTION__, __LINE__, recvline); |
| int port1 = strtosrv(recvline); |
| data_sock = cliopen(hoster, port1); |
| |
| LYDBGLOG("[%s-%d] ftp,data_sock = %d\n", __FUNCTION__, __LINE__, data_sock); |
| LYDBGLOG("[%s-%d] FTP->getfilename = %s\n", __FUNCTION__, __LINE__, FTP->getfilename); |
| LYDBGLOG("[%s-%d] FTP->getfilename_path = %s\n", __FUNCTION__, __LINE__, FTP->getfilename_path); |
| |
| //send the command retr; |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| strcat(sendline, "RETR "); |
| strcat(sendline, FTP->getfilename_path); |
| strcat(sendline, "/"); |
| strcat(sendline, FTP->getfilename); |
| strcat(sendline, "\r\n"); |
| //printf("%s\n", sendline); |
| |
| LYDBGLOG("[%s-%d] ftp,%ld\n", __FUNCTION__, __LINE__, write(FTP->control_sockfd,sendline,strlen(sendline))); |
| LYDBGLOG("[%s-%d] getfilename= %s FTP->control_sockfd = %d\n", __FUNCTION__, __LINE__, FTP->getfilename, FTP->control_sockfd); |
| #if 1 |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| |
| if(recvbytes < 0) |
| { |
| error = 52;//FTP_SEND_ERROR |
| LYDBGLOG("[%s-%d] retr recv is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][get][session%d]: error num = %d\n", FTP->session, error); |
| |
| return FTP_SEND_ERROR; |
| } |
| LYDBGLOG("[%s-%d] recvline = %s\n", __FUNCTION__, __LINE__, recvline); |
| if(strncmp(recvline, "400", 3) > 0) |
| { |
| error = 51;//FTP_RCV_ERROR |
| |
| LYDBGLOG("[%s-%d] return is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][get][session%d]: error num = %d\n", FTP->session, error); |
| return FTP_RCV_ERROR; |
| } |
| |
| strcat(getfilepath, FTP->getfilename); |
| lynq_ftp_get(data_sock, getfilepath, FTP->session); |
| |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| |
| strcpy(FTP->respond, recvline); |
| |
| LYDBGLOG("[%s-%d] FTP->respond = %s\n", __FUNCTION__, __LINE__, FTP->respond); |
| |
| if(strncmp(FTP->respond, "550", 3) == 0) |
| { |
| error = 46; //FTP_DOWNLOAD_ERROR |
| LYDBGLOG("[%s-%d] download is error %d \n", __FUNCTION__, __LINE__, error); |
| LYVERBLOG("+[ftp][get][session%d]: error num = %d\n", FTP->session, error); |
| |
| return FTP_DOWNLOAD_ERROR; |
| } |
| |
| if(strncmp(FTP->respond, "421",3) == 0) |
| { |
| error = 34;//FTP_TIMEROUT |
| LYDBGLOG("[%s-%d] download is error %d \n", __FUNCTION__, __LINE__, error); |
| LYVERBLOG("+[ftp][get][session%d]: error num = %d\n", FTP->session, error); |
| |
| return FTP_TIMEROUT; |
| } |
| |
| if((strncmp(FTP->respond, "226", 3) == 0) || (strncmp(FTP->respond, "125",3) == 0)) |
| { |
| LYVERBLOG("+[ftp][get][session%d]: ok!!\n", FTP->session); |
| } |
| #endif |
| return 0; |
| |
| } |
| |
| int lynq_ftp_put(int sck, char *pUploadFileName_s) |
| { |
| int handle = open(pUploadFileName_s, O_RDWR); |
| int nread; |
| if(handle == -1) |
| return -1; |
| |
| while(1) |
| { |
| if((nread = read(handle, rbuf1, 1024)) < 0) |
| { |
| error = 54;//FTP_READ_ERROR |
| LYDBGLOG("[%s-%d] read error!", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][up][session%d]: error num = %d\n", FTP->session, error); |
| } |
| else if(nread == 0) |
| break; |
| LYDBGLOG("[%s-%d] rbuf1 = %s \n", __FUNCTION__, __LINE__, rbuf1); |
| |
| if(write(sck, rbuf1, nread) != nread){ |
| error = 54; |
| LYDBGLOG("[%s-%d] send error!", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][up][session%d]: error num = %d\n", FTP->session, error); |
| } |
| memset(rbuf1,0,1024); |
| } |
| if(close(sck) < 0) |
| LYVERBLOG("+[ftp][up][session%d]: error num = %d\n", FTP->session, FTP_CLOSE_ERROR); |
| |
| return 0; |
| } |
| |
| |
| int lynq_ftp_up(lynq_ftp_socker_info* FTP) |
| { |
| char catbuf[1024]; |
| int data_sock; |
| int recvbytes,sendbytes; |
| char sendline[1024], recvline[1024]; |
| int put_ret = -1; |
| |
| if((access(FTP->putfilename, F_OK)) == -1) |
| { |
| //FTP_SOCK_ERROR |
| LYVERBLOG("+[ftp][up][session%d]: error num = %d\n", FTP->session, FTP_SOCK_ERROR); |
| LYDBGLOG("[%s-%d] %s file does not exist\n", __FUNCTION__, __LINE__, FTP->putfilename); |
| return FTP_SOCK_ERROR; |
| } |
| |
| #if 1 |
| zeromery(recvline, 1024); |
| zeromery(sendline, 1024); |
| strcat(sendline, "TYPE "); |
| strcat(sendline, FTP->file_type); |
| strcat(sendline, "\r\n"); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes < 0) |
| { |
| LYDBGLOG("[%s-%d] ftp type send is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][up][session%d]: error num = %d\n", FTP->session, FTP_SEND_ERROR); |
| return FTP_SEND_ERROR; |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline,sizeof(recvline),0); |
| if(strncmp(recvline, "200",3) == 0) |
| { |
| LYDBGLOG("[%s-%d] initalize\n", __FUNCTION__, __LINE__); |
| } |
| else |
| { |
| LYDBGLOG("[%s-%d] type recv is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][up][session%d]: error num = %d\n", FTP->session, FTP_RCV_ERROR); |
| return FTP_RCV_ERROR; |
| } |
| #endif |
| |
| //PASV |
| zeromery(recvline, 1024); |
| zeromery(sendline, 1024); |
| strcat(sendline, FTP->is_pasv_mode); |
| strcat(sendline, " \r\n"); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes < 0) |
| { |
| LYDBGLOG("[%s-%d] type send is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][up][session%d]: error num = %d\n", FTP->session, FTP_SEND_ERROR); |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline,sizeof(recvline), 0); |
| if(strncmp(recvline, "227", 3) == 0) |
| { |
| LYDBGLOG("[%s-%d] binary transmisson\n", __FUNCTION__, __LINE__); |
| } |
| else |
| { |
| error = 43;//FTP_ACTIVE_ERROR |
| LYDBGLOG("[%s-%d] type recv is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][up][session%d]: error num = %d\n", FTP->session, error); |
| return FTP_ACTIVE_ERROR; |
| } |
| |
| //init datelink server port information |
| int port1 = strtosrv(recvline); |
| LYDBGLOG("[%s-%d] ftp,hoster =%s,port1 = %d\n", __FUNCTION__, __LINE__, hoster,port1); |
| data_sock = cliopen(hoster, port1); |
| |
| LYDBGLOG("[%s-%d] ftp,data_sock = %d\n", __FUNCTION__, __LINE__, data_sock); |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| strcat(sendline, FTP->put_opt); |
| strcat(sendline, " "); |
| strcat(sendline, FTP->putfilename_path); |
| strcat(sendline, "/"); |
| strcat(sendline, FTP->putfilename); |
| strcat(sendline, "\r\n"); |
| |
| LYDBGLOG("[%s-%d] ftp,%s\n", __FUNCTION__, __LINE__, sendline); |
| LYDBGLOG("%ld\n", write(FTP->control_sockfd, sendline, strlen(sendline))); |
| LYDBGLOG("[%s-%d] ftp,filename = %s\n", __FUNCTION__, __LINE__, FTP->putfilename); |
| |
| |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| |
| LYDBGLOG("RETR RECVLINE = %s\n", recvline); |
| if(recvbytes < 0) |
| { |
| LYVERBLOG("+[ftp][up][session%d]: error num = %d\n", FTP->session, FTP_RCV_ERROR); |
| LYDBGLOG("[%s-%d] retr recv is error!\n", __FUNCTION__, __LINE__); |
| return FTP_RCV_ERROR; |
| } |
| if(strncmp(recvline, "400", 3) > 0) |
| { |
| error = 400; |
| LYVERBLOG("+[ftp][up][session%d]: error num = %d\n", FTP->session, error); |
| } |
| |
| lynq_ftp_put(data_sock, FTP->putfilename); |
| |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| |
| strcpy(FTP->respond, recvline); |
| |
| if(strncmp(FTP->respond, "226",3) == 0) |
| { |
| LYDBGLOG("[%s-%d] FTP->respond = %s\n", __FUNCTION__, __LINE__, FTP->respond); |
| LYVERBLOG("+[ftp][up][session%d]: ok!!\n", FTP->session); |
| } |
| else |
| { |
| error = 45;//FTP_UPLOAD_ERROR |
| LYVERBLOG("+[ftp][up][session%d]: error num = %d\n", FTP->session, error); |
| return FTP_UPLOAD_ERROR; |
| } |
| return 0; |
| |
| } |
| |
| |
| int lynq_ftp_ls(lynq_ftp_socker_info* FTP) |
| { |
| char catbuf[1024]; |
| int data_sock; |
| int recvbytes, sendbytes; |
| char sendline[1024], recvline[1024]; |
| |
| |
| //PASV |
| zeromery(recvline, 1024); |
| zeromery(sendline, 1024); |
| strcat(sendline, FTP->is_pasv_mode); |
| strcat(sendline, " \r\n"); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes < 0) |
| { |
| LYDBGLOG("[%s-%d] type send is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][ls][session%d]: error num = %d\n", FTP->session, FTP_SEND_ERROR); |
| return FTP_SEND_ERROR; |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline,sizeof(recvline), 0); |
| if(strncmp(recvline, "227",3) == 0) |
| { |
| LYDBGLOG("[%s-%d] binary transmit\n", __FUNCTION__, __LINE__); |
| } |
| else |
| { |
| error = 43; |
| LYDBGLOG("[%s-%d] type recv is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][ls][session%d]: error num = %d\n", FTP->session, error); |
| return error; |
| } |
| |
| //init datelink server port information |
| int port1 = strtosrv(recvline); |
| LYDBGLOG("[%s-%d] ftp,hoster =%s,port1 = %d\n", __FUNCTION__, __LINE__, hoster,port1); |
| data_sock = cliopen(hoster, port1); |
| |
| //printf("data_sock = %d\n",data_sock); |
| |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| strcat(sendline, "LIST -al "); |
| strcat(sendline, FTP->dir); |
| strcat(sendline, "\r\n"); |
| |
| LYDBGLOG("%ld\n", write(FTP->control_sockfd, sendline, strlen(sendline))); |
| |
| LYDBGLOG("[%s-%d] ftp,%s\n", __FUNCTION__, __LINE__,sendline); |
| |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| |
| //printf("RETR RECVLINE = %s\n",recvline); |
| LYDBGLOG("[%s-%d] recvline = %s\n", __FUNCTION__, __LINE__, recvline); |
| |
| if(recvbytes < 0) |
| { |
| LYVERBLOG("+[ftp][ls][session%d]: error num = %d\n", FTP->session, FTP_SEND_ERROR); |
| } |
| if(strncmp(recvline, "400", 3)>0) |
| { |
| error = 400; |
| LYDBGLOG("[%s-%d] type recv is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][ls][session%d]: error num = %d\n", FTP->session, error); |
| return error; |
| } |
| |
| ftp_list(data_sock, FTP->session); |
| |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| |
| LYDBGLOG("[%s-%d] recvline = %s\n", __FUNCTION__, __LINE__, recvline); |
| |
| strcpy(FTP->respond, recvline); |
| |
| if((strncmp(FTP->respond, "226", 3) == 0) || (strncmp(FTP->respond, "150",3) == 0) || strncmp(FTP->respond, "125", 3) == 0) |
| { |
| if(strstr(FTP->respond, ". 0 bytes")){//rita add @2021.07.19 for ls |
| LYDBGLOG("[%s-%d] FTP->respond = %s\n", __FUNCTION__, __LINE__, FTP->respond); |
| LYVERBLOG("+[ftp][ls][session%d]: error num = %d\n", FTP->session, FTP_LS_ERROR); |
| return FTP_LS_ERROR; |
| } |
| else |
| LYVERBLOG("+[ftp][ls][session%d]: ok!!\n", FTP->session); |
| } |
| else{ |
| error = 44; |
| LYDBGLOG("[%s-%d] ls error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][ls][session%d]: error num = %d\n", FTP->session, error); |
| return error; |
| } |
| |
| return 0; |
| } |
| |
| |
| void lynq_ftp_get(int sck, char *pDownloadFileName, int session) |
| { |
| int handle = open(pDownloadFileName, O_WRONLY | O_CREAT | O_TRUNC, S_IREAD| S_IWRITE); |
| int nread; |
| |
| while(1) |
| { |
| //printf("%d\n",sck); |
| //printf("%d\n",handle); |
| if((nread = recv(sck, rbuf1, 1024, 0)) < 0) |
| { |
| error = 51; |
| //LYDBGLOG("[%s-%d] ftp,rbuf1 = %s\n", __FUNCTION__, __LINE__, rbuf1); |
| LYDBGLOG("[%s-%d] receive error\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][get][session%d]: error num = %d\n", session, error); |
| return; |
| } |
| else if(nread == 0) |
| { |
| LYDBGLOG("[%s-%d] over\n", __FUNCTION__, __LINE__); |
| break; |
| } |
| if(write(handle, rbuf1, nread) != nread) |
| { |
| LYDBGLOG("[%s-%d] receive error from server!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][get][session%d]: error num = %d\n", session, FTP_WRITE_ERROR); |
| } |
| |
| //LYDBGLOG("[%s-%d] rbuf1 = %s \n", __FUNCTION__, __LINE__, rbuf1); |
| |
| memset(rbuf1,0,1024); |
| } |
| if(close(sck) < 0){ |
| LYDBGLOG("[%s-%d] close error\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][get][session%d]: error num = %d\n", session, FTP_CLOSE_ERROR); |
| } |
| } |
| |
| |
| |
| int cliopen(char *hoster, int port) |
| { |
| |
| int control_sockfd; |
| |
| struct sockaddr_in serv_addr; |
| struct hostent *host = NULL; |
| |
| //get hostent argument |
| char name[MAXSIZE]; |
| //printf("please enter the hostname\n"); |
| //printf("ftp-> "); |
| |
| strcpy(name, hoster); |
| host = gethostbyname(name); |
| if(host == NULL) |
| { |
| LYDBGLOG("[%s-%d] ftp,get host by name is error!\n", __FUNCTION__, __LINE__); |
| login_yes = 0; |
| } |
| else |
| { |
| //creact socket |
| control_sockfd = socket(AF_INET, SOCK_STREAM, 0); |
| if(control_sockfd < 0) |
| { |
| //printf("socket is error\n"); |
| LYDBGLOG("[%s-%d] ftp,socket is error\n", __FUNCTION__, __LINE__); |
| login_yes = 0; |
| } |
| |
| //set sockaddr_in |
| bzero(&serv_addr, sizeof(serv_addr)); |
| |
| memset(&serv_addr, 0, sizeof(struct sockaddr_in)); |
| memcpy(&serv_addr.sin_addr.s_addr, host->h_addr, host->h_length); |
| serv_addr.sin_family = AF_INET; |
| serv_addr.sin_port = htons(port); |
| |
| //printf("line port = %d\n",port); |
| if((connect(control_sockfd, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr))) < 0) |
| { |
| //printf("connect is error\n"); |
| LYDBGLOG("[%s-%d] ftp,connect is error\n", __FUNCTION__, __LINE__); |
| login_yes = 0; |
| } |
| } |
| return control_sockfd; |
| } |
| |
| void ftp_list(int sockfd, int session) |
| { |
| int nread; |
| |
| for(;;) |
| { |
| if((nread = recv(sockfd, rbuf1, 1024, 0)) < 0) |
| { |
| LYDBGLOG("[%s-%d] recv error\n", __FUNCTION__, __LINE__); |
| } |
| else if(nread == 0) |
| { |
| LYDBGLOG("[%s-%d] disconnect \n", __FUNCTION__, __LINE__); |
| break; |
| } |
| LYVERBLOG("+[ftp][ls][session%d]: data = %s\n", session, rbuf1); |
| LYVERBLOG("+[ftp][ls][session%d]: ok!! \n", session); |
| memset(rbuf1, 0, 1024); |
| } |
| if(close(sockfd) < 0){ |
| LYDBGLOG("[%s-%d] close error\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][ls][session%d]: error num = %d\n", session, FTP_CLOSE_ERROR); |
| } |
| } |
| |
| void lynq_ftp_cd(lynq_ftp_socker_info* FTP) |
| { |
| char catbuf[1024]; |
| char sendline[1024]; |
| char recvline[1024]; |
| |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| int recvbytes, sendbytes; |
| int issuccess; |
| |
| if(strcmp(FTP->del_mkr_filename, "..") == 0) |
| { |
| sprintf(sendline, "CDUP %s\n", FTP->del_mkr_filename); |
| } |
| else |
| { |
| sprintf(sendline, "CWD %s\n", FTP->del_mkr_filename); |
| } |
| strcat(sendline, "\r\n"); |
| |
| LYDBGLOG("[%s-%d] %s\n", __FUNCTION__, __LINE__, sendline); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes < 0) |
| { |
| LYDBGLOG("cd send is error!"); |
| exit(1); |
| } |
| |
| |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| if(strncmp(recvline, "257", 3) == 0) |
| { |
| issuccess = 1; |
| } |
| else |
| { |
| error = 44; |
| issuccess = 0; |
| } |
| } |
| |
| void lynq_ftp_creat_mkd(lynq_ftp_socker_info* FTP) |
| { |
| char catbuf[1024]; |
| char sendline[1024]; |
| char recvline[1024]; |
| |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| int recvbytes, sendbytes; |
| int issuccess; |
| strcat(sendline, "MKD "); |
| strcat(sendline, FTP->del_mkr_filename); |
| strcat(sendline, "\r\n"); |
| LYDBGLOG("[%s-%d] %s\n", __FUNCTION__, __LINE__, sendline); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes < 0) |
| { |
| LYDBGLOG("[%s-%d] mkd send is error!", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][mkdir][session%d]: error num = %s\n", FTP->session, FTP_SEND_ERROR); |
| exit(1); |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| if(strncmp(recvline, "257", 3) == 0) |
| { |
| issuccess = 1; |
| LYVERBLOG("+[ftp][mkdir][session%d]: ok!!\n", FTP->session); |
| } |
| else |
| { |
| error = 44; |
| LYVERBLOG("+[ftp][mkdir][session%d]: error num = %d\n", FTP->session, error); |
| issuccess = 0; |
| } |
| } |
| |
| |
| void lynq_ftp_delete_mkd(lynq_ftp_socker_info* FTP) |
| { |
| char sendline[1024]; |
| char recvline[1024]; |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| int recvbytes, sendbytes; |
| int issuccess; |
| char catbuf[1024]; |
| |
| strcat(sendline, "RMD "); |
| strcat(sendline, FTP->del_mkr_filename); |
| strcat(sendline, "\r\n"); |
| LYDBGLOG("[%s-%d] %s\n", __FUNCTION__, __LINE__,sendline); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes < 0) |
| { |
| LYDBGLOG("[%s-%d] rmd send is error!", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][rmd][session%d]: error num = %s\n", FTP->session, FTP_SEND_ERROR); |
| exit(1); |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| if(strncmp(recvline, "250", 3) == 0) |
| { |
| issuccess = 1; |
| LYVERBLOG("+[ftp][rmd][session%d]: ok!!\n", FTP->session); |
| } |
| else |
| { |
| error = 44; |
| issuccess = 0; |
| LYVERBLOG("+[ftp][rmd][session%d]: error num = %s\n", FTP->session, error); |
| } |
| } |
| |
| void lynq_ftp_quit(lynq_ftp_socker_info* FTP) |
| { |
| |
| int recvbytes, sendbytes; |
| char sendline[1024], recvline[1024]; |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| |
| |
| strcat(sendline, "bye "); |
| strcat(sendline, "\n"); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes < 0) |
| { |
| LYDBGLOG("[%s-%d] stru send is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][quit][session%d]: error num = %s\n", FTP->session, FTP_SEND_ERROR); |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| |
| LYDBGLOG("[%s-%d] quit = %s\n", __FUNCTION__, __LINE__, recvline); |
| if(recvbytes < 0) |
| { |
| LYDBGLOG("[%s-%d] stru recv is error!\n", __FUNCTION__, __LINE__); |
| LYVERBLOG("+[ftp][quit][session%d]: error num = %s\n", FTP->session, FTP_RCV_ERROR); |
| } |
| if(strncmp(recvline, "221", 3) == 0) |
| { |
| LYVERBLOG("+[ftp][quit][session%d]: ok!!\n", FTP->session); |
| } |
| } |
| |
| void lynq_ftp_deletefile_mkd(lynq_ftp_socker_info* FTP) |
| { |
| char sendline[1024]; |
| char recvline[1024]; |
| |
| zeromery(sendline, 1024); |
| zeromery(recvline, 1024); |
| int recvbytes, sendbytes; |
| int issuccess; |
| char catbuf[1024]; |
| strcat(sendline, "DELE "); |
| strcat(sendline, FTP->del_mkr_filename); |
| strcat(sendline, "\r\n"); |
| LYDBGLOG("[%s-%d] %s\n", __FUNCTION__, __LINE__,sendline); |
| sendbytes = send(FTP->control_sockfd, sendline, strlen(sendline), 0); |
| if(sendbytes < 0) |
| { |
| LYVERBLOG("+[ftp][delfile][session%d]: error num = %d\n", FTP->session, FTP_SEND_ERROR); |
| exit(1); |
| } |
| recvbytes = recv(FTP->control_sockfd, recvline, sizeof(recvline), 0); |
| if(strncmp(recvline, "250", 3) == 0) |
| { |
| issuccess = 1; |
| LYVERBLOG("+[ftp][delfile][session%d]: ok!!\n", FTP->session); |
| } |
| else |
| { |
| error = 44; |
| issuccess = 0; |
| LYVERBLOG("+[ftp][delfile][session%d]: error num = %d\n", FTP->session, error); |
| } |
| } |
| |