[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [tor-dev] PRELIMINARY: [PATCH] Adapt to changes in 'GHC.Handle'.



> It would be a bit sad if it fell to me to reviewing the haskell code
> alone, since I don't really know Haskell very well.

If so, don't spend too much time on the preliminary patches.  I think
that quick review is enough at this point.

> I get that this is required for more warnings, though, and I think
> it's okay to turn it off temporarily.

Yes, '-Werror' converts all warnings into errors [1], but it also
hides useful messages sometimes.  '-Werror' is "suitable for
development but not release.  [...]  The package will break silently
as soon as the next version of ghc adds a new warning, which generally
does happen every major release." [2]

> Is there a conditional build thing where we can get -Werror when
> developing, and turn it off for hackage?

Yep, take a look at [3] and [4].  (I'll ask someone about Hackage.)

What do you think about an attached patch?  We can add other flags if
it's needed.

Example ('git pull' and 'git am' were omitted):

# ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.12.1
# cabal --version
cabal-install version 1.16.0.2
using version 1.16.0 of the Cabal library
# ./Setup.lhs configure --user

[...]

Configuring TorDNSEL-0.1.1...
# ./Setup.lhs build

[...]

dist/build/tordnsel/tordnsel-tmp/TorDNSEL/Util.hs:1:11:
    Warning: -#include is deprecated: No longer has any effect
[ 4 of 39] Compiling TorDNSEL.Util    ( dist/build/tordnsel/tordnsel-tmp/TorDNSEL/Util.hs, dist/build/tordnsel/tordnsel-tmp/TorDNSEL/Util.o )

src/TorDNSEL/Util.hsc:143:23:
    Module `GHC.Handle' does not export `fillReadBuffer'

src/TorDNSEL/Util.hsc:143:39:
    Module `GHC.Handle' does not export `readCharFromBuffer'

src/TorDNSEL/Util.hsc:145:26:
    Module `GHC.IOBase' does not export `Buffer(..)'

# ./Setup.lhs configure --user -f devel

[...]

# ./Setup.lhs build

[...]

dist/build/tordnsel/tordnsel-tmp/TorDNSEL/Main.hs:3:11:
    Warning: -#include is deprecated: No longer has any effect

<no location info>: 
Failing due to -Werror.

I don't think there is a need to push this patch right now.  There
might be other issues (for instance, incorrect build dependencies.)

> Hm.  I don't understand how the hgetLineN implementation can work.  It
> looks like it reads N bytes unconditionally, then looks for the EOL
> marker in them , and returns everything before the EOL marker... but
> what does it do with everything after the EOL marker?  It appears to
> me that if the EOL marker is not right at the end of the N bytes,
> those bytes would get lost.

Right, should it work differently?  (Again, I haven't inspected
'hGetLine' yet.)

The current version allows to estimate a worst case scenario because
it reads N bytes unconditionally.  But it might be better to look for
the EOL marker first, then check the number of bytes.  What do you
think?

> Am I missing something there?  Do the extra bytes get put back somehow?

No.  Here is an example:

# cat > Main.hs
module Main where
import Data.ByteString
import qualified Data.ByteString.Char8 as B
import System.IO

-- | Read @n@ bytes from @handle@; strip @eol@ (e.g., @'B.pack' "\r\n"@)
-- and everything after it.
hGetLineN :: Handle -> ByteString -> Int -> IO ByteString
hGetLineN handle eol n = do
  hSetBuffering handle LineBuffering
  bStr <- B.hGet handle n
  return $ fst $ B.breakSubstring eol bStr

main = do
  handle <- openFile "test.txt" ReadMode
  hGetLineN handle (B.pack "\n") 42

# echo -e "foo\nbar\nbaz" > test.txt
# runhaskell Main
"foo"

Does it answer your question?

(FYI: a chapter about I/O [5], an introduction to bytestrings [6], and
a search engine [7].)

>> If you apply both patches (with GHC 7.6.3), the following errors will
>> appear:
>>
>> [ 3 of 39] Compiling TorDNSEL.Compat.Exception ( src/TorDNSEL/Compat/Exception.hs, dist/build/tordnsel/tordnsel-tmp/TorDNSEL/Compat/Exception.o ) [dist/build/autogen/cabal_macros.h changed]
>> [ 4 of 39] Compiling TorDNSEL.System.Timeout ( src/TorDNSEL/System/Timeout.hs, dist/build/tordnsel/tordnsel-tmp/TorDNSEL/System/Timeout.o )

> I don't see the errors there... did they go to stderr or something?

I was a bit sleepy and messed it up.  Here is the right output:

src/TorDNSEL/System/Timeout.hs:56:47:
    Module `TorDNSEL.Compat.Exception' does not export `throwDynTo'

src/TorDNSEL/System/Timeout.hs:56:59:
    Module `TorDNSEL.Compat.Exception' does not export `dynExceptions'

> Seems reasonable.  It might also be good to have a publicly git
> repository somewhere where you work on the branch, that can store all
> of the preliminary repositories.

Can I create a new branch here [8]?  If so, should I also send patches
and comments to this list, or will it only annoy everyone?

[1] http://www.haskell.org/ghc/docs/7.6.3/html/users_guide/flag-reference.html
[2] http://hackage.haskell.org/trac/hackage/ticket/191
[3] http://www.haskell.org/cabal/users-guide/developing-packages.html#configurations
[4] http://www.haskell.org/cabal/users-guide/installing-packages.html#controlling-flag-assignments
[5] http://learnyouahaskell.com/input-and-output#hello-world
[6] https://www.fpcomplete.com/school/pick-of-the-week/bytestring-bits-and-pieces
[7] http://www.haskell.org/hoogle/
[8] https://gitweb.torproject.org/tordnsel.git

From a54dbe1d21ba44b2ff108182be809c3096d918d7 Mon Sep 17 00:00:00 2001
From: Nikita Karetnikov <nikita@xxxxxxxxxxxxxx>
Date: Fri, 21 Jun 2013 19:31:28 +0000
Subject: [PATCH] Add 'Flag Devel' to 'tordnsel.cabal', and update its layout.

---
 tordnsel.cabal |  159 +++++++++++++++++++++++++++++++-------------------------
 1 files changed, 88 insertions(+), 71 deletions(-)

diff --git a/tordnsel.cabal b/tordnsel.cabal
index 243e026..09a273e 100644
--- a/tordnsel.cabal
+++ b/tordnsel.cabal
@@ -1,74 +1,91 @@
-Name:            TorDNSEL
-Version:         0.1.1-dev
-Synopsis:        provides a DNSBL-style interface for detecting Tor exit nodes
-Description:     TorDNSEL implements a design for a DNSBL-style interface for
-  detecting connections exiting the Tor network. This design and its rationale
-  is described at <https://gitweb.torproject.org/tordnsel.git/blob/HEAD:/doc/torel-design.txt>.
-License:         PublicDomain
-License-File:    LICENSE
-Homepage:        http://p56soo2ibjkx23xo.onion/
-Package-URL: https://archive.torproject.org/tor-package-archive/tordnsel/tordnsel-0.1.1.tar.gz
-Author:          tup
-Maintainer:      tup.tuple@xxxxxxxxxxxxxx, lunar@xxxxxxxxxx, andrew@xxxxxxxxxxxxxx
-Build-Type:      Simple
-Build-Depends:   base>=2.0, network>=2.0, mtl>=1.0, unix>=1.0, stm>=2.0,
-  time>=1.0, HUnit>=1.1, binary>=0.4, bytestring>=0.9, array>=0.1, directory>=1.0,
-  containers>=0.1
-Tested-With:     GHC==6.6, GHC==6.8, GHC==6.10, GHC==6.12
-Data-Files:      config/tordnsel.conf.sample, contrib/cacti-input.pl,
+Name:          TorDNSEL
+Version:       0.1.1-dev
+Cabal-Version: >= 1.2
+Synopsis:      DNSBL-style interface for detecting Tor exit nodes
+Description:   TorDNSEL implements a design for a DNSBL-style interface
+  for detecting connections exiting the Tor network.  This design and
+  its rationale are described at
+  <https://gitweb.torproject.org/tordnsel.git/blob/HEAD:/doc/torel-design.txt>.
+License:       PublicDomain
+License-File:  LICENSE
+Homepage:      http://p56soo2ibjkx23xo.onion/
+Package-URL:   https://archive.torproject.org/tor-package-archive/tordnsel/tordnsel-0.1.1.tar.gz
+Author:        tup
+Maintainer:    tup.tuple@xxxxxxxxxxxxxx, lunar@xxxxxxxxxx, andrew@xxxxxxxxxxxxxx
+Build-Type:    Simple
+Tested-With:   GHC==6.6, GHC==6.8, GHC==6.10, GHC==6.12
+Data-Files:    config/tordnsel.conf.sample, contrib/cacti-input.pl,
   contrib/tordnsel-init.d-script.sample, doc/tordnsel.8
 
-Executable:      tordnsel
-Main-Is:         tordnsel.hs
-Other-Modules:   TorDNSEL.Config,
-                 TorDNSEL.Config.Internals,
-                 TorDNSEL.Control.Concurrent.Link,
-                 TorDNSEL.Control.Concurrent.Link.Internals,
-                 TorDNSEL.Control.Concurrent.Util,
-                 TorDNSEL.DeepSeq,
-                 TorDNSEL.Directory,
-                 TorDNSEL.Directory.Internals,
-                 TorDNSEL.DistinctQueue,
-                 TorDNSEL.DNS,
-                 TorDNSEL.DNS.Internals,
-                 TorDNSEL.DNS.Server,
-                 TorDNSEL.DNS.Server.Internals,
-                 TorDNSEL.Document,
-                 TorDNSEL.ExitTest.Initiator,
-                 TorDNSEL.ExitTest.Initiator.Internals,
-                 TorDNSEL.ExitTest.Request,
-                 TorDNSEL.ExitTest.Server,
-                 TorDNSEL.ExitTest.Server.Internals,
-                 TorDNSEL.Log,
-                 TorDNSEL.Log.Internals,
-                 TorDNSEL.Main,
-                 TorDNSEL.NetworkState,
-                 TorDNSEL.NetworkState.Internals,
-                 TorDNSEL.NetworkState.Storage,
-                 TorDNSEL.NetworkState.Storage.Internals,
-                 TorDNSEL.NetworkState.Types,
-                 TorDNSEL.Random,
-                 TorDNSEL.Socks,
-                 TorDNSEL.Socks.Internals,
-                 TorDNSEL.Statistics,
-                 TorDNSEL.Statistics.Internals,
-                 TorDNSEL.System.Timeout,
-                 TorDNSEL.TorControl,
-                 TorDNSEL.TorControl.Internals,
-                 TorDNSEL.Util
-HS-Source-Dirs:  src
-Includes:        sys/types.h, unistd.h, sysexits.h, netinet/in.h, openssl/rand.h
-Extra-Libraries: crypto
-GHC-Options:     -O2 -Wall -Werror -DVERSION="0.1.1-dev"
+Flag Devel
+  Description: Enable almost all warnings, and make them fatal
+  Default:     False
 
-Executable:      runtests
-Buildable:       False
-Main-Is:         runtests.hs
-Other-Modules:   TorDNSEL.Config.Tests,
-                 TorDNSEL.Directory.Tests,
-                 TorDNSEL.DNS.Tests,
-                 TorDNSEL.DNS.Server.Tests
-HS-Source-Dirs:  src
-Includes:        netinet/in.h, openssl/rand.h
-Extra-Libraries: crypto
-GHC-Options:     -fasm -Wall -Werror -fno-warn-missing-signatures
+Executable         tordnsel
+  Build-Depends:   base>=2.0, network>=2.0, mtl>=1.0, unix>=1.0, stm>=2.0,
+    time>=1.0, binary>=0.4, bytestring>=0.9, array>=0.1,
+    directory>=1.0, containers>=0.1
+  Main-Is:         tordnsel.hs
+  Other-Modules:   TorDNSEL.Config,
+                   TorDNSEL.Config.Internals,
+                   TorDNSEL.Control.Concurrent.Link,
+                   TorDNSEL.Control.Concurrent.Link.Internals,
+                   TorDNSEL.Control.Concurrent.Util,
+                   TorDNSEL.DeepSeq,
+                   TorDNSEL.Directory,
+                   TorDNSEL.Directory.Internals,
+                   TorDNSEL.DistinctQueue,
+                   TorDNSEL.DNS,
+                   TorDNSEL.DNS.Internals,
+                   TorDNSEL.DNS.Server,
+                   TorDNSEL.DNS.Server.Internals,
+                   TorDNSEL.Document,
+                   TorDNSEL.ExitTest.Initiator,
+                   TorDNSEL.ExitTest.Initiator.Internals,
+                   TorDNSEL.ExitTest.Request,
+                   TorDNSEL.ExitTest.Server,
+                   TorDNSEL.ExitTest.Server.Internals,
+                   TorDNSEL.Log,
+                   TorDNSEL.Log.Internals,
+                   TorDNSEL.Main,
+                   TorDNSEL.NetworkState,
+                   TorDNSEL.NetworkState.Internals,
+                   TorDNSEL.NetworkState.Storage,
+                   TorDNSEL.NetworkState.Storage.Internals,
+                   TorDNSEL.NetworkState.Types,
+                   TorDNSEL.Random,
+                   TorDNSEL.Socks,
+                   TorDNSEL.Socks.Internals,
+                   TorDNSEL.Statistics,
+                   TorDNSEL.Statistics.Internals,
+                   TorDNSEL.System.Timeout,
+                   TorDNSEL.TorControl,
+                   TorDNSEL.TorControl.Internals,
+                   TorDNSEL.Util
+  HS-Source-Dirs:  src
+  Includes:        sys/types.h, unistd.h, sysexits.h, netinet/in.h,
+    openssl/rand.h
+  Extra-Libraries: crypto
+  cpp-options:     -DVERSION="0.1.1-dev"
+
+  if flag(devel)
+    GHC-Options: -O2 -Wall -Werror
+  else
+    GHC-Options: -O2
+
+Executable         runtests
+  Build-Depends:   HUnit>=1.1
+  Buildable:       False
+  Main-Is:         runtests.hs
+  Other-Modules:   TorDNSEL.Config.Tests,
+                   TorDNSEL.Directory.Tests,
+                   TorDNSEL.DNS.Tests,
+                   TorDNSEL.DNS.Server.Tests
+  HS-Source-Dirs:  src
+  Includes:        netinet/in.h, openssl/rand.h
+  Extra-Libraries: crypto
+
+  if flag(devel)
+    GHC-Options: -fasm -Wall -Werror
+  else
+    GHC-Options: -fasm -fno-warn-missing-signatures
-- 
1.7.5.4

Attachment: pgpa5w2opXPdU.pgp
Description: PGP signature

_______________________________________________
tor-dev mailing list
tor-dev@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-dev