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