public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Rename RegisterSet to BlockSpace and AddressSpace to ByteSpace.
Date: Fri, 04 Jul 2008 20:37:00 -0000	[thread overview]
Message-ID: <20080704203706.18240.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  44038d6b0cfa52d6ee37adc061cb4142997d99b1 (commit)
      from  6a0ea520d3eaebb371820f312c3bb40666c60265 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 44038d6b0cfa52d6ee37adc061cb4142997d99b1
Author: Andrew Cagney <cagney@redhat.com>
Date:   Fri Jul 4 16:35:00 2008 -0400

    Rename RegisterSet to BlockSpace and AddressSpace to ByteSpace.
    
    It turns out that there are more block transferable spaces then just
    the register sets.

-----------------------------------------------------------------------

Summary of changes:
 ...etByteBuffer.java => BlockSpaceByteBuffer.java} |   27 +--
 ...aceByteBuffer.java => ByteSpaceByteBuffer.java} |   84 ++++----
 frysk-core/frysk/proc/live/ChangeLog               |    9 +
 frysk-core/frysk/proc/live/LinuxPtraceTask.java    |    7 +-
 .../frysk/proc/live/LogicalMemoryBuffer.java       |  172 +++++++--------
 .../proc/live/PtraceRegisterBanksFactory.java      |   20 +-
 frysk-core/frysk/proc/live/TestByteBuffer.java     |  242 +++++++++-----------
 .../ptrace/{RegisterSet.java => BlockSpace.java}   |   23 +-
 .../ptrace/{AddressSpace.java => ByteSpace.java}   |   22 +-
 frysk-sys/frysk/sys/ptrace/ChangeLog               |   11 +
 frysk-sys/frysk/sys/ptrace/TestAddressSpace.java   |   60 +++---
 frysk-sys/frysk/sys/ptrace/TestRegisterSet.java    |    8 +-
 .../ptrace/cni/{RegisterSet.cxx => BlockSpace.cxx} |   34 ++--
 .../ptrace/cni/{AddressSpace.cxx => ByteSpace.cxx} |   48 ++--
 .../ptrace/jni/{RegisterSet.cxx => BlockSpace.cxx} |   26 +-
 .../ptrace/jni/{AddressSpace.cxx => ByteSpace.cxx} |   48 ++--
 frysk-sys/frysk/testbed/ChangeLog                  |    4 +
 frysk-sys/frysk/testbed/LocalMemory.java           |    4 +-
 18 files changed, 419 insertions(+), 430 deletions(-)
 rename frysk-core/frysk/proc/live/{RegisterSetByteBuffer.java => BlockSpaceByteBuffer.java} (86%)
 rename frysk-core/frysk/proc/live/{AddressSpaceByteBuffer.java => ByteSpaceByteBuffer.java} (80%)
 rename frysk-sys/frysk/sys/ptrace/{RegisterSet.java => BlockSpace.java} (82%)
 rename frysk-sys/frysk/sys/ptrace/{AddressSpace.java => ByteSpace.java} (89%)
 rename frysk-sys/frysk/sys/ptrace/cni/{RegisterSet.cxx => BlockSpace.cxx} (77%)
 rename frysk-sys/frysk/sys/ptrace/cni/{AddressSpace.cxx => ByteSpace.cxx} (83%)
 rename frysk-sys/frysk/sys/ptrace/jni/{RegisterSet.cxx => BlockSpace.cxx} (84%)
 rename frysk-sys/frysk/sys/ptrace/jni/{AddressSpace.cxx => ByteSpace.cxx} (82%)

First 500 lines of diff:
diff --git a/frysk-core/frysk/proc/live/RegisterSetByteBuffer.java b/frysk-core/frysk/proc/live/BlockSpaceByteBuffer.java
similarity index 86%
rename from frysk-core/frysk/proc/live/RegisterSetByteBuffer.java
rename to frysk-core/frysk/proc/live/BlockSpaceByteBuffer.java
index 6b2c1ff..84b2c8a 100644
--- a/frysk-core/frysk/proc/live/RegisterSetByteBuffer.java
+++ b/frysk-core/frysk/proc/live/BlockSpaceByteBuffer.java
@@ -39,7 +39,7 @@
 
 package frysk.proc.live;
 
