···11-let send_wol mac port broadcast =
22- let mac = Macaddr.of_string_exn mac in
33- Eio_posix.run @@ fun env -> Wol_eio.send ~net:env#net ~port ~broadcast mac
11+let send_wol mac port address broadcast =
22+ Eio_posix.run @@ fun env ->
33+ Wol_eio.send ~net:env#net ~port ~address ~broadcast mac
4455let () =
66 let open Cmdliner in
77 let mac_address =
88 let doc = "The MAC address to send the magic packet to." in
99- Arg.(required & pos 0 (some string) None & info [] ~docv:"MAC_ADDRESS" ~doc)
99+ Arg.(
1010+ required
1111+ & pos 0 (some (Cmdliner.Arg.conv (Macaddr.of_string, Macaddr.pp))) None
1212+ & info [] ~docv:"MAC_ADDRESS" ~doc)
1013 in
1114 let port =
1215 let doc = "Port to send the packet too (default 9)." in
1316 Arg.(value & opt int 9 & info [ "p"; "port" ] ~docv:"PORT" ~doc)
1417 in
1515- let broadcast =
1818+ let address =
1619 let doc =
1720 "Address to send the packet too (default broadcast to 255.255.255.255)."
1821 in
1922 Arg.(
2023 value
2121- & opt string "255.255.255.255"
2424+ & opt
2525+ (Cmdliner.Arg.conv (Ipaddr.V4.of_string, Ipaddr.V4.pp))
2626+ (Ipaddr.V4.of_string_exn "255.255.255.255")
2227 & info [ "a"; "address" ] ~docv:"ADDRESS" ~doc)
2328 in
2929+ let broadcast =
3030+ let doc =
3131+ "Whether to set the SO_BROADCAST socket option to enable broadcasting \
3232+ (default true)."
3333+ in
3434+ Arg.(value & opt bool true & info [ "a"; "address" ] ~docv:"ADDRESS" ~doc)
3535+ in
2436 let cmd =
2525- let term = Term.(const send_wol $ mac_address $ port $ broadcast) in
3737+ let term =
3838+ Term.(const send_wol $ mac_address $ port $ address $ broadcast)
3939+ in
2640 let doc = "Send a Wake-on-LAN magic packet with a specified MAC address." in
2741 let info = Cmd.info "wol" ~doc in
2842 Cmd.v info term
+6-6
src/eio/wol_eio.ml
···11-let send ~net ?(port = 9) ?(broadcast = "255.255.255.255") mac_str =
11+let send ~net ?(port = 9) ?(address = Ipaddr.V4.of_string_exn "255.255.255.255")
22+ ?(broadcast = true) mac_str =
23 Eio.Switch.run @@ fun sw ->
33- let addr =
44- Ipaddr.V4.of_string_exn broadcast
55- |> Ipaddr.V4.to_octets |> Eio.Net.Ipaddr.of_raw
66- in
44+ let addr = address |> Ipaddr.V4.to_octets |> Eio.Net.Ipaddr.of_raw in
75 let sock =
86 let proto =
97 Eio.Net.Ipaddr.fold ~v4:(fun _v4 -> `UdpV4) ~v6:(fun _v6 -> `UdpV6) addr
···119 Eio.Net.datagram_socket ~sw net proto
1210 in
1311 let fd = Option.get (Eio_unix.Resource.fd_opt sock) in
1414- Eio_unix.Fd.use_exn "broadcast" fd (fun fd -> Unix.setsockopt fd Unix.SO_BROADCAST true);
1212+ if broadcast then
1313+ Eio_unix.Fd.use_exn "broadcast" fd (fun fd ->
1414+ Unix.setsockopt fd Unix.SO_BROADCAST true);
1515 let packet = Wol.magic_packet mac_str in
1616 Eio.Net.send sock ~dst:(`Udp (addr, port)) [ packet ]