<div>I don't know if anyone else will find this even remotely usefull, but I have this friend that has a very restrictive network.  Their internet usage is tracked, and the pc's cannot talk site to site.  However there is a common fileserver in the middle....   
</div>
<div> </div>
<div>So I cooked up this little 'gem'. </div>
<div> </div>
<div>This way people in site 'A' can telnet to their vax, likewise with site 'B'.  The network admins won't see irc, ftp, email whatever on the vaxa -> vaxb link since it's going through the fileserver.  I haven't even profiled how much bandwidth it uses so you with extreme caution! 
</div>
<div> </div>
<div>I'm using he 11/780 (small memory footprint..) and here is how to initallize it.  the parameter for the networking is the path in which you need an 'a' and 'b' directory.  In this case on the V: drive. (Sorry its MS only with sopen.. I'm sure there is some kind of open exclusive on *nix, but if you have NFS.....) 
</div>
<div> </div>
<div>set xu ena<br>set xu MAC=08:00:2B:CC:DD:01<br>att xu v:\temp\</div>
<div> </div>
<div>You will need to build two exe's one compiled with USE_NETA and the other with USE_NETB.</div>
<div> </div>
<div>The following code can be dropped into sim_ether.c , in place of the #ifdef USE_NETWORK portion.</div>
<div> </div>
<div>Again I don't know if anyone will be even remotly interested in this...</div>
<div> </div>
<div> ------8< ------8< ------8< ------8< ------8< ------8< ------8< ------8< ------8< ------8<</div>
<div>#ifdef USE_NETWORK<br>#include <fcntl.h>               /*constants defined*/<br>#include <sys\types.h><br>#include <sys\stat.h>            /*constants defined*/<br>#include <share.h>               /*constants defined*/ 
<br>#include <io.h></div>
<p>#define USE_NETA<br>//#define USE_NETB</p>
<p><br>//Packet couters for reading/writing<br>int Packet;<br>int PacketR;<br>char Path[255];</p>
<p>t_stat eth_open (ETH_DEV* dev, char* name)<br>  {<br>    Packet=0;<br>   PacketR=0;<br>#ifdef USE_NETA<br>   printf("the A client");<br>#endif<br>#ifdef USE_NETB<br>   printf("the B client");<br>#endif 
<br>   memset(Path,0x0,sizeof(Path));<br>   sprintf(Path,"%s",name);<br>   printf("\t%s\n",Path);<br>   return SCPE_OK;<br>  }</p>
<p>t_stat eth_close (ETH_DEV* dev)<br>  {<br> return SCPE_NOFNC;<br> }<br>/************Helper functions...***************************/</p>
<p><br>void sendpacket(char *p);<br>/*************************************************************/</p>
<p>t_stat eth_write (ETH_DEV* dev, ETH_PACK* packet, ETH_PCALLBACK routine)<br>  {<br>  int status = 1;   /* default to failure */</p>
<p>  /* make sure device exists */<br>  if (!dev) return SCPE_UNATT;</p>
<p>  /* make sure packet exists */<br>  if (!packet) return SCPE_ARG;</p>
<p>  /* make sure packet is acceptable length */<br>  if ((packet->len >= ETH_MIN_PACKET) && (packet->len <= ETH_MAX_PACKET)) {<br>   char buffer[5000];<br>   char fname[255];<br>   FILE *outz;</p>
<p>   memset(buffer,0x0,sizeof(buffer));<br>   memset(fname,0x0,sizeof(fname));<br>#ifdef USE_NETA<br>   sprintf(fname,"%sa\\packet_%d.cap",Path,Packet);<br>#else<br>   sprintf(fname,"%sb\\packet_%d.cap",Path,Packet); 
<br>#endif</p>
<div><br>   outz=sopen(fname,O_RDWR | O_BINARY | O_CREAT, SH_DENYRW, S_IREAD | S_IWRITE);<br>   eth_add_crc32(packet->msg);<br>   write(outz,packet->msg,packet->len);<br>   close(outz);</div>
<div>   status=0;<br>   Packet++;</div>
<p>    /* detect sending of decnet loopback packet */<br>    if ((status == 0) && DECNET_SELF_FRAME(dev->decnet_addr, packet->msg)) <br>      dev->decnet_self_sent += dev->reflections;</p>
<p>  } /* if packet->len */</p>
<p>  /* call optional write callback function */<br>  if (routine)<br>    (routine)(status);<br>  return SCPE_OK;<br>}</p>
<p>/*************************************************************/<br>t_stat eth_read (ETH_DEV* dev, ETH_PACK* packet, ETH_PCALLBACK routine)<br>  {</p>
<p>  int status;</p>
<p>  /* make sure device exists */<br>  if (!dev) return SCPE_UNATT;</p>
<p>  /* make sure packet exists */<br>  if (!packet) return SCPE_ARG;</p>
<p>  /* set read packet */<br>  dev->read_packet = packet;<br>  packet->len = 0;</p>
<p>  /* set optional callback routine */<br>  dev->read_callback = routine;</p>
<p>  /* dispatch read request to either receive a filtered packet or timeout */<br>  do {<br>    char fname[255];<br>    FILE *inz;<br>  int j=0;<br>#ifdef USE_NETA<br>  sprintf(fname,"%sb\\packet_%d.cap",Path,PacketR); 
<br>#endif<br>#ifdef USE_NETB<br>  sprintf(fname,"%sa\\packet_%d.cap",Path,PacketR);<br>#endif<br>  inz=sopen(fname,O_RDWR | O_BINARY, SH_DENYRW);</p>
<p> if(inz==-1)<br> {<br>  return SCPE_OK;<br> }<br> else<br> {<br>  unsigned char packetbuffer[2000];<br>  memset(packetbuffer,0x0,sizeof(packetbuffer));<br>  j=read(inz,packetbuffer,sizeof(packetbuffer));<br>  close(inz); 
<br>  unlink(fname);<br>  dev->read_packet->len=j;<br>  memcpy(dev->read_packet->msg,packetbuffer,j);<br>  eth_add_crc32(dev->read_packet);<br>  if (dev->read_callback)<br>   (dev->read_callback)(0);<br>
  PacketR++;</p>
<p> }<br>  <br>  return SCPE_OK;<br> } while ((status) && (0 == packet->len));<br>}</p>
<p><br>////////////////////////////////////////////////////////////////////////<br>t_stat eth_filter (ETH_DEV* dev, int addr_count, ETH_MAC* addresses,<br>                   ETH_BOOL all_multicast, ETH_BOOL promiscuous)<br>
  {return SCPE_NOFNC;}<br>int eth_devices (int max, ETH_LIST* dev)<br>  {return 0;}</p>
<p>#endif</p>