[Libguestfs] [PATCH 1/2] New API: vfs_min_size

Richard W.M. Jones rjones at redhat.com
Tue Oct 20 13:38:41 UTC 2015


On Tue, Oct 20, 2015 at 01:28:23PM +0300, Maxim Perevedentsev wrote:
> On 10/19/2015 07:45 PM, Pino Toscano wrote:
> >On Monday 19 October 2015 17:05:02 Maxim Perevedentsev wrote:
> >
> >>+  const char *size_pattern = "You might resize at ",
> >>+             *full_pattern = "Volume is full",
> >>+             *cluster_size_pattern = "Cluster size",
> >>+             *volume_size_pattern = "Current volume size:";
> >>+  int is_full = 0;
> >>+  int32_t cluster_size = 0;
> >>+
> >>+  /* FS may be marked for check, so force ntfsresize */
> >>+  r = command (&out, &err, str_ntfsresize, "--info", "-ff", device, NULL);
> >>+
> >>+  lines = split_lines (out);
> >>+  if (lines == NULL)
> >>+    return -1;
> >>+
> >>+  if (verbose) {
> >>+    for (i = 0; lines[i] != NULL; ++i)
> >>+      fprintf (stderr, "ntfs_min_size: lines[%zu] = \"%s\"\n", i, lines[i]);
> >>+  }
> >>+
> >>+  if (r == -1) {
> >>+    /* If volume is full, ntfsresize returns error. */
> >>+    for (i = 0; lines[i] != NULL; ++i) {
> >>+      if (strstr (lines[i], full_pattern))
> >Better use STRPREFIX here, which is what we use all around libguestfs.
> This is not at the beginning of line.
> >
> >>+        is_full = 1;
> >>+      else if ((p = strstr (lines[i], cluster_size_pattern))) {
> >>+        if (sscanf (p + strlen(cluster_size_pattern),
> >>+                    "%*[ ]:%" SCNd32, &cluster_size) != 1) {
> >>+          reply_with_error("Cannot parse cluster size");
> >>+          return -1;
> >>+        }
> >>+      }
> >>+      else if ((p = strstr (lines[i], volume_size_pattern))) {
> >>+        if (sscanf (p + strlen(volume_size_pattern),
> >>+                    "%" SCNd64, &volume_size) != 1) {
> >>+          reply_with_error("Cannot parse volume size");
> >>+          return -1;
> >>+        }
> >It sounds like these scans of the lines could be done using the
> >analyze_line helper in btrfs.c (which would need to be moved as common
> >code in guestfd.c). This way, the parsing of numbers could use
> >xstrtoul/xstrtoull (see btrfs.c:do_btrfs_subvolume_list) instead of
> >sscanf.

Although I think sscanf is fine, and certainly easier to use.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine.  Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/




More information about the Libguestfs mailing list