/* Confirmed this is true up to ext4 from the Linux sources. */
#define EXT2_LABEL_MAX 16
+#define MAX_ARGS 64
+
/* Choose which tools like mke2fs to use. For RHEL 5 (only) there
* is a special set of tools which support ext2/3/4. eg. On RHEL 5,
* mke2fs only supports ext2/3, but mke4fs supports ext2/3/4.
free (err);
return 0;
}
+
+/* Takes optional arguments, consult optargs_bitmask. */
+int
+do_tune2fs (const char *device, /* only required parameter */
+ int force,
+ int maxmountcount,
+ int mountcount,
+ const char *errorbehavior,
+ int64_t group,
+ int intervalbetweenchecks,
+ int reservedblockspercentage,
+ const char *lastmounteddirectory,
+ int64_t reservedblockscount,
+ int64_t user)
+{
+ const char *argv[MAX_ARGS];
+ size_t i = 0;
+ int r;
+ char *err;
+ char prog[] = "tune2fs";
+ char maxmountcount_s[64];
+ char mountcount_s[64];
+ char group_s[64];
+ char intervalbetweenchecks_s[64];
+ char reservedblockspercentage_s[64];
+ char reservedblockscount_s[64];
+ char user_s[64];
+
+ if (e2prog (prog) == -1)
+ return -1;
+
+ ADD_ARG (argv, i, prog);
+
+ if (optargs_bitmask & GUESTFS_TUNE2FS_FORCE_BITMASK) {
+ if (force)
+ ADD_ARG (argv, i, "-f");
+ }
+
+ if (optargs_bitmask & GUESTFS_TUNE2FS_MAXMOUNTCOUNT_BITMASK) {
+ if (maxmountcount < 0) {
+ reply_with_error ("maxmountcount cannot be negative");
+ return -1;
+ }
+ ADD_ARG (argv, i, "-c");
+ snprintf (maxmountcount_s, sizeof maxmountcount_s, "%d", maxmountcount);
+ ADD_ARG (argv, i, maxmountcount_s);
+ }
+
+ if (optargs_bitmask & GUESTFS_TUNE2FS_MOUNTCOUNT_BITMASK) {
+ if (mountcount < 0) {
+ reply_with_error ("mountcount cannot be negative");
+ return -1;
+ }
+ ADD_ARG (argv, i, "-C");
+ snprintf (mountcount_s, sizeof mountcount_s, "%d", mountcount);
+ ADD_ARG (argv, i, mountcount_s);
+ }
+
+ if (optargs_bitmask & GUESTFS_TUNE2FS_ERRORBEHAVIOR_BITMASK) {
+ if (STRNEQ (errorbehavior, "continue") &&
+ STRNEQ (errorbehavior, "remount-ro") &&
+ STRNEQ (errorbehavior, "panic")) {
+ reply_with_error ("invalid errorbehavior parameter: %s", errorbehavior);
+ return -1;
+ }
+ ADD_ARG (argv, i, "-e");
+ ADD_ARG (argv, i, errorbehavior);
+ }
+
+ if (optargs_bitmask & GUESTFS_TUNE2FS_GROUP_BITMASK) {
+ if (group < 0) {
+ reply_with_error ("group cannot be negative");
+ return -1;
+ }
+ ADD_ARG (argv, i, "-g");
+ snprintf (group_s, sizeof group_s, "%" PRIi64, group);
+ ADD_ARG (argv, i, group_s);
+ }
+
+ if (optargs_bitmask & GUESTFS_TUNE2FS_INTERVALBETWEENCHECKS_BITMASK) {
+ if (intervalbetweenchecks < 0) {
+ reply_with_error ("intervalbetweenchecks cannot be negative");
+ return -1;
+ }
+ ADD_ARG (argv, i, "-i");
+ if (intervalbetweenchecks > 0) {
+ /* -i <NN>s is not documented in the man page, but has been
+ * supported in tune2fs for several years.
+ */
+ snprintf (intervalbetweenchecks_s, sizeof intervalbetweenchecks_s,
+ "%ds", intervalbetweenchecks);
+ ADD_ARG (argv, i, intervalbetweenchecks_s);
+ }
+ else
+ ADD_ARG (argv, i, "0");
+ }
+
+ if (optargs_bitmask & GUESTFS_TUNE2FS_RESERVEDBLOCKSPERCENTAGE_BITMASK) {
+ if (reservedblockspercentage < 0) {
+ reply_with_error ("reservedblockspercentage cannot be negative");
+ return -1;
+ }
+ ADD_ARG (argv, i, "-m");
+ snprintf (reservedblockspercentage_s, sizeof reservedblockspercentage_s,
+ "%d", reservedblockspercentage);
+ ADD_ARG (argv, i, reservedblockspercentage_s);
+ }
+
+ if (optargs_bitmask & GUESTFS_TUNE2FS_LASTMOUNTEDDIRECTORY_BITMASK) {
+ ADD_ARG (argv, i, "-M");
+ ADD_ARG (argv, i, lastmounteddirectory);
+ }
+
+ if (optargs_bitmask & GUESTFS_TUNE2FS_RESERVEDBLOCKSCOUNT_BITMASK) {
+ if (reservedblockscount < 0) {
+ reply_with_error ("reservedblockscount cannot be negative");
+ return -1;
+ }
+ ADD_ARG (argv, i, "-r");
+ snprintf (reservedblockscount_s, sizeof reservedblockscount_s,
+ "%" PRIi64, reservedblockscount);
+ ADD_ARG (argv, i, reservedblockscount_s);
+ }
+
+ if (optargs_bitmask & GUESTFS_TUNE2FS_USER_BITMASK) {
+ if (user < 0) {
+ reply_with_error ("user cannot be negative");
+ return -1;
+ }
+ ADD_ARG (argv, i, "-u");
+ snprintf (user_s, sizeof user_s, "%" PRIi64, user);
+ ADD_ARG (argv, i, user_s);
+ }
+
+ ADD_ARG (argv, i, device);
+ ADD_ARG (argv, i, NULL);
+
+ r = commandv (NULL, &err, argv);
+ if (r == -1) {
+ reply_with_error ("%s: %s: %s", prog, device, err);
+ free (err);
+ return -1;
+ }
+
+ free (err);
+ return 0;
+}
C<guestfs_cp_a> and C<guestfs_mv> for general file copying and
moving functions.");
+ ("tune2fs", (RErr, [Device "device"], [Bool "force"; Int "maxmountcount"; Int "mountcount"; String "errorbehavior"; Int64 "group"; Int "intervalbetweenchecks"; Int "reservedblockspercentage"; String "lastmounteddirectory"; Int64 "reservedblockscount"; Int64 "user"]), 298, [],
+ [InitScratchFS, Always, TestOutputHashtable (
+ [["tune2fs"; "/dev/sdb1"; "false"; "0"; ""; "NOARG"; ""; "0"; ""; "NOARG"; ""; ""];
+ ["tune2fs_l"; "/dev/sdb1"]],
+ ["Check interval", "0 (<none>)";
+ "Maximum mount count", "-1"]);
+ InitScratchFS, Always, TestOutputHashtable (
+ [["tune2fs"; "/dev/sdb1"; "false"; "0"; ""; "NOARG"; ""; "86400"; ""; "NOARG"; ""; ""];
+ ["tune2fs_l"; "/dev/sdb1"]],
+ ["Check interval", "86400 (1 day)";
+ "Maximum mount count", "-1"]);
+ InitScratchFS, Always, TestOutputHashtable (
+ [["tune2fs"; "/dev/sdb1"; "false"; ""; ""; "NOARG"; "1"; ""; ""; "NOARG"; ""; "1"];
+ ["tune2fs_l"; "/dev/sdb1"]],
+ ["Reserved blocks uid", "1 (user bin)";
+ "Reserved blocks gid", "1 (group bin)"]);
+ InitScratchFS, Always, TestOutputHashtable (
+ [["tune2fs"; "/dev/sdb1"; "false"; ""; ""; "NOARG"; "0"; ""; ""; "NOARG"; ""; "0"];
+ ["tune2fs_l"; "/dev/sdb1"]],
+ ["Reserved blocks uid", "0 (user root)";
+ "Reserved blocks gid", "0 (group root)"])
+ ],
+ "adjust ext2/ext3/ext4 filesystem parameters",
+ "\
+This call allows you to adjust various filesystem parameters of
+an ext2/ext3/ext4 filesystem called C<device>.
+
+The optional parameters are:
+
+=over 4
+
+=item C<force>
+
+Force tune2fs to complete the operation even in the face of errors.
+This is the same as the tune2fs C<-f> option.
+
+=item C<maxmountcount>
+
+Set the number of mounts after which the filesystem is checked
+by L<e2fsck(8)>. If this is C<0> then the number of mounts is
+disregarded. This is the same as the tune2fs C<-c> option.
+
+=item C<mountcount>
+
+Set the number of times the filesystem has been mounted.
+This is the same as the tune2fs C<-C> option.
+
+=item C<errorbehavior>
+
+Change the behavior of the kernel code when errors are detected.
+Possible values currently are: C<continue>, C<remount-ro>, C<panic>.
+In practice these options don't really make any difference,
+particularly for write errors.
+
+This is the same as the tune2fs C<-e> option.
+
+=item C<group>
+
+Set the group which can use reserved filesystem blocks.
+This is the same as the tune2fs C<-g> option except that it
+can only be specified as a number.
+
+=item C<intervalbetweenchecks>
+
+Adjust the maximal time between two filesystem checks
+(in seconds). If the option is passed as C<0> then
+time-dependent checking is disabled.
+
+This is the same as the tune2fs C<-i> option.
+
+=item C<reservedblockspercentage>
+
+Set the percentage of the filesystem which may only be allocated
+by privileged processes.
+This is the same as the tune2fs C<-m> option.
+
+=item C<lastmounteddirectory>
+
+Set the last mounted directory.
+This is the same as the tune2fs C<-M> option.
+
+=item C<reservedblockscount>
+Set the number of reserved filesystem blocks.
+This is the same as the tune2fs C<-r> option.
+
+=item C<user>
+
+Set the user who can use the reserved filesystem blocks.
+This is the same as the tune2fs C<-u> option except that it
+can only be specified as a number.
+
+=back
+
+To get the current values of filesystem parameters, see
+C<guestfs_tune2fs_l>. For precise details of how tune2fs
+works, see the L<tune2fs(8)> man page.");
+
]
let all_functions = non_daemon_functions @ daemon_functions