conn.c

来自「tuxede下面的编程」· C语言 代码 · 共 234 行

C
234
字号

#include <stdio.h>
#include <ctype.h>
#include <atmi.h>	/* TUXEDO Header File */
#include <userlog.h>	/* TUXEDO Header File */
#include <sys/types.h>
#include <sys/timeb.h>
#include "fml32.h"
#include "myfml.h"


static long time=0;
struct timeb t_start, t_now;
long lasti=0;


/* tpsvrinit is executed when a server is booted, before it begins
   processing requests.  It is not necessary to have this function.
   Also available is tpsvrdone (not used in this example), which is
   called at server shutdown time.
*/

#if defined(__STDC__) || defined(__cplusplus)
tpsvrinit(int argc, char *argv[])
#else
tpsvrinit(argc, argv)
int argc;
char **argv;
#endif
{
	
	return(0);
}

/* This function performs the actual service requested by the client.
   Its argument is a structure containing among other things a pointer
   to the data buffer, and the length of the data buffer.
*/

#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
CONN(TPSVCINFO *rqst)
#else
CONN(rqst)
TPSVCINFO *rqst;
#endif
{
	long count=0;
	FILE *fp;
	FILE *rp;
	long i=0;
	FBFR32 *rcvbuf;
	char *sendbuf;
	char fname[100]="";
	char tmp[100]="";
	FLDLEN32 len=0;
	long bnum,bid,bsize=1024;
	char *fdata;
	long revent;
	long finish=0;
	char id[10];
	
	
	
	
	userlog("SSSSSSSSSSSSSSSSSSSSSSS\n");
	sendbuf = (char *)tpalloc("STRING",NULL , 1000);
	if(sendbuf == NULL)
	{
		userlog("tpalloc(sendbuf) failure\n");	
		tpreturn(TPFAIL,0,0,0L,0);
	}
	
	rcvbuf = (FBFR32 *)tpalloc("FML32",NULL , bsize+1000);//???
	if(rcvbuf == NULL)
	{
		userlog("tpalloc(rcvbuf) failure\n");	
		tpreturn(TPFAIL,0,0,0L,0);
	}
	
	fdata=(char *)malloc(bsize);
	if(fdata == NULL)
	{
		userlog("malloc(fdata) failure");
        	tpreturn(TPFAIL,0,0,0,0);		
	}	
	
	
	for(;;)
	{
	if(tprecv(rqst->cd,&rcvbuf,&len,TPNOCHANGE,&revent)==-1)
	{
		if(tperrno==TPEEVENT&&revent==TPEV_SENDONLY)
		{
			userlog("state change from receive\n");
		}
		else
		{
			userlog("tprecv() failure:%s,event=%ld\n",tpstrerror(tperrno),revent);
			tpreturn(TPFAIL,0,0,0L,0);
		}
	}	
	len=sizeof(bid);
	if(Fget32(rcvbuf,BID,0,(char *)&bid,&len) == -1)
	{
		userlog("Fget32(BID) failure :%s",(char *)Fstrerror32(Ferror32));
		tpreturn(TPFAIL,0,0,0,0);
	}
	/*the first time*/
	if(bid == -1)
	{
		userlog("0\n");
		if((rp=fopen("record", "r+b"))==NULL)
		{
			userlog("fopen(record) failure\n");	
			tpreturn(TPFAIL,0,0,0L,0);
		}	
		len=fread(sendbuf, 1, 100, rp);//???
		
		userlog("recorded id=%s\n",sendbuf);
		if (tpsend(rqst->cd,sendbuf,0,TPRECVONLY,&revent)==-1)
		{
			userlog("tpsend(%d):%s",revent,tpstrerror(tperrno));
			fclose(rp);
			tpreturn(TPFAIL,0,0,0L,0);
		}
		userlog("1\n");
		continue;		
	}
	userlog("2\n");
	len=sizeof(fname);
	if(Fget32(rcvbuf,FNAME,0,fname,&len) == -1)
	{
		userlog("Fget32(FNAME) failure :%s",(char *)Fstrerror32(Ferror32));
		tpreturn(TPFAIL,0,0,0,0);
	}
	strcat(fname,".s");
	
	len=sizeof(bnum);
	if(Fget32(rcvbuf,BNUM,0,(char *)&bnum,&len) == -1)
	{
		userlog("Fget32(BNUM) failure :%s",(char *)Fstrerror32(Ferror32));
		tpreturn(TPFAIL,0,0,0,0);
	}
	
	if ((fp=fopen(fname, "rb"))==NULL)	
	{ 
		fp=fopen(fname, "wb");
	}
	else if(bid == 0 )	
	{
		fclose(fp);
		fp=fopen(fname, "wb");
	}
	else
	{
		fclose(fp);
		fp = fopen(fname, "r+b");
	}
	
	if(fp == NULL)
	{
		userlog("fopen() %s failure,errno=%ld,strerr=%s\n",fname,errno,strerror(errno));
		fclose(fp);
		fp=fopen(fname, "wb");
		//tpreturn(TPFAIL,0,0,0,0);	
	}
	
	userlog("3\n");
	len=bsize;
	if(Fget32(rcvbuf,FDATA,0,fdata,(FLDLEN32 *)&len) == -1)
	{
		userlog("Fget32(FDATA) failure :%s",(char *)Fstrerror32(Ferror32));
		tpreturn(TPFAIL,0,0,0,0);
	}
	
	i=bid * bsize;
	if(fseek(fp, i, 0)!=0)
	{
		userlog("fseek() failure\n");
		tpreturn(TPFAIL,0,0,0,0);		
	}
	i = fwrite(fdata,1,len,fp);
	if(i != len)
	{
		userlog("fwrite()fail\n");
		tpreturn(TPFAIL,0,0,0,0);	
	}
	fclose(fp);
	if(fseek(rp, 0, SEEK_SET)!=0)
	{
		userlog("fseek() failure\n");
		tpreturn(TPFAIL,0,0,0,0);		
	}
	sprintf(tmp,"%ld",bid);
	i = fwrite(tmp,1,strlen(tmp)+1,rp);
	if(i != strlen(tmp) + 1)
	{
		userlog("fwrite(record)fail\n");
		fclose(rp);
		tpreturn(TPFAIL,0,0,0,0);	
	}
	userlog("4\n");
	if(bid == bnum)
	{
		if (tpsend(rqst->cd,rcvbuf,0,0,&revent)==-1)
			userlog("tpsend(%d):%s",revent,tpstrerror(tperrno));
		else
			userlog("finished\n");
		break;
	}
	/* Return the transformed buffer to the requestor. */
}
	userlog("5\n");
	fclose(rp);
	//fclose(fp);
	tpfree(sendbuf);
	tpfree(rcvbuf);
	tpreturn(TPSUCCESS, 0, NULL, 0L, 0);
}

/*
void err()
{
	fclose(rp);
	fclose(fp);
	tpfree(rcvbuf);
	tpfree(sendbuf);
	tpreturn(TPFAIL,0,0,0L,0);
}
*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?