packages feed

netw-0.1.0.0: src/Netw/Internal/Enum.hsc

{-# OPTIONS_GHC -Wno-missing-pattern-synonym-signatures #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE TemplateHaskell #-}
module Netw.Internal.Enum where
import Netw.Internal.Protocols
{- NOTE: This module is platform-depenent (Linux)
 - -}
#include <sys/socket.h>
#include <netinet/in.h>

import Foreign
import Foreign.C


newtype ProtocolFamily  = ProtocolFamily CInt deriving (Eq)
-- TODO: Add more and maybe use macro to check if value is defined
-- PF_LOCAL and PF_UNIX should be the same on every platform
#if linux_HOST_OS
pattern PF_UNIX         = ProtocolFamily #{const PF_UNIX       }
pattern PF_LOCAL        = ProtocolFamily #{const PF_LOCAL      }
pattern PF_INET         = ProtocolFamily #{const PF_INET       }
pattern PF_AX25         = ProtocolFamily #{const PF_AX25       }
pattern PF_IPX          = ProtocolFamily #{const PF_IPX        }
pattern PF_APPLETALK    = ProtocolFamily #{const PF_APPLETALK  }
pattern PF_NETROM       = ProtocolFamily #{const PF_NETROM     }
pattern PF_BRIDGE       = ProtocolFamily #{const PF_BRIDGE     }
pattern PF_ATMPVC       = ProtocolFamily #{const PF_ATMPVC     }
pattern PF_X25          = ProtocolFamily #{const PF_X25        }
pattern PF_INET6        = ProtocolFamily #{const PF_INET6      }
pattern PF_ROSE         = ProtocolFamily #{const PF_ROSE       }
pattern PF_DECnet       = ProtocolFamily #{const PF_DECnet     }
pattern PF_NETBEUI      = ProtocolFamily #{const PF_NETBEUI    }
pattern PF_SECURITY     = ProtocolFamily #{const PF_SECURITY   }
pattern PF_KEY          = ProtocolFamily #{const PF_KEY        }
pattern PF_NETLINK      = ProtocolFamily #{const PF_NETLINK    }
pattern PF_PACKET       = ProtocolFamily #{const PF_PACKET     }
pattern PF_ECONET       = ProtocolFamily #{const PF_ECONET     }
pattern PF_ATMSVC       = ProtocolFamily #{const PF_ATMSVC     }
pattern PF_RDS          = ProtocolFamily #{const PF_RDS        }
pattern PF_IRDA         = ProtocolFamily #{const PF_IRDA       }
pattern PF_PPPOX        = ProtocolFamily #{const PF_PPPOX      }
pattern PF_WANPIPE      = ProtocolFamily #{const PF_WANPIPE    }
pattern PF_LLC          = ProtocolFamily #{const PF_LLC        }
pattern PF_IB           = ProtocolFamily #{const PF_IB         }
pattern PF_MPLS         = ProtocolFamily #{const PF_MPLS       }
pattern PF_CAN          = ProtocolFamily #{const PF_CAN        }
pattern PF_TIPC         = ProtocolFamily #{const PF_TIPC       }
pattern PF_BLUETOOTH    = ProtocolFamily #{const PF_BLUETOOTH  }
pattern PF_IUCV         = ProtocolFamily #{const PF_IUCV       }
pattern PF_RXRPC        = ProtocolFamily #{const PF_RXRPC      }
pattern PF_ISDN         = ProtocolFamily #{const PF_ISDN       }
pattern PF_PHONET       = ProtocolFamily #{const PF_PHONET     }
pattern PF_IEEE802154   = ProtocolFamily #{const PF_IEEE802154 }
pattern PF_CAIF         = ProtocolFamily #{const PF_CAIF       }
pattern PF_ALG          = ProtocolFamily #{const PF_ALG        }
pattern PF_VSOCK        = ProtocolFamily #{const PF_VSOCK      }
pattern PF_KCM          = ProtocolFamily #{const PF_KCM        }
pattern PF_QIPCRTR      = ProtocolFamily #{const PF_QIPCRTR    }
pattern PF_SMC          = ProtocolFamily #{const PF_SMC        }
pattern PF_XDP          = ProtocolFamily #{const PF_XDP        }
#endif

newtype SocketType      = SocketType CInt deriving (Eq, Bits)
pattern SOCK_STREAM     = SocketType #{const SOCK_STREAM    }
pattern SOCK_DGRAM      = SocketType #{const SOCK_DGRAM     }
pattern SOCK_SEQPACKET  = SocketType #{const SOCK_SEQPACKET }

#if linux_HOST_OS
pattern SOCK_RAW        = SocketType #{const SOCK_RAW       }
pattern SOCK_RDM        = SocketType #{const SOCK_RDM       }
pattern SOCK_PACKET     = SocketType #{const SOCK_PACKET    }

-- These are a little different
pattern SOCK_NONBLOCK   = SocketType #{const SOCK_NONBLOCK  }
pattern SOCK_CLOEXEC    = SocketType #{const SOCK_CLOEXEC   }
#endif

newtype Protocol        = Protocol CInt deriving Eq
pattern DefaultProtocol = Protocol 0
-- Some values have different name from the equivalent in 
-- netinet/in.h
$(declareProtocols 'Protocol)

-- These value are not defined in /etc/protocols but is defined
-- in netinet/in.h
#if linux_HOST_OS
pattern IPPROTO_IP      = Protocol #{const IPPROTO_IP   }
pattern IPPROTO_RAW     = Protocol #{const IPPROTO_RAW  }
pattern IPPROTO_MPTCP   = Protocol #{const IPPROTO_MPTCP}
pattern IPPROTO_MH      = Protocol #{const IPPROTO_MH   }
#endif

newtype MsgFlags        = MsgFlags CInt deriving (Eq, Bits, Storable)
pattern MSG_EOR         = MsgFlags #{const MSG_EOR      }
pattern MSG_OOB         = MsgFlags #{const MSG_OOB      }
pattern MSG_NOSIGNAL    = MsgFlags #{const MSG_NOSIGNAL }
pattern MSG_PEEK        = MsgFlags #{const MSG_PEEK     }
pattern MSG_WAITALL     = MsgFlags #{const MSG_WAITALL  }
pattern MSG_TRUNC       = MsgFlags #{const MSG_TRUNC    }
pattern MSG_CTRUNC      = MsgFlags #{const MSG_CTRUNC   }

-- These seem to be specific to linux
-- They don't appear in posix man pages
#if linux_HOST_OS
pattern MSG_CONFIRM      = MsgFlags (#const MSG_CONFIRM   )   
pattern MSG_DONTROUTE    = MsgFlags (#const MSG_DONTROUTE )   
pattern MSG_DONTWAIT     = MsgFlags (#const MSG_DONTWAIT  )   
pattern MSG_MORE         = MsgFlags (#const MSG_MORE      )   
pattern MSG_FASTOPEN     = MsgFlags (#const MSG_FASTOPEN  )    

pattern MSG_CMSG_CLOEXEC = MsgFlags (#const MSG_CMSG_CLOEXEC )
pattern MSG_ERRQUEUE     = MsgFlags (#const MSG_ERRQUEUE     )
#endif

newtype ShutHow   = ShutHow CInt
pattern SHUT_RD   = ShutHow #{const SHUT_RD  }
pattern SHUT_WR   = ShutHow #{const SHUT_WR  }
pattern SHUT_RDWR = ShutHow #{const SHUT_RDWR}