X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Fext2.c;h=3a075e565dbd42cd0f853a47d158359a4329a880;hp=ff6459b40796a564a2c8e3a88e4f05edc16ba1bb;hb=71b02d6654395ff04689055f3820b3ad4e54ec00;hpb=c4e8aa245a243b020d6b7bd832674be871a43610;ds=sidebyside diff --git a/daemon/ext2.c b/daemon/ext2.c index ff6459b..3a075e5 100644 --- a/daemon/ext2.c +++ b/daemon/ext2.c @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -43,11 +44,11 @@ e2prog (char *name) p++; *p = '4'; - if (access (name, X_OK) == 0) + if (prog_exists (name)) return 0; *p = '2'; - if (access (name, X_OK) == 0) + if (prog_exists (name)) return 0; reply_with_error ("cannot find required program %s", name); @@ -63,7 +64,7 @@ do_tune2fs_l (const char *device) char **ret = NULL; int size = 0, alloc = 0; - char prog[] = "/sbin/tune2fs"; + char prog[] = "tune2fs"; if (e2prog (prog) == -1) return NULL; @@ -151,7 +152,7 @@ do_set_e2label (const char *device, const char *label) int r; char *err; - char prog[] = "/sbin/e2label"; + char prog[] = "e2label"; if (e2prog (prog) == -1) return -1; @@ -172,7 +173,7 @@ do_get_e2label (const char *device) int r, len; char *out, *err; - char prog[] = "/sbin/e2label"; + char prog[] = "e2label"; if (e2prog (prog) == -1) return NULL; @@ -200,7 +201,7 @@ do_set_e2uuid (const char *device, const char *uuid) int r; char *err; - char prog[] = "/sbin/tune2fs"; + char prog[] = "tune2fs"; if (e2prog (prog) == -1) return -1; @@ -225,7 +226,7 @@ do_get_e2uuid (const char *device) * to use tune2fs -l and then look for a particular string in * the output. */ - char prog[] = "/sbin/tune2fs"; + char prog[] = "tune2fs"; if (e2prog (prog) == -1) return NULL; @@ -285,7 +286,7 @@ do_resize2fs (const char *device) char *err; int r; - char prog[] = "/sbin/resize2fs"; + char prog[] = "resize2fs"; if (e2prog (prog) == -1) return -1; @@ -301,16 +302,30 @@ do_resize2fs (const char *device) } int -do_e2fsck_f (const char *device) +do_resize2fs_size (const char *device, int64_t size) { char *err; int r; - char prog[] = "/sbin/e2fsck"; + char prog[] = "resize2fs"; if (e2prog (prog) == -1) return -1; - r = command (NULL, &err, prog, "-p", "-f", device, NULL); + /* resize2fs itself may impose additional limits. Since we are + * going to use the 'K' suffix however we can only work with whole + * kilobytes. + */ + if (size & 1023) { + reply_with_error ("%" PRIi64 ": size must be a round number of kilobytes", + size); + return -1; + } + size /= 1024; + + char buf[32]; + snprintf (buf, sizeof buf, "%" PRIi64 "K", size); + + r = command (NULL, &err, prog, device, buf, NULL); if (r == -1) { reply_with_error ("%s", err); free (err); @@ -322,12 +337,40 @@ do_e2fsck_f (const char *device) } int +do_e2fsck_f (const char *device) +{ + char *err; + int r; + + char prog[] = "e2fsck"; + if (e2prog (prog) == -1) + return -1; + + /* 0 = no errors, 1 = errors corrected. + * + * >= 4 means uncorrected or other errors. + * + * 2, 3 means errors were corrected and we require a reboot. This is + * a difficult corner case. + */ + r = commandr (NULL, &err, prog, "-p", "-f", device, NULL); + if (r == -1 || r >= 2) { + reply_with_error ("%s", err); + free (err); + return -1; + } + + free (err); + return 0; +} + +int do_mke2journal (int blocksize, const char *device) { char *err; int r; - char prog[] = "/sbin/mke2fs"; + char prog[] = "mke2fs"; if (e2prog (prog) == -1) return -1; @@ -353,7 +396,7 @@ do_mke2journal_L (int blocksize, const char *label, const char *device) char *err; int r; - char prog[] = "/sbin/mke2fs"; + char prog[] = "mke2fs"; if (e2prog (prog) == -1) return -1; @@ -380,7 +423,7 @@ do_mke2journal_U (int blocksize, const char *uuid, const char *device) char *err; int r; - char prog[] = "/sbin/mke2fs"; + char prog[] = "mke2fs"; if (e2prog (prog) == -1) return -1; @@ -408,7 +451,7 @@ do_mke2fs_J (const char *fstype, int blocksize, const char *device, char *err; int r; - char prog[] = "/sbin/mke2fs"; + char prog[] = "mke2fs"; if (e2prog (prog) == -1) return -1; @@ -439,7 +482,7 @@ do_mke2fs_JL (const char *fstype, int blocksize, const char *device, char *err; int r; - char prog[] = "/sbin/mke2fs"; + char prog[] = "mke2fs"; if (e2prog (prog) == -1) return -1; @@ -470,7 +513,7 @@ do_mke2fs_JU (const char *fstype, int blocksize, const char *device, char *err; int r; - char prog[] = "/sbin/mke2fs"; + char prog[] = "mke2fs"; if (e2prog (prog) == -1) return -1;