+84
-9
lines changedFilter options
+84
-9
lines changed Original file line number Diff line number Diff line change
@@ -85,6 +85,7 @@ let () = Jbuild_plugin.V1.send @@ {|
85
85
unix_recv_send_utils
86
86
unix_recv_msg
87
87
unix_send_msg
88
+
unix_send_msg_byte
88
89
unix_get_credentials
89
90
unix_mcast_utils
90
91
unix_mcast_set_loop
Original file line number Diff line number Diff line change
@@ -1626,16 +1626,22 @@ let recv_msg ~socket ~io_vectors =
1626
1626
external stub_send_msg :
1627
1627
Unix.file_descr ->
1628
1628
int -> IO_vectors.io_vector list ->
1629
-
int -> Unix.file_descr list ->
1630
-
int =
1631
-
"lwt_unix_send_msg"
1629
+
int -> Unix.file_descr list -> Unix.sockaddr option ->
1630
+
int = "lwt_unix_send_msg_byte" "lwt_unix_send_msg"
1632
1631
1633
1632
let send_msg ~socket ~io_vectors ~fds =
1634
1633
let vector_count = check_io_vectors "Lwt_unix.send_msg" io_vectors in
1635
1634
let fd_count = List.length fds in
1636
1635
wrap_syscall Write socket (fun () ->
1637
1636
stub_send_msg
1638
-
socket.fd vector_count io_vectors.IO_vectors.prefix fd_count fds)
1637
+
socket.fd vector_count io_vectors.IO_vectors.prefix fd_count fds None)
1638
+
1639
+
let send_msgto ~socket ~io_vectors ~fds ~dest =
1640
+
let vector_count = check_io_vectors "Lwt_unix.send_msgto" io_vectors in
1641
+
let fd_count = List.length fds in
1642
+
wrap_syscall Write socket (fun () ->
1643
+
stub_send_msg
1644
+
socket.fd vector_count io_vectors.IO_vectors.prefix fd_count fds (Some dest))
1639
1645
1640
1646
type inet_addr = Unix.inet_addr
1641
1647
Original file line number Diff line number Diff line change
@@ -988,6 +988,18 @@ val send_msg :
988
988
989
989
@since 5.0.0 *)
990
990
991
+
val send_msgto :
992
+
socket:file_descr -> io_vectors:IO_vectors.t -> fds:Unix.file_descr list ->
993
+
dest:Unix.sockaddr ->
994
+
int Lwt.t
995
+
(** [send_msgto ~socket ~io_vectors ~fds ~dest] is similar to [send_msg] but
996
+
takes an additional [dest] argument to set the address when using a
997
+
connection-less socket.
998
+
999
+
Not implemented on Windows.
1000
+
1001
+
@since 5.4.0 *)
1002
+
991
1003
type credentials = {
992
1004
cred_pid : int;
993
1005
cred_uid : int;
Original file line number Diff line number Diff line change
@@ -64,15 +64,25 @@ value wrapper_recv_msg(int fd, int n_iovs, struct iovec *iovs)
64
64
}
65
65
66
66
value wrapper_send_msg(int fd, int n_iovs, struct iovec *iovs,
67
-
value val_n_fds, value val_fds)
67
+
value val_n_fds, value val_fds, value dest)
68
68
{
69
-
CAMLparam2(val_n_fds, val_fds);
69
+
CAMLparam3(val_n_fds, val_fds, dest);
70
70
71
71
struct msghdr msg;
72
72
memset(&msg, 0, sizeof(msg));
73
73
msg.msg_iov = iovs;
74
74
msg.msg_iovlen = n_iovs;
75
75
76
+
/* dest: Unix.sockaddr option */
77
+
if (Is_block(dest)) {
78
+
union sock_addr_union addr;
79
+
socklen_t addr_len;
80
+
get_sockaddr(Field(dest, 0), &addr, &addr_len);
81
+
82
+
msg.msg_name = &addr.s_gen;
83
+
msg.msg_namelen = addr_len;
84
+
}
85
+
76
86
int n_fds = Int_val(val_n_fds);
77
87
#if defined(HAVE_FD_PASSING)
78
88
if (n_fds > 0) {
Original file line number Diff line number Diff line change
@@ -37,5 +37,5 @@ extern void get_sockaddr(value mladdr, union sock_addr_union *addr /*out*/,
37
37
socklen_t *addr_len /*out*/);
38
38
value wrapper_recv_msg(int fd, int n_iovs, struct iovec *iovs);
39
39
value wrapper_send_msg(int fd, int n_iovs, struct iovec *iovs,
40
-
value val_n_fds, value val_fds);
40
+
value val_n_fds, value val_fds, value dest);
41
41
#endif
Original file line number Diff line number Diff line change
@@ -14,11 +14,11 @@
14
14
#include "unix_readv_writev_utils.h"
15
15
16
16
CAMLprim value lwt_unix_send_msg(value val_fd, value val_n_iovs, value val_iovs,
17
-
value val_n_fds, value val_fds)
17
+
value val_n_fds, value val_fds, value val_dest)
18
18
{
19
19
int n_iovs = Int_val(val_n_iovs);
20
20
struct iovec iovs[n_iovs];
21
21
flatten_io_vectors(iovs, val_iovs, n_iovs, NULL, NULL);
22
-
return wrapper_send_msg(Int_val(val_fd), n_iovs, iovs, val_n_fds, val_fds);
22
+
return wrapper_send_msg(Int_val(val_fd), n_iovs, iovs, val_n_fds, val_fds, val_dest);
23
23
}
24
24
#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
1
+
/* This file is part of Lwt, released under the MIT license. See LICENSE.md for
2
+
details, or visit https://github.com/ocsigen/lwt/blob/master/LICENSE.md. */
3
+
4
+
5
+
6
+
#include "lwt_config.h"
7
+
8
+
#if !defined(LWT_ON_WINDOWS)
9
+
10
+
#include <caml/mlvalues.h>
11
+
12
+
extern value lwt_unix_send_msg(value val_fd, value val_n_iovs, value val_iovs,
13
+
value val_n_fds, value val_fds, value val_dest);
14
+
15
+
CAMLprim value lwt_unix_send_msg_byte(value * argv, int argc)
16
+
{
17
+
value val_fd = argv[0];
18
+
value val_n_iovs = argv[1];
19
+
value val_iovs = argv[2];
20
+
value val_n_fds = argv[3];
21
+
value val_fds = argv[4];
22
+
value val_dest = argv[5];
23
+
24
+
return lwt_unix_send_msg(val_fd, val_n_iovs, val_iovs, val_n_fds, val_fds, val_dest);
25
+
}
26
+
27
+
#endif
Original file line number Diff line number Diff line change
@@ -755,6 +755,25 @@ let suite = suite "lwt_bytes" [
755
755
Lwt.return check
756
756
end;
757
757
758
+
test "send_msgto" ~only_if:(fun () -> not Sys.win32) begin fun () ->
759
+
let buffer = gen_buf 6 in
760
+
let offset = 0 in
761
+
let server_logic socket =
762
+
let io_vectors = [Lwt_bytes.io_vector ~buffer ~offset ~length:6] in
763
+
(Lwt_bytes.recv_msg [@ocaml.warning "-3"]) ~socket ~io_vectors
764
+
in
765
+
let client_logic socket sockaddr =
766
+
let message = Lwt_bytes.of_string "abcdefghij" in
767
+
let io_vectors = Lwt_unix.IO_vectors.create () in
768
+
Lwt_unix.IO_vectors.append_bigarray io_vectors message offset 9;
769
+
Lwt_unix.send_msgto ~socket ~io_vectors ~fds:[] ~dest:sockaddr
770
+
in
771
+
udp_server_client_exchange server_logic client_logic
772
+
>>= fun () ->
773
+
let check = "abcdef" = Lwt_bytes.to_string buffer in
774
+
Lwt.return check
775
+
end;
776
+
758
777
test "map_file" begin fun () ->
759
778
let test_file = "bytes_io_data" in
760
779
let fd = Unix.openfile test_file [O_RDONLY] 0 in
You can’t perform that action at this time.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4