+
+
+getGroupID :: [CmdOpt] -> IO GroupID
+getGroupID opts
+ = do let xs = mapMaybe (\ x -> case x of
+ OptGroupName n -> Just n
+ _ -> Nothing) opts
+ name = case xs of
+ [] -> defaultGroupName
+ (x:[]) -> x
+ _ -> error "too many --group options."
+
+ groupEnt <- getGroupEntryForName name
+ return $ groupID groupEnt
+
+
+getLocalStateDir :: [CmdOpt] -> IO FilePath
+getLocalStateDir opts
+ = do let xs = mapMaybe (\ x -> case x of
+ OptLSDir n -> Just n
+ _ -> Nothing) opts
+ path = case xs of
+ [] -> defaultLocalStateDir
+ (x:[]) -> x
+ _ -> error "too many --localstatedir options."
+
+ return path
+
+
+createLocalStateDir :: FilePath -> UserID -> GroupID -> IO ()
+createLocalStateDir path uid gid
+ = do createDirectoryIfMissing True path
+ setOwnerAndGroup path uid gid