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

📄 ftp_y.c

📁 本程序为在linux下实现FTP传输文件的实现
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <dirent.h>#include <sys/types.h>#include <sys/wait.h>#include "inc.h"#include "ftp.h"static void Sig_Handle(int signo)		{    char tmp[256];    int leng;    DEBUG_BUS(ifdebug,"FTP: sig %d received!\r\n",signo);    switch(signo)    {    case SIGUSR1:    case SIGUSR2:	DEBUG_BUS(ifdebug,"FTP:Catch sig USER!\r\n");	ReceiveMsgQ = 1;	leng = MSGQ_Read(PROCID_FTP,tmp);	if((leng==2) && (tmp[0]== 0x00) && (tmp[1]==0x01))	{	    systemcall("killall -9 wget",1);	    sprintf(tmp,"lufsumount ");	    strcat(tmp,DFTPMOUNT);	    strcat(tmp," 2>/dev/null");	    systemcall(tmp,1);	    systemcall(tmp,1);	    systemcall(tmp,1);	    exit(0);	}	break;    case SIGKILL:	DEBUG_BUS(ifdebug,"FTP:Prog End!\r\n");	break;    default:	break;    }}void Signal_Init(void){    //处理子进程退出,避免僵尸进程;    //signal(SIGCHLD,SIG_IGN);    if (signal(SIGUSR1,Sig_Handle) == SIG_ERR)	perror("FTP:cann't catch SIGUSR1!\r\n");    if (signal(SIGUSR2,Sig_Handle) == SIG_ERR)	perror("FTP:cann't catch SIGUSR2!\r\n");}int readxml(char *file, struct filename *name){    xmlTextReaderPtr reader;    const xmlChar *value;    int ret,num,i;        i = 0;    num = 0;    reader = xmlReaderForFile(file, NULL, 0);    if (reader != NULL)     {    	ret = xmlTextReaderRead(reader);    	while (ret == 1)     	{	    if(strcmp(xmlTextReaderConstName(reader),"filename") == 0)	    {		xmlTextReaderRead(reader);		value = xmlTextReaderConstValue(reader);		if(strlen(value) > 30)		{		    sprintf(name[i].name,"%s",value);		    i++;		    num = i;		}	    }	    ret = xmlTextReaderRead(reader);    	}    	xmlFreeTextReader(reader);    	if (ret != 0)     	{	    xmlCleanupParser();	    xmlMemoryDump();	    return -1;    	}    }     else 	num = -1;    xmlCleanupParser();    xmlMemoryDump();    return num;}int main(){    char cmdtmp[256],tmp[256];        struct UPMEDIA upmedia;    Guard_Info *main_shm, main_local;    GPS_Info *gps_shm, gps_local;    FTP_Info *ftp_shm, ftp_local;    KeyB_Info *keyb_shm, keyb_local;    Media_Info *media_shm, media_local;    Dispatch_Info *dispatch_shm, dispatch_local;    int msgid;    FILE *fp;    char logbuf[20] = "info,shutdown";	    ifdebug = DEBUG;	    ftp_local.Proc_Info.PID = getpid();    ftp_local.FTPFsrw = 0;    //初使化共享内存 消息队列    main_shm = (Guard_Info*)IPC_ProcState_Init(PROCID_GUARD,SHM_RDONLY);    gps_shm = (GPS_Info *)IPC_ProcState_Init(PROCID_GPS,SHM_RDONLY);    ftp_shm = (FTP_Info *)IPC_ProcState_Init(PROCID_FTP,0);    keyb_shm = (KeyB_Info *)IPC_ProcState_Init(PROCID_KEYB,SHM_RDONLY);    media_shm = (Media_Info *)IPC_ProcState_Init(PROCID_MEDIA,SHM_RDONLY);    dispatch_shm = (Dispatch_Info *)IPC_ProcState_Init(PROCID_DISPATCH,SHM_RDONLY);	    msgid = MSGQ_Init();    MSGQ_Clear(PROCID_FTP);    Signal_Init();	//	GetPrivateProfileString("NET","LOCALIP","192.168.0.162",upmedia.localip,20,SYSCONFIG);//	GetPrivateProfileString("NET","FTPIP","192.168.0.74",upmedia.ftpip,20,SYSCONFIG);    GetPrivateProfileString("NET","FTPUSER","zdbustv",upmedia.ftpuser,40,NETCONFIG);    GetPrivateProfileString("NET","FTPPASS","cpu1G?od:nw",upmedia.ftppass,40,NETCONFIG);    GetPrivateProfileString("DEBUG","DBG","0",upmedia.debug,2,SYSCONFIG);	    if(upmedia.debug[0] == '1')    {	ifdebug = 1;	    }    else    {	ifdebug = 0;    }ftpstart:    ftp_local.FTPState = 0x00;    ftp_local.FTPMount = 0x00;    time(&(ftp_local.Proc_Info.ctime));    IPC_ProcState_Write(PROCID_FTP,ftp_shm,&ftp_local);	    IPC_ProcState_Read(PROCID_GUARD,main_shm,&main_local);    strcpy(upmedia.localip,main_local.WlanIP);    strcpy(upmedia.ftpip,main_local.ServerIP);    //生成IP自举文件    sprintf(tmp,"/tmp/%s.ipp",upmedia.localip);    fp = fopen(tmp,"w+");    sprintf(tmp,"%s,",upmedia.localip);    fputs(tmp,fp);    fclose(fp);//	if((main_local.NetState ==0) && (main_local.HddState == 0))    if(main_local.HddState == 0)    {/************************通过 USB 设备更新***********************************************/			//挂载USB存储设备	sprintf(tmp,DUSBMOUNT);	sprintf(cmdtmp,"mount -t vfat -o rw /dev/sda1 %s 2>/dev/null",tmp);	DEBUG_BUS(ifdebug,"FTP: cmd = %s\n",cmdtmp);	systemcall(cmdtmp,1);			//更新媒体文件	if(access(USBMEDCONFIG,F_OK) != -1)	{	    char ver[16];	    int filenum;	    struct filename filename[100];	    int ifstopmedia;	    long verl,vermedial;	    GetPrivateProfileString("sig","version","0",upmedia.version,16,HDDMEDCONFIG);	    GetPrivateProfileString("sig","version","0",ver,16,USBMEDCONFIG);	    vermedial = atol(upmedia.version);	    verl = atol(ver);	    if((vermedial == 0) || ((verl != 0) && (verl > vermedial)))	    {		//解析XML文件		char xmlfile[256];		int i,cpsuccess;		sprintf(tmp,DUSBPLCFG);		sprintf(xmlfile,"%s/%s.xml",tmp,upmedia.localip);		filenum = readxml(xmlfile, filename);		cpsuccess = 0;		ifstopmedia = 0;				if(filenum < 0)		    cpsuccess = -1;							//进程通讯,结束媒体播放进程		if(ifstopmedia == 0)		{		    char exitbuf[2];		    exitbuf[0] = 0x00;		    exitbuf[1] = 0x05;		    ftp_local.FTPState = 0x01;		    time(&(ftp_local.Proc_Info.ctime));		    IPC_ProcState_Write(PROCID_FTP,ftp_shm,&ftp_local);		    		    IPC_ProcState_Read(PROCID_MEDIA,media_shm,&media_local);		    if((media_local.Proc_Info.PID > 0) &&(kill(media_local.Proc_Info.PID,0) == 0))			MSGQ_Send(PROCID_MEDIA,exitbuf,2);		    sleep(TIMEOUT);		    if(media_local.Proc_Info.PID > 0)			kill(media_local.Proc_Info.PID,SIGKILL);		    ifstopmedia = 1;		    sleep(1);		    waitpid(media_local.Proc_Info.PID,NULL,WNOHANG);		}		//检测硬盘剩余空间,删除不用的文件		if((getdiskfree(DHDDMOUNT) < FREESPACE) && (filenum>0))		{		    struct dirent **namelist;		    int n;		    		    n = scandir(DHDDMEDIA, &namelist, 0, alphasort);		    if (n < 0)			perror("scandir");		    else		    {			while(n--)			{			    int temp,ifdel;			    ifdel = 1;			    for(temp=0; temp<filenum; temp++)			    {				if(strcmp(namelist[n]->d_name,filename[temp].name) == 0)				    ifdel = 0;				if((strcmp(namelist[n]->d_name,".") == 0) || (strcmp(namelist[n]->d_name,"..") == 0))				    ifdel = 0;			    }			    if(ifdel == 1)			    {				char tempc[256];				sprintf(tempc,DHDDMOUNT);				strcat(tempc,"/media/");				strcat(tempc,namelist[n]->d_name);				DEBUG_BUS(ifdebug,"FTP: remove %s\n",tempc);				remove(tempc);			    }			    free(namelist[n]);			}			free(namelist);		    }		}				//依次处理每个文件		for(i=0; i<filenum; i++)		{		    char filesrc[100],fileold[100];		    		    sprintf(filesrc,DUSBMEDIA);		    strcat(filesrc,"/media/");		    strcat(filesrc,filename[i].name);		    		    sprintf(fileold,DHDDMOUNT);		    strcat(fileold,"/media/");		    strcat(fileold,filename[i].name);		    DEBUG_BUS(ifdebug,"FTP: %s\n",fileold);		    		    if(access(filesrc,F_OK) != -1)		    {			//比较文件大小,如果不同,就复制			if(comparefilesize(fileold,filesrc) != 0)			{			    mkdirp(DHDDMEDIA);			    sprintf(tmp,"cp -f %s %s",filesrc,fileold);			    DEBUG_BUS(ifdebug,"FTP: cmd = %s\n",tmp);			    systemcall(tmp,1);			    systemcall("sync",1);			}			//复制完成后再次比较大小			if(comparefilesize(fileold,filesrc) != 0)			    cpsuccess = -1;		    }		    else			cpsuccess = -1;		}		//升级版本文件和播放控制xml文件		if(cpsuccess == 0)		{		    mkdirp(DHDDCONFIG);		    sprintf(tmp,"cp -f ");		    strcat(tmp,USBMEDCONFIG);		    strcat(tmp," ");		    strcat(tmp,HDDMEDCONFIG);		    DEBUG_BUS(ifdebug,"FTP: cmd = %s\n",tmp);		    systemcall(tmp,1);		    systemcall("sync",1);		    		    sprintf(tmp,"cp -f ");		    strcat(tmp,xmlfile);		    strcat(tmp," ");		    strcat(tmp,DHDDCONFIG);		    DEBUG_BUS(ifdebug,"FTP: cmd = %s\n",tmp);		    systemcall(tmp,1);		    systemcall("sync",1);		    IPC_ProcState_Read(PROCID_LOG,log_shm,&log_local);		    if(strlen(log_local.LogFile) > 0)		    {			writelog(log_local.LogFile,logbuf);		    }		    systemcall("killall -9 cp mv keyb gps mplayer mplayers media busDispatch log showfont lufsd lufsmount lufsmnt lufsumount",1);							    systemcall("killall -2 x x x",1);		    systemcall("sync",1);		    FedDog();		    sleep_my(30);		    FedDog();		    systemcall("sync",1);		    systemcall("killall -9 guard",1);		    systemcall("poweroff",0);		    //sleep(1);		    exit(0);		}	    }	}	//usb 更新报站文件	sprintf(tmp,DUSBSTATION);	strcat(tmp,"/zzver.ini");	if(access(tmp,F_OK) != -1)	{	    char sverh[256],sverf[256];	    GetPrivateProfileString("STATION","VERSION","0.01",sverf,50,tmp);	    sprintf(tmp,DHDDSTATION);	    strcat(tmp,"/zzver.ini");	    GetPrivateProfileString("STATION","VERSION","0.01",sverh,50,tmp);	    	    if((access(tmp,F_OK) == -1) || (strcmp(sverf,sverh) > 0))	    {		remove(tmp);		struct fileattr mediafile[MAXFILENUM];		char cmdftp[256];		//结束媒体播放进程		char exitbuf[2];		exitbuf[0] = 0x00;		exitbuf[1] = 0x05;		ftp_local.FTPState = 0x01;		time(&(ftp_local.Proc_Info.ctime));		IPC_ProcState_Write(PROCID_FTP,ftp_shm,&ftp_local);						IPC_ProcState_Read(PROCID_MEDIA,media_shm,&media_local);		if((media_local.Proc_Info.PID > 0) &&(kill(media_local.Proc_Info.PID,0) == 0))		    MSGQ_Send(PROCID_MEDIA,exitbuf,2);		sleep(TIMEOUT);		if(media_local.Proc_Info.PID > 0)		    kill(media_local.Proc_Info.PID,SIGKILL);		sleep(1);		waitpid(media_local.Proc_Info.PID,NULL,WNOHANG);						//检测硬盘剩余空间,删除不用的报站文件						if(getdiskfree(DHDDMOUNT) < FREESPACE)		{		    struct dirent **namelist, **namelisthdd;		    int n,m;		    		    m = scandir(DFTPSTATION, &namelist, 0, alphasort);		    n = scandir(DHDDSTATION, &namelisthdd, 0, alphasort);		    		    if((m>0) && (n>0))		    {			while(n--)			{			    int temp,ifdel;			    ifdel = 1;			    for(temp=0; temp<m; temp++)			    {				if((strcmp(namelisthdd[n]->d_name,".") == 0) || (strcmp(namelisthdd[n]->d_name,"..") == 0))				{				    ifdel = 0;				    break;				}				if(strcmp(namelisthdd[n]->d_name,namelist[temp]->d_name) == 0)				{				    ifdel = 0;				    break;				}			    }			    if(ifdel == 1)			    {				char tempc[256];				sprintf(tempc,DHDDSTATION);				strcat(tempc,"/");				strcat(tempc,namelisthdd[n]->d_name);				DEBUG_BUS(ifdebug,"FTP: remove %s\n",tempc);				remove(tempc);			    }			    free(namelisthdd[n]);			}			free(namelist);			free(namelisthdd);		    }

⌨️ 快捷键说明

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