#include #include #include #include #include #include #include #include FILE *MyErrorOut = stdout; #include "ox_kan.h" #define READBUFSIZE 5000 int UseOXPacketSerial = 0; int readOneByte(int fd) /* blocking */ { static char data[1]; int size; int ans; int watch = 1; if (fd < 0) { fprintf(MyErrorOut,"readOneByte fd < 0 ??? .\n"); return(-1); } if (oxSocketSelect0(fd,-1)) { /* block */ size = read(fd,data,1); if (size == 0) { fprintf(MyErrorOut,"oxSocketSelect0() returns 1, but there is no data. You peer may be killed.\n"); return(-1); } return(data[0]); }else{ fprintf(MyErrorOut,"readOneByte: select error in block mode. Retrying.\n"); return(-1); } } int readOneByte_org(int fd) /* blocking */ { static char data[READBUFSIZE]; static int thisFd = -1; static int from = 0; static int to = 0; int size; int ans; int watch = 1; if ((thisFd == -1) && (fd >= 0)) {thisFd = fd;} if (fd < 0) { fprintf(MyErrorOut,"readOneByte fd < 0 ??? .\n"); return(-1); } if (fd != thisFd) { fprintf(MyErrorOut,"readOneByte can be used only for one fd.\n"); fflush(NULL); return(-1); } if (to > from) { ans = data[from]; from++; if (watch) { printf("%2x ",ans); fflush(stdout); } return(ans); } while (1) { if (oxSocketSelect0(fd,-1)) { /* block */ size = read(fd,data,READBUFSIZE-1); if (size == 0) { fprintf(MyErrorOut,"oxSocketSelect0() returns 1, but there is no data. You peer may be killed.\n"); return(-1); } from = 0; to = size; return(readOneByte(fd)); }else{ fprintf(MyErrorOut,"readOneByte: select error in block mode. Retrying.\n"); } } } int oxfdGetInt32(int fd) { char d[4]; int i; for (i=0; i<4; i++) { d[i] = readOneByte(fd); } return(ntohl(* ( (int *)d))); } int oxGetInt32(ox_stream ostream) { char d[4]; int i; for (i=0; i<4; i++) { d[i] = fp2fgetc(ostream); } return(ntohl(* ( (int *)d))); } int oxGetCMOInt32(ox_stream ostream) { int id; id = oxGetInt32(ostream); if (id != CMO_INT32) { fprintf(MyErrorOut,"It is not CMO_INT32.\n"); return(0); } return(oxGetInt32(ostream)); } char *oxGetCMOString(ox_stream ostream) { int id; int size; char *r; int i; id = oxGetInt32(ostream); if (id != CMO_STRING) { fprintf(MyErrorOut,"It is not CMO_STRING.\n"); return(NULL); } size = oxGetInt32(ostream); if (size <0) { return(NULL); }else{ r = (char *)mymalloc(size+1); for (i=0; ihumanio) { fd = (fdcontrolfd?clients[i]->controlfd:fd); FD_SET(clients[i]->controlfd,&readfds); if (oxSocketSelect0(clients[i]->controlfd,0)) { ddd = controlready[i] = 1; }else{ controlready[i] = 0; } if (clients[i]->datafp2 != NULL) { fd = (fddatafp2->fd?clients[i]->datafp2->fd:fd); FD_SET(clients[i]->datafp2->fd,&readfds); if (fp2select(clients[i]->datafp2,0)) { ddd = dataready[i] = 1; }else{ dataready[i] = 0; } }else{ dataready[i] = 0; } } } if (t > 0 ) { if (ddd) return(1); if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,&timeout)<0) { fprintf(MyErrorOut,"error"); return(-1); } return(oxclientMultiSelect(clients, dataready, controlready,size,0)); }else if (t == 0) { return(ddd); }else { /** printf("(2)"); fflush(NULL); */ if (select(fd+1,&readfds,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL)<0) { fprintf(MyErrorOut,"error"); return(-1); } /** printf("(3)"); fflush(NULL); */ return(oxclientMultiSelect(clients, dataready, controlready,size,0)); } } int oxGetControl(oxclientp client) /* synchronized. */ { int ans; ox_stream os; switch (client->cstate) { case 1: ans = oxGetResultOfControlInt32(client->controlfd); client->cstate = 0; return(ans); default: fprintf(MyErrorOut,"oxGet: unknown cstate.\n"); client->cstate = -1; return(-1); } return(-1); } int oxInitClient(oxclientp client) { client->datafp2 = NULL; client->dataport = 0; client->controlport = 0; client->controlfd = 0; client->humanio = 0; client->dstate = 0; client->cstate = 0; client->id = -1; return(0); } int oxIsThereErrorClient(oxclientp client) { if (client == NULL) return(1); if (client->dstate == -1) return(1); if (client->cstate == -1) return(1); return(0); } oxclientp oxCreateClient(char *sname,int portStream,int portControl) { static int clnum = 0; int v = 0; int fdControl = -1; int fdStream = -1; oxclientp client; v = 1; if (portControl != -1) { fdControl = socketConnect(sname,portControl); if (v) fprintf(stderr,"\nControl port %d : Connected.\n",portControl); } if (portStream != -1) { sleep(1); /* wait */ fdStream = socketConnect(sname,portStream); if (v) fprintf(stderr,"\nStream port %d : Connected.\n",portStream); } if (fdStream == -1 || fdControl == -1) { fprintf(stderr,"\nOpen error in oxCreateClient.\n"); return(NULL); } client = (oxclientp) mymalloc(sizeof(oxclient)); oxInitClient(client); client->datafp2 = fp2open(fdStream); if (client->datafp2 == NULL) { fprintf(stderr,"oxCreateClient(): fp2open(fd) failed.\n"); return(NULL); } client->dataport = portStream; client->controlport = portControl; client->controlfd = fdControl; client->id = clnum; clnum++; client->type = CLIENT_SOCKET; /* socket */ return(client); } oxclientp oxCreateClientFile(char *fname,char *mode,char *controlName,char *cmode) { static int clnum = 0x8000; int v = 0; int fdControl = -1; int fdStream = -1; oxclientp client; v = 1; if (strcmp(mode,"w") == 0) { fdStream = creat(fname,S_IWRITE|S_IREAD|S_IRGRP|S_IROTH); if (fdStream < 0) { fprintf(stderr,"\nCreat failed for %s\n",fname); return(NULL); } }else if (strcmp(mode,"r")==0) { fdStream = open(fname,O_RDONLY); if (fdStream < 0) { fprintf(stderr,"\nOpen failed for %s\n",fname); return(NULL); } }else { fprintf(stderr,"\nThe mode %s is not supported.\n",mode); return(NULL); } if (strcmp(cmode,"w") == 0) { fdControl = creat(controlName,S_IWRITE|S_IREAD|S_IRGRP|S_IROTH); if (fdControl < 0) { fprintf(stderr,"\nCreat failed for %s\n",controlName); return(NULL); } }else if (strcmp(cmode,"r")==0) { fdControl = open(controlName,O_RDONLY); if (fdControl < 0) { fprintf(stderr,"\nOpen failed for %s\n",controlName); return(NULL); } }else if (strcmp(cmode,"rw")==0) { fdControl = open(controlName,O_RDWR); if (fdControl < 0) { fprintf(stderr,"\nOpen failed for %s\n",controlName); return(NULL); } }else { fprintf(stderr,"\nThe mode %s is not supported.\n",cmode); return(NULL); } client = (oxclientp) mymalloc(sizeof(oxclient)); oxInitClient(client); client->datafp2 = fp2open(fdStream); if (client->datafp2 == NULL) { fprintf(stderr,"oxCreateClientFile(): fp2open(fd) failed.\n"); return(NULL); } client->dataport = 0; client->controlport = 0; client->controlfd = fdControl; client->id = clnum; clnum++; client->type = CLIENT_FILE; return(client); } void oxSendOXheader_generic(int type,int fd,ox_stream ox, int k,int serial) { static int ss = 0; extern int UseOXPacketSerial; if (serial >= 0) ss = serial; else ss++; if (ss < 0) ss=0; if (type == 0) { /* fd */ oxfdSendInt32(fd,k); if (UseOXPacketSerial) oxfdSendInt32(fd,ss); }else { oxSendInt32(ox,k); if (UseOXPacketSerial) oxSendInt32(ox,ss); } } void oxSendOXheader(ox_stream ostream,int k,int serial) { oxSendOXheader_generic(1,-1,ostream,k,serial); } void oxfdSendOXheader(int fd,int k,int serial) { oxSendOXheader_generic(0,fd,(ox_stream) NULL,k,serial); }