30 January 2017

patching Network-NineP

System: Microsoft Windows XP Home Edition
CPUs: Intel(R) Atom(TM) CPU N270 @1.60GHz
Deps: HaskellPlatform-2014.2.0.0-i386-setup.exe

I am suspending further work on this project after initially
patching the hackage download to compile on GNU/Linux,
basically because I don't like the [MSYS2] toolchain that's
shipped with the current HaskellPlatform.

The GitHub network-ninep-0.0.1 download contains code using withSocketsDo,
purportedly needed to be able to use Winsock - I believe binary > might be
a dependency for that download, however withSocketsDo is not appearing in the
hackage Network-NineP downloads, of which incidentally, though I admit I have
not researched it thouroughly, if the GitHub release preceded those from hackage,
some of the former's code might appear to have been split off into separate NineP
downloads: https://github.com/Elemir/network-ninep

The Network-NineP-0.4.1 package compiled on Slackware-14.0 after
adding this line following the comments at the top of Error.hs. If you are
installing into '--prefix=/usr' you might want to change the executable's
name in the cabal file, so it does not conflict with Slackware's /bin/test,
/usr/bin contains a symbolic link to /bin/test.

{-# LANGUAGE DeriveDataTypeable #-}

On Windows XP the compile fails on the 8th of a total of 9 files,
the same occurs on HaskellPlatform-7.10.2-a-i386-setup.exe.

HaskellPlatform-7.10.3-i386-setup.exe installed on XP fails to
load time-

HaskellPlatform-8.0.2-full-i386-setup.exe requires at minimum
Windows 7, as that version's ghc.exe uses the procedure entry
point _wsplitpath_s, introduced in the Windows 7 msvcrt.dll.

After importing Network (from network- in ghci.exe
the 'Not in scope' error occurs.

Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Eric>ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
ghci> import Network
ghci> :t UnixSocket

<interactive>:1:1: Not in scope: data constructor `UnixSocket'
ghci> :q
Leaving GHCi.

C:\Documents and Settings\Eric>EXIT

This however doesn't occur on Slackware-14.0 using network-

sh-4.2$ ghci
GHCi, version 7.8.4: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
ghci> import Network
ghci> :t UnixSocket
UnixSocket :: String -> PortID
ghci> :q
Leaving GHCi.

sh-4.2$ exit


The parsec version (accompanying the above download) and convertible-
need to use the identical version of the text package.

C:\Documents and Settings\Eric>CD \

C:\>cabal update
Config file path source is default config file.
Config file C:\Documents and Settings\Eric\Application Data\cabal\config not
Writing default configuration to C:\Documents and Settings\Eric\Application
Downloading the latest package list from hackage.haskell.org
Note: there is a new version of cabal-install available.
To upgrade, run: cabal install cabal-install

C:\>cabal install NineP- transformers-compat-
Resolving dependencies...
Downloading NineP-
Downloading transformers-compat-
Configuring NineP-
Configuring transformers-compat-
Building NineP-
Building transformers-compat-
Installed transformers-compat-
Installed NineP-

C:\>cabal install exceptions- hslogger-1.2.10 monad-loops-0.4.3
Resolving dependencies...
Downloading exceptions-
Downloading monad-loops-0.4.3...
Downloading hslogger-1.2.10...
Configuring monad-loops-0.4.3...
Configuring exceptions-
Building monad-loops-0.4.3...
Building exceptions-
Installed monad-loops-0.4.3
Configuring hslogger-1.2.10...
Installed exceptions-
Building hslogger-1.2.10...
Installed hslogger-1.2.10

C:\>cabal install convertible- extensible-exceptions-
Resolving dependencies...
Downloading convertible-
Downloading extensible-exceptions-
Configuring extensible-exceptions-
Configuring convertible-
Building extensible-exceptions-
Building convertible-
Installed extensible-exceptions-
Installed convertible-

C:\>cabal install monad-peel- mstate-0.2.7 stateref-0.3
Resolving dependencies...
Downloading monad-peel-
Downloading stateref-0.3...
Configuring stateref-0.3...
Configuring monad-peel-
Building stateref-0.3...
Building monad-peel-
Installed monad-peel-
Downloading mstate-0.2.7...
Configuring mstate-0.2.7...
Installed stateref-0.3
Building mstate-0.2.7...
Installed mstate-0.2.7



Download and extract Network-NineP-0.4.1.tar.gz, adding
this line following the comments at the top of Error.hs.

{-# LANGUAGE DeriveDataTypeable #-}

Then run the commands.

C:\Network-NineP-0.4.1>runhaskell Setup configure --user
Configuring Network-NineP-0.4.1...

C:\Network-NineP-0.4.1>runhaskell Setup build
Building Network-NineP-0.4.1...
Preprocessing library Network-NineP-0.4.1...
[1 of 9] Compiling Network.NineP.Error ( Network\NineP\Error.hs, dist\build\Netw
ork\NineP\Error.o )
[2 of 9] Compiling Control.Monad.EmbedIO ( Control\Monad\EmbedIO.hs, dist\build\
Control\Monad\EmbedIO.o )
[3 of 9] Compiling Network.NineP.Internal.File ( Network\NineP\Internal\File.hs,
 dist\build\Network\NineP\Internal\File.o )
[4 of 9] Compiling Network.NineP.File ( Network\NineP\File.hs, dist\build\Networ
k\NineP\File.o )
[5 of 9] Compiling Network.NineP.File.Instances ( Network\NineP\File\Instances.h
s, dist\build\Network\NineP\File\Instances.o )
[6 of 9] Compiling Network.NineP.Internal.State ( Network\NineP\Internal\State.h
s, dist\build\Network\NineP\Internal\State.o )
[7 of 9] Compiling Network.NineP.Internal.Msg ( Network\NineP\Internal\Msg.hs, d
ist\build\Network\NineP\Internal\Msg.o )
[8 of 9] Compiling Network.NineP.Server ( Network\NineP\Server.hs, dist\build\Ne
twork\NineP\Server.o )

    Not in scope: data constructor `UnixSocket'


Here's the code block in Server.hs where the compile failed.

connection :: String -> IO Socket
connection s = let pat = "tcp!(.*)!([0-9]*)|unix!(.*)" :: ByteString
wrongAddr = ioError $ userError $ "wrong 9p connection address: " ++ s
(bef, _, aft, grps) = s =~ pat :: (String, String, String, [String])
in if (bef /= "" || aft /= "" || grps == [])
then wrongAddr
else case grps of
[addr, port, ""] -> listen' addr $ toEnum $ (fromMaybe 2358 $ maybeRead port :: Int)
["", "", addr]  -> listenOn $ UnixSocket addr
_ -> wrongAddr

NB: The package version numbers above were selected so one could install yi-0.10.1 on
top of this without breaking any packages.