Hello, 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. Thanks, Karel 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 <k...@outback.escape.de> 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 >