www.pudn.com > ftp.rar > ftp_y.c
#include#include #include #include #include #include #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 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 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 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); } } //复制文件 //comparedir(DHDDSTATION, DUSBSTATION, DTEMP, mediafile,1,0); systemcall("rm -rf /busonline/hda1/station/*",1); sprintf(cmdtmp,"cp -rf "); strcat(cmdtmp,DUSBSTATION); strcat(cmdtmp," "); strcat(cmdtmp,DHDDMOUNT); systemcall(cmdtmp,1); if(comparedir(DHDDSTATION, DUSBSTATION, DTEMP, mediafile,0,1) != -1) { systemcall("sync",1); systemcall("killall -9 cp mv keyb gps mplayer mplayers media busDispatch log showfont lufsd lufsmount lufsmnt lufsumount",1); IPC_ProcState_Read(PROCID_LOG,log_shm,&log_local); if(strlen(log_local.LogFile) > 0) { writelog(log_local.LogFile,logbuf); } 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); } else { remove(tmp); } systemcall("sync",1); } } //卸载USB存储设备 sprintf(tmp,DUSBMOUNT); sprintf(cmdtmp,"umount %s 2>/dev/null",tmp); DEBUG_BUS(ifdebug,"FTP: cmd = %s\n",cmdtmp); systemcall(cmdtmp,1); /***********************通过 ftp 更新***********************************************/ //挂载ftp ftp_local.FTPMount = 0x01; ftp_local.FTPFsrw = 1; IPC_ProcState_Write(PROCID_FTP,ftp_shm,&ftp_local); systemcall("mount -n -o remount,rw / 2>/dev/null",1); sprintf(cmdtmp,"lufsmount ftpfs://"); strcat(cmdtmp,upmedia.ftpuser); strcat(cmdtmp,":"); strcat(cmdtmp,upmedia.ftppass); strcat(cmdtmp,"@"); strcat(cmdtmp,upmedia.ftpip); strcat(cmdtmp," "); strcat(cmdtmp,DFTPMOUNT); //"/busonline/ftp" strcat(cmdtmp," 2>/dev/null"); DEBUG_BUS(ifdebug,"FTP: cmd = %s\n",cmdtmp); systemcall(cmdtmp,1); IPC_ProcState_Read(PROCID_GUARD,main_shm,&main_local); if(main_local.FTPFsrw != 1) systemcall("mount -n -o remount,ro / 2>/dev/null",1); ftp_local.FTPFsrw = 0; IPC_ProcState_Write(PROCID_FTP,ftp_shm,&ftp_local); //更新媒体文件 if(access(FTPMEDCONFIG,F_OK) != -1) { char ver[16]; int filenum; struct filename filename[100]; int ifstopmedia; char logtmp[256]; long vermedial,verl; //上传IP自举文件 sprintf(tmp,DFTPIPRAISE); sprintf(cmdtmp,"%s/%s.ipp",tmp,upmedia.localip); remove(cmdtmp); sprintf(cmdtmp,"cp -f /tmp/%s.ipp %s",upmedia.localip,tmp); DEBUG_BUS(ifdebug,"FTP: cmd = %s\n",cmdtmp); systemcall(cmdtmp,1); //上传日志文件 sprintf(tmp,DHDDLOG); sprintf(logtmp,DFTPLOG); sprintf(cmdtmp,"mv -f %s/*.gz %s/ 2>/dev/null",tmp,logtmp); DEBUG_BUS(ifdebug,"FTP: cmd = %s\n",cmdtmp); systemcall(cmdtmp,1); systemcall("sync",1); //读取版本信息 GetPrivateProfileString("sig","version","0",upmedia.version,16,HDDMEDCONFIG); GetPrivateProfileString("sig","version","0",ver,16,FTPMEDCONFIG); verl = atol(ver); vermedial = atol(upmedia.version); if((vermedial == 0) || ((verl != 0) && (verl > vermedial))) { //解析XML文件 char xmlfile[256]; int i,cpsuccess; sprintf(tmp,DFTPPLCFG); sprintf(xmlfile,"%s/%s.xml",tmp,upmedia.localip); filenum = readxml(xmlfile, filename); cpsuccess = 0; ifstopmedia = 0; ftp_local.FTPState = 0x01; time(&(ftp_local.Proc_Info.ctime)); IPC_ProcState_Write(PROCID_FTP,ftp_shm,&ftp_local); if(filenum < 0) cpsuccess = -1; //检测硬盘剩余空间,删除不用的文件 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 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 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); } { int ftptimeout,ftpretry; ftptimeout = FTPTIMEOUT; ftpretry = FTPRETRY; mkdirp(DHDDMEDIA); sprintf(tmp,DHDDMEDIA); sprintf(cmdtmp,"wget -q -T %d -t %d -P %s --retry-connrefused --ftp-user=%s --ftp-password=%s -c ftp://%s/media/%s", ftptimeout, ftpretry, tmp, upmedia.ftpuser, upmedia.ftppass, upmedia.ftpip, filename[i].name); DEBUG_BUS(ifdebug,"FTP: cmd = %s\n",cmdtmp); systemcall(cmdtmp,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,FTPMEDCONFIG); 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); systemcall("killall -9 cp mv keyb gps mplayer mplayers media busDispatch log showfont lufsd lufsmount lufsmnt lufsumount",1); IPC_ProcState_Read(PROCID_LOG,log_shm,&log_local); if(strlen(log_local.LogFile) > 0) { writelog(log_local.LogFile,logbuf); } 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); } } } //ftp 更新报站文件 sprintf(tmp,DFTPSTATION); 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); int ftptimeout,ftpretry; struct fileattr mediafilef[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 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); } } //断点续传文件 /*ftptimeout = FTPTIMEOUT; ftpretry = FTPRETRY; sprintf(tmp,DHDDSTATION); sprintf(cmdftp,"wget -r -nH --cut-dirs=2 -q -T %d -t %d -P %s --retry-connrefused --ftp-user=%s --ftp-password=%s -c ftp://%s/teamgo/station/*", ftptimeout, ftpretry, tmp, upmedia.ftpuser, upmedia.ftppass, upmedia.ftpip); DEBUG_BUS(ifdebug,"FTP: cmd = %s\n",cmdftp); systemcall(cmdftp,1); systemcall("sync",1);*/ systemcall("rm -rf /busonline/hda1/station/*",1); sprintf(cmdtmp,"cp -rf "); strcat(cmdtmp,DFTPSTATION); strcat(cmdtmp," "); strcat(cmdtmp,DHDDMOUNT); systemcall(cmdtmp,1); if(comparedir(DHDDSTATION, DFTPSTATION, DTEMP, mediafilef,0,1) != -1) { systemcall("sync",1); systemcall("killall -9 cp mv keyb gps mplayer mplayers media busDispatch log showfont lufsd lufsmount lufsmnt lufsumount",1); IPC_ProcState_Read(PROCID_LOG,log_shm,&log_local); if(strlen(log_local.LogFile) > 0) { writelog(log_local.LogFile,logbuf); } 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); } else { remove("/busonline/hda1/station/zzver.ini"); } } } //卸载ftp ftp_local.FTPFsrw = 1; IPC_ProcState_Write(PROCID_FTP,ftp_shm,&ftp_local); systemcall("mount -n -o remount,rw / 2>/dev/null",1); sprintf(cmdtmp,"lufsumount "); strcat(cmdtmp,DFTPMOUNT); strcat(cmdtmp," 2>/dev/null"); DEBUG_BUS(ifdebug,"FTP: cmd = %s\n",cmdtmp); systemcall(cmdtmp,1); systemcall(cmdtmp,1); IPC_ProcState_Read(PROCID_GUARD,main_shm,&main_local); if(main_local.FTPFsrw != 1) systemcall("mount -n -o remount,ro / 2>/dev/null",1); //systemcall("killall -9 lufsd lufsmnt lufsmount lufsumount 2>/dev/null",1); ftp_local.FTPFsrw = 0; ftp_local.FTPMount = 0x00; IPC_ProcState_Write(PROCID_FTP,ftp_shm,&ftp_local); } sleep(10); goto ftpstart; return 0; }