[Pkg-ocaml-maint-commits] r5520 - in /trunk/projects/approx/trunk: _tags control_file.ml debian/NEWS debian/changelog ifaddr.c interface.mli myocamlbuild.ml netstubs.c network.mli server.ml tcp_wrappers.ml tests/_tags tests/ifaddr_test.ml

ecc-guest at users.alioth.debian.org ecc-guest at users.alioth.debian.org
Thu Apr 17 02:31:31 UTC 2008


Author: ecc-guest
Date: Thu Apr 17 02:31:30 2008
New Revision: 5520

URL: http://svn.debian.org/wsvn/?sc=1&rev=5520
Log:
listen on both IPv4 and IPv6 sockets when available

add C stub for setsockopt IPV6_V6ONLY

build all bytecode executables with -custom

Added:
    trunk/projects/approx/trunk/netstubs.c
      - copied, changed from r5317, trunk/projects/approx/trunk/ifaddr.c
    trunk/projects/approx/trunk/network.mli
      - copied, changed from r5317, trunk/projects/approx/trunk/interface.mli
Removed:
    trunk/projects/approx/trunk/ifaddr.c
    trunk/projects/approx/trunk/interface.mli
Modified:
    trunk/projects/approx/trunk/_tags
    trunk/projects/approx/trunk/control_file.ml
    trunk/projects/approx/trunk/debian/NEWS
    trunk/projects/approx/trunk/debian/changelog
    trunk/projects/approx/trunk/myocamlbuild.ml
    trunk/projects/approx/trunk/server.ml
    trunk/projects/approx/trunk/tcp_wrappers.ml
    trunk/projects/approx/trunk/tests/_tags
    trunk/projects/approx/trunk/tests/ifaddr_test.ml

