Hi Karel,
On Sat, Jan 23, 2016 at 02:31:52PM +0100, Karel Gardas wrote:
> I've thought it would be nice if Haskell type checker would work into
> our strength. Attached patch defines algebraic data type Promise and
> use this for calling pledge sys call. The patch also provides two
> version of Promise to string conversion function. One is explicit and
> another is using show capability and just fixes prot_exec case.
>
> Any comments highly appreciated.
Well, it's of course more elegant, but it would also mean that
everytime a new pledge promise will be introduced or an existing
one removed, this type has to be changed. I don't know how stable
the set of promises of pledge(2) are, but it feels like a change
like this should be deferred until after 5.9.
Look at the changelogs of sys/pledge.h and sys/kern/kern_pledge.c
to get an idea about how things are still moving.
Ciao,
Kili
ps: at least the "audio" "drm" and "vmm" promises are missing in
your diff, so now we know how old your installation is ;-)
> Index: Process.hsc
> ===================================================================
> RCS file: /cvs/ports/lang/ghc/files/Process.hsc,v
> retrieving revision 1.1
> diff -u -p -u -r1.1 Process.hsc
> --- Process.hsc 20 Jan 2016 16:02:06 -0000 1.1
> +++ Process.hsc 23 Jan 2016 13:15:42 -0000
> @@ -1,14 +1,77 @@
> {-# LANGUAGE Safe #-}
>
> -module System.OpenBSD.Process ( pledge ) where
> +module System.OpenBSD.Process ( pledge, Promise(..) ) where
>
> import Foreign
> import Foreign.C
> import System.Posix.Internals ( withFilePath )
> +import Data.Char
>
> -pledge :: String -> Maybe [FilePath] -> IO ()
> +data Promise = Stdio
> + | RPath
> + | WPath
> + | CPath
> + | DPath
> + | TmpPath
> + | Inet
> + | FAttr
> + | FLock
> + | Unix
> + | Dns
> + | GetPW
> + | SendFD
> + | RecvFD
> + | IOCtl
> + | Tty
> + | Proc
> + | Exec
> + | ProtExec
> + | SetTime
> + | Ps
> + | VMInfo
> + | Id
> + | Pf
> + deriving (Show)
> +{-
> +promise2String :: Promise -> String
> +promise2String p = case p of
> + Stdio -> "stdio"
> + RPath -> "rpath"
> + WPath -> "wpath"
> + CPath -> "cpath"
> + DPath -> "dpath"
> + TmpPath -> "tmppath"
> + Inet -> "inet"
> + FAttr -> "fattr"
> + FLock -> "flock"
> + Unix -> "unix"
> + Dns -> "dns"
> + GetPW -> "getpw"
> + SendFD -> "sendfd"
> + RecvFD -> "recvfd"
> + IOCtl -> "ioctl"
> + Tty -> "tty"
> + Proc -> "proc"
> + Exec -> "exec"
> + ProtExec -> "prot_exec"
> + SetTime -> "settime"
> + Ps -> "ps"
> + VMInfo -> "vminfo"
> + Id -> "id"
> + Pf -> "pf"
> +-}
>
> -pledge promises paths =
> +promise2String :: Promise -> String
> +promise2String p = case p of
> + ProtExec -> "prot_exec"
> + _ -> map toLower (show p)
> +
> +pledge :: [Promise] -> Maybe [FilePath] -> IO ()
> +pledge promises = cpledge (unwords $ map promise2String promises)
> +
> +cpledge :: String -> Maybe [FilePath] -> IO ()
> +
> +cpledge promises paths =
> withCString promises $ \cproms ->
> withPaths2Array0 paths $ \paths_arr ->
> throwErrnoIfMinus1_ "pledge" (c_pledge cproms paths_arr)
>
> On Wed, Jan 20, 2016 at 5:38 AM, Matthias Kilian <[email protected]>
> wrote:
> > On Tue, Jan 19, 2016 at 08:43:17PM +0100, Matthias Kilian wrote:
> >> > Below is a hopefully correct and more complete diff. Again without
> >> > bump because I'll also merge -main and -doc.
> >>
> >> Famous last words. I missed the plist changes. Will send a new diff
> >> later (at the moment i'm rebuilding ghc).
> >
> > Here it is. Works fine for me, so I'm going to commit this in a few
> > hours.
> >
> > Index: Makefile
> > ===================================================================
> > RCS file: /cvs/ports/lang/ghc/Makefile,v
> > retrieving revision 1.131
> > diff -u -p -r1.131 Makefile
> > --- Makefile 28 Dec 2015 19:18:52 -0000 1.131
> > +++ Makefile 20 Jan 2016 04:24:09 -0000
> > @@ -157,6 +157,11 @@ PORTHOME = ${WRKDIR}
> >
> > TEST_DEPENDS = print/ghostscript/gnu
> >
> > +post-extract:
> > + cd ${WRKSRC}/libraries/unix && \
> > + mkdir -p System/OpenBSD && \
> > + install -m 644 ${FILESDIR}/Process.hsc System/OpenBSD
> > +
> > post-patch:
> > # - Install a precompiled binary.
> > cd ${WRKDIR}/ghc-${BIN_VER} && \
> > Index: files/Process.hsc
> > ===================================================================
> > RCS file: files/Process.hsc
> > diff -N files/Process.hsc
> > --- /dev/null 1 Jan 1970 00:00:00 -0000
> > +++ files/Process.hsc 20 Jan 2016 04:24:09 -0000
> > @@ -0,0 +1,26 @@
> > +{-# LANGUAGE Safe #-}
> > +
> > +module System.OpenBSD.Process ( pledge ) where
> > +
> > +import Foreign
> > +import Foreign.C
> > +import System.Posix.Internals ( withFilePath )
> > +
> > +pledge :: String -> Maybe [FilePath] -> IO ()
> > +
> > +pledge promises paths =
> > + withCString promises $ \cproms ->
> > + withPaths2Array0 paths $ \paths_arr ->
> > + throwErrnoIfMinus1_ "pledge" (c_pledge cproms paths_arr)
> > +
> > +withPaths2Array0 :: Maybe [FilePath] -> (Ptr (Ptr CChar) -> IO a) -> IO a
> > +
> > +withPaths2Array0 Nothing f = f nullPtr
> > +
> > +withPaths2Array0 (Just paths) f =
> > + withMany withFilePath paths $ \cstrs ->
> > + withArray0 nullPtr cstrs $ \paths_arr ->
> > + f paths_arr
> > +
> > +foreign import ccall unsafe "unistd.h pledge"
> > + c_pledge :: CString -> Ptr CString -> IO CInt
> > Index: patches/patch-libraries_unix_unix_cabal
> > ===================================================================
> > RCS file: patches/patch-libraries_unix_unix_cabal
> > diff -N patches/patch-libraries_unix_unix_cabal
> > --- /dev/null 1 Jan 1970 00:00:00 -0000
> > +++ patches/patch-libraries_unix_unix_cabal 20 Jan 2016 04:24:09 -0000
> > @@ -0,0 +1,12 @@
> > +$OpenBSD$
> > +--- libraries/unix/unix.cabal.orig Sun Jan 4 23:56:26 2015
> > ++++ libraries/unix/unix.cabal Tue Jan 19 00:42:33 2016
> > +@@ -109,6 +109,8 @@ library
> > + System.Posix.Terminal
> > + System.Posix.Terminal.ByteString
> > +
> > ++ System.OpenBSD.Process
> > ++
> > + other-modules:
> > + System.Posix.Directory.Common
> > + System.Posix.DynamicLinker.Common
> > Index: pkg/PLIST-main
> > ===================================================================
> > RCS file: /cvs/ports/lang/ghc/pkg/PLIST-main,v
> > retrieving revision 1.17
> > diff -u -p -r1.17 PLIST-main
> > --- pkg/PLIST-main 2 Nov 2015 21:31:26 -0000 1.17
> > +++ pkg/PLIST-main 20 Jan 2016 04:24:09 -0000
> > @@ -2228,6 +2228,9 @@ lib/ghc/trans_${TRANSFORMERS_KEY}/libHSt
> > lib/ghc/unix_${UNIX_KEY}/
> > lib/ghc/unix_${UNIX_KEY}/HSunix-${UNIX_VER}-${UNIX_KEY}.o
> > lib/ghc/unix_${UNIX_KEY}/System/
> > +lib/ghc/unix_${UNIX_KEY}/System/OpenBSD/
> > +lib/ghc/unix_${UNIX_KEY}/System/OpenBSD/Process.hi
> > +lib/ghc/unix_${UNIX_KEY}/System/OpenBSD/Process.p_hi
> > lib/ghc/unix_${UNIX_KEY}/System/Posix/
> > lib/ghc/unix_${UNIX_KEY}/System/Posix.hi
> > lib/ghc/unix_${UNIX_KEY}/System/Posix.p_hi
> >