diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2009-05-01 11:00:34 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2009-05-01 11:00:34 +0100 |
commit | 3cb794463a62239e36d730bc5d2d3eb4c7a66096 (patch) | |
tree | dca98ab21d35f7078879ec7fac98bd10b4f432bf /daemon/cpmv.c | |
parent | af5087450063fe013ac2df4db39451d7da6152a3 (diff) | |
download | libguestfs-3cb794463a62239e36d730bc5d2d3eb4c7a66096.tar.gz libguestfs-3cb794463a62239e36d730bc5d2d3eb4c7a66096.tar.xz libguestfs-3cb794463a62239e36d730bc5d2d3eb4c7a66096.zip |
Add cp, cp-a and mv commands.
Diffstat (limited to 'daemon/cpmv.c')
-rw-r--r-- | daemon/cpmv.c | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/daemon/cpmv.c b/daemon/cpmv.c new file mode 100644 index 00000000..33755c42 --- /dev/null +++ b/daemon/cpmv.c @@ -0,0 +1,94 @@ +/* libguestfs - the guestfsd daemon + * Copyright (C) 2009 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "daemon.h" +#include "actions.h" + +static int cpmv_cmd (const char *cmd, const char *flags, const char *src, const char *dest); + +int +do_cp (const char *src, const char *dest) +{ + return cpmv_cmd ("cp", NULL, src, dest); +} + +int +do_cp_a (const char *src, const char *dest) +{ + return cpmv_cmd ("cp", "-a", src, dest); +} + +int +do_mv (const char *src, const char *dest) +{ + return cpmv_cmd ("mv", NULL, src, dest); +} + +static int +cpmv_cmd (const char *cmd, const char *flags, const char *src, const char *dest) +{ + char *srcbuf, *destbuf; + int srclen, destlen; + char *err; + int r; + + NEED_ROOT (-1); + ABS_PATH (src, -1); + ABS_PATH (dest, -1); + + srclen = strlen (src) + 32; + srcbuf = malloc (srclen); + if (srcbuf == NULL) { + reply_with_perror ("malloc"); + return -1; + } + + destlen = strlen (dest) + 32; + destbuf = malloc (destlen); + if (destbuf == NULL) { + reply_with_perror ("malloc"); + free (srcbuf); + return -1; + } + + snprintf (srcbuf, srclen, "/sysroot%s", src); + snprintf (destbuf, destlen, "/sysroot%s", dest); + + if (flags) + r = command (NULL, &err, cmd, flags, srcbuf, destbuf, NULL); + else + r = command (NULL, &err, cmd, srcbuf, destbuf, NULL); + + free (srcbuf); + free (destbuf); + + if (r == -1) { + reply_with_error ("%s: %s", cmd, err); + free (err); + return -1; + } + free (err); + + return 0; +} |