From 612a358b8935381e5b8d706e4a77689cd316a18d Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Wed, 15 Apr 2009 20:27:30 +0100 Subject: [PATCH] Move guestfish 'alloc' command to a separate file. --- fish/Makefile.am | 1 + fish/alloc.c | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ fish/fish.c | 84 +---------------------------------------- fish/fish.h | 3 ++ 4 files changed, 117 insertions(+), 82 deletions(-) create mode 100644 fish/alloc.c diff --git a/fish/Makefile.am b/fish/Makefile.am index 11598b8..8efa5a5 100644 --- a/fish/Makefile.am +++ b/fish/Makefile.am @@ -18,6 +18,7 @@ bin_PROGRAMS = guestfish guestfish_SOURCES = \ + alloc.c \ cmds.c \ completion.c \ fish.c \ diff --git a/fish/alloc.c b/fish/alloc.c new file mode 100644 index 0000000..8979acf --- /dev/null +++ b/fish/alloc.c @@ -0,0 +1,111 @@ +/* guestfish - the filesystem interactive shell + * 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 +#include +#include + +#include "fish.h" + +static int parse_size (const char *str, off_t *size_rtn); + +int +do_alloc (int argc, char *argv[]) +{ + off_t size; + int fd; + + if (argc != 2) { + fprintf (stderr, "use 'alloc file size' to create an image\n"); + return -1; + } + + if (parse_size (argv[1], &size) == -1) + return -1; + + if (g_launched) { + fprintf (stderr, "can't allocate or add disks after launching\n"); + return -1; + } + + fd = open (argv[0], O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_TRUNC, 0666); + if (fd == -1) { + perror (argv[0]); + return -1; + } + + if (posix_fallocate (fd, 0, size) == -1) { + perror ("fallocate"); + close (fd); + unlink (argv[0]); + return -1; + } + + if (close (fd) == -1) { + perror (argv[0]); + unlink (argv[0]); + return -1; + } + + if (guestfs_add_drive (g, argv[0]) == -1) { + unlink (argv[0]); + return -1; + } + + return 0; +} + +static int +parse_size (const char *str, off_t *size_rtn) +{ + uint64_t size; + char type; + + /* Note that the parsing here is looser than what is specified in the + * help, but we may tighten it up in future so beware. + */ + if (sscanf (str, "%"SCNu64"%c", &size, &type) == 2) { + switch (type) { + case 'k': case 'K': size *= 1024; break; + case 'm': case 'M': size *= 1024 * 1024; break; + case 'g': case 'G': size *= 1024 * 1024 * 1024; break; + case 's': size *= 512; break; + default: + fprintf (stderr, "could not parse size specification '%s'\n", str); + return -1; + } + } + else if (sscanf (str, "%"SCNu64, &size) == 1) + size *= 1024; + else { + fprintf (stderr, "could not parse size specification '%s'\n", str); + return -1; + } + + /* XXX 32 bit file offsets, if anyone uses them? GCC should give + * a warning here anyhow. + */ + *size_rtn = size; + + return 0; +} diff --git a/fish/fish.c b/fish/fish.c index e506f7e..b96d1d9 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -26,7 +26,6 @@ #include #include #include -#include #include #ifdef HAVE_LIBREADLINE @@ -50,7 +49,6 @@ static void shell_script (void); static void script (int prompt); static void cmdline (char *argv[], int optind, int argc); static int issue_command (const char *cmd, char *argv[]); -static int parse_size (const char *str, off_t *size_rtn); static void initialize_readline (void); static void cleanup_readline (void); static void add_history_line (const char *); @@ -494,50 +492,8 @@ issue_command (const char *cmd, char *argv[]) return 0; } else if (strcasecmp (cmd, "alloc") == 0 || - strcasecmp (cmd, "allocate") == 0) { - if (argc != 2) { - fprintf (stderr, "use 'alloc file size' to create an image\n"); - return -1; - } - else { - off_t size; - int fd; - - if (parse_size (argv[1], &size) == -1) - return -1; - - if (g_launched) { - fprintf (stderr, "can't allocate or add disks after launching\n"); - return -1; - } - - fd = open (argv[0], O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_TRUNC, 0666); - if (fd == -1) { - perror (argv[0]); - return -1; - } - - if (posix_fallocate (fd, 0, size) == -1) { - perror ("fallocate"); - close (fd); - unlink (argv[0]); - return -1; - } - - if (close (fd) == -1) { - perror (argv[0]); - unlink (argv[0]); - return -1; - } - - if (guestfs_add_drive (g, argv[0]) == -1) { - unlink (argv[0]); - return -1; - } - - return 0; - } - } + strcasecmp (cmd, "allocate") == 0) + return do_alloc (argc, argv); else return run_action (cmd, argc, argv); } @@ -590,42 +546,6 @@ display_builtin_command (const char *cmd) cmd); } -/* Parse size parameter of alloc command. */ -static int -parse_size (const char *str, off_t *size_rtn) -{ - uint64_t size; - char type; - - /* Note that the parsing here is looser than what is specified in the - * help, but we may tighten it up in future so beware. - */ - if (sscanf (str, "%"SCNu64"%c", &size, &type) == 2) { - switch (type) { - case 'k': case 'K': size *= 1024; break; - case 'm': case 'M': size *= 1024 * 1024; break; - case 'g': case 'G': size *= 1024 * 1024 * 1024; break; - case 's': size *= 512; break; - default: - fprintf (stderr, "could not parse size specification '%s'\n", str); - return -1; - } - } - else if (sscanf (str, "%"SCNu64, &size) == 1) - size *= 1024; - else { - fprintf (stderr, "could not parse size specification '%s'\n", str); - return -1; - } - - /* XXX 32 bit file offsets, if anyone uses them? GCC should give - * a warning here anyhow. - */ - *size_rtn = size; - - return 0; -} - void free_strings (char **argv) { diff --git a/fish/fish.h b/fish/fish.h index 6cd4d97..e45f034 100644 --- a/fish/fish.h +++ b/fish/fish.h @@ -44,4 +44,7 @@ extern int run_action (const char *cmd, int argc, char *argv[]); /* in completion.c (auto-generated) */ extern char **do_completion (const char *text, int start, int end); +/* in alloc.c */ +extern int do_alloc (int argc, char *argv[]); + #endif /* FISH_H */ -- 1.8.3.1