X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=daemon%2Fparted.c;h=d52ad2c71226933cf3757d8dada7b8208288a2a5;hb=7a091a11d7aeddc170e4d1b833fd9d7d18c00841;hp=2f928b05b5e50c7d4bce90d4a593b54c5f4028bd;hpb=cbb026036826f2ab40237aec0b0c5453b859625d;p=libguestfs.git diff --git a/daemon/parted.c b/daemon/parted.c index 2f928b0..d52ad2c 100644 --- a/daemon/parted.c +++ b/daemon/parted.c @@ -1,5 +1,5 @@ /* libguestfs - the guestfsd daemon - * Copyright (C) 2009 Red Hat Inc. + * Copyright (C) 2009-2011 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 @@ -178,27 +178,21 @@ do_part_del (const char *device, int partnum) int do_part_disk (const char *device, const char *parttype) { - const char *startstr; - const char *endstr; - parttype = check_parttype (parttype); if (!parttype) { reply_with_error ("unknown partition type: common choices are \"gpt\" and \"msdos\""); return -1; } - /* Voooooodooooooooo (thanks Jim Meyering for working this out). */ - if (STREQ (parttype, "msdos")) { - startstr = "1s"; - endstr = "-1s"; - } else if (STREQ (parttype, "gpt")) { - startstr = "34s"; - endstr = "-34s"; - } else { - /* untested */ - startstr = "1s"; - endstr = "-1s"; - } + /* Align all partitions created this way to 64 sectors, and leave + * the last 64 sectors at the end of the disk free. This wastes + * 32K+32K = 64K on 512-byte sector disks. The rationale is: + * + * - aligned operations are faster + * - GPT requires at least 34 sectors at the end of the disk. + */ + const char *startstr = "64s"; + const char *endstr = "-64s"; RUN_PARTED (return -1, device, @@ -293,21 +287,21 @@ test_parted_m_opt (void) if (result >= 0) return result; - if (verbose) - fprintf (stderr, "Testing if this parted supports '-m' option.\n"); - char *err = NULL; int r = commandr (NULL, &err, "parted", "-s", "-m", "/dev/null", NULL); if (r == -1) { /* Test failed, eg. missing or completely unusable parted binary. */ reply_with_error ("could not run 'parted' command"); + free (err); return -1; } if (err && strstr (err, "invalid option -- m")) - return result = 0; - - return result = 1; + result = 0; + else + result = 1; + free (err); + return result; } static char * @@ -334,9 +328,6 @@ print_partition_table (const char *device, int parted_has_m_opt) } free (err); - if (verbose) - fprintf (stderr, "parted output:\n%s\n", out); - return out; } @@ -384,6 +375,14 @@ do_part_get_parttype (const char *device) } free_strings (lines); + + /* If "loop" return an error (RHBZ#634246). */ + if (STREQ (r, "loop")) { + free (r); + reply_with_error ("not a partitioned device"); + return NULL; + } + return r; } else { @@ -412,6 +411,13 @@ do_part_get_parttype (const char *device) return NULL; } + /* If "loop" return an error (RHBZ#634246). */ + if (STREQ (p, "loop")) { + free (p); + reply_with_error ("not a partitioned device"); + return NULL; + } + return p; /* caller frees */ } }