A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/ocsigen/lwt/commit/20e8836bbbf22c27f45e5586728507c7b4ffc53b below:

add `Lwt_unix.send_msgto` that takes a destination address · ocsigen/lwt@20e8836 · GitHub

File tree Expand file treeCollapse file tree 8 files changed

+84

-9

lines changed

Filter options

Expand file treeCollapse file tree 8 files changed

+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