//连接 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; }
/* 对选择的列构建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; }
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); }
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; }
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; }
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); }
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; }
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; }
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; }
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; }
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; }
/* 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; }
/* 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; }
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; }