/* str: local_filename remodt_filename */ void putlist(T_Connect *conn,char *str) { char lpath[512],*dir,*rmtp; char *filename; DIR *dirp; struct dirent *direp; regex_t reg; regmatch_t pmatch[2]; int ret; char errbuf[1024],rmtbuf[1024]; TRIM(str); if(!*str) return; rmtp=stptok(str,lpath,sizeof(lpath)," "); substitute_env(lpath); if(*rmtp) rmtp=skipblk(rmtp); if(!*rmtp) rmtp="$/"; // filename=basename(lpath); filename=strrchr(lpath,'/'); if(filename) { *filename++=0; dir=lpath; if(!*dir) dir="/"; if(!*filename) strcpy(filename,"*"); } else { filename=lpath; dir="."; } ShowLog(5,"dir=%s,name=%s:\n",dir,filename); ret=sh2reg(filename); if(0!=(ret=regcomp(®,filename,REG_NOSUB))) { regerror(ret,®,errbuf,sizeof(errbuf)); ShowLog(1,"filename %s regcomp err=%s",filename,errbuf); return; } if(!(dirp=opendir(dir))) { ShowLog(1,"putls opendir %s err %d",dir,errno); regfree(®); return; } while(NULL != (direp=readdir(dirp))) { strcpy(errbuf,dir); ret=regexec(®,direp->d_name,1,pmatch,0); if(!ret) { /* send file to server */ if(dir[strlen(dir)-1]=='/') sprintf(errbuf,"%s%s",dir,direp->d_name); else sprintf(errbuf,"%s/%s",dir,direp->d_name); if(isrfile(errbuf)>0){ if(rmtp[strlen(rmtp)-1]=='/') sprintf(rmtbuf,"%s%s", rmtp,basename(direp->d_name)); else sprintf(rmtbuf,"%s/%s", rmtp,basename(direp->d_name)); ret=NZ_Put_File(conn,errbuf,rmtbuf); if(ret) ShowLog(1,"putlist:%s %s,ret=%d", errbuf,rmtbuf,ret); else { printf("%s\n",errbuf); ShowLog(2,"NZ_PutFile %s to %s succeed!", errbuf,rmtbuf); } if(ret<0) break; } } } /* if(errno) { ShowLog(1,"putlist %s err=%d",errbuf,errno); } */ closedir(dirp); regfree(®); return; }
int getlist(T_Connect *conn,T_NetHead *NetHead) { char *buff,*env,*p; char *p1,*p2; char tmp[1000],dir[512],tmp1[2000]; FILE *fd; int ret,dirnum; char buffer[4096]; if(!NetHead->pkg_len) { ShowLog(1,"getlist what to list?"); NetHead->errno1=0; errret: NetHead->data=0; NetHead->pkg_len=0; NetHead->errno2=-1; NetHead->pkg_rec_num=0; NetHead->o_node=0; NetHead->d_node=0; ret=SendPack(conn,NetHead); return 0; } buff=malloc(NetHead->pkg_len+100); strcpy(buff,NetHead->data); ShowLog(5,"%s",buff); if(!strncmp(buff,"$/",2)) { env=getenv("SENDDIR"); p=buff+2; } else if(!strncmp(buff,"@/",2)) { env=getenv("HOME"); p=buff+2; } else if(*buff=='$') { p=stptok(buff+1,tmp,sizeof(tmp),"/"); env=getenv(tmp); } else { p=buff; } if(p>buff) { if(!env||!*env) env="."; sprintf(tmp,"%s/",env); strsubst(buff,p-buff,tmp); } //if(!*LOGFILE) p2="/dev/null"; //else p2=LOGFILE; p2="/dev/null"; sprintf(tmp,"ls -R %s 2>>%s ",buff,p2); ShowLog(5,tmp); dirnum=0; *dir=0; fd=popen(tmp,"r"); if(!fd) { ShowLog(1,"%s:err=%d",tmp,errno); free(buff); NetHead->errno1=errno; goto errret; } buffer[0]=0; while((ret=fscanf(fd,"%s",tmp))==1) { if(tmp[strlen(tmp)-1]==':') { // is dir if(!*dir) { tmp[strlen(tmp)-1]=0; strcpy(dir,tmp); continue; } else { ShowLog(5,tmp); break; // no -R } } if(*dir) { if(dir[strlen(dir)-1]=='/') sprintf(tmp1,"%s%s",dir,tmp); else sprintf(tmp1,"%s/%s",dir,tmp); } else { strcpy(tmp1,tmp); } if(isrfile(tmp1)<=0) continue; //not readble reg file /* send tmp1 to client */ ret=strlen(buffer); if((ret+strlen(tmp1)+2) < sizeof(buffer)) { sprintf(buffer+ret,"%s ",tmp1); } else { NetHead->data=buffer; NetHead->pkg_len=strlen(NetHead->data)+1; NetHead->errno2=0; NetHead->pkg_rec_num=0; NetHead->o_node=0; NetHead->d_node=0; ret=SendPack(conn,NetHead); if(ret) break; strcpy(buffer,tmp1); strcat(buffer," "); } } pclose(fd); if(*buffer) { NetHead->data=buffer; NetHead->pkg_len=strlen(NetHead->data)+1; NetHead->errno2=0; NetHead->pkg_rec_num=0; NetHead->o_node=0; NetHead->d_node=0; ret=SendPack(conn,NetHead); *buffer=0; } NetHead->data=0; NetHead->pkg_len=0; NetHead->errno2=100; NetHead->pkg_rec_num=0; NetHead->o_node=0; NetHead->d_node=0; ret=SendPack(conn,NetHead); free(buff); return 0; }
/* file_list: server */ int filels(T_Connect *conn,T_NetHead *NetHead) { char *buff,*env,*p; char *p1; char tmp[1000],dir[512],tmp1[2000]; FILE *fd; int ret; char buffer[SDBC_BLKSZ]; int Event_no=NetHead->PROTO_NUM; if(!NetHead->PKG_LEN) { ShowLog(1,"getlist what to list?"); NetHead->ERRNO1=-1; errret: NetHead->PROTO_NUM=PutEvent(conn,Event_no); NetHead->data=0; NetHead->PKG_LEN=0; NetHead->ERRNO2=-1; NetHead->PKG_REC_NUM=0; NetHead->O_NODE=LocalAddr(conn->Socket,0); NetHead->D_NODE=0; ret=SendPack(conn,NetHead); return 0; } buff=malloc(NetHead->PKG_LEN+200); if(!buff) { NetHead->ERRNO1=-2; goto errret; } strcpy(buff,NetHead->data); //ShowLog(5,"errno2=%d %s",NetHead->ERRNO2,buff); if(!strncmp(buff,"$/",2)) { env=getenv("SENDDIR"); p=buff+1; } else if(!strncmp(buff,"@/",2)) { env=getenv("HOME"); p=buff+1; } else if(*buff=='$') { p=stptok(buff+1,tmp,sizeof(tmp),"/"); env=getenv(tmp); } else { p=buff; } if(p>buff) { if(!env||!*env) env="."; if(env[strlen(env)-1]=='/') env[strlen(env)-1]=0; strcpy(tmp,env); //ShowLog(5,"%s:env=%s,buff=%s",__FUNCTION__,env,buff); strsubst(buff,p-buff,tmp); } ShowLog(5,"filelist:path=%s",buff); sprintf(tmp,"ls %s",buff); if(isdir(buff)>0) strcpy(dir,buff); else { p1=strrchr(buff,'/'); if(p1) { *p1=0; strcpy(dir,buff); } else strcpy(dir,"."); } if(dir[strlen(dir)-1]=='/') dir[strlen(dir)-1]=0; fd=popen(tmp,"r"); if(!fd) { ShowLog(1,"%s:err=%d",tmp,errno); free(buff); NetHead->ERRNO1=errno; goto errret; } //ShowLog(5,"tmp=%s",tmp); p=buffer; *p=0; while((ret=fscanf(fd,"%s",tmp))==1) { if(*buffer==0 && tmp[strlen(tmp)-1] == ':') {//没找到 break; } p1=sc_basename(tmp); ret=sprintf(tmp1,"%s/%s",dir,p1); if(isrfile(tmp1)<=0) continue; //not readble reg file /* send tmp1 to client */ if((int)(buffer+sizeof(buffer)-2-p)>ret) { p=stpcpy(p,tmp1); } else { //ShowLog(5,"%s",buffer); NetHead->PROTO_NUM=0; NetHead->data=buffer; NetHead->PKG_LEN=strlen(NetHead->data); NetHead->ERRNO2= PACK_CONTINUE; NetHead->O_NODE=LocalAddr(conn->Socket,0); NetHead->D_NODE=0; ret=SendPack(conn,NetHead); if(ret) break; p=buffer; p=stpcpy(p,tmp1); *p++ = ' '; *p=0; } } pclose(fd); if(*buffer) { //ShowLog(5,"final %s",buffer); NetHead->PROTO_NUM=0; NetHead->data=buffer; NetHead->PKG_LEN=strlen(NetHead->data); NetHead->ERRNO2= PACK_CONTINUE; NetHead->O_NODE=LocalAddr(conn->Socket,0); ret=SendPack(conn,NetHead); *buffer=0; } NetHead->PROTO_NUM=PutEvent(conn,Event_no); NetHead->data=0; NetHead->PKG_LEN=0; NetHead->ERRNO2=0; NetHead->PKG_REC_NUM=0; NetHead->O_NODE=LocalAddr(conn->Socket,0); NetHead->D_NODE=0; ret=SendPack(conn,NetHead); free(buff); return 0; }