Esempio n. 1
0
/* 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(&reg,filename,REG_NOSUB))) {
		regerror(ret,&reg,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(&reg);
		return;
	}
	while(NULL != (direp=readdir(dirp))) {
		strcpy(errbuf,dir);
		ret=regexec(&reg,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(&reg);
	return;
}
Esempio n. 2
0
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;
}
Esempio n. 3
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;
}