Modified: trunk/projects/approx/trunk/_tags
URL: http://svn.debian.org/wsvn/trunk/projects/approx/trunk/_tags?rev=5520&op=diff
==============================================================================
--- trunk/projects/approx/trunk/_tags (original)
+++ trunk/projects/approx/trunk/_tags Thu Apr 17 02:31:30 2008
@@ -15,4 +15,4 @@
 <**/*.{byte,native}>: use_unix, use_pcre, use_sha
 <*.{byte,native}>: use_syslog, use_netsys, use_netstring
 <approx.{byte,native}>: use_netcgi, use_nethttpd-for-netcgi2
-<approx.{byte,native}>: ifaddr, libwrap
+<approx.{byte,native}>: netstubs, libwrap

Modified: trunk/projects/approx/trunk/control_file.ml
URL: http://svn.debian.org/wsvn/trunk/projects/approx/trunk/control_file.ml?rev=5520&op=diff
==============================================================================
--- trunk/projects/approx/trunk/control_file.ml (original)
+++ trunk/projects/approx/trunk/control_file.ml Thu Apr 17 02:31:30 2008
@@ -5,7 +5,6 @@
 open Printf
 open Util
 open Log
-open Config
 
 type paragraph = (string * string) list
 

Modified: trunk/projects/approx/trunk/debian/NEWS
URL: http://svn.debian.org/wsvn/trunk/projects/approx/trunk/debian/NEWS?rev=5520&op=diff
==============================================================================
--- trunk/projects/approx/trunk/debian/NEWS (original)
+++ trunk/projects/approx/trunk/debian/NEWS Thu Apr 17 02:31:30 2008
@@ -1,3 +1,9 @@
+approx (3.2.0) unstable; urgency=low
+
+  If both IPv4 and IPv6 sockets are supported, approx will listen on both.
+
+ -- Eric Cooper <ecc at cmu.edu>  Wed, 16 Apr 2008 21:49:01 -0400
+
 approx (3.1.0~rc1) experimental; urgency=low
 
   TCP wrappers support has been added. Access control rules can be specified

Modified: trunk/projects/approx/trunk/debian/changelog
URL: http://svn.debian.org/wsvn/trunk/projects/approx/trunk/debian/changelog?rev=5520&op=diff
==============================================================================
--- trunk/projects/approx/trunk/debian/changelog (original)
+++ trunk/projects/approx/trunk/debian/changelog Thu Apr 17 02:31:30 2008
@@ -1,3 +1,14 @@
+approx (3.2.0) unstable; urgency=low
+
+  * Listen on both IPv4 and IPv6 sockets when available
+  * Add setsockopt IPV6_V6ONLY to allow both kinds of sockets to bind
+    to the same port, as suggested by Julien Cristau <jcristau at debian.org>
+  * Enable -custom for all bytecode executables, not just ones that
+    directly use C stubs, to avoid missing DLLs from libpcre-ocaml, etc.
+    at runtime (closes: #476367)
+
+ -- Eric Cooper <ecc at cmu.edu>  Wed, 16 Apr 2008 21:49:01 -0400
+
 approx (3.1.0) unstable; urgency=low
 
   * Prevent dh_strip from stripping custom bytecode executables

Modified: trunk/projects/approx/trunk/myocamlbuild.ml
URL: http://svn.debian.org/wsvn/trunk/projects/approx/trunk/myocamlbuild.ml?rev=5520&op=diff
==============================================================================
--- trunk/projects/approx/trunk/myocamlbuild.ml (original)
+++ trunk/projects/approx/trunk/myocamlbuild.ml Thu Apr 17 02:31:30 2008
@@ -8,29 +8,28 @@
 
 let libraries =
   ["pcre"; "sha"; "syslog";
-   "netsys"; "netstring"; "+netcgi2:netcgi"; "nethttpd-for-netcgi2"]
+   "netsys"; "netstring"; "netcgi2:netcgi"; "nethttpd-for-netcgi2"]
 
 let split str =
   let i = String.index str ':' in
   String.sub str 0 i, String.sub str (i+1) (String.length str - (i+1))
 
 let add_library lib =
-  let dir, lib =
-    if lib.[0] = '+' then split lib
-    else "+" ^ lib, lib
+  let inc, lib =
+    if String.contains lib ':' then split lib
+    else lib, lib
   in
-  ocaml_lib ~extern: true ~dir lib
+  ocaml_lib ~extern: true ~dir: ("+" ^ inc) lib
 
 let custom_rules () =
   rule "Use mkversion to generate version.ml"
     ~dep: "debian/changelog" ~prod: "version.ml"
     (fun _ _ -> Cmd (S [P (concat pwd "mkversion"); Sh "> version.ml"]));
   dep ["compile"; "ocaml"; "file:log.ml"] ["version.ml"];
-  dep ["link"; "ocaml"; "ifaddr"] ["ifaddr.o"];
-  flag ["link"; "ocaml"; "byte"; "ifaddr"] & A "-custom";
+  dep ["link"; "ocaml"; "netstubs"] ["netstubs.o"];
   dep ["link"; "ocaml"; "libwrap"] ["libwrap.o"];
   flag ["link"; "ocaml"; "libwrap"] & S [A "-cclib"; A "-lwrap"];
-  flag ["link"; "ocaml"; "byte"; "libwrap"] & A "-custom";
+  flag ["link"; "ocaml"; "byte"] & A "-custom";
   flag ["c"; "compile"] & S [A "-ccopt"; A "-Wall"];
   List.iter add_library libraries
 

Copied: trunk/projects/approx/trunk/netstubs.c (from r5317, trunk/projects/approx/trunk/ifaddr.c)
URL: http://svn.debian.org/wsvn/trunk/projects/approx/trunk/netstubs.c?rev=5520&op=diff
==============================================================================
--- trunk/projects/approx/trunk/ifaddr.c (original)
+++ trunk/projects/approx/trunk/netstubs.c Thu Apr 17 02:31:30 2008
@@ -46,3 +46,15 @@
     else
         caml_raise_not_found();
 }
+
+value
+set_ipv6_only(value descr, value on_off)
+{
+    CAMLparam2(descr, on_off);
+    int fd = Int_val(descr);
+    int v = Bool_val(on_off);
+    if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &v, sizeof(int)) == 0)
+        CAMLreturn(Val_unit);
+    else
+        caml_failwith("set_ipv6_only");
+}

Copied: trunk/projects/approx/trunk/network.mli (from r5317, trunk/projects/approx/trunk/interface.mli)
URL: http://svn.debian.org/wsvn/trunk/projects/approx/trunk/network.mli?rev=5520&op=diff
==============================================================================
--- trunk/projects/approx/trunk/interface.mli (original)
+++ trunk/projects/approx/trunk/network.mli Thu Apr 17 02:31:30 2008
@@ -2,4 +2,6 @@
    Copyright (C) 2008  Eric C. Cooper <ecc at cmu.edu>
    Released under the GNU General Public License *)
 
-external address : string -> Unix.inet_addr = "interface_address"
+external interface_address : string -> Unix.inet_addr = "interface_address"
+
+external set_ipv6_only : Unix.file_descr -> bool -> unit = "set_ipv6_only"

Modified: trunk/projects/approx/trunk/server.ml
URL: http://svn.debian.org/wsvn/trunk/projects/approx/trunk/server.ml?rev=5520&op=diff
==============================================================================
--- trunk/projects/approx/trunk/server.ml (original)
+++ trunk/projects/approx/trunk/server.ml Thu Apr 17 02:31:30 2008
@@ -38,24 +38,21 @@
     method config_reactor_synch = `Write
   end
 
-type t = file_descr
+type t = file_descr list
 
 let address interface = function
   | PF_INET ->
       if interface = "any" || interface = "all" then inet_addr_any
-      else begin
-        try
-          Interface.address interface
-        with Not_found ->
-          error_message "IP address for interface %s not found" interface;
-          raise Not_found
+      else begin try
+        Network.interface_address interface
+      with Not_found ->
+        error_message "IP address for interface %s not found" interface;
+        raise Not_found
       end
   | PF_INET6 ->
       if interface = "any" || interface = "all" then inet6_addr_any
       else begin
-        error_message
-          "The $interface parameter (%s) is not supported for IPv6.\n\
-             Attempting to listen on IPv4 socket instead.\n" interface;
+        error_message "Cannot use $interface parameter (%s) for IPv6" interface;
         raise Not_found
       end
   | _ -> failwith "invalid protocol family"
@@ -63,32 +60,27 @@
 let remote_address ~with_port = function
   | ADDR_INET (host, port) ->
       let addr = string_of_inet_addr host in
-      if with_port then sprintf "%s:%d" addr port else addr
+      if with_port then sprintf "%s port %d" addr port else addr
   | ADDR_UNIX path ->
       failwith ("Unix domain socket " ^ path)
 
-let rec find_some f = function
-  | x :: rest -> (match f x with Some y -> y | None -> find_some f rest)
-  | [] -> raise Not_found
-
 let init ~user ~group ~interface ~port =
-  let make_socket pf =
+  let add_socket list pf =
     try
       let sock = socket pf SOCK_STREAM 0 in
+      if pf = PF_INET6 then Network.set_ipv6_only sock true;
       setsockopt sock SO_REUSEADDR true;
       bind sock (ADDR_INET (address interface pf, port));
       listen sock 10;
-      Some sock
-    with Unix.Unix_error (EAFNOSUPPORT, "socket", _) | Not_found -> None
+      sock :: list
+    with Unix.Unix_error _ | Not_found -> list
   in
-  try
-    let sock = find_some make_socket [PF_INET6; PF_INET] in
-    drop_privileges ~user ~group;
-    sock
-  with Not_found -> failwith "cannot listen on socket"
+  let sockets = List.fold_left add_socket [] [PF_INET6; PF_INET] in
+  drop_privileges ~user ~group;
+  sockets
 
-let loop sock service =
-  while true do
+let loop sockets service =
+  let process sock =
     let fd, _ = accept sock in
     let address = remote_address (getpeername fd) ~with_port: false in
     if Tcp_wrappers.hosts_ctl Version.name ~address then
@@ -106,4 +98,10 @@
       close fd;
       debug_message "Connection from %s denied by TCP wrappers" address
     end
+  in
+  if sockets = [] then failwith "no sockets created";
+  while true do
+    match select sockets [] [] (-1.) with
+    | [], _, _ -> failwith "no sockets selected"
+    | ready, _, _ -> List.iter process ready
   done

Modified: trunk/projects/approx/trunk/tcp_wrappers.ml
URL: http://svn.debian.org/wsvn/trunk/projects/approx/trunk/tcp_wrappers.ml?rev=5520&op=diff
==============================================================================
--- trunk/projects/approx/trunk/tcp_wrappers.ml (original)
+++ trunk/projects/approx/trunk/tcp_wrappers.ml Thu Apr 17 02:31:30 2008
@@ -5,5 +5,5 @@
 external wrap_hosts_ctl : string -> string -> string -> string -> bool
   = "wrap_hosts_ctl"
 
-let hosts_ctl ?(address="") ?(host="") ?(user="") daemon =
+let hosts_ctl ?(address="unknown") ?(host="unknown") ?(user="unknown") daemon =
   wrap_hosts_ctl daemon host address user

Modified: trunk/projects/approx/trunk/tests/_tags
URL: http://svn.debian.org/wsvn/trunk/projects/approx/trunk/tests/_tags?rev=5520&op=diff
==============================================================================
--- trunk/projects/approx/trunk/tests/_tags (original)
+++ trunk/projects/approx/trunk/tests/_tags Thu Apr 17 02:31:30 2008
@@ -5,5 +5,5 @@
 <sha1_test.ml>: use_sha
 
 <control_file_test.{byte,native}>: use_syslog
-<ifaddr_test.{byte,native}>: -use_pcre, -use_sha, ifaddr
+<ifaddr_test.{byte,native}>: -use_pcre, -use_sha, netstubs
 <metadata_test.{byte,native}>: use_syslog

Modified: trunk/projects/approx/trunk/tests/ifaddr_test.ml
URL: http://svn.debian.org/wsvn/trunk/projects/approx/trunk/tests/ifaddr_test.ml?rev=5520&op=diff
==============================================================================
--- trunk/projects/approx/trunk/tests/ifaddr_test.ml (original)
+++ trunk/projects/approx/trunk/tests/ifaddr_test.ml Thu Apr 17 02:31:30 2008
@@ -14,7 +14,7 @@
 let () =
   try
     printf "%s: %s\n" interface
-      (string_of_inet_addr (Interface.address interface))
+      (string_of_inet_addr (Network.interface_address interface))
   with Not_found ->
     eprintf "address of interface %s not found\n" interface;
     exit 1




More information about the Pkg-ocaml-maint-commits mailing list