<br><br><div class="gmail_quote">On Tue, Jun 2, 2009 at 2:07 PM, David Leimbach <span dir="ltr">&lt;<a href="mailto:leimy2k@gmail.com">leimy2k@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br><br><div class="gmail_quote"><div class="im">On Tue, Jun 2, 2009 at 1:56 PM, Thomas DuBuisson <span dir="ltr">&lt;<a href="mailto:thomas.dubuisson@gmail.com" target="_blank">thomas.dubuisson@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Again, I can&#39;t reproduce your problem.  Are you getting data through<br>
some previous Binary instance before calling the routines you show us<br>
here?  </blockquote><div><br></div></div><div>Ah good question... I&#39;m calling &quot;decode&quot;, but it&#39;s not clear that it&#39;s even running my instance of Get!!!!</div><div><br></div><div>If I have a lazy bytestring, and call &quot;decode&quot;, which instance of &quot;Get&quot; runs?  Probably not my 9P message version I&#39;ll bet... </div>

<div><br></div><div>geeze...  :-(</div></div></blockquote><div><br></div><div>AAAAANd... that was it.  I totally didn&#39;t decode with the right decoder.  By the expression I had, it appears it was trying to decode a ByteString as a String, and that was causing a big darned mess.</div>
<div><br></div><div>Thanks for all the help guys.  I&#39;m glad it&#39;s not a bug in the library, just my dumb code</div><div><br></div><div>Dave</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="gmail_quote"><div></div><div><div></div><div class="h5"><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The code I tested with is below - I&#39;ve tried it with both<br>


&#39;getSpecific&#39; paths by commenting out one path at a time.  Both<br>
methods work, shown below.<br>
<br>
Thomas<br>
<br>
*Main&gt; decode test :: RV<br>
Rversion {size = 19, mtype = 101, tag = 65535, msize = 1024, ssize =<br>
6, version = Chunk &quot;9P2000&quot; Empty}<br>
*Main&gt; :q<br>
Leaving GHCi.<br>
[... edit ...]<br>
[1 of 1] Compiling Main             ( p.hs, interpreted )<br>
Ok, modules loaded: Main.<br>
*Main&gt; decode test :: RV<br>
Rerror {size = 19, mtype = 101, tag = 65535, ssize = 1024, ename =<br>
Chunk &quot;\NUL\NUL\ACK\NUL9P2000&quot; Empty}<br>
*Main&gt;<br>
<div><br>
<br>
<br>
import Data.ByteString.Lazy<br>
import Data.Binary<br>
import Data.Binary.Get<br>
<br>
data RV =<br>
 Rversion {     size    :: Word32,<br>
                mtype   :: Word8,<br>
                tag     :: Word16,<br>
                msize   :: Word32,<br>
                ssize   :: Word16,<br>
                version :: ByteString}<br>
</div> | Rerror {     size    :: Word32,<br>
                mtype   :: Word8,<br>
                tag     :: Word16,<br>
                ssize   :: Word16,<br>
                ename :: ByteString}<br>
<div>        deriving (Eq, Ord, Show)<br>
<br>
instance Binary RV where<br>
</div> put = undefined<br>
<div> get = do s &lt;- getWord32le<br>
          mtype &lt;- getWord8<br>
          getSpecific s mtype<br>
        where<br>
          getSpecific s mt<br>
{-                      = do t &lt;- getWord16le<br>
                           ms &lt;- getWord32le<br>
                           ss &lt;- getWord16le<br>
                           v &lt;- getRemainingLazyByteString<br>
                           return $ Rversion {size=s,<br>
                                              mtype=mt,<br>
                                              tag=t,<br>
                                              msize=ms,<br>
                                              ssize=ss,<br>
                                              version=v}<br>
</div>-}<br>
<div>                      = do t &lt;- getWord16le<br>
                           ss &lt;- getWord16le<br>
                           e &lt;- getLazyByteString $ fromIntegral ss<br>
</div>                           return $ Rerror {size=s,<br>
<div>                                                            mtype=mt,<br>
                                                            tag=t,<br>
                                                            ssize=ss,<br>
                                                           ename=e}<br>
<br>
</div>test = pack<br>
        [ 0x13<br>
        , 0x00<br>
        , 0x00<br>
        , 0x00<br>
        , 0x65<br>
        , 0xff<br>
        , 0xff<br>
        , 0x00<br>
        , 0x04<br>
        , 0x00<br>
        , 0x00<br>
        , 0x06<br>
        , 0x00<br>
        , 0x39<br>
        , 0x50<br>
        , 0x32<br>
        , 0x30<br>
        , 0x30<br>
        , 0x30 ]<br>
<div><div></div><div><br>
On Tue, Jun 2, 2009 at 1:31 PM, David Leimbach &lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; On Tue, Jun 2, 2009 at 1:28 PM, John Van Enk &lt;<a href="mailto:vanenkj@gmail.com" target="_blank">vanenkj@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; I think Thomas&#39; point was that some other branch in `getSpecific&#39; is<br>
&gt;&gt; running. Is there a chance we can see the rest of `getSpecific&#39;?<br>
&gt;<br>
&gt; Sure:  (In the meantime, I&#39;ll try the suggested code from before)<br>
&gt;  get = do s &lt;- getWord32le<br>
&gt;              mtype &lt;- getWord8<br>
&gt;              getSpecific s mtype<br>
&gt;         where<br>
&gt;           getSpecific s mt<br>
&gt;                       | mt == mtRversion = do t &lt;- getWord16le<br>
&gt;                                               ms &lt;- getWord32le<br>
&gt;                                               ss &lt;- getWord16le<br>
&gt;                                               v &lt;-<br>
&gt; getRemainingLazyByteString<br>
&gt;                                               return $ MessageClient $<br>
&gt; Rversion {size=s,<br>
&gt;<br>
&gt;     mtype=mt,<br>
&gt;<br>
&gt;     tag=t,<br>
&gt;<br>
&gt;     msize=ms,<br>
&gt;<br>
&gt;     ssize=ss,<br>
&gt;<br>
&gt;     version=v}<br>
&gt;                       | mt == mtRerror = do t &lt;- getWord16le<br>
&gt;                                             ss &lt;- getWord16le<br>
&gt;                                             e &lt;- getLazyByteString $<br>
&gt; fromIntegral ss<br>
&gt;                                             return $ MessageClient $ Rerror<br>
&gt; {size=s,<br>
&gt;<br>
&gt; mtype=mt,<br>
&gt;<br>
&gt; tag=t,<br>
&gt;<br>
&gt; ssize=ss,<br>
&gt;<br>
&gt; ename=e}<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Tue, Jun 2, 2009 at 4:20 PM, David Leimbach &lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt; The thing is I have 19 bytes in the hex string I provided:<br>
&gt;&gt; &gt; 1300000065ffff000400000600395032303030<br>
&gt;&gt; &gt; That&#39;s 38 characters or 19 bytes.<br>
&gt;&gt; &gt; The last 4 are 9P2000<br>
&gt;&gt; &gt; 13000000  = 4 bytes for 32bit message payload,  This is little endian<br>
&gt;&gt; &gt; for 19<br>
&gt;&gt; &gt; bytes total.<br>
&gt;&gt; &gt; 65 = 1 byte for message type.  65 is &quot;Rversion&quot; or the response type for<br>
&gt;&gt; &gt; a<br>
&gt;&gt; &gt; Tversion request<br>
&gt;&gt; &gt; ffff = 2 bytes for 16bit message &quot;tag&quot;.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 00040000 = 4 bytes for the 32 bit maximum message payload size I&#39;m<br>
&gt;&gt; &gt; negotiating with the 9P server.  This is little endian for 1024<br>
&gt;&gt; &gt; 0600 =  2 bytes for 16 bit value for the length of the &quot;string&quot; I&#39;m<br>
&gt;&gt; &gt; sending.<br>
&gt;&gt; &gt;  The strings are *NOT* null terminated in 9p, and this is little endian<br>
&gt;&gt; &gt; for<br>
&gt;&gt; &gt; 6 bytes remaining.<br>
&gt;&gt; &gt; 5032303030 = 6 bytes the ASCII or UTF-8 string &quot;9P2000&quot; which is 6 bytes<br>
&gt;&gt; &gt; 4 + 1 + 2 + 4 + 2 + 6 = 19 bytes.<br>
&gt;&gt; &gt; As far as I can see, my &quot;get&quot; code does NOT ask for a 20th byte, so why<br>
&gt;&gt; &gt; am I<br>
&gt;&gt; &gt; getting that error?<br>
&gt;&gt; &gt; get = do s &lt;- getWord32le  -- 4<br>
&gt;&gt; &gt;              mtype &lt;- getWord8  -- 1<br>
&gt;&gt; &gt;              getSpecific s mtype<br>
&gt;&gt; &gt;         where<br>
&gt;&gt; &gt;           getSpecific s mt<br>
&gt;&gt; &gt;                       | mt == mtRversion = do t &lt;- getWord16le -- 2<br>
&gt;&gt; &gt;                                               ms &lt;- getWord32le  -- 4<br>
&gt;&gt; &gt;                                               ss &lt;- getWord16le -- 2<br>
&gt;&gt; &gt;                                               v &lt;-<br>
&gt;&gt; &gt; getRemainingLazyByteString  -- remaining should be 6 bytes.<br>
&gt;&gt; &gt;                                               return $ MessageClient $<br>
&gt;&gt; &gt; Rversion {size=s,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                         mtype=mt,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                         tag=t,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                         msize=ms,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                         ssize=ss,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                         version=v}<br>
&gt;&gt; &gt; Should I file a bug?  I don&#39;t believe I should be seeing an error<br>
&gt;&gt; &gt; message<br>
&gt;&gt; &gt; claiming a failure at the 20th byte when I&#39;ve never asked for one.<br>
&gt;&gt; &gt; Dave<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On Tue, Jun 2, 2009 at 10:51 AM, John Van Enk &lt;<a href="mailto:vanenkj@gmail.com" target="_blank">vanenkj@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Thomas,<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; You&#39;re correct. For some reason, I based my advice on the thought that<br>
&gt;&gt; &gt;&gt; 19 was the minimum size instead of 13.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; On Tue, Jun 2, 2009 at 1:24 PM, Thomas DuBuisson<br>
&gt;&gt; &gt;&gt; &lt;<a href="mailto:thomas.dubuisson@gmail.com" target="_blank">thomas.dubuisson@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;&gt; I think getRemainingLazyByteString expects at least one byte<br>
&gt;&gt; &gt;&gt; &gt; No, it works with an empty bytestring.  Or, my tests do with binary<br>
&gt;&gt; &gt;&gt; &gt; 0.5.0.1.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; The specific error means you are requiring more data than providing.<br>
&gt;&gt; &gt;&gt; &gt; First check the length of the bytestring you pass in to the to level<br>
&gt;&gt; &gt;&gt; &gt; decode (or &#39;get&#39;) routine and walk though that to figure out how much<br>
&gt;&gt; &gt;&gt; &gt; it should be consuming.  I notice you have a guard on the<br>
&gt;&gt; &gt;&gt; &gt; &#39;getSpecific&#39; function, hopefully you&#39;re sure the case you gave us is<br>
&gt;&gt; &gt;&gt; &gt; the branch being taken.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; I think the issue isn&#39;t with the code provided.  I cleaned up the<br>
&gt;&gt; &gt;&gt; &gt; code<br>
&gt;&gt; &gt;&gt; &gt; (which did change behavior due to the guard and data declarations<br>
&gt;&gt; &gt;&gt; &gt; that<br>
&gt;&gt; &gt;&gt; &gt; weren&#39;t in the mailling) and it works fine all the way down to the<br>
&gt;&gt; &gt;&gt; &gt; expected minimum of 13 bytes.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; import Data.ByteString.Lazy<br>
&gt;&gt; &gt;&gt; &gt;&gt; import Data.Binary<br>
&gt;&gt; &gt;&gt; &gt;&gt; import Data.Binary.Get<br>
&gt;&gt; &gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; data RV =<br>
&gt;&gt; &gt;&gt; &gt;&gt; Rversion {     size   :: Word32,<br>
&gt;&gt; &gt;&gt; &gt;&gt;                mtype  :: Word8,<br>
&gt;&gt; &gt;&gt; &gt;&gt;                tag    :: Word16,<br>
&gt;&gt; &gt;&gt; &gt;&gt;                msize  :: Word32,<br>
&gt;&gt; &gt;&gt; &gt;&gt;                ssize  :: Word16,<br>
&gt;&gt; &gt;&gt; &gt;&gt;                version :: ByteString}<br>
&gt;&gt; &gt;&gt; &gt;&gt;       deriving (Eq, Ord, Show)<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt;&gt; instance Binary RV where<br>
&gt;&gt; &gt;&gt; &gt;&gt;  get = do s &lt;- getWord32le<br>
&gt;&gt; &gt;&gt; &gt;&gt;          mtype &lt;- getWord8<br>
&gt;&gt; &gt;&gt; &gt;&gt;          getSpecific s mtype<br>
&gt;&gt; &gt;&gt; &gt;&gt;   where<br>
&gt;&gt; &gt;&gt; &gt;&gt;    getSpecific s mt = do t &lt;- getWord16le<br>
&gt;&gt; &gt;&gt; &gt;&gt;                          ms &lt;- getWord32le<br>
&gt;&gt; &gt;&gt; &gt;&gt;                          ss &lt;- getWord16le<br>
&gt;&gt; &gt;&gt; &gt;&gt;                          v &lt;- getRemainingLazyByteString<br>
&gt;&gt; &gt;&gt; &gt;&gt;                          return $ Rversion {size=s,<br>
&gt;&gt; &gt;&gt; &gt;&gt;                                             mtype=mt,<br>
&gt;&gt; &gt;&gt; &gt;&gt;                                             tag=t,<br>
&gt;&gt; &gt;&gt; &gt;&gt;                                             msize=ms,<br>
&gt;&gt; &gt;&gt; &gt;&gt;                                             ssize=ss,<br>
&gt;&gt; &gt;&gt; &gt;&gt;                                             version=v }<br>
&gt;&gt; &gt;&gt; &gt;&gt;  put _ = undefined<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; --<br>
&gt;&gt; &gt;&gt; /jve<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; _______________________________________________<br>
&gt;&gt; &gt; Haskell-Cafe mailing list<br>
&gt;&gt; &gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt;&gt; &gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; /jve<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
&gt;<br>
</div></div></blockquote></div></div></div><br>
</blockquote></div><br>