diff --git a/mllib/unix_utils-c.c b/mllib/unix_utils-c.c index f5aaaf6b1..2cd7b5385 100644 --- a/mllib/unix_utils-c.c +++ b/mllib/unix_utils-c.c @@ -57,6 +57,7 @@ extern value guestfs_int_mllib_fnmatch (value patternv, value strv, value flagsv extern value guestfs_int_mllib_sync (value unitv); extern value guestfs_int_mllib_fsync_file (value filenamev); extern value guestfs_int_mllib_mkdtemp (value val_pattern); +extern value guestfs_int_mllib_realpath (value pathv); extern value guestfs_int_mllib_statvfs_free_space (value pathv); /* NB: This is a "noalloc" call. */ @@ -195,6 +196,22 @@ guestfs_int_mllib_mkdtemp (value val_pattern) CAMLreturn (rv); } +value +guestfs_int_mllib_realpath (value pathv) +{ + CAMLparam1 (pathv); + CAMLlocal1 (rv); + char *r; + + r = realpath (String_val (pathv), NULL); + if (r == NULL) + unix_error (errno, (char *) "realpath", pathv); + + rv = caml_copy_string (r); + free (r); + CAMLreturn (rv); +} + value guestfs_int_mllib_statvfs_free_space (value pathv) { diff --git a/mllib/unix_utils.ml b/mllib/unix_utils.ml index 66b6e4f4e..8ac36836c 100644 --- a/mllib/unix_utils.ml +++ b/mllib/unix_utils.ml @@ -56,6 +56,10 @@ module Mkdtemp = struct mkdtemp (Filename.concat base_dir (prefix ^ "XXXXXX" ^ suffix)) end +module Realpath = struct + external realpath : string -> string = "guestfs_int_mllib_realpath" +end + module StatVFS = struct external free_space : string -> int64 = "guestfs_int_mllib_statvfs_free_space" diff --git a/mllib/unix_utils.mli b/mllib/unix_utils.mli index 0a4c1b3a9..4795cb37f 100644 --- a/mllib/unix_utils.mli +++ b/mllib/unix_utils.mli @@ -88,6 +88,11 @@ module Mkdtemp : sig [Filename.temp_dir_name] is used. *) end +module Realpath : sig + val realpath : string -> string + (** [realpath(3)] returns the canonicalized absolute pathname. *) +end + module StatVFS : sig val free_space : string -> int64 (** [free_space path] returns the free space available on the