/* 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
int
do_part_del (const char *device, int partnum)
{
+ if (partnum <= 0) {
+ reply_with_error ("partition number must be >= 1");
+ return -1;
+ }
+
char partnum_str[16];
snprintf (partnum_str, sizeof partnum_str, "%d", 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,
int
do_part_set_bootable (const char *device, int partnum, int bootable)
{
+ if (partnum <= 0) {
+ reply_with_error ("partition number must be >= 1");
+ return -1;
+ }
+
char partstr[16];
snprintf (partstr, sizeof partstr, "%d", partnum);
int
do_part_set_name (const char *device, int partnum, const char *name)
{
+ if (partnum <= 0) {
+ reply_with_error ("partition number must be >= 1");
+ return -1;
+ }
+
char partstr[16];
snprintf (partstr, sizeof partstr, "%d", partnum);
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 *
}
free (err);
- if (verbose)
- fprintf (stderr, "parted output:\n%s<END>\n", out);
-
return out;
}
}
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 {
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 */
}
}
int
do_part_get_bootable (const char *device, int partnum)
{
+ if (partnum <= 0) {
+ reply_with_error ("partition number must be >= 1");
+ return -1;
+ }
+
int parted_has_m_opt = test_parted_m_opt ();
if (parted_has_m_opt == -1)
return -1;
int
do_part_get_mbr_id (const char *device, int partnum)
{
+ if (partnum <= 0) {
+ reply_with_error ("partition number must be >= 1");
+ return -1;
+ }
+
char partnum_str[16];
snprintf (partnum_str, sizeof partnum_str, "%d", partnum);
int
do_part_set_mbr_id (const char *device, int partnum, int idbyte)
{
+ if (partnum <= 0) {
+ reply_with_error ("partition number must be >= 1");
+ return -1;
+ }
+
char partnum_str[16];
snprintf (partnum_str, sizeof partnum_str, "%d", partnum);