opam-version: "2.0"
maintainer: "Anil Madhavapeddy <anil@recoil.org>"
authors: "Anil Madhavapeddy <anil@recoil.org>"
homepage: "https://github.com/mirage/ocaml-vmnet"
bug-reports: "https://github.com/mirage/ocaml-vmnet/issues"
dev-repo: "git+https://github.com/mirage/ocaml-vmnet.git"
license: "ISC"
build: [
  ["./configure" "--prefix=%{prefix}%"]
  [make]
]
install: [make "install"]
remove: ["ocamlfind" "remove" "vmnet"]
depends: [
  "ocaml"
  "ocamlfind" {build}
  "camlp4" {build}
  "type_conv" {build}
  "sexplib" {< "113.24.00"}
  "ipaddr" {>= "2.5.0" & < "3.0.0"}
  "lwt" {>= "2.4.3" & < "4.0.0"}
  "cstruct" {>= "1.4.0" & <= "1.9.0"}
  "ocamlbuild" {build}
]
available: os = "macos"
post-messages: [
  "This package requires the vmnet.framework plus development headers which are present in Yosemite (10.10.*) and later." {failure}
]
synopsis: "Userlevel network bridging on MacOS X"
description: """
MacOS X 10.10 (Yosemite) introduced the somewhat undocumented `vmnet`
framework.  This exposes virtual network interfaces to userland applications.
There are a number of advantages of this over previous implementations:

- Unlike [tuntaposx](http://tuntaposx.sourceforge.net/), this is builtin
  to MacOS X now and so is easier to package up and distribute for end users.
- `vmnet` uses the XPC sandboxing interfaces and should make it easier to
  drop a hard dependency on running networking applications as `root`.
- Most significantly, `vmnet` supports bridging network traffic to the
  outside world, which was previously unsupported.

These OCaml bindings are constructed against the documentation contained
in the `<vmnet.h>` header file in Yosemite, and may not be correct due to
the lack of any other example code.  However, they do suffice to run
[MirageOS](http://openmirage.org) applications that can connect to the
outside world.  The bindings are also slightly complicated by the need
to interface [GCD](http://en.wikipedia.org/wiki/Grand_Central_Dispatch)
thread pools with the OCaml runtime, so please report any instabilities
that you see when using this interface as a consumer.

There are two libraries provided:

- `Vmnet` is the raw OCaml binding to the `vmnet` framework, using
   OCaml preemptive threads to handle synchronisation.
- `Lwt_vmnet` uses the [Lwt](http://ocsigen.org/lwt) framework to
  provide a monadic asynchronous I/O interface at a higher level.

Most users should use `Lwt_vmnet` to handle guest traffic."""
flags: light-uninstall
url {
  src: "https://github.com/mirage/ocaml-vmnet/archive/v1.0.1.tar.gz"
  checksum: "md5=b1ff2c7323a8a7ff158227f5b2713bbd"
}
