64 #if defined ( PLD_tk ) || defined ( ENABLE_tkX )
90 #if defined ( __sgi ) && !defined ( SVR3 )
91 #include <sys/select.h>
93 #ifdef PL_HAVE_UNISTD_H
102 #include <sys/stat.h>
103 #include <sys/types.h>
106 #if !defined ( __WIN32__ )
111 #if defined ( __WIN32__ )
113 #include <winerror.h>
116 #if defined ( EWOULDBLOCK )
117 #define PLPLOT_EWOULDBLOCK EWOULDBLOCK
118 #elif defined ( WSAEWOULDBLOCK )
119 #define PLPLOT_EWOULDBLOCK WSAEWOULDBLOCK
121 #error broken system where neither EWOULDBLOCK nor WSAEWOULDBLOCK macros are #defined
125 #if defined ( __WIN32__ )
126 #define read( a, b, c ) 0
128 #define write( a, b, c ) 0
134 #define MIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )
141 #define PACKET_MAGIC 0x6feeddcc
150 typedef struct PartialRead
155 struct PartialRead *next;
158 #define MAX_OPEN_FILES 128
160 static PartialRead *partial[MAX_OPEN_FILES];
162 static void pl_FreeReadBuffer(
int fd );
163 static void pl_Unread(
int fd,
char *
buffer,
int numBytes,
int copy );
164 static int pl_Read(
int fd,
char *
buffer,
int numReq );
187 pl_FreeReadBuffer(
int fd )
189 PartialRead *readList;
191 while ( partial[fd] != NULL )
193 readList = partial[fd];
194 partial[fd] = readList->next;
195 free( readList->buffer );
218 pl_Unread(
int fd,
char *
buffer,
int numBytes,
int copy )
227 new = (PartialRead *) malloc(
sizeof ( PartialRead ) );
230 new->buffer = (
char *) malloc( (
size_t) numBytes );
231 memcpy( new->buffer, buffer, (
size_t) numBytes );
237 new->bufSize = numBytes;
239 new->next = partial[fd];
262 pl_Read(
int fd,
char *buffer,
int numReq )
267 PartialRead *readList;
272 readList = partial[fd];
278 if ( readList == NULL )
280 numRead = (int) read( fd, buffer, (
size_t) numReq );
284 fprintf( stderr,
"received %d bytes starting with:", numRead );
285 for ( j = 0; j <
MIN( 8, numRead ); j++ )
286 fprintf( stderr,
" %x", 0x000000FF & (
unsigned long) buffer[j] );
287 fprintf( stderr,
"\n" );
299 while ( ( readList != NULL ) && ( numRead < numReq ) )
301 numToCopy = readList->bufSize - readList->offset;
302 if ( numToCopy + numRead > numReq )
304 numToCopy = numReq - numRead;
306 memcpy( buffer + numRead, readList->buffer + readList->offset, (
size_t) numToCopy );
312 readList = readList->next;
313 tmp->offset += numToCopy;
314 if ( tmp->offset == tmp->bufSize )
318 partial[fd] = readList;
320 numRead += numToCopy;
326 if ( ( numRead < numReq ) )
328 numToCopy = numReq - numRead;
329 numRead += (int) read( fd, buffer + numRead, (
size_t) numToCopy );
343 #include <arpa/inet.h>
345 #include <netinet/in.h>
346 #include <sys/socket.h>
358 get_inet(
char ** listptr,
int length )
362 while ( ( ptr = (
struct in_addr *) *listptr++ ) == NULL )
365 return inet_ntoa( *ptr );
371 register struct hostent *hostptr;
374 if ( gethostname( hostname, 100 ) )
376 Tcl_AppendResult( interp,
"Error -- cannot get host name",
381 if ( ( hostptr = gethostbyname( hostname ) ) == NULL )
383 Tcl_AppendResult( interp,
"Error -- cannot get host info for node ",
384 hostname, (
char *) NULL );
388 Tcl_SetResult( interp,
389 get_inet( hostptr->h_addr_list, hostptr->h_length ),
424 unsigned int packetLen,
header[2];
426 unsigned char hbuf[8];
435 numRead = pl_Read( iodev->
fd, (
char *) hbuf, headerSize );
440 fprintf( stderr,
"Incorrect header read, numRead = %d\n", numRead );
448 if ( numRead < headerSize )
451 fprintf( stderr,
"Incomplete header read, numRead = %d\n", numRead );
453 pl_Unread( iodev->
fd, (
char *) hbuf, numRead, 1 );
454 Tcl_ResetResult( interp );
468 header[0] |= (
unsigned int) ( hbuf[j++] << 24 );
469 header[0] |= (
unsigned int) ( hbuf[j++] << 16 );
470 header[0] |= (
unsigned int) ( hbuf[j++] << 8 );
471 header[0] |= hbuf[j++];
474 header[1] |= (
unsigned int) ( hbuf[j++] << 24 );
475 header[1] |= (
unsigned int) ( hbuf[j++] << 16 );
476 header[1] |= (
unsigned int) ( hbuf[j++] << 8 );
477 header[1] |= hbuf[j++];
486 if ( header[0] != PACKET_MAGIC )
488 fprintf( stderr,
"Badly formatted packet, numRead = %d\n", numRead );
489 Tcl_AppendResult( interp,
"Error reading from ", iodev->
typeName,
490 ": badly formatted packet", (
char *) NULL );
493 packetLen = header[1] - (
unsigned int) headerSize;
499 if ( header[1] > (
unsigned) pdfs->
bufmax )
501 free( (
void *) pdfs->
buffer );
502 pdfs->
bufmax = header[1] + 32;
503 pdfs->
buffer = (
unsigned char *) malloc( pdfs->
bufmax );
514 if ( iodev->
type == 0 )
516 numRead = pl_Read( iodev->
fd, (
char *) pdfs->
buffer, (
int) packetLen );
521 if ( Tdp_FDIsReady( iodev->
fd ) & TCL_FILE_READABLE )
523 numRead = pl_Read( iodev->
fd, (
char *) pdfs->
buffer, packetLen );
528 fprintf( stderr,
"Packet not ready, putting back header\n" );
530 pl_Unread( iodev->
fd, (
char *) hbuf, headerSize, 1 );
531 Tcl_ResetResult( interp );
542 if ( (
unsigned) numRead != packetLen )
545 fprintf( stderr,
"Incomplete packet read, numRead = %d\n", numRead );
547 pl_Unread( iodev->
fd, (
char *) pdfs->
buffer, numRead, 1 );
548 pl_Unread( iodev->
fd, (
char *) hbuf, headerSize, 1 );
552 pdfs->
bp = (size_t) numRead;
554 fprintf( stderr,
"received %d byte packet starting with:", numRead );
555 for ( j = 0; j < 4; j++ )
557 fprintf( stderr,
" %x", 0x000000FF & (
unsigned long) pdfs->
buffer[j] );
559 fprintf( stderr,
"\n" );
575 if ( errno == PLPLOT_EWOULDBLOCK || errno == EAGAIN )
577 Tcl_ResetResult( interp );
584 errMsg = Tcl_PosixError( interp );
594 if ( iodev->
type == 0 )
597 #if !defined ( MAC_TCL ) && !defined ( __WIN32__ ) && !defined ( __CYGWIN__ )
598 Tk_DeleteFileHandler( iodev->
fd );
602 pl_FreeReadBuffer( iodev->
fd );
604 Tcl_ResetResult( interp );
611 Tcl_AppendResult( interp,
"pl_PacketReceive -- error reading from ",
612 iodev->
typeName,
": ", errMsg, (
char *) NULL );
640 unsigned char hbuf[8];
641 unsigned int packetLen, header[2];
652 packetLen = (
unsigned int) pdfs->
bp + 8;
654 header[0] = PACKET_MAGIC;
655 header[1] = packetLen;
664 hbuf[j++] = (
unsigned char) ( ( header[0] & (
unsigned long) 0xFF000000 ) >> 24 );
665 hbuf[j++] = (
unsigned char) ( ( header[0] & (
unsigned long) 0x00FF0000 ) >> 16 );
666 hbuf[j++] = (
unsigned char) ( ( header[0] & (
unsigned long) 0x0000FF00 ) >> 8 );
667 hbuf[j++] = (
unsigned char) ( header[0] & (
unsigned long) 0x000000FF );
669 hbuf[j++] = (
unsigned char) ( ( header[1] & (
unsigned long) 0xFF000000 ) >> 24 );
670 hbuf[j++] = (
unsigned char) ( ( header[1] & (
unsigned long) 0x00FF0000 ) >> 16 );
671 hbuf[j++] = (
unsigned char) ( ( header[1] & (
unsigned long) 0x0000FF00 ) >> 8 );
672 hbuf[j++] = (
unsigned char) ( header[1] & (
unsigned long) 0x000000FF );
681 buffer = (
char *) malloc( len );
683 memcpy( buffer, (
char *) hbuf, 8 );
684 memcpy( buffer + 8, (
char *) pdfs->
buffer, pdfs->
bp );
687 fprintf( stderr,
"sending %z byte packet starting with:", len );
688 for ( j = 0; j < 12; j++ )
690 fprintf( stderr,
" %x", 0x000000FF & (
unsigned long) buffer[j] );
692 fprintf( stderr,
"\n" );
694 numSent = (int) write( iodev->
fd, buffer, len );
698 if ( (
unsigned) numSent != packetLen )
700 if ( ( errno == 0 ) || ( errno == PLPLOT_EWOULDBLOCK || errno == EAGAIN ) )
705 Tcl_ResetResult( interp );
706 sprintf( tmp,
"%d", numSent - 8 );
707 Tcl_SetResult( interp, tmp, TCL_VOLATILE );
710 else if ( errno == EPIPE )
716 if ( iodev->
type == 0 )
721 Tcl_SetResult( interp, tmp, TCL_VOLATILE );
726 Tcl_AppendResult( interp,
"pl_PacketSend -- error writing to ",
728 Tcl_PosixError( interp ), (
char *) NULL );
737 sprintf( tmp,
"%d", numSent - 8 );
738 Tcl_SetResult( interp, tmp, TCL_VOLATILE );
749 #endif // defined(PLD_tk) || defined (ENABLE_tkX)
PLDLLIMPEXP_TCLTK int pl_PacketReceive(Tcl_Interp *interp, PLiodev *iodev, PDFstrm *pdfs)
int plHost_ID(ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)
static Tcl_Interp * interp
PLDLLIMPEXP_TCLTK int pl_PacketSend(Tcl_Interp *interp, PLiodev *iodev, PDFstrm *pdfs)