From 086bd1f7bfab4c10d890ecca3506a1b091c0d398 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Wed, 24 Nov 2010 13:34:16 +0000 Subject: ocaml: Translate C examples into OCaml and include documentation. --- ocaml/examples/create_disk.ml | 73 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 ocaml/examples/create_disk.ml (limited to 'ocaml/examples/create_disk.ml') diff --git a/ocaml/examples/create_disk.ml b/ocaml/examples/create_disk.ml new file mode 100644 index 00000000..0f9f9418 --- /dev/null +++ b/ocaml/examples/create_disk.ml @@ -0,0 +1,73 @@ +(* Example showing how to create a disk image. *) + +open Unix +open Printf + +let output = "disk.img" + +let () = + let g = new Guestfs.guestfs () in + + (* Create a raw-format sparse disk image, 512 MB in size. *) + let fd = openfile output [O_WRONLY;O_CREAT;O_TRUNC;O_NOCTTY] 0o666 in + ftruncate fd (512 * 1024 * 1024); + close fd; + + (* Set the trace flag so that we can see each libguestfs call. *) + g#set_trace true; + + (* Set the autosync flag so that the disk will be synchronized + * automatically when the libguestfs handle is closed. + *) + g#set_autosync true; + + (* Attach the disk image to libguestfs. *) + g#add_drive_opts ~format:"raw" ~readonly:false output; + + (* Run the libguestfs back-end. *) + g#launch (); + + (* Get the list of devices. Because we only added one drive + * above, we expect that this list should contain a single + * element. + *) + let devices = g#list_devices () in + if Array.length devices <> 1 then + failwith "error: expected a single device from list-devices"; + + (* Partition the disk as one single MBR partition. *) + g#part_disk devices.(0) "mbr"; + + (* Get the list of partitions. We expect a single element, which + * is the partition we have just created. + *) + let partitions = g#list_partitions () in + if Array.length partitions <> 1 then + failwith "error: expected a single partition from list-partitions"; + + (* Create a filesystem on the partition. *) + g#mkfs "ext4" partitions.(0); + + (* Now mount the filesystem so that we can add files. *) + g#mount_options "" partitions.(0) "/"; + + (* Create some files and directories. *) + g#touch "/empty"; + let message = "Hello, world\n" in + g#write "/hello" message; + g#mkdir "/foo"; + + (* This one uploads the local file /etc/resolv.conf into + * the disk image. + *) + g#upload "/etc/resolv.conf" "/foo/resolv.conf"; + + (* Because 'autosync' was set (above) we can just close the handle + * and the disk contents will be synchronized. You can also do + * this manually by calling g#umount_all and g#sync. + * + * Note also that handles are automatically closed if they are + * reaped by the garbage collector. You only need to call close + * if you want to close the handle right away. + *) + g#close () -- cgit