66 #if defined ( PLD_tk ) || defined ( ENABLE_tkX )
92 #if defined ( __sgi ) && !defined ( SVR3 )
93 #include <sys/select.h>
95 #ifdef PL_HAVE_UNISTD_H
104 #include <sys/stat.h>
105 #include <sys/types.h>
108 #if !defined ( __WIN32__ )
113 #if defined ( __WIN32__ )
115 #include <winerror.h>
118 #if defined ( EWOULDBLOCK )
119 #define PLPLOT_EWOULDBLOCK EWOULDBLOCK
120 #elif defined ( WSAEWOULDBLOCK )
121 #define PLPLOT_EWOULDBLOCK WSAEWOULDBLOCK
123 #error broken system where neither EWOULDBLOCK nor WSAEWOULDBLOCK macros are #defined
127 #if defined ( __WIN32__ )
128 #define read( a, b, c ) 0
130 #define write( a, b, c ) 0
136 #define MIN( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )
143 #define PACKET_MAGIC 0x6feeddcc
152 typedef struct PartialRead
157 struct PartialRead *next;
160 #define MAX_OPEN_FILES 128
162 static PartialRead *partial[MAX_OPEN_FILES];
164 static void pl_FreeReadBuffer(
int fd );
165 static void pl_Unread(
int fd,
char *
buffer,
int numBytes,
int copy );
166 static int pl_Read(
int fd,
char *
buffer,
int numReq );
189 pl_FreeReadBuffer(
int fd )
191 PartialRead *readList;
193 while ( partial[fd] != NULL )
195 readList = partial[fd];
196 partial[fd] = readList->next;
197 free( readList->buffer );
220 pl_Unread(
int fd,
char *
buffer,
int numBytes,
int copy )
229 new = (PartialRead *) malloc(
sizeof ( PartialRead ) );
232 new->buffer = (
char *) malloc( (
size_t) numBytes );
233 memcpy( new->buffer, buffer, (
size_t) numBytes );
239 new->bufSize = numBytes;
241 new->next = partial[fd];
264 pl_Read(
int fd,
char *buffer,
int numReq )
269 PartialRead *readList;
274 readList = partial[fd];
280 if ( readList == NULL )
282 numRead = (int) read( fd, buffer, (
size_t) numReq );
286 fprintf( stderr,
"received %d bytes starting with:", numRead );
287 for ( j = 0; j <
MIN( 8, numRead ); j++ )
288 fprintf( stderr,
" %x", 0x000000FF & (
unsigned long) buffer[j] );
289 fprintf( stderr,
"\n" );
301 while ( ( readList != NULL ) && ( numRead < numReq ) )
303 numToCopy = readList->bufSize - readList->offset;
304 if ( numToCopy + numRead > numReq )
306 numToCopy = numReq - numRead;
308 memcpy( buffer + numRead, readList->buffer + readList->offset, (
size_t) numToCopy );
314 readList = readList->next;
315 tmp->offset += numToCopy;
316 if ( tmp->offset == tmp->bufSize )
320 partial[fd] = readList;
322 numRead += numToCopy;
328 if ( ( numRead < numReq ) )
330 numToCopy = numReq - numRead;
331 numRead += (int) read( fd, buffer + numRead, (
size_t) numToCopy );
345 #include <arpa/inet.h>
347 #include <netinet/in.h>
348 #include <sys/socket.h>
360 get_inet(
char ** listptr,
int length )
364 while ( ( ptr = (
struct in_addr *) *listptr++ ) == NULL )
367 return inet_ntoa( *ptr );
373 register struct hostent *hostptr;
376 if ( gethostname( hostname, 100 ) )
378 Tcl_AppendResult( interp,
"Error -- cannot get host name",
383 if ( ( hostptr = gethostbyname( hostname ) ) == NULL )
385 Tcl_AppendResult( interp,
"Error -- cannot get host info for node ",
386 hostname, (
char *) NULL );
390 Tcl_SetResult( interp,
391 get_inet( hostptr->h_addr_list, hostptr->h_length ),
426 unsigned int packetLen,
header[2];
428 unsigned char hbuf[8];
437 numRead = pl_Read( iodev->
fd, (
char *) hbuf, headerSize );
442 fprintf( stderr,
"Incorrect header read, numRead = %d\n", numRead );
450 if ( numRead < headerSize )
453 fprintf( stderr,
"Incomplete header read, numRead = %d\n", numRead );
455 pl_Unread( iodev->
fd, (
char *) hbuf, numRead, 1 );
456 Tcl_ResetResult( interp );
470 header[0] |= (
unsigned int) ( hbuf[j++] << 24 );
471 header[0] |= (
unsigned int) ( hbuf[j++] << 16 );
472 header[0] |= (
unsigned int) ( hbuf[j++] << 8 );
473 header[0] |= hbuf[j++];
476 header[1] |= (
unsigned int) ( hbuf[j++] << 24 );
477 header[1] |= (
unsigned int) ( hbuf[j++] << 16 );
478 header[1] |= (
unsigned int) ( hbuf[j++] << 8 );
479 header[1] |= hbuf[j++];
488 if ( header[0] != PACKET_MAGIC )
490 fprintf( stderr,
"Badly formatted packet, numRead = %d\n", numRead );
491 Tcl_AppendResult( interp,
"Error reading from ", iodev->
typeName,
492 ": badly formatted packet", (
char *) NULL );
495 packetLen = header[1] - (
unsigned int) headerSize;
501 if ( header[1] > (
unsigned) pdfs->
bufmax )
503 free( (
void *) pdfs->
buffer );
504 pdfs->
bufmax = header[1] + 32;
505 pdfs->
buffer = (
unsigned char *) malloc( pdfs->
bufmax );
516 if ( iodev->
type == 0 )
518 numRead = pl_Read( iodev->
fd, (
char *) pdfs->
buffer, (
int) packetLen );
523 if ( Tdp_FDIsReady( iodev->
fd ) & TCL_FILE_READABLE )
525 numRead = pl_Read( iodev->
fd, (
char *) pdfs->
buffer, packetLen );
530 fprintf( stderr,
"Packet not ready, putting back header\n" );
532 pl_Unread( iodev->
fd, (
char *) hbuf, headerSize, 1 );
533 Tcl_ResetResult( interp );
544 if ( (
unsigned) numRead != packetLen )
547 fprintf( stderr,
"Incomplete packet read, numRead = %d\n", numRead );
549 pl_Unread( iodev->
fd, (
char *) pdfs->
buffer, numRead, 1 );
550 pl_Unread( iodev->
fd, (
char *) hbuf, headerSize, 1 );
554 pdfs->
bp = (size_t) numRead;
556 fprintf( stderr,
"received %d byte packet starting with:", numRead );
557 for ( j = 0; j < 4; j++ )
559 fprintf( stderr,
" %x", 0x000000FF & (
unsigned long) pdfs->
buffer[j] );
561 fprintf( stderr,
"\n" );
577 if ( errno == PLPLOT_EWOULDBLOCK || errno == EAGAIN )
579 Tcl_ResetResult( interp );
586 errMsg = Tcl_PosixError( interp );
596 if ( iodev->
type == 0 )
599 #if !defined ( MAC_TCL ) && !defined ( __WIN32__ ) && !defined ( __CYGWIN__ )
600 Tk_DeleteFileHandler( iodev->
fd );
604 pl_FreeReadBuffer( iodev->
fd );
606 Tcl_ResetResult( interp );
613 Tcl_AppendResult( interp,
"pl_PacketReceive -- error reading from ",
614 iodev->
typeName,
": ", errMsg, (
char *) NULL );
642 unsigned char hbuf[8];
643 unsigned int packetLen, header[2];
654 packetLen = (
unsigned int) pdfs->
bp + 8;
656 header[0] = PACKET_MAGIC;
657 header[1] = packetLen;
666 hbuf[j++] = (
unsigned char) ( ( header[0] & (
unsigned long) 0xFF000000 ) >> 24 );
667 hbuf[j++] = (
unsigned char) ( ( header[0] & (
unsigned long) 0x00FF0000 ) >> 16 );
668 hbuf[j++] = (
unsigned char) ( ( header[0] & (
unsigned long) 0x0000FF00 ) >> 8 );
669 hbuf[j++] = (
unsigned char) ( header[0] & (
unsigned long) 0x000000FF );
671 hbuf[j++] = (
unsigned char) ( ( header[1] & (
unsigned long) 0xFF000000 ) >> 24 );
672 hbuf[j++] = (
unsigned char) ( ( header[1] & (
unsigned long) 0x00FF0000 ) >> 16 );
673 hbuf[j++] = (
unsigned char) ( ( header[1] & (
unsigned long) 0x0000FF00 ) >> 8 );
674 hbuf[j++] = (
unsigned char) ( header[1] & (
unsigned long) 0x000000FF );
683 buffer = (
char *) malloc( len );
685 memcpy( buffer, (
char *) hbuf, 8 );
686 memcpy( buffer + 8, (
char *) pdfs->
buffer, pdfs->
bp );
689 fprintf( stderr,
"sending %z byte packet starting with:", len );
690 for ( j = 0; j < 12; j++ )
692 fprintf( stderr,
" %x", 0x000000FF & (
unsigned long) buffer[j] );
694 fprintf( stderr,
"\n" );
696 numSent = (int) write( iodev->
fd, buffer, len );
700 if ( (
unsigned) numSent != packetLen )
702 if ( ( errno == 0 ) || ( errno == PLPLOT_EWOULDBLOCK || errno == EAGAIN ) )
707 Tcl_ResetResult( interp );
708 sprintf( tmp,
"%d", numSent - 8 );
709 Tcl_SetResult( interp, tmp, TCL_VOLATILE );
712 else if ( errno == EPIPE )
718 if ( iodev->
type == 0 )
723 Tcl_SetResult( interp, tmp, TCL_VOLATILE );
728 Tcl_AppendResult( interp,
"pl_PacketSend -- error writing to ",
730 Tcl_PosixError( interp ), (
char *) NULL );
739 sprintf( tmp,
"%d", numSent - 8 );
740 Tcl_SetResult( interp, tmp, TCL_VOLATILE );
751 #endif // defined(PLD_tk) || defined (ENABLE_tkX)