···11+open Libbpf
22+open Libbpf_maps
33+44+let obj_path = "opentrace.bpf.o"
55+let program_names = [ "tracepoint__syscalls__sys_enter_openat" ]
66+77+module Open_event = struct
88+ open Ctypes
99+1010+ type t
1111+1212+ let t : t structure typ = Ctypes.structure "event"
1313+ let ( -: ) ty label = Ctypes.field t label ty
1414+ let pid = int -: "e_pid"
1515+ let flags = int -: "e_flags"
1616+ let mode = int -: "e_mode"
1717+ let filename = array 256 char -: "e_filename"
1818+ let () = seal t
1919+2020+ let char_array_as_string a =
2121+ let len = CArray.length a in
2222+ let b = Buffer.create len in
2323+ try
2424+ for i = 0 to len - 1 do
2525+ let c = CArray.get a i in
2626+ if c = '\x00' then raise Exit else Buffer.add_char b c
2727+ done;
2828+ Buffer.contents b
2929+ with Exit -> Buffer.contents b
3030+3131+ let get_pid s = getf s pid
3232+ let get_flags s = getf s flags
3333+ let get_mode s = getf s mode
3434+ let get_fname s = getf s filename |> char_array_as_string
3535+end
3636+3737+let () =
3838+ let bpf_callback obj _links =
3939+ (* Set signal handlers *)
4040+ let exitting = ref true in
4141+ let sig_handler = Sys.Signal_handle (fun _ -> exitting := false) in
4242+ Sys.(set_signal sigint sig_handler);
4343+ Sys.(set_signal sigterm sig_handler);
4444+4545+ (* Print header *)
4646+ Format.printf "pid,flags,mode,filename\n";
4747+4848+ let map = Libbpf.bpf_object_find_map_by_name obj "rb" in
4949+ let callback : RingBuffer.callback =
5050+ fun _ data _ ->
5151+ let event = Ctypes.(!@(from_voidp Open_event.t data)) in
5252+ Format.printf "%i,%i,%i,\"%s\"\n%!" (Open_event.get_pid event)
5353+ (Open_event.get_flags event)
5454+ (Open_event.get_mode event)
5555+ (Open_event.get_fname event);
5656+ 0
5757+ in
5858+ RingBuffer.init map ~callback @@ fun rb ->
5959+ while !exitting do
6060+ Unix.sleepf 1.0;
6161+ let _ : int = RingBuffer.poll rb ~timeout:1 in
6262+ ()
6363+ done
6464+ in
6565+ with_bpf_object_open_load_link ~obj_path ~program_names bpf_callback
+29
opentrace.opam
···11+opam-version: "2.0"
22+synopsis: "Trace the opening of files"
33+description: "A linux tool using eBPF for tracing calls to open files"
44+maintainer: ["Patrick Ferris <patrick@sirref.org>"]
55+authors: ["Patrick Ferris <patrick@sirref.org>"]
66+license: "MIT"
77+homepage: "https://tangled.sh/@patrick.sirref.org/opentrace"
88+depends: [
99+ "dune" {>= "3.17"}
1010+ "ocaml"
1111+ "libbpf"
1212+ "libbpg_map"
1313+ "odoc" {with-doc}
1414+]
1515+build: [
1616+ ["dune" "subst"] {dev}
1717+ [
1818+ "dune"
1919+ "build"
2020+ "-p"
2121+ name
2222+ "-j"
2323+ jobs
2424+ "@install"
2525+ "@runtest" {with-test}
2626+ "@doc" {with-doc}
2727+ ]
2828+]
2929+homepage: "https://tangled.sh/@patrick.sirref.org/opentrace"