2016-02-17 3 views
1

J'essaye de modifier un peu l'exemple http-fetch de MirageOS (https://github.com/mirage/mirage-skeleton) qui peut être trouvé dans mirage-skeleton mais j'ai quelques problèmes pour comprendre pourquoi je ne peux pas déplacer certains de la fonction exécutée dans le fichier config.ml dans mon fichier unikernel.ml. Le fichier config.ml d'origine suit (je viens de copier la partie intéressante):MirageOS - Exemple Http-fetch

[...] 
let client = 
     foreign "Unikernel.Client" @@ console @-> resolver @-> conduit @-> job 

let() = 
    add_to_ocamlfind_libraries ["mirage-http"]; 
    add_to_opam_packages ["mirage-http"]; 
    let sv4 = stack default_console in 
    let res_dns = resolver_dns sv4 in 
    let conduit = conduit_direct sv4 in 
    let job = [ client $ default_console $ res_dns $ conduit ] in 
    register "http-fetch" job 

Ce que je suis en train de faire est de déplacer ces deux lignes:

let res_dns = resolver_dns sv4 in 
    let conduit = conduit_direct sv4 in 

dans mon unikernel.ml méthode de démarrage. Fondamentalement je veux passer à mon module juste la pile et le laisser créer un résolveur de DNS et un conduit. Ma fonction de démarrage suit:

let start c s = 
    C.log_s c (sprintf "Resolving in 1s using DNS server %s" ns) >>= fun() -> 
    OS.Time.sleep 1.0 >>= fun() -> 
    let res_dns = resolver_dns s in 
     let conduit = conduit_direct s in 
      http_fetch c res_dns conduit >>= fun (data) -> 
      Lwt.return(dump_to_db data); 

En ce moment, je reçois cette erreur à http_fetch paramètres soumission:

Error: This expression has type Mirage.resolver Mirage.impl 
     but an expression was expected of type Resolver_lwt.t 

Ce que je demande ici est surtout une question conceptuelle parce que je manque clairement quelque chose . Je ne suis pas un expert en OCaml/MirageOS mais ce comportement controversé d'incompatibilité de type est difficile à comprendre étant donné que j'appelle la même fonction à partir d'un fichier différent.

+0

config.ml et unikernel.ml sont compilés complètement différemment (et pas même au même point). Pourquoi voulez-vous copier du code de l'un à l'autre? – Drup

+0

J'essayais surtout d'expérimenter. Mon vrai problème est que je rencontre ce problème http://lists.xenproject.org/archives/html/mirageos-devel/2015-06/msg00025.html et j'essaie de suivre les conseils de la création du résolveur et le conduit directement à l'intérieur de l'unikernel. –

Répondre

1

config.ml est utilisé pour générer main.ml. Vous pouvez copier le code généré à partir de là si vous le souhaitez.

+0

Merci de me pointer dans la bonne direction, en regardant le code à l'intérieur main.ml j'ai réussi à déplacer l'instanciation du résolveur et du conduit à l'unikernel.ml. Malheureusement, il n'a pas résolu le problème DHCP (Routing.No_route_to_destination_address) que j'ai mentionné dans mon commentaire ci-dessus :(. –