Beispiel #1
0
//连接
static int sc_connect(pool *p1,resource *rs)
{
int ret=-1;
T_NetHead Head;
struct utsname ubuf;
char buf[200],*p,addr[20];
log_stu logs;

	rs->Conn.timeout=-1;
	ret=Net_Connect(&rs->Conn,&rs->cli,*p1->log.family?p1->family:NULL);
	if(ret) {
		rs->cli.Errno=errno;
		stptok(strerror(errno),rs->cli.ErrMsg,sizeof(rs->cli.ErrMsg),0);
		return -1;
	}
//login
	uname(&ubuf);
	p=buf;
	Head.O_NODE=LocalAddr(rs->Conn.Socket,addr);
	p+=sprintf(p,"%s|%s|%s,%s|||",p1->log.DEVID,p1->log.LABEL,
		ubuf.nodename,addr);
	rs->Conn.MTU=p1->log.MTU;
	Head.PROTO_NUM=0;
	Head.D_NODE=p1->log.NEXT_d_node;
	Head.ERRNO1=rs->Conn.MTU;
	Head.ERRNO2=Head.PKG_REC_NUM=0;
	Head.data=buf;
	Head.PKG_LEN=strlen(Head.data);
	ret=SendPack(&rs->Conn,&Head);
	ret=RecvPack(&rs->Conn,&Head);
	if(ret) {
		rs->cli.Errno=errno;
		stptok(strerror(errno),rs->cli.ErrMsg,sizeof(rs->cli.ErrMsg),0);
		disconnect(&rs->Conn);
		ShowLog(1,"%s:network error %d,%s",__FUNCTION__,rs->cli.Errno,rs->cli.ErrMsg);
		rs->cli.Errno=-1;
		return -2;
	}
	if(Head.ERRNO1 || Head.ERRNO2) {
		ShowLog(1,"%s:login error ERRNO1=%d,ERRNO2=%d,%s",__FUNCTION__,
			Head.ERRNO1,Head.ERRNO2,Head.data);
		disconnect(&rs->Conn);
		stptok(Head.data,rs->cli.ErrMsg,sizeof(rs->cli.ErrMsg),0);
		rs->cli.Errno=-1;
		return -3;
	}
	net_dispack(&logs,Head.data,log_tpl);
	strcpy(rs->cli.DBOWN,logs.DBOWN);
	strcpy(rs->cli.UID,logs.DBUSER);
//取服务名
	ret=init_svc_no(&rs->Conn);
	rs->cli.Errno=ret;
	*rs->cli.ErrMsg=0;
	return ret;
}
Beispiel #2
0
/* 对选择的列构建update语句,如果choose为空,全部列 ,返回尾部 */
char * SRM_mk_upd_col(SRM *srmp,char *DBOWN,const char *choose,char *stmt)
{
    char *p,*p1;
    char col_name[49];
    T_PkgType *tp;

    if(!srmp||!stmt) {
        return stmt;
    }
    p=SRM_mk_update(srmp,DBOWN,stmt);
    p=stpcpy(p,"SET ");
    p1=(char *)choose;
    if(p1 && *p1) do {
            if(!*p1) break;
            p1=stptok(skipblk(p1),col_name,sizeof(col_name),",|");
            *p++ = '$';
            p=stpcpy(stpcpy(stpcpy(p,col_name),"=:"),col_name);
            *p++ = ',';
        } while (*p1++);
    else  for(tp=srmp->tp; tp->type>=0; tp++) {
            if(tp->type==CH_CLOB || tp->bindtype & NOINS) continue;
            p1=(char *)tp->name;
            p=stpcpy(stpcpy(strtcpy(p,&p1,' '),"=:"),plain_name(tp->name));
            *p++ = ',';
        }
    *p=0;
    p[-1]=' ';
    return p;
}
Beispiel #3
0
int pkg_dispack(void *net_struct,char *buf,T_PkgType *pkg_type,char delimit)
{
	char *cp;
	register char *cp1;
	char dml[2];
	T_PkgType *typ;

	*dml=delimit;
	dml[1]=0;
	cp=buf;
	if(!cp||!*cp) return 0;
	if(pkg_type->offset<0) set_offset(pkg_type);
	for(typ=pkg_type;typ->type>-1;typ++){
		if(typ->bindtype&NOSELECT) continue;
		if(typ->type==CH_STRUCT) {
			cp+=pkg_dispack((char *)net_struct+typ->offset,cp,(T_PkgType *)typ->format,delimit);
			continue;
		}
		cp1=cp;
		cp=stptok(cp,0,0,dml);
		if(*cp==delimit) *cp++=0;
		put_str_one(net_struct,cp1,typ,delimit);
		if(!*cp) break;
	}
	return (cp-buf);
}
Beispiel #4
0
int SRM_mk_select(SRM *srmp,char *DBOWN,char *where)
{
    register char *p,*p1;
    char *whp=0;

    if(!where) return -1;
    if(*where && (toupper(*where)=='S' && toupper(where[1])=='E')) return 0; //如果是select,不作处理
    if(!srmp->tp) return -1;
    if(*where) {
        whp=strdup(where);
        if(!whp) {
            return MEMERR;
        }
    }
    p=where;
    if(srmp->befor) {
        p=stpcpy(p,srmp->befor);
        *p++ = ' ';
        srmp->befor=0;
    }
    p=stpcpy(p,"SELECT ");
    if(srmp->hint) {
        p=stpcpy(p, srmp->hint);
        *p++ = ' ';
    }
    mkfield(p,srmp->tp,0);
    p1=where;
    while((p1=strcasestr((const char *)p1,(const char *)pre_tabname)) != 0) {
        if(*DBOWN) p1=strsubst(p1,3,DBOWN);
        else	   p1=strsubst(p1,4,DBOWN);
    }
    p+=strlen(p);
    p=stpcpy(p," FROM ");

    p1=stptok(srmp->tabname,0,0," ,.");
    if(!*p1) {			//简单表名
        if(DBOWN && *DBOWN) {
            p=stpcpy(p, DBOWN);
            *p++='.';
            *p=0;
        }
        p=stpcpy(p,srmp->tabname);
        *p++=' ';
        *p=0;
    } else {
        p=addown_to_name(p,DBOWN,srmp->tabname);
        *p++=' ';
        *p=0;
    }
    if(whp) {
        p=addown_to_name(p,DBOWN,whp);
        free(whp);
    }
    return 0;
}
Beispiel #5
0
int patt_copy_col(T_PkgType * dest,T_PkgType * src,const char *choose,char *idxcol)
{
int i,num;
T_PkgType *tp,*dp;
char buf[100];
const char *cp;
int colnum;

	if(!src || !dest) return 0;
	tp=src;
	dp=dest;
	if(!choose||!*choose) {		// 没有选择,全部加入
	    for(i=0;tp[i].type>=0;i++,dp++) {
		tp_cp(dp,tp,i);
	    }
	    tp_cp(dp,tp,i);
	    return i;
	}
	num=0;
	cp=choose;
	colnum=set_offset(src);
	do {
	char *p;
		*buf=0;
		cp=stptok(skipblk((char *)cp),buf,sizeof(buf),",|");	//可以用的分隔符
		p=buf;
		TRIM(p);
		if(!*p) continue;
		if(isdigit(*p)) {	//数字选择,字段号范围
		int ret,beg,end;
			end=beg=-1;
			ret=sscanf(buf,"%d - %d",&beg,&end);
			if(!ret) continue;
			if(ret==1) end=beg;
			if(end<beg) end=beg;
			for(ret=beg;ret<=end;ret++,dp++) {
	    			tp_cp(dp,tp,ret);
				num++;
			}
		} else {		//字母,字段名
			i=index_col(idxcol,colnum,p,src);
			if(src[i].type<0) continue;
	    		tp_cp(dp,tp,i);
			dp++;
			num++;
		}
	} while(*cp++);
	tp_cp(dp,tp,colnum);
	return num;
}
Beispiel #6
0
static int GetError(T_Connect *conn,T_NetHead *NetHead)
{
register T_User_Var *up;
	
        up=(T_User_Var *)conn->Var;
       	*up->ErrMsg=0;
        up->NativeError=NetHead->PKG_REC_NUM;
       	up->Errno=NetHead->ERRNO2;
	if(NetHead->PKG_LEN) {
			stptok(NetHead->data,up->ErrMsg,sizeof(up->ErrMsg),NULL);
	}
	EventCatch(conn,NetHead->PROTO_NUM);
	return -abs(NetHead->ERRNO1);
}
Beispiel #7
0
int sh2reg(char *str)
{
char *p,*p1;
int flg=0;
	if(!str) return flg;
	strins(str,'^');
	for(p1=p=str; *p ; p++) {
		p=stptok(p,0,0,"?*.[\\");
		if(!*p) break;
		if(*p=='\\') {
			++p;
			continue;
		}
		if(*p=='[') {
			p1=strchr(p,']');
			if(p1) {
				flg=1;
				p=p1;
				continue;
			}
		}
		switch(*p) {
		case '?':
			*p='.';
			flg=1;
			break;
		case '*':
			p=strins(p,'.');
			flg=1;
			break;
		case '.':
			p=strins(p,'\\');
			break;
		default:
			break;
		}
	}
	strcat(str,"$");
	return flg;
}
Beispiel #8
0
int strcpy_esc(char *dest,char *src,int len,char CURDLM)
{
	char *p;
	int i;
	p=src;
	if(len<=0) len=strlen(src)+1;
	if(!CURDLM) {
		p=stptok(src,dest,len,0);
		return p-src;
	}
	for(i=0;*p&&i<len-1;i++) {
		if(*p != ESC_CHAR) {
			*dest++ = *p++;
			continue;
		}
		if(p>src && GBK_flag &&  firstcc((unsigned char *)src,(unsigned char *)p-1)) {
			*dest++ = *p++;
			continue;
		}
		p++;
		switch(*p) {
			case 0:
				continue;
			case 'n':
				*dest++ = '\n';
				p++;
				continue;
			case 'G':
				*dest++ = CURDLM;
				p++;
				continue;
			default:
				*dest++ = *p++;
				continue;
		}
	}
	*dest=0;
	return i;
}
Beispiel #9
0
char * mk_where(const char *keys,char *stmt)
{
    char pks[104],*p,*p1;
    int i;

    if(!stmt) return 0;
    if(!keys || !*keys) {
        *stmt=0;
        return stmt;
    }
    p1=stmt;
    *p1=0;
    p=(char *)keys;
    for(i=0; *p; i++) {
        p=stptok(skipblk(p),pks,sizeof(pks),",|");
        if(*p) p++;
        if(i==0) p1=stpcpy(p1,"WHERE $");
        else p1=stpcpy(p1," AND $");
        p1=stpcpy(stpcpy(stpcpy(p1,pks),"=:"),pks);
    }
    return p1;
}
Beispiel #10
0
int login(T_Connect *conn,T_NetHead *NetHead)
{
int ret,crc;
char tmp[200];
char *cp,*key;
char tmp1[1024],cliaddr[20];
DWS dw;
struct login_s logrec;
ENIGMA egm;
FILE *fd;
T_SRV_Var *up;
GDA *gp;
//u_int e[RSALEN],m[RSALEN];

	up=(T_SRV_Var *)conn->Var;
	gp=(GDA *)up->var;
	StrAddr(NetHead->O_NODE,cliaddr);
ShowLog(5,"%s:TCB:%d Client IP Addr=%s,Net_login %s",__FUNCTION__,up->TCB_no,cliaddr,NetHead->data);
	net_dispack(&logrec,NetHead->data,login_type);
	strcpy(gp->devid,logrec.devid);
	sprintf(gp->ShowID,"%s:%s:%d",logrec.devid,cliaddr,up->TCB_no);
	mthr_showid_add(up->tid,gp->ShowID);

	conn->MTU=NetHead->ERRNO1;

	cp=getenv("KEYFILE");
	if(!cp||!*cp) {
		strcpy(tmp1,"缺少环境变量 KEYFILE");
errret:
		ShowLog(1,"%s:Error %s",__FUNCTION__,tmp1);
		NetHead->ERRNO1=-1;
		NetHead->ERRNO2=-1;
		NetHead->PKG_REC_NUM=0;
		NetHead->data=tmp1;
		NetHead->PKG_LEN=strlen(NetHead->data);
    		SendPack(conn,NetHead);
		return 0; // fail
	}
/* read key */
	crc=0;
reopen:
	ret=initdw(cp,&dw);
	if(ret) {
		if((errno==24)&& (++crc<5)) {
			sleep(15);
			goto reopen;
		}
		sprintf(tmp1,"Init dw error %d",ret);
		goto errret;
	}
	crc=ssh_crc32((unsigned char *)logrec.devid,strlen(logrec.devid));
	key=getdw(crc,&dw);
	if(!key) {
		freedw(&dw);
                sprintf(tmp1,"无效的 DEVID");
                goto errret;
        }

//ShowLog(5,"getdw key=%s",key);
	enigma1_init(egm,key);
/* check CA */
	memset(gp->operid,0,sizeof(gp->operid));
	cp=getenv("CADIR");
	if(!cp||!*cp) cp=".";
    if(strcmp(gp->devid,"REGISTER")) {
	strncpy(gp->operid,logrec.uid,sizeof(gp->operid)-1);
	sprintf(tmp,"%s/%s.CA",cp,logrec.devid);
//ShowLog(5,"CAfile=%s,key=%s",tmp,key);
	fd=fopen(tmp,"r");
	if(!fd) {
		if(errno==2) {
		    crc=strlen(logrec.CA);
		    frenz_encode(egm,logrec.CA,crc);
		    byte_a64(tmp1,logrec.CA,crc);
//ShowLog(5,"CA=%s",tmp1);
		    fd=fopen(tmp,"w");
		    if(!fd) {
			sprintf(tmp1,"write %s err=%d",tmp,errno);
err1:
			freedw(&dw);
			goto errret;
		    }
		    fprintf(fd,"%s\n",tmp1);
		    fclose(fd);
		} else {
			sprintf(tmp1,"open CAfile %s err=%d",tmp,errno);
			goto err1;
		}
	} else {
		fgets(tmp1,sizeof(logrec.CA),fd);
		fclose(fd);
		TRIM(tmp1);
		ret=a64_byte(tmp,tmp1);
		frenz_decode(egm,tmp,ret);
		tmp[ret]=0;
		if(strcmp(tmp,logrec.CA)) {
			sprintf(tmp1,"CA 错误");
ShowLog(1,"%s:%s CA=%s log=%s len=%d",__FUNCTION__,tmp1,tmp,logrec.CA,ret);
			goto err1;
		}
	}
    } else {   //未注册客户端注册
	char *p;
	char *keyD;
/* REGISTER label|CA|devfile|CHK_Code| */

ShowLog(2,"REGISTER %s",logrec.uid);
	if(!*logrec.uid) {
		sprintf(tmp1,"REGSTER is empty!");
		goto err1;
	}
//uid=devfile
	crc=0xFFFF&gencrc((unsigned char *)logrec.uid,strlen(logrec.uid));
//pwd=CHK_Code
	sscanf(logrec.pwd,"%04X",&ret);
	ret &= 0xFFFF;
	if(ret != crc) {
		sprintf(tmp1,"REGISTER:devfile CHK Code error! ");//, crc,ret);
		goto err1;
	}
	p=stptok(logrec.uid,logrec.devid,sizeof(logrec.devid),".");//logrec.devid=准备注册的DEVID
	crc=ssh_crc32((unsigned char *)logrec.devid,strlen(logrec.devid));
	keyD=getdw(crc,&dw);
	if(!keyD) {
		sprintf(tmp1,"注册失败,%s:没有这个设备!",
				logrec.devid);
		goto err1;
	}
	enigma1_init(egm,keyD);
	sprintf(tmp,"%s/%s.CA",cp,logrec.devid);
ShowLog(5,"REGISTER:%s",tmp);
	if(0!=(fd=fopen(tmp,"r"))) {
		fgets(tmp1,81,fd);
		fclose(fd);
		TRIM(tmp1);
		ret=a64_byte(tmp,tmp1);
		frenz_decode(egm,tmp,ret);
		tmp[ret]=0;
		if(strcmp(tmp,logrec.CA)) {
			sprintf(tmp1,"注册失败,%s 已被注册,使用中。",
					logrec.devid);
			goto err1;
		}
	} else if(errno != 2) {
		sprintf(tmp1,"CA 错误");
		goto err1;
	}
/*把设备特征码写入文件*/
	fd=fopen(tmp,"w");
	if(fd) {
	int len=strlen(logrec.CA);
		frenz_encode(egm,logrec.CA,len);
		byte_a64(tmp1,logrec.CA,len);
		fprintf(fd,"%s\n",tmp1);
		fclose(fd);
	}
	else ShowLog(1,"net_login:REGISTER open %s for write,err=%d,%s",
		tmp,errno,strerror(errno));

	freedw(&dw);
	sprintf(tmp,"%s/%s",cp,logrec.uid);
	fd=fopen(tmp,"r");
	if(!fd) {
		sprintf(tmp1,"REGISTER 打不开文件 %s err=%d,%s",
					logrec.CA,errno,strerror(errno));
		goto errret;
	}
	fgets(logrec.uid,sizeof(logrec.uid),fd);
	TRIM(logrec.uid);
	ShowLog(2,"REGISTER open %s",tmp);
	fclose(fd);
	cp=tmp1;
	cp+=sprintf(cp,"%s|%s|", logrec.devid,logrec.uid);
	cp+=sprintf(cp,"%s|",rsecstrfmt(tmp,now_sec(),YEAR_TO_SEC));
	NetHead->data=tmp1;
	NetHead->PKG_LEN=strlen(NetHead->data);
	NetHead->ERRNO1=0;
	NetHead->ERRNO2=0;
	NetHead->PKG_REC_NUM=0;
    	SendPack(conn,NetHead);
	return -1;
    } //未注册客户端注册完成

	freedw(&dw);
	up->poolno=get_scpool_no(NetHead->D_NODE);
	if(up->poolno<0) {
		sprintf(tmp1,"非法的D_NODE %d",NetHead->D_NODE);
		goto errret;
	}
	ret=get_s_connect(up->TCB_no,up->poolno,&gp->server,login_finish);
	if(ret==0) return login_finish(conn,NetHead);
	else if(ret==1) return -5;
	sprintf(tmp1,"错误的参数");
	goto errret;
}
Beispiel #11
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;
}
Beispiel #12
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;
}
Beispiel #13
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;
}
Beispiel #14
0
JSON_OBJECT  stu_to_json(JSON_OBJECT json,void *data,T_PkgType * typ,const char *choose,char *colidx)
{
int i,colnum,n;
T_PkgType *tp;
char buf[100];
const char *cp;

	if(!json) return json;
	colnum=set_offset(typ);
	tp=typ;
	if(!choose||!*choose) {		// 没有选择,全部加入
	    for(i=0;tp->type>=0;i++,tp++) {
			if(tp->bindtype & NOSELECT) continue;
			if(choose&&isnull((char *)data+tp->offset,tp->type)) continue;
			if(tp->type==CH_STRUCT) {
			JSON_OBJECT sub=json_object_new_object();
				stu_to_json(sub,(char *)data+tp->offset,
					(T_PkgType *)tp->format,0,0);
				json_object_object_add(json,plain_name(tp->name),sub);
				continue;
			}
			add_field_to_object(json,data,tp);
	    }
	    return json;
	}
	cp=choose;
	do {
	char *p;
		*buf=0;
		cp=stptok(skipblk((char *)cp),buf,sizeof(buf),",|");	//可以用的分隔符
		p=buf;
		TRIM(p);
		if(!*p) continue;
		if(isdigit(*p)) {	//数字选择,字段号范围:"1-3,6-11"
		int ret,beg,end;
			end=beg=-1;
			ret=sscanf(buf,"%d - %d",&beg,&end);
			if(!ret) continue;
			if(ret==1) end=beg;
			if(end<beg) end=beg;
			for(ret=beg;ret<=end;ret++) {
				if(typ[ret].type==CH_STRUCT) {
				JSON_OBJECT sub=json_object_new_object();
					stu_to_json(sub,(char *)data+typ[ret].offset,
						(T_PkgType *)typ[ret].format,0,0);
					json_object_object_add(json,plain_name(typ[ret].name),sub);
					continue;
				}
				add_field_to_object(json,data,&typ[ret]);
			}
		} else {		//字母,字段名 :"colname1,colname2,..."
			n=index_col(colidx,colnum,p,typ);
			if(n<0) continue;
			if(typ[n].type==CH_STRUCT) {
			JSON_OBJECT sub=json_object_new_object();
				stu_to_json(sub,(char *)data+typ[n].offset,
					(T_PkgType *)typ[n].format,0,0);
				json_object_object_add(json,plain_name(typ[n].name),sub);
				continue;
			}
			add_field_to_object(json,data,typ+n);
		}
	} while(*cp++);
	return json;
}