X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=generator%2Fgenerator_daemon.ml;h=e3d87e50e84095c9492c20960c8a7b91a7d3fb1a;hp=4ac2a6e924039ddda925da79c409008b05a0260e;hb=d8346d5d6428c7293d1ddf58e4f9ec4b7de25380;hpb=04d8209077d2227eb1d42695ba71147f78987050 diff --git a/generator/generator_daemon.ml b/generator/generator_daemon.ml index 4ac2a6e..e3d87e5 100644 --- a/generator/generator_daemon.ml +++ b/generator/generator_daemon.ml @@ -33,7 +33,7 @@ open Generator_c let generate_daemon_actions_h () = generate_header CStyle GPLv2plus; - pr "#include \"../src/guestfs_protocol.h\"\n"; + pr "#include \"guestfs_protocol.h\"\n"; pr "\n"; List.iter ( @@ -58,17 +58,20 @@ and generate_daemon_actions () = pr "\n"; pr "#include \"daemon.h\"\n"; pr "#include \"c-ctype.h\"\n"; - pr "#include \"../src/guestfs_protocol.h\"\n"; + pr "#include \"guestfs_protocol.h\"\n"; pr "#include \"actions.h\"\n"; pr "\n"; List.iter ( - fun (name, style, _, _, _, _, _) -> + fun (name, (ret, args, optargs), _, _, _, _, _) -> + if optargs <> [] then + failwithf "optional arguments not supported in the daemon yet"; + (* Generate server-side stubs. *) pr "static void %s_stub (XDR *xdr_in)\n" name; pr "{\n"; let error_code = - match fst style with + match ret with | RErr | RInt _ -> pr " int r;\n"; "-1" | RInt64 _ -> pr " int64_t r;\n"; "-1" | RBool _ -> pr " int r;\n"; "-1" @@ -83,7 +86,7 @@ and generate_daemon_actions () = pr " char *r;\n"; "NULL" in - (match snd style with + (match args with | [] -> () | args -> pr " struct guestfs_%s_args args;\n" name; @@ -102,14 +105,15 @@ and generate_daemon_actions () = | BufferIn n -> pr " const char *%s;\n" n; pr " size_t %s_size;\n" n + | Pointer _ -> assert false ) args ); pr "\n"; let is_filein = - List.exists (function FileIn _ -> true | _ -> false) (snd style) in + List.exists (function FileIn _ -> true | _ -> false) args in - (match snd style with + (match args with | [] -> () | args -> pr " memset (&args, 0, sizeof args);\n"; @@ -171,12 +175,13 @@ and generate_daemon_actions () = | BufferIn n -> pr " %s = args.%s.%s_val;\n" n n n; pr " %s_size = args.%s.%s_len;\n" n n n + | Pointer _ -> assert false ) args; pr "\n" ); (* this is used at least for do_equal *) - if List.exists (function Pathname _ -> true | _ -> false) (snd style) then ( + if List.exists (function Pathname _ -> true | _ -> false) args then ( (* Emit NEED_ROOT just once, even when there are two or more Pathname args *) pr " NEED_ROOT (%s, goto done);\n" @@ -187,13 +192,12 @@ and generate_daemon_actions () = * parameters, since these go "outside" the RPC protocol. *) let args' = - List.filter (function FileIn _ | FileOut _ -> false | _ -> true) - (snd style) in + List.filter (function FileIn _ | FileOut _ -> false | _ -> true) args in pr " r = do_%s " name; - generate_c_call_args (fst style, args'); + generate_c_call_args (ret, args', optargs); pr ";\n"; - (match fst style with + (match ret with | RErr | RInt _ | RInt64 _ | RBool _ | RConstString _ | RConstOptString _ | RString _ | RStringList _ | RHashtable _ @@ -216,11 +220,11 @@ and generate_daemon_actions () = * send its own reply. *) let no_reply = - List.exists (function FileOut _ -> true | _ -> false) (snd style) in + List.exists (function FileOut _ -> true | _ -> false) args in if no_reply then pr " /* do_%s has already sent a reply */\n" name else ( - match fst style with + match ret with | RErr -> pr " reply (NULL, NULL);\n" | RInt n | RInt64 n | RBool n -> pr " struct guestfs_%s_ret ret;\n" name; @@ -267,7 +271,7 @@ and generate_daemon_actions () = (* Free the args. *) pr "done:\n"; - (match snd style with + (match args with | [] -> () | _ -> pr " xdr_free ((xdrproc_t) xdr_guestfs_%s_args, (char *) &args);\n" @@ -283,7 +287,7 @@ and generate_daemon_actions () = pr " switch (proc_nr) {\n"; List.iter ( - fun (name, style, _, _, _, _, _) -> + fun (name, _, _, _, _, _, _) -> pr " case GUESTFS_PROC_%s:\n" (String.uppercase name); pr " %s_stub (xdr_in);\n" name; pr " break;\n"