[Libguestfs] [PATCH] NEW API: mktemp

Richard W.M. Jones rjones at redhat.com
Mon Oct 15 08:10:23 UTC 2012


On Sun, Oct 14, 2012 at 02:32:36PM +0800, Wanlong Gao wrote:
> Used to create temporary directory or file with an optional suffix.
> 
> Signed-off-by: Wanlong Gao <gaowanlong at cn.fujitsu.com>
> ---
>  daemon/dir.c         | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  generator/actions.ml | 36 +++++++++++++++++++++++++++++++
>  gobject/Makefile.inc |  6 ++++--
>  po/POTFILES          |  2 ++
>  src/MAX_PROC_NR      |  2 +-
>  5 files changed, 104 insertions(+), 3 deletions(-)
> 
> diff --git a/daemon/dir.c b/daemon/dir.c
> index aed45d6..b58cc2a 100644
> --- a/daemon/dir.c
> +++ b/daemon/dir.c
> @@ -212,3 +212,64 @@ do_mkdtemp (const char *template)
>  
>    return r;
>  }
> +
> +char *
> +do_mktemp (const char *template,
> +           int dir,
> +           const char *suffix)
> +{
> +  char *dest_name = NULL;
> +  size_t suffix_len = 0;
> +  char *r;
> +  int err;
> +  if (!(optargs_bitmask & GUESTFS_MKTEMP_DIR_BITMASK))
> +    dir = 0;
> +
> +  if (optargs_bitmask & GUESTFS_MKTEMP_SUFFIX_BITMASK) {
> +    if (suffix) {
> +      if (dir) {
> +        reply_with_error ("can not support suffix with directory");
> +        return NULL;
> +      }
> +      size_t len = strlen (template);
> +      if (!len || template[len - 1] != 'X') {
> +        reply_with_error ("template %s must end in X", template);
> +        return NULL;
> +      }
> +      suffix_len = strlen (suffix);
> +      dest_name = malloc (len + suffix_len + 1);
> +      memcpy (dest_name, template, len);
> +      memcpy (dest_name + len, suffix, suffix_len + 1);
> +    }
> +  }
> +
> +  if (dest_name == NULL) {
> +    dest_name = strdup (template);
> +    if (dest_name == NULL) {
> +      reply_with_perror ("strdup");
> +      return NULL;
> +    }
> +  }
> +
> +  CHROOT_IN;
> +  if (dir)
> +    r = mkdtemp (dest_name);
> +  else
> +    err = mkstemps (dest_name, suffix_len);
> +  CHROOT_OUT;
> +
> +  if (dir) {
> +    if (r == NULL) {
> +      reply_with_perror ("%s", dest_name);
> +      free (dest_name);
> +    }
> +    return r;
> +  } else {
> +    if (err == -1) {
> +      reply_with_perror ("%s", dest_name);
> +      free (dest_name);
> +      return NULL;
> +    }
> +    return dest_name;
> +  }
> +}
> diff --git a/generator/actions.ml b/generator/actions.ml
> index 13e54f3..855b4d1 100644
> --- a/generator/actions.ml
> +++ b/generator/actions.ml
> @@ -4834,6 +4834,7 @@ manual page for more details." };
>      name = "mkdtemp";
>      style = RString "dir", [Pathname "tmpl"], [];
>      proc_nr = Some 117;
> +    deprecated_by = Some "mktemp";
>      tests = [
>        InitScratchFS, Always, TestRun (
>          [["mkdir"; "/mkdtemp"];
> @@ -10013,6 +10014,41 @@ This function is used internally when hotplugging drives." };
>      longdesc = "\
>  This function is used internally when hotplugging drives." };
>  
> +  { defaults with
> +    name = "mktemp";
> +    style = RString "path", [Pathname "tmpl"], [OBool "dir"; OString "suffix"];
> +    proc_nr = Some 373;
> +    tests = [
> +      InitScratchFS, Always, TestRun (
> +        [["mkdir"; "/mktemp"];
> +         ["mktemp"; "/mktemp/tmpXXXXXX"; "true"; "NOARG"];
> +         ["mktemp"; "/mktemp/tmpXXXXXX"; "false"; "suff"]])
> +    ];
> +    shortdesc = "create a temporary directory or file";
> +    longdesc = "\
> +This command creates a temporary directory/file.  The
> +C<tmpl> parameter should be a full pathname for the
> +temporary directory name with the final six characters being
> +\"XXXXXX\".
> +
> +For example: \"/tmp/myprogXXXXXX\" or \"/Temp/myprogXXXXXX\",
> +the second one being suitable for Windows filesystems.
> +
> +The name of the temporary directory/file that was created
> +is returned.
> +
> +The temporary directory/file is created with mode 0700
> +and is owned by root.
> +
> +The caller is responsible for deleting the temporary
> +directory/file and its contents after use.
> +
> +Set C<dir> to \"true\" if you want to crate a directory.
> +
> +C<suffix> is used to specify a suffix to append the C<tmpl>.
> +
> +See also: L<mkdtemp(3)> and L<mkstemps(3)>" };
> +

It all seems good.  What would be the real killer feature would be
some sort of 'cleanup' flag which removes the file/directory when the
daemon exits ...

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into Xen guests.
http://et.redhat.com/~rjones/virt-p2v




More information about the Libguestfs mailing list