Skip to content

Commit

Permalink
Fix copy again.
Browse files Browse the repository at this point in the history
  • Loading branch information
toots committed Jan 23, 2025
1 parent 606ce11 commit 6503ba7
Show file tree
Hide file tree
Showing 15 changed files with 56 additions and 66 deletions.
2 changes: 1 addition & 1 deletion CHANGES
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
2.1.1 (unreleased)
2.2.0 (unreleased)
=====
* Fix copy code in `getaddrinfo`.

Expand Down
2 changes: 1 addition & 1 deletion dune-project
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
(lang dune 2.9)
(version 2.1.1)
(version 2.2.0)
(name posix-bindings)
(source (github savonet/ocaml-posix))
(license MIT)
Expand Down
2 changes: 1 addition & 1 deletion posix-base.opam
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "2.1.1"
version: "2.2.0"
synopsis: "Base module for the posix bindings"
description: "posix-base provides base tools for the posix binding modules."
maintainer: ["[email protected]"]
Expand Down
2 changes: 1 addition & 1 deletion posix-bindings.opam
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "2.1.1"
version: "2.2.0"
synopsis: "POSIX bindings"
description: "install all available posix bindings"
maintainer: ["[email protected]"]
Expand Down
2 changes: 1 addition & 1 deletion posix-getopt.opam
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "2.1.1"
version: "2.2.0"
synopsis: "Bindings for posix getopt/getopt_long"
description:
"posix-getopt provides a simple interface for the POSIX getopt and its extensions, getopt_long and getopt_long_only."
Expand Down
2 changes: 1 addition & 1 deletion posix-math2.opam
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "2.1.1"
version: "2.2.0"
synopsis: "Bindings for posix math"
description:
"posix-math2 provides a simple interface for POSIX math functions."
Expand Down
2 changes: 1 addition & 1 deletion posix-signal.opam
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "2.1.1"
version: "2.2.0"
synopsis: "Bindings for the types defined in <signal.h>"
description:
"posix-signal provides an API to the types and bindings defined in <signal.h>"
Expand Down
2 changes: 1 addition & 1 deletion posix-socket-unix.opam
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "2.1.1"
version: "2.2.0"
synopsis: "Bindings for posix sockets"
description:
"posix-socket-unix provides unix-specific types and bindings for posix sockets."
Expand Down
2 changes: 1 addition & 1 deletion posix-socket.opam
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "2.1.1"
version: "2.2.0"
synopsis: "Bindings for posix sockets"
description:
"posix-socket provides the types and bindings of posix sockets APIs available on both unix and windows."
Expand Down
13 changes: 5 additions & 8 deletions posix-socket/examples/getaddrinfo.ml
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,14 @@ let from_ptr t ptr = from_voidp t (to_voidp ptr)

let () =
let host = Sys.argv.(1) in
let p = getaddrinfo ~port:(`String Sys.argv.(2)) host in
let rec print_sockaddr pos =
if not (is_null !@(p +@ pos)) then (
let sockaddr = !@p in
let resolved_addresses = getaddrinfo ~port:(`String Sys.argv.(2)) host in
List.iter
(fun sockaddr ->
Printf.printf "sockaddr.sa_family = %d\n%!"
(Sa_family.to_int !@(sockaddr |-> Sockaddr.sa_family));
let sockaddr_in = from_ptr SockaddrInet.t sockaddr in
Printf.printf "sockaddr_in.sin_addr.s_addr = %d\n%!"
(Unsigned.UInt32.to_int
(ntohl
!@(sockaddr_in |-> SockaddrInet.sin_addr |-> SockaddrInet.s_addr)));
print_sockaddr (pos + 1))
in
print_sockaddr 0
!@(sockaddr_in |-> SockaddrInet.sin_addr |-> SockaddrInet.s_addr))))
resolved_addresses
83 changes: 38 additions & 45 deletions posix-socket/src/posix_socket.ml
Original file line number Diff line number Diff line change
Expand Up @@ -94,51 +94,44 @@ let getnameinfo sockaddr_ptr =
(host, port)
| _ -> failwith "getnameinfo"

