(* Copyright (C) 2000, HELM Team. * * This file is part of HELM, an Hypertextual, Electronic * Library of Mathematics, developed at the Computer Science * Department, University of Bologna, Italy. * * HELM is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * HELM is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HELM; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * * For details, see the HELM World-Wide-Web page, * http://cs.unibo.it/helm/. *) exception XsltProcessorCouldNotSend;; exception XsltProcessorCouldNotReceive;; let portserver = 12345;; let portclient = 12346;; let time_to_wait = 10;; let rec process uri usecache mode = let module U = Unix in let uri = UriManager.string_of_uri uri in let pid = string_of_int (U.getpid ()) and filename' = let uri' = Str.replace_first (Str.regexp ".*:") "" uri in Str.global_replace (Str.regexp "/") "_" (Str.global_replace (Str.regexp "_") "__" uri') in let tmpfile = "/tmp/helm_" ^ filename' ^ "_" ^ pid in (* test if the cache can be used *) let tmp_file_exists = Sys.file_exists tmpfile in if usecache && tmp_file_exists then tmpfile else let url = Configuration.getter_url ^ uri in (* purge the cache if asked to *) if not usecache && tmp_file_exists then Sys.remove tmpfile ; (* let string_to_send = mode ^ " " ^ url ^ " " ^ tmpfile in *) let string_to_send = "apply " ^ url ^ " " ^ tmpfile ^ match mode with "cic" -> " C1 C2" | "theory" -> " T1 T2" in (* next function is for looping in case the server is not responding *) let socketserver = U.socket U.PF_INET U.SOCK_DGRAM 0 in let rec contact_server () = let n = Printf.printf "sending %s to server...\n" string_to_send; flush stdout; U.sendto socketserver string_to_send 0 (String.length string_to_send) [] (U.ADDR_INET(U.inet_addr_any,portserver)) in if n = -1 then raise XsltProcessorCouldNotSend ; let process_signal _ = () in Sys.set_signal Sys.sigalrm (Sys.Signal_handle process_signal) ; (* if the server does not respond, repeat the query *) ignore (U.alarm time_to_wait) ; try if U.recv socketserver "" 0 0 [] = -1 then raise XsltProcessorCouldNotReceive ; ignore (U.alarm 0) ; (* stop the bomb *) Sys.set_signal Sys.sigalrm Sys.Signal_default ; U.close socketserver ; tmpfile with U.Unix_error(_,"recv",_) -> print_endline "Xaland server not responding. Retrying..." ; flush stdout; contact_server () in contact_server () ;;