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 | |
parent | af5087450063fe013ac2df4db39451d7da6152a3 (diff) | |
download | libguestfs-3cb794463a62239e36d730bc5d2d3eb4c7a66096.tar.gz libguestfs-3cb794463a62239e36d730bc5d2d3eb4c7a66096.tar.xz libguestfs-3cb794463a62239e36d730bc5d2d3eb4c7a66096.zip |
Add cp, cp-a and mv commands.
-rw-r--r-- | daemon/Makefile.am | 1 | ||||
-rw-r--r-- | daemon/cpmv.c | 94 | ||||
-rwxr-xr-x | src/generator.ml | 45 |
3 files changed, 140 insertions, 0 deletions
diff --git a/daemon/Makefile.am b/daemon/Makefile.am index ecced37a..9cec685b 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -24,6 +24,7 @@ guestfsd_SOURCES = \ blockdev.c \ checksum.c \ command.c \ + cpmv.c \ daemon.h \ debug.c \ devsparts.c \ 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; +} diff --git a/src/generator.ml b/src/generator.ml index ba97debe..bb550f1d 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -1692,6 +1692,51 @@ any partition tables, filesystem superblocks and so on."); This command installs GRUB (the Grand Unified Bootloader) on C<device>, with the root directory being C<root>."); + ("cp", (RErr, [String "src"; String "dest"]), 87, [], + [InitBasicFS, TestOutput ( + [["write_file"; "/old"; "file content"; "0"]; + ["cp"; "/old"; "/new"]; + ["cat"; "/new"]], "file content"); + InitBasicFS, TestOutputTrue ( + [["write_file"; "/old"; "file content"; "0"]; + ["cp"; "/old"; "/new"]; + ["is_file"; "/old"]]); + InitBasicFS, TestOutput ( + [["write_file"; "/old"; "file content"; "0"]; + ["mkdir"; "/dir"]; + ["cp"; "/old"; "/dir/new"]; + ["cat"; "/dir/new"]], "file content")], + "copy a file", + "\ +This copies a file from C<src> to C<dest> where C<dest> is +either a destination filename or destination directory."); + + ("cp_a", (RErr, [String "src"; String "dest"]), 88, [], + [InitBasicFS, TestOutput ( + [["mkdir"; "/olddir"]; + ["mkdir"; "/newdir"]; + ["write_file"; "/olddir/file"; "file content"; "0"]; + ["cp_a"; "/olddir"; "/newdir"]; + ["cat"; "/newdir/olddir/file"]], "file content")], + "copy a file or directory recursively", + "\ +This copies a file or directory from C<src> to C<dest> +recursively using the C<cp -a> command."); + + ("mv", (RErr, [String "src"; String "dest"]), 89, [], + [InitBasicFS, TestOutput ( + [["write_file"; "/old"; "file content"; "0"]; + ["mv"; "/old"; "/new"]; + ["cat"; "/new"]], "file content"); + InitBasicFS, TestOutputFalse ( + [["write_file"; "/old"; "file content"; "0"]; + ["mv"; "/old"; "/new"]; + ["is_file"; "/old"]])], + "move a file", + "\ +This moves a file from C<src> to C<dest> where C<dest> is +either a destination filename or destination directory."); + ] |