X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Fext2.c;h=3a075e565dbd42cd0f853a47d158359a4329a880;hp=c90ee05c2d5af399f50fe2e70a49d64322c47636;hb=7cb6fac3074c52ac3c3e9ead5d99e4a2887cf7b1;hpb=00a9ae7365e6bad258bcf079a18dcae94d0853ad diff --git a/daemon/ext2.c b/daemon/ext2.c index c90ee05..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,12 +302,47 @@ do_resize2fs (const char *device) } int +do_resize2fs_size (const char *device, int64_t size) +{ + char *err; + int r; + + char prog[] = "resize2fs"; + if (e2prog (prog) == -1) + return -1; + + /* 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); + return -1; + } + + free (err); + return 0; +} + +int do_e2fsck_f (const char *device) { char *err; int r; - char prog[] = "/sbin/e2fsck"; + char prog[] = "e2fsck"; if (e2prog (prog) == -1) return -1; @@ -334,7 +370,7 @@ do_mke2journal (int blocksize, const char *device) char *err; int r; - char prog[] = "/sbin/mke2fs"; + char prog[] = "mke2fs"; if (e2prog (prog) == -1) return -1; @@ -360,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; @@ -387,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; @@ -415,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; @@ -446,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; @@ -477,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;