=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/plugin/file2.c,v retrieving revision 1.5 retrieving revision 1.14 diff -u -p -r1.5 -r1.14 --- OpenXM/src/kan96xx/plugin/file2.c 2003/11/17 05:45:47 1.5 +++ OpenXM/src/kan96xx/plugin/file2.c 2005/10/31 07:50:20 1.14 @@ -1,14 +1,28 @@ -/*$OpenXM: OpenXM/src/kan96xx/plugin/file2.c,v 1.4 2001/05/04 01:06:30 takayama Exp $ */ +/*$OpenXM: OpenXM/src/kan96xx/plugin/file2.c,v 1.13 2005/07/03 11:08:54 ohara Exp $ */ #include +#include #include #include #include +#include +#include #include "file2.h" +/* If you use file2 standalone to output string, + make the following dummy definition; +int KsocketSelect0(int a,int b) { return(0); } +int oxSocketSelect0(int a,int b) { return(0); } +or define FORSTRING +*/ +#ifdef FORSTRING +#define KsocketSelect0(a,b) 0 +#define oxSocketSelect0(a,b) 0 +#endif + #ifdef KXX -#define GC_malloc(n) malloc(n) +#define sGC_malloc(n) malloc(n) #else -void *GC_malloc(int size); +void *sGC_malloc(int size); #endif int WatchStream = 0; /* Note: 1997, 12/6 cf. SS475/kxx/openxxx.tex, SS475/memo1.txt @@ -19,6 +33,7 @@ int WatchStream = 0; static int debug1 = 0; static int checkfp2(FILE2 *fp2,char *s); +static int fp2fputcString(int c,FILE2 *fp2); static int checkfp2(FILE2 *fp2,char *s) { if (fp2 == NULL) { @@ -37,11 +52,12 @@ FILE2 *fp2open(int fd) { if (debug1) { printf("fp2open is called. \n"); } - fp2 = (FILE2 *) GC_malloc(sizeof(FILE2)); - if (fd < 0) { + fp2 = (FILE2 *) sGC_malloc(sizeof(FILE2)); + if (fd < -1) { fprintf(stderr,"fp2open Invalid file descriptor %d\n",fd); return(NULL); } + /* fd == -1 ==> store in string. */ if (fp2 == NULL) { fprintf(stderr,"fp2open. No memory.\n"); return(NULL); @@ -53,14 +69,26 @@ FILE2 *fp2open(int fd) { fp2->readsize = 0; fp2->writepos = 0; fp2->limit = FILE2BSIZE; + fp2->readBuf = (char *) sGC_malloc(FILE2BSIZE); + fp2->writeBuf = (char *) sGC_malloc(FILE2BSIZE); + if ((fp2->readBuf == NULL) || (fp2->writeBuf == NULL)) { + fprintf(stderr,"fp2open. No more memory.\n"); + return(NULL); + } fp2->watch = 0; fp2->watchFile = NULL; fp2->mathcapList = NULL; fp2->log_incomming = NULL; fp2->log_outgoing = NULL; + fp2->popened = 0; + fp2->pfp = NULL; return(fp2); } +void fp2setfp(FILE2 *fp2,FILE *fp,int popened) { + fp2->pfp = fp; + fp2->popened = popened; +} int fp2fflush(FILE2 *fp2) { int r; @@ -70,11 +98,19 @@ int fp2fflush(FILE2 *fp2) { printf("--------------------------\n"); } if (checkfp2(fp2,"fp2fflush ") == -1) return(-1); + if (fp2->fd == -1) return(0); if (fp2->writepos > 0) { + signal(SIGPIPE,SIG_IGN); r = write(fp2->fd,fp2->writeBuf,fp2->writepos); + signal(SIGPIPE,SIG_DFL); fp2->writepos = 0; if (r <= 0) { fprintf(stderr,"fp2fflush(): write failed on %d.\n",fp2->fd); + if (errno == EPIPE) { + fprintf(stderr,"Your peer is closed --- SIGPIPE. Closing this fp2.\n"); + fp2fclose(fp2); + return r; + } } return(r); }else{ @@ -85,12 +121,18 @@ int fp2fflush(FILE2 *fp2) { int fp2fclose(FILE2 *fp2) { int r; if (checkfp2(fp2," fp2fclose ") == -1) return(-1); + if (fp2->fd == -1) return(0); r = fp2fflush(fp2); if (r < 0) { fprintf(stderr,"fp2fclose: flush error.\n"); return(-1); } - return(close(fp2->fd)); + if (fp2->pfp != NULL) { + if (fp2->popened) { + return pclose(fp2->pfp); + } else return fclose(fp2->pfp); + } + else return(close(fp2->fd)); } int fp2fputc(int c,FILE2 *fp2) { @@ -102,6 +144,7 @@ int fp2fputc(int c,FILE2 *fp2) { if (fp2->watch || WatchStream) { if (fp2->watch) fp = fp2->watchFile; else fp = stderr; + fprintf(stderr,"put to <%x> ",fp2->fd); /* output the channel for debug */ if (c >= ' ' && c <='z') { fprintf(fp," %2x(%c)-> ",c& 0xff,c); }else{ @@ -113,6 +156,7 @@ int fp2fputc(int c,FILE2 *fp2) { if (checkfp2(fp2," fp2fputc ") == -1) return(-1); (fp2->writeBuf)[fp2->writepos] = c; (fp2->writepos)++; + if (fp2->fd == -1) return(fp2fputcString(c,fp2)); if (fp2->writepos < fp2->limit) { return(c); }else{ @@ -132,6 +176,7 @@ int fp2fgetc(FILE2 *fp2) { if (fp2->watch || WatchStream) { if (fp2->watch) fp = fp2->watchFile; else fp = stderr; + fprintf(fp,"get from <%x> ",fp2->fd); /* output the channel for debug*/ if (c >= ' ' && c <= 'z') { fprintf(fp," %2x(%c) ",c,c); }else{ @@ -142,6 +187,7 @@ int fp2fgetc(FILE2 *fp2) { if (fp2->log_incomming != NULL) fputc(c,fp2->log_incomming); return(c); }else{ + if (fp2->fd == -1) return(-1); fp2->readpos = 0; fp2 ->readsize = read(fp2->fd, fp2->readBuf, fp2->limit); @@ -152,7 +198,6 @@ int fp2fgetc(FILE2 *fp2) { fprintf(fp," <%2x ",c); fflush(NULL); } - if (fp2->log_incomming != NULL) fputc(c,fp2->log_incomming); return(-1); } else { @@ -162,6 +207,10 @@ int fp2fgetc(FILE2 *fp2) { } int fp2select(FILE2 *fp2, int t) { + if (fp2->fd == -1) { + if (fp2->readpos < fp2->readsize) return(1); + else return(0); + } if (fp2->readpos < fp2->readsize) return(1); else { #ifdef KXX @@ -196,7 +245,6 @@ int fp2dumpBuffer(FILE2 *fp2) { int fp2clearReadBuf(FILE2 *fp2) { fd_set readfds; struct timeval timeout; - extern int errno; int fd; #define TMP00SIZE 2000 char tmp00[TMP00SIZE]; @@ -205,6 +253,7 @@ int fp2clearReadBuf(FILE2 *fp2) { if (checkfp2(fp2," fp2clearReadBuf ") == -1) { return(-1); } + if (fp2->fd == -1) return(0); fp2->readsize=0; fp2->readpos = 0; /* Clear the buffer. */ @@ -236,7 +285,7 @@ int fp2clearReadBuf(FILE2 *fp2) { int fp2write(FILE2 *os, char *data, int size) { int i,r; for (i=0; ilog_incomming = fp->log_outgoing = NULL; return 0; } + +static int fp2fputcString(int c,FILE2 *fp2) { + unsigned char *newwrite,*newread; + int newsize; + int i; + (fp2->readBuf)[fp2->readsize] = c; + (fp2->readsize)++; + if ((fp2->writepos < fp2->limit) && (fp2->readsize < fp2->limit)) return(c); + if ((fp2->limit)*2 >=0x3000000) { + fprintf(stderr,"Too big output string.\n"); + return(-1); + } + newsize = (fp2->limit)*2; + newwrite = (char *)sGC_malloc(newsize); + newread = (char *)sGC_malloc(newsize); + if ((newwrite == NULL) || (newread == NULL)) { + fprintf(stderr,"fp2fputcString: No more memory.\n"); + return(-1); + } + for (i=0; iwritepos; i++) { + newwrite[i] = fp2->writeBuf[i]; + } + for (i=0; ireadsize; i++) { + newread[i] = fp2->readBuf[i]; + } + fp2->writeBuf = newwrite; + fp2->readBuf = newread; + fp2->limit = newsize; + return(c); +} + +char *fp2fcloseInString(FILE2 *fp2, int *sizep) +{ + if (fp2->fd == -1) { + fp2fputc(0,fp2); + *sizep = fp2->writepos-1; + return(fp2->writeBuf); + }else{ + fprintf(stderr,"fp2fcloseInString is called for a file stream that is not associated to a string.\n"); + } +} + +int fp2fputs(char *s,FILE2 *fp) { + int i,n; + n = strlen(s); + for (i=0; i