let getaddrinfo ?hints ?port host =
let port =
match port with
| Some (`Int port) ->
let s = string_of_int port in
let c = CArray.of_string s in
CArray.start c
| Some (`String s) ->
let c = CArray.of_string s in
CArray.start c
| None -> from_voidp char null
let getaddrinfo =
let rec get_sockaddr ~cur p =
if is_null !@p then List.rev cur
else (
let addrinfo = !@p in
let sockaddr_len =
Socklen.to_int !@(addrinfo |-> Types.Addrinfo.ai_addrlen)
in
let sockaddr = to_voidp (allocate_n char ~count:sockaddr_len) in
memcpy sockaddr
(to_voidp !@(addrinfo |-> Types.Addrinfo.ai_addr))
(Unsigned.Size_t.of_int sockaddr_len);
get_sockaddr
~cur:(from_voidp Types.Sockaddr.t sockaddr :: cur)
(addrinfo |-> Types.Addrinfo.ai_next))
in
let p = allocate_n (ptr Addrinfo.t) ~count:1 in
let rec count len p =
match !@p with
| p when is_null p -> len
| p -> count (len + 1) (p |-> Types.Addrinfo.ai_next)
in
let copy p =
let count = count 0 p in
let ret = allocate_n (ptr Types.Sockaddr.t) ~count:(count + 1) in
let rec assign_sockaddr pos p =
if not (is_null !@p) then (
let addrinfo = !@p in
let sockaddr_len =
Socklen.to_int !@(addrinfo |-> Types.Addrinfo.ai_addrlen)
in
let sockaddr = to_voidp (allocate_n char ~count:sockaddr_len) in
memcpy sockaddr
(to_voidp !@(addrinfo |-> Types.Addrinfo.ai_addr))
(Unsigned.Size_t.of_int sockaddr_len);
ret +@ pos <-@ from_voidp Types.Sockaddr.t sockaddr;
assign_sockaddr (pos + 1) (addrinfo |-> Types.Addrinfo.ai_next))
else ret +@ pos <-@ from_voidp Sockaddr.t null
fun ?hints ?port host ->
let port =
match port with
| Some (`Int port) ->
let s = string_of_int port in
let c = CArray.of_string s in
CArray.start c
| Some (`String s) ->
let c = CArray.of_string s in
CArray.start c
| None -> from_voidp char null
in
assign_sockaddr 0 p;
ret
in
let hints = Option.value ~default:(from_voidp Types.Addrinfo.t null) hints in
match getaddrinfo host port hints p with
| 0 ->
let ret = copy p in
freeaddrinfo !@p;
ret
| _ -> failwith "getaddrinfo"
let p = allocate_n (ptr Addrinfo.t) ~count:1 in
let hints =
Option.value ~default:(from_voidp Types.Addrinfo.t null) hints
in
match getaddrinfo host port hints p with
| 0 ->
let ret = get_sockaddr ~cur:[] p in
freeaddrinfo !@p;
ret
| _ -> failwith "getaddrinfo"

let to_unix_sockaddr s =
match !@(s |-> Sockaddr.sa_family) with
Expand All @@ -158,5 +151,5 @@ let from_unix_sockaddr = function
hints |-> Types.Addrinfo.ai_socktype <-@ sock_stream;
let inet_addr = Unix.string_of_inet_addr inet_addr in
match getaddrinfo ~hints ~port:(`Int port) inet_addr with
| p when is_null !@p -> failwith "Resolution failed!"
| p -> !@p)
| [] -> failwith "Resolution failed!"
| sockaddr :: _ -> sockaddr)
2 changes: 1 addition & 1 deletion posix-socket/src/posix_socket.mli
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ val getaddrinfo :
?hints:Addrinfo.t structure ptr ->
?port:[ `Int of int | `String of string ] ->
string ->
sockaddr ptr ptr
sockaddr ptr list

(** Misc *)
val strnlen : char ptr -> Unsigned.size_t -> Unsigned.size_t
Expand Down
2 changes: 1 addition & 1 deletion posix-time2.opam
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "2.1.1"
version: "2.2.0"
synopsis: "Bindings for posix time functions"
description:
"posix-time2 provides the types and bindings for posix time APIs."
Expand Down
2 changes: 1 addition & 1 deletion posix-types.opam
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "2.1.1"
version: "2.2.0"
synopsis: "Bindings for the types defined in <sys/types.h>"
description:
"posix-types provides an API to the types defined in <sys/types.h>"
Expand Down
2 changes: 1 addition & 1 deletion posix-uname.opam
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# This file is generated by dune, edit dune-project instead
opam-version: "2.0"
version: "2.1.1"
version: "2.2.0"
synopsis: "Bindings for posix uname"
description: "posix-uname provides a simple interface for POSIX uname."
maintainer: ["[email protected]"]
Expand Down

0 comments on commit 6503ba7

Please sign in to comment.