From 3cb794463a62239e36d730bc5d2d3eb4c7a66096 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Fri, 1 May 2009 11:00:34 +0100 Subject: [PATCH] Add cp, cp-a and mv commands. --- daemon/Makefile.am | 1 + daemon/cpmv.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/generator.ml | 45 ++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 daemon/cpmv.c diff --git a/daemon/Makefile.am b/daemon/Makefile.am index ecced37..9cec685 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 0000000..33755c4 --- /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 + +#include +#include +#include + +#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 ba97deb..bb550f1 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, with the root directory being C."); + ("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 to C where C 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 to C +recursively using the C 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 to C where C is +either a destination filename or destination directory."); + ] -- 1.8.3.1