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)