-import frysk.sys.ptrace.RegisterSet;
+import frysk.sys.ptrace.BlockSpace;
 import frysk.event.Request;
 import frysk.proc.Manager;
 import inua.eio.ByteBuffer;
@@ -50,23 +50,23 @@ import frysk.sys.ProcessIdentifier;
  * be read or written all at once e.g., the registers or floating
  * point registers.
  */
-public class RegisterSetByteBuffer
+public class BlockSpaceByteBuffer
     extends ByteBuffer
 {
     private final ProcessIdentifier pid;
-    private final RegisterSet registerSet;
+    private final BlockSpace registerSet;
     private final byte[] bytes;
   
-    private RegisterSetByteBuffer(ProcessIdentifier pid,
-				  RegisterSet registerSet,
-				  long lowerExtreem, long upperExtreem) {
+    private BlockSpaceByteBuffer(ProcessIdentifier pid,
+				 BlockSpace registerSet,
+				 long lowerExtreem, long upperExtreem) {
 	super(lowerExtreem, upperExtreem);
 	this.pid = pid;
 	this.registerSet = registerSet;
 	bytes = new byte[registerSet.length()];
     }
-    public RegisterSetByteBuffer(ProcessIdentifier pid,
-				 RegisterSet registerSet) {
+    public BlockSpaceByteBuffer(ProcessIdentifier pid,
+				BlockSpace registerSet) {
 	this(pid, registerSet, 0, registerSet.length());
     }
   
@@ -121,11 +121,10 @@ public class RegisterSetByteBuffer
 	return len;
     }
   
-    protected ByteBuffer subBuffer (ByteBuffer parent, long lowerExtreem,
-				    long upperExtreem)
-    {
-	RegisterSetByteBuffer up = (RegisterSetByteBuffer)parent;
-	return new RegisterSetByteBuffer (up.pid, up.registerSet,
-					  lowerExtreem, upperExtreem);
+    protected ByteBuffer subBuffer(ByteBuffer parent, long lowerExtreem,
+				   long upperExtreem) {
+	BlockSpaceByteBuffer up = (BlockSpaceByteBuffer)parent;
+	return new BlockSpaceByteBuffer(up.pid, up.registerSet,
+					lowerExtreem, upperExtreem);
     }
 }
diff --git a/frysk-core/frysk/proc/live/AddressSpaceByteBuffer.java b/frysk-core/frysk/proc/live/ByteSpaceByteBuffer.java
similarity index 80%
rename from frysk-core/frysk/proc/live/AddressSpaceByteBuffer.java
rename to frysk-core/frysk/proc/live/ByteSpaceByteBuffer.java
index adc0723..7cd405e 100644
--- a/frysk-core/frysk/proc/live/AddressSpaceByteBuffer.java
+++ b/frysk-core/frysk/proc/live/ByteSpaceByteBuffer.java
@@ -42,34 +42,35 @@ package frysk.proc.live;
 import inua.eio.ByteBuffer;
 import frysk.sys.Errno;
 import frysk.sys.ProcessIdentifier;
-import frysk.sys.ptrace.AddressSpace;
+import frysk.sys.ptrace.ByteSpace;
 import frysk.sys.proc.Mem;
 import frysk.event.Request;
 import frysk.proc.Manager;
 
-public class AddressSpaceByteBuffer extends ByteBuffer {
-    protected final AddressSpace addressSpace;
+public class ByteSpaceByteBuffer extends ByteBuffer {
+    protected final ByteSpace addressSpace;
     protected final ProcessIdentifier pid;
 
     // Direct files access if possible, or null otherwise.
     private Mem mem;
 
-    protected AddressSpaceByteBuffer (ProcessIdentifier pid,
-				      AddressSpace addressSpace,
-				      long lowerExtreem, long upperExtreem) {
+    protected ByteSpaceByteBuffer (ProcessIdentifier pid,
+				   ByteSpace addressSpace,
+				   long lowerExtreem, long upperExtreem) {
 	super (lowerExtreem, upperExtreem);
 	this.pid = pid;
 	this.addressSpace = addressSpace;
 	peekRequest = new PeekRequest();
 	pokeRequest = new PokeRequest();
-	if (addressSpace == AddressSpace.TEXT
-	    || addressSpace == AddressSpace.DATA)
+	if (addressSpace == ByteSpace.TEXT
+	    || addressSpace == ByteSpace.DATA) {
 	    // Try to use /proc; but if any error occures clear it and
 	    // revert back to ptrace.
 	    mem = new Mem(pid);
+	}
     }
-    public AddressSpaceByteBuffer(ProcessIdentifier pid,
-				  AddressSpace addressSpace) {
+    public ByteSpaceByteBuffer(ProcessIdentifier pid,
+			       ByteSpace addressSpace) {
 	this(pid, addressSpace, 0, addressSpace.length());
     }
 
@@ -79,22 +80,21 @@ public class AddressSpaceByteBuffer extends ByteBuffer {
     {
 	private long index;
 	private int value;
-	PeekRequest()
-	{
+	PeekRequest() {
 	    super(Manager.eventLoop);
 	}
-	public void execute ()
-	{
+	public void execute() {
 	    value = addressSpace.peek(pid, index);
 	}
-	public int request (long index)
-	{
+	public int request(long index) {
 	    if (isEventLoopThread())
 		return addressSpace.peek(pid, index);
-	    else synchronized (this) {
-		this.index = index;
-		request();
-		return value;
+	    else {
+		synchronized (this) {
+		    this.index = index;
+		    request();
+		    return value;
+		}
 	    }
 	}
     }
@@ -108,22 +108,21 @@ public class AddressSpaceByteBuffer extends ByteBuffer {
     {
 	private long index;
 	private int value;
-	PokeRequest()
-	{
+	PokeRequest() {
 	    super(Manager.eventLoop);
 	}
-	public void execute ()
-	{
+	public void execute() {
 	    addressSpace.poke(pid, index, value);
 	}
-	public void request (long index, int value)
-	{
+	public void request(long index, int value) {
 	    if (isEventLoopThread())
 		addressSpace.poke(pid, index, value);
-	    else synchronized (this) {
-		this.index = index;
-		this.value = value;
-		request();
+	    else {
+		synchronized (this) {
+		    this.index = index;
+		    this.value = value;
+		    request();
+		}
 	    }
 	}
     }
@@ -167,13 +166,15 @@ public class AddressSpaceByteBuffer extends ByteBuffer {
 			    boolean write) {
 	    if (isEventLoopThread())
 		transfer(index, bytes, offset, length, write);
-	    else synchronized (this) {
-		this.index = index;
-		this.bytes = bytes;
-		this.offset = offset;
-		this.length = length;
-		this.write = write;
-		super.request();
+	    else {
+		synchronized (this) {
+		    this.index = index;
+		    this.bytes = bytes;
+		    this.offset = offset;
+		    this.length = length;
+		    this.write = write;
+		    super.request();
+		}
 	    }
 	}
     }
@@ -189,10 +190,9 @@ public class AddressSpaceByteBuffer extends ByteBuffer {
     }
 
     protected ByteBuffer subBuffer (ByteBuffer parent, long lowerExtreem,
-				    long upperExtreem)
-    {
-	AddressSpaceByteBuffer up = (AddressSpaceByteBuffer)parent;
-	return new AddressSpaceByteBuffer (up.pid, up.addressSpace,
-					   lowerExtreem, upperExtreem);
+				    long upperExtreem) {
+	ByteSpaceByteBuffer up = (ByteSpaceByteBuffer)parent;
+	return new ByteSpaceByteBuffer(up.pid, up.addressSpace,
+				       lowerExtreem, upperExtreem);
     }
 }
diff --git a/frysk-core/frysk/proc/live/ChangeLog b/frysk-core/frysk/proc/live/ChangeLog
index 0d40328..49838f5 100644
--- a/frysk-core/frysk/proc/live/ChangeLog
+++ b/frysk-core/frysk/proc/live/ChangeLog
@@ -1,3 +1,12 @@
+2008-07-04  Andrew Cagney  <cagney@redhat.com>
+
+	* ByteSpaceByteBuffer.java: Rename AddressSpaceByteBuffer.
+	* BlockSpaceByteBuffer.java: Rename RegisterSetByteBuffer..
+	* LogicalMemoryBuffer.java: Update.
+	* LinuxPtraceTask.java: Update.
+	* PtraceRegisterBanksFactory.java: Update.
+	* TestByteBuffer.java: Update.
+
 2008-06-16  Phil Muldoon  <pmuldoon@redhat.com>
 
 	* LinuxPtraceTaskState.java (Running.checkWatchpoint): Rewrite to use
diff --git a/frysk-core/frysk/proc/live/LinuxPtraceTask.java b/frysk-core/frysk/proc/live/LinuxPtraceTask.java
index 0ecadb3..8dc5c78 100644
--- a/frysk-core/frysk/proc/live/LinuxPtraceTask.java
+++ b/frysk-core/frysk/proc/live/LinuxPtraceTask.java
@@ -60,7 +60,7 @@ import inua.eio.ByteOrder;
 import frysk.sys.Errno;
 import frysk.sys.ProcessIdentifier;
 import frysk.sys.ptrace.Ptrace;
-import frysk.sys.ptrace.AddressSpace;
+import frysk.sys.ptrace.ByteSpace;
 import frysk.sys.Signal;
 import frysk.isa.syscalls.Syscall;
 import frysk.isa.ISA;
@@ -140,8 +140,7 @@ public class LinuxPtraceTask extends LiveTask {
     ByteBuffer getRawMemory() {
 	fine.log(this, "Begin fillMemory");
 	ByteOrder byteOrder = getISA().order();
-	ByteBuffer memory = new AddressSpaceByteBuffer(tid,
-						       AddressSpace.DATA);
+	ByteBuffer memory = new ByteSpaceByteBuffer(tid, ByteSpace.DATA);
 	memory.order(byteOrder);
 	fine.log(this, "End fillMemory"); 
 	return memory;
@@ -155,7 +154,7 @@ public class LinuxPtraceTask extends LiveTask {
 	    fine.log(this, "exiting get memory");
 	    ByteOrder byteOrder = getISA().order();
 	    BreakpointAddresses breakpoints = ((LinuxPtraceProc)getProc()).breakpoints;
-	    memory = new LogicalMemoryBuffer(tid, AddressSpace.DATA,
+	    memory = new LogicalMemoryBuffer(tid, ByteSpace.DATA,
 					     breakpoints);
 	    memory.order(byteOrder);
 	}
diff --git a/frysk-core/frysk/proc/live/LogicalMemoryBuffer.java b/frysk-core/frysk/proc/live/LogicalMemoryBuffer.java
index 5d1330b..3227a5f 100644
--- a/frysk-core/frysk/proc/live/LogicalMemoryBuffer.java
+++ b/frysk-core/frysk/proc/live/LogicalMemoryBuffer.java
@@ -42,7 +42,7 @@ package frysk.proc.live;
 import frysk.sys.ProcessIdentifier;
 import java.util.Iterator;
 import inua.eio.ByteBuffer;
-import frysk.sys.ptrace.AddressSpace;
+import frysk.sys.ptrace.ByteSpace;
 
 /**
  * MemorySpaceByteBuffer that filters out anything the frysk core
@@ -51,16 +51,15 @@ import frysk.sys.ptrace.AddressSpace;
  * replace the bytes with the logical bytes as the user would normally
  * see them from the process.
  */
-class LogicalMemoryBuffer extends AddressSpaceByteBuffer
-{
-  // The breakpoints associated with the process address space.
-  private final BreakpointAddresses breakpoints;
+class LogicalMemoryBuffer extends ByteSpaceByteBuffer {
+    // The breakpoints associated with the process address space.
+    private final BreakpointAddresses breakpoints;
 
     /**
      * Private constructor used by subBuffer()
      */
     private LogicalMemoryBuffer(ProcessIdentifier tid,
-				AddressSpace addressSpace,
+				ByteSpace addressSpace,
 				BreakpointAddresses breakpoints,
 				long lower, long upper) {
 	super(tid, addressSpace, lower, upper);
@@ -72,99 +71,90 @@ class LogicalMemoryBuffer extends AddressSpaceByteBuffer
      * memory space for a task when requested.
      */
     LogicalMemoryBuffer(ProcessIdentifier tid,
-			AddressSpace addressSpace,
+			ByteSpace addressSpace,
 			BreakpointAddresses breakpoints) {
 	super(tid, addressSpace);
 	this.breakpoints = breakpoints;
     }
   
-  protected int peek(long caret)
-  {
-    Breakpoint breakpoint = breakpoints.getBreakpoint(caret);
-    if (breakpoint != null)
-      {
-	// This really shouldn't happen, it means the breakpoint
-	// is already uninstalled.
-	Instruction instruction = breakpoint.getInstruction();
-	if (instruction != null)
-	  {
-	    byte[] ibs = instruction.getBytes();
-	    return ibs[0] & 0xff;
-	  }
-      }
-    return super.peek(caret);
-  }
-  
-  protected int peek(long index, byte[] bytes, int offset, int length)
-  {
-    synchronized (breakpoints)
-      {
-	Iterator it;
-	it = breakpoints.getBreakpoints(index, index + length);
-	int r = 0;
-	while (it.hasNext())
-	  {
-	    Breakpoint breakpoint = (Breakpoint) it.next();
-	    // address - index falls inside the byte[] so will be at most
-	    // a positive int apart.
-	    int l = (int) (breakpoint.getAddress() - index) - r;
-	    // Do we need to be worried about "short peeks"?
-	    r += super.peek(index + r, bytes, offset + r, l);
-
-	    byte b;
-	    Instruction instruction = breakpoint.getInstruction();
+    protected int peek(long caret)
+    {
+	Breakpoint breakpoint = breakpoints.getBreakpoint(caret);
+	if (breakpoint != null) {
 	    // This really shouldn't happen, it means the breakpoint
 	    // is already uninstalled.
-	    if (instruction != null)
-	      b = instruction.getBytes()[0];
-	    else
-	      b = (byte) super.peek(index + r);
-	    bytes[offset + r] = b;
-	    r++;
-	  }
-	return super.peek(index + r, bytes, offset + r, length - r) + r;
-      }
-  }
-
-  /**
-   * Pokes the value at the given index. Unless a breakpoint is set at
-   * that location (FIXME: this limitation should be lifted).
-   */
-  protected void poke (long index, int value)
-  {
-    Breakpoint breakpoint = breakpoints.getBreakpoint(index);
-    if (breakpoint != null)
-      throw new UnsupportedOperationException("breakpoint set at: " + index);
-
-    super.poke(index, value);
-  }
+	    Instruction instruction = breakpoint.getInstruction();
+	    if (instruction != null) {
+		byte[] ibs = instruction.getBytes();
+		return ibs[0] & 0xff;
+	    }
+	}
+	return super.peek(caret);
+    }
   
-  /**
-   * Pokes the given bytes from offset at the index plus the given
-   * lenght. Unless a breakpoint is set in that range (FIXME: this
-   * limitation should be lifted).
-   */
-  protected int poke(long index, byte[] bytes, int offset, int length)
-  {
-    synchronized (breakpoints)
-      {
-	Iterator it;
-	it = breakpoints.getBreakpoints(index, index + length);
-	if (it.hasNext())
-	  throw new UnsupportedOperationException("breakpoint set between "
-						  + index + " and "
-						  + index + length);
-      }
+    protected int peek(long index, byte[] bytes, int offset, int length) {
+	synchronized (breakpoints) {
+	    Iterator it;
+	    it = breakpoints.getBreakpoints(index, index + length);
+	    int r = 0;
+	    while (it.hasNext()) {
+		Breakpoint breakpoint = (Breakpoint) it.next();
+		// address - index falls inside the byte[] so will be at most
+		// a positive int apart.
+		int l = (int) (breakpoint.getAddress() - index) - r;
+		// Do we need to be worried about "short peeks"?
+		r += super.peek(index + r, bytes, offset + r, l);
+		
+		byte b;
+		Instruction instruction = breakpoint.getInstruction();
+		// This really shouldn't happen, it means the breakpoint
+		// is already uninstalled.
+		if (instruction != null)
+		    b = instruction.getBytes()[0];
+		else
+		    b = (byte) super.peek(index + r);
+		bytes[offset + r] = b;
+		r++;
+	    }
+	    return super.peek(index + r, bytes, offset + r, length - r) + r;
+	}
+    }
+    
+    /**
+     * Pokes the value at the given index. Unless a breakpoint is set
+     * at that location (FIXME: this limitation should be lifted).
+     */
+    protected void poke(long index, int value) {
+	Breakpoint breakpoint = breakpoints.getBreakpoint(index);
+	if (breakpoint != null)
+	    throw new UnsupportedOperationException("breakpoint set at: " + index);
 
-    return super.poke(index, bytes, offset, length);
-  }
+	super.poke(index, value);
+    }
+  
+    /**
+     * Pokes the given bytes from offset at the index plus the given
+     * lenght. Unless a breakpoint is set in that range (FIXME: this
+     * limitation should be lifted).
+     */
+    protected int poke(long index, byte[] bytes, int offset, int length) {
+	synchronized (breakpoints) {
+	    Iterator it;
+	    it = breakpoints.getBreakpoints(index, index + length);
+	    if (it.hasNext())
+		throw new UnsupportedOperationException("breakpoint set between "
+							+ index + " and "
+							+ index + length);
+	}
+	
+	return super.poke(index, bytes, offset, length);
+    }
 
-  protected ByteBuffer subBuffer(ByteBuffer parent,
-				 long lower, long upper)
-  {
-    LogicalMemoryBuffer sub = (LogicalMemoryBuffer) parent;
-    return new LogicalMemoryBuffer (sub.pid, sub.addressSpace,
-				    sub.breakpoints,
-				    lower, upper);
-  }
+    protected ByteBuffer subBuffer(ByteBuffer parent,
+				   long lower, long upper) {
+	LogicalMemoryBuffer sub = (LogicalMemoryBuffer) parent;
+	return new LogicalMemoryBuffer (sub.pid, sub.addressSpace,
+					sub.breakpoints,
+					lower, upper);
+    }
 }
diff --git a/frysk-core/frysk/proc/live/PtraceRegisterBanksFactory.java b/frysk-core/frysk/proc/live/PtraceRegisterBanksFactory.java
index daa86d9..dea7c53 100644
--- a/frysk-core/frysk/proc/live/PtraceRegisterBanksFactory.java
+++ b/frysk-core/frysk/proc/live/PtraceRegisterBanksFactory.java
@@ -44,8 +44,8 @@ import inua.eio.ByteBuffer;
 import inua.eio.ByteOrder;
 import frysk.isa.ISA;
 import frysk.sys.ProcessIdentifier;
-import frysk.sys.ptrace.RegisterSet;
-import frysk.sys.ptrace.AddressSpace;
+import frysk.sys.ptrace.BlockSpace;
+import frysk.sys.ptrace.ByteSpace;
 import frysk.isa.banks.RegisterBanks;
 import frysk.isa.banks.X86BankRegisters;
 import frysk.isa.banks.PPCBankRegisters;
@@ -60,9 +60,9 @@ class PtraceRegisterBanksFactory {
 
     private static ByteBuffer[] x8664Banks(ProcessIdentifier pid) {
 	ByteBuffer[] bankBuffers = new ByteBuffer[] {
-	    new RegisterSetByteBuffer(pid, RegisterSet.REGS),
-	    new RegisterSetByteBuffer(pid, RegisterSet.FPREGS),
-	    new AddressSpaceByteBuffer(pid, AddressSpace.USR)


hooks/post-receive
--
frysk system monitor/debugger


                 reply	other threads:[~2008-07-04 20:37 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080704203706.18240.qmail@sourceware.org \
    --to=cagney@sourceware.org \
    --cc=frysk-cvs@sourceware.org \
    --cc=frysk@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).