diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2010-11-24 13:34:16 +0000 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2010-11-24 20:12:16 +0000 |
commit | 086bd1f7bfab4c10d890ecca3506a1b091c0d398 (patch) | |
tree | eaa8ce0bd417510e22f8f4abcf8b208e9254f7dc /ocaml/examples/create_disk.ml | |
parent | 58012dc9b67aa1b5de9c5dc70e7e471de3ed2a6a (diff) | |
download | libguestfs-086bd1f7bfab4c10d890ecca3506a1b091c0d398.tar.gz libguestfs-086bd1f7bfab4c10d890ecca3506a1b091c0d398.tar.xz libguestfs-086bd1f7bfab4c10d890ecca3506a1b091c0d398.zip |
ocaml: Translate C examples into OCaml and include documentation.
Diffstat (limited to 'ocaml/examples/create_disk.ml')
-rw-r--r-- | ocaml/examples/create_disk.ml | 73 |
1 files changed, 73 insertions, 0 deletions
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 () |