| version 1.8, 2003/11/24 08:16:13 | version 1.12, 2005/02/28 12:53:44 | 
|  |  | 
| /*$OpenXM: OpenXM/src/kan96xx/plugin/file2.c,v 1.7 2003/11/23 13:16:30 takayama Exp $ */ | /*$OpenXM: OpenXM/src/kan96xx/plugin/file2.c,v 1.11 2004/12/16 08:42:14 takayama Exp $ */ | 
| #include <stdio.h> | #include <stdio.h> | 
| #include <sys/time.h> | #include <sys/time.h> | 
| #include <sys/types.h> | #include <sys/types.h> | 
| #include <unistd.h> | #include <unistd.h> | 
|  | #include <signal.h> | 
|  | #include <errno.h> | 
| #include "file2.h" | #include "file2.h" | 
|  |  | 
| /* If you use file2 standalone to output string, | /* If you use file2 standalone to output string, | 
| 
| Line 17  or define FORSTRING |  | 
| Line 19  or define FORSTRING |  | 
| #endif | #endif | 
|  |  | 
| #ifdef KXX | #ifdef KXX | 
| #define GC_malloc(n) malloc(n) | #define sGC_malloc(n) malloc(n) | 
| #else | #else | 
| void *GC_malloc(int size); | void *sGC_malloc(int size); | 
| #endif | #endif | 
| int WatchStream = 0; | int WatchStream = 0; | 
| /*  Note:  1997, 12/6   cf. SS475/kxx/openxxx.tex, SS475/memo1.txt | /*  Note:  1997, 12/6   cf. SS475/kxx/openxxx.tex, SS475/memo1.txt | 
| 
| Line 49  FILE2 *fp2open(int fd) { |  | 
| Line 51  FILE2 *fp2open(int fd) { |  | 
| if (debug1) { | if (debug1) { | 
| printf("fp2open is called. \n"); | printf("fp2open is called. \n"); | 
| } | } | 
| fp2 = (FILE2 *) GC_malloc(sizeof(FILE2)); | fp2 = (FILE2 *) sGC_malloc(sizeof(FILE2)); | 
| if (fd < -1) { | if (fd < -1) { | 
| fprintf(stderr,"fp2open  Invalid file descriptor %d\n",fd); | fprintf(stderr,"fp2open  Invalid file descriptor %d\n",fd); | 
| return(NULL); | return(NULL); | 
| 
| Line 66  FILE2 *fp2open(int fd) { |  | 
| Line 68  FILE2 *fp2open(int fd) { |  | 
| fp2->readsize = 0; | fp2->readsize = 0; | 
| fp2->writepos = 0; | fp2->writepos = 0; | 
| fp2->limit = FILE2BSIZE; | fp2->limit = FILE2BSIZE; | 
| fp2->readBuf = (char *) GC_malloc(FILE2BSIZE); | fp2->readBuf = (char *) sGC_malloc(FILE2BSIZE); | 
| fp2->writeBuf = (char *) GC_malloc(FILE2BSIZE); | fp2->writeBuf = (char *) sGC_malloc(FILE2BSIZE); | 
| if ((fp2->readBuf == NULL) || (fp2->writeBuf == NULL)) { | if ((fp2->readBuf == NULL) || (fp2->writeBuf == NULL)) { | 
| fprintf(stderr,"fp2open. No more memory.\n"); | fprintf(stderr,"fp2open. No more memory.\n"); | 
| return(NULL); | return(NULL); | 
| 
| Line 77  FILE2 *fp2open(int fd) { |  | 
| Line 79  FILE2 *fp2open(int fd) { |  | 
| fp2->mathcapList = NULL; | fp2->mathcapList = NULL; | 
| fp2->log_incomming = NULL; | fp2->log_incomming = NULL; | 
| fp2->log_outgoing = NULL; | fp2->log_outgoing = NULL; | 
|  | fp2->popened = 0; | 
|  | fp2->pfp = NULL; | 
| return(fp2); | return(fp2); | 
| } | } | 
|  |  | 
|  | void fp2setfp(FILE2 *fp2,FILE *fp,int popened) { | 
|  | fp2->pfp = fp; | 
|  | fp2->popened = popened; | 
|  | } | 
|  |  | 
| int fp2fflush(FILE2 *fp2) { | int fp2fflush(FILE2 *fp2) { | 
| int r; | int r; | 
| 
| Line 91  int fp2fflush(FILE2 *fp2) { |  | 
| Line 99  int fp2fflush(FILE2 *fp2) { |  | 
| if (checkfp2(fp2,"fp2fflush ") == -1) return(-1); | if (checkfp2(fp2,"fp2fflush ") == -1) return(-1); | 
| if (fp2->fd == -1) return(0); | if (fp2->fd == -1) return(0); | 
| if (fp2->writepos > 0) { | if (fp2->writepos > 0) { | 
|  | signal(SIGPIPE,SIG_IGN); | 
| r = write(fp2->fd,fp2->writeBuf,fp2->writepos); | r = write(fp2->fd,fp2->writeBuf,fp2->writepos); | 
|  | signal(SIGPIPE,SIG_DFL); | 
| fp2->writepos = 0; | fp2->writepos = 0; | 
| if (r <= 0) { | if (r <= 0) { | 
| fprintf(stderr,"fp2fflush(): write failed on %d.\n",fp2->fd); | 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); | return(r); | 
| }else{ | }else{ | 
| 
| Line 111  int fp2fclose(FILE2 *fp2) { |  | 
| Line 126  int fp2fclose(FILE2 *fp2) { |  | 
| fprintf(stderr,"fp2fclose: flush error.\n"); | fprintf(stderr,"fp2fclose: flush error.\n"); | 
| return(-1); | 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) { | int fp2fputc(int c,FILE2 *fp2) { | 
| 
| Line 224  int fp2dumpBuffer(FILE2 *fp2) { |  | 
| Line 244  int fp2dumpBuffer(FILE2 *fp2) { |  | 
| int fp2clearReadBuf(FILE2 *fp2) { | int fp2clearReadBuf(FILE2 *fp2) { | 
| fd_set readfds; | fd_set readfds; | 
| struct timeval timeout; | struct timeval timeout; | 
| extern int errno; |  | 
| int fd; | int fd; | 
| #define TMP00SIZE  2000 | #define TMP00SIZE  2000 | 
| char tmp00[TMP00SIZE]; | char tmp00[TMP00SIZE]; | 
| 
| Line 329  static int fp2fputcString(int c,FILE2 *fp2) { |  | 
| Line 348  static int fp2fputcString(int c,FILE2 *fp2) { |  | 
| return(-1); | return(-1); | 
| } | } | 
| newsize = (fp2->limit)*2; | newsize = (fp2->limit)*2; | 
| newwrite = (char *)GC_malloc(newsize); | newwrite = (char *)sGC_malloc(newsize); | 
| newread = (char *)GC_malloc(newsize); | newread = (char *)sGC_malloc(newsize); | 
| if ((newwrite == NULL) || (newread == NULL)) { | if ((newwrite == NULL) || (newread == NULL)) { | 
| fprintf(stderr,"fp2fputcString: No more memory.\n"); | fprintf(stderr,"fp2fputcString: No more memory.\n"); | 
| return(-1); | return(-1); | 
| 
| Line 384  int fp2fputs(char *s,FILE2 *fp) { |  | 
| Line 403  int fp2fputs(char *s,FILE2 *fp) { |  | 
| .... | .... | 
| } | } | 
| */ | */ | 
|  |  |