[Libguestfs] [nbdkit PATCH 11/17] plugins/floppy: wrap source code at 80 chars

Laszlo Ersek lersek at redhat.com
Thu Apr 13 14:03:40 UTC 2023


Wrap the source code at 80 characters.

In the create_virtual_floppy() function, we have a complex calculation
that is not really possible to squeeze under 80 characters in width,
without extracting part of it to a local variable. The problem is *naming*
the new variable, plus the *type* of the new variable.

By inspecting the rest of the function, I decided that the expression
being extracted, namely

  DIV_ROUND_UP ((data_size / CLUSTER_SIZE + 2) * 4, CLUSTER_SIZE)

should be called "fat_clusters". The rest of the function calculates the
same quantity, only in multiple steps; the result is then assigned to
"floppy->fat_clusters".

Regarding the type of the new local variable: "data_size" is "uint64_t",
and everything else in the expression is "int", so the result is
"uint64_t" as well, in practice.

Shorten the original assignment by using compound assignment, as well.

Note that this patch is untested. In "make check", "tests/test-floppy.sh"
passes. However, that test does not seem to pass the "size=..." option to
the plugin, and the code being modified in create_virtual_floppy() is
related to "size=..." -- at least it originates from commit c6d6113fa1f3
("floppy: support FAT FSes with unused space.", 2021-06-16).

Cc: Nolan Leake <nolan at sigbus.net>
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2172516
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---

Notes:
    context:-W

 plugins/floppy/directory-lfn.c  | 13 +++++++++----
 plugins/floppy/virtual-floppy.c | 19 +++++++++++++------
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/plugins/floppy/directory-lfn.c b/plugins/floppy/directory-lfn.c
index aa9b38bac755..afa5e4cfef36 100644
--- a/plugins/floppy/directory-lfn.c
+++ b/plugins/floppy/directory-lfn.c
@@ -63,15 +63,20 @@ struct lfn {
   size_t lfn_size;              /* Size *in bytes* of lfn. */
 };
 
-static int add_volume_label (const char *label, size_t di, struct virtual_floppy *floppy);
+static int add_volume_label (const char *label, size_t di,
+                             struct virtual_floppy *floppy);
 static int add_dot_entries (size_t di, struct virtual_floppy *floppy);
-static int add_directory_entry (const struct lfn *lfn, uint8_t attributes, uint32_t file_size, struct stat *statbuf, size_t di, struct virtual_floppy *floppy);
+static int add_directory_entry (const struct lfn *lfn, uint8_t attributes,
+                                uint32_t file_size, struct stat *statbuf,
+                                size_t di, struct virtual_floppy *floppy);
 static uint8_t lfn_checksum (const struct lfn *lfn);
 static void set_times (const struct stat *statbuf, struct dir_entry *entry);
 static int convert_long_file_names (struct lfn *lfns, size_t n);
-static int convert_to_utf16le (const char *name, char **out, size_t *output_len);
+static int convert_to_utf16le (const char *name, char **out,
+                               size_t *output_len);
 static void free_lfns (struct lfn *lfns, size_t n);
-static ssize_t append_dir_table (size_t di, const struct dir_entry *entry, struct virtual_floppy *floppy);
+static ssize_t append_dir_table (size_t di, const struct dir_entry *entry,
+                                 struct virtual_floppy *floppy);
 
 /* Create the on disk directory table for dirs[di]. */
 int
diff --git a/plugins/floppy/virtual-floppy.c b/plugins/floppy/virtual-floppy.c
index 2a6871bce6be..6d2f49adb2f0 100644
--- a/plugins/floppy/virtual-floppy.c
+++ b/plugins/floppy/virtual-floppy.c
@@ -61,14 +61,20 @@
 #define OEM_NAME "MSWIN4.1"
 
 static ssize_t visit (const char *dir, struct virtual_floppy *floppy);
-static int visit_subdirectory (const char *dir, const char *name, const struct stat *statbuf, size_t di, struct virtual_floppy *floppy);
-static int visit_file (const char *dir, const char *name, const struct stat *statbuf, size_t di, struct virtual_floppy *floppy);
+static int visit_subdirectory (const char *dir, const char *name,
+                               const struct stat *statbuf, size_t di,
+                               struct virtual_floppy *floppy);
+static int visit_file (const char *dir, const char *name,
+                       const struct stat *statbuf, size_t di,
+                       struct virtual_floppy *floppy);
 static int create_mbr (struct virtual_floppy *floppy);
 static void chs_too_large (uint8_t *out);
-static int create_partition_boot_sector (const char *label, struct virtual_floppy *floppy);
+static int create_partition_boot_sector (const char *label,
+                                         struct virtual_floppy *floppy);
 static int create_fsinfo (struct virtual_floppy *floppy);
 static int create_fat (struct virtual_floppy *floppy);
-static void write_fat_file (uint32_t first_cluster, uint32_t nr_clusters, struct virtual_floppy *floppy);
+static void write_fat_file (uint32_t first_cluster, uint32_t nr_clusters,
+                            struct virtual_floppy *floppy);
 static int create_regions (struct virtual_floppy *floppy);
 
 void
@@ -88,135 +94,136 @@ int
 create_virtual_floppy (const char *dir, const char *label, uint64_t size,
                        struct virtual_floppy *floppy)
 {
   size_t i;
   uint64_t nr_bytes, nr_clusters;
   uint64_t data_used_size;
   uint32_t cluster;
 
   if (visit (dir, floppy) == -1)
     return -1;
 
   nbdkit_debug ("floppy: %zu directories and %zu files",
                 floppy->dirs.len, floppy->files.len);
 
   /* Create the on disk directory tables. */
   for (i = 0; i < floppy->dirs.len; ++i) {
     if (create_directory (i, label, floppy) == -1)
       return -1;
   }
 
   /* We now have a complete list of directories and files, and
    * directories have been converted to on disk directory tables.  So
    * we can assign them to clusters and also precisely calculate the
    * size of the data region and hence the size of the FAT.
    *
    * The first cluster number is always 2 (0 and 1 are reserved), and
    * (in this implementation) always contains the root directory.
    */
   data_used_size = 0;
   cluster = 2;
   for (i = 0; i < floppy->dirs.len; ++i) {
     floppy->dirs.ptr[i].first_cluster = cluster;
     nr_bytes =
       ROUND_UP (floppy->dirs.ptr[i].table.len * sizeof (struct dir_entry),
                 CLUSTER_SIZE);
     data_used_size += nr_bytes;
     nr_clusters = nr_bytes / CLUSTER_SIZE;
     if (cluster + nr_clusters > UINT32_MAX)
       goto too_big;
     floppy->dirs.ptr[i].nr_clusters = nr_clusters;
     cluster += nr_clusters;
   }
   for (i = 0; i < floppy->files.len; ++i) {
     floppy->files.ptr[i].first_cluster = cluster;
     nr_bytes = ROUND_UP (floppy->files.ptr[i].statbuf.st_size, CLUSTER_SIZE);
     data_used_size += nr_bytes;
     nr_clusters = nr_bytes / CLUSTER_SIZE;
     if (cluster + nr_clusters > UINT32_MAX)
       goto too_big;
     floppy->files.ptr[i].nr_clusters = nr_clusters;
     cluster += nr_clusters;
   }
 
   if (size > 0) {
     uint64_t data_size = size - (2080 * SECTOR_SIZE);
-    data_size = data_size - 2 * DIV_ROUND_UP ((data_size / CLUSTER_SIZE + 2) * 4,
-                                              CLUSTER_SIZE) * CLUSTER_SIZE;
+    uint64_t fat_clusters = DIV_ROUND_UP ((data_size / CLUSTER_SIZE + 2) * 4,
+                                          CLUSTER_SIZE);
+    data_size -= 2 * fat_clusters * CLUSTER_SIZE;
     if (data_used_size > data_size) {
       nbdkit_error ("filesystem is larger than \"size\" bytes");
       return -1;
     }
     floppy->data_size = data_size;
   } else {
     floppy->data_size = data_used_size;
   }
 
   floppy->data_clusters = floppy->data_size / CLUSTER_SIZE;
   floppy->data_used_clusters = data_used_size / CLUSTER_SIZE;
 
   /* Despite its name, FAT32 only allows 28 bit cluster numbers, so
    * give an error if we go beyond this.
    */
   if (floppy->data_clusters >= 0x10000000) {
   too_big:
     nbdkit_error ("disk image is too large for the FAT32 disk format");
     return -1;
   }
 
   nbdkit_debug ("floppy: %" PRIu64 " data clusters, "
                 "largest cluster number %" PRIu32 ", "
                 "%" PRIu64 " bytes",
                 floppy->data_clusters,
                 cluster-1,
                 floppy->data_size);
 
   floppy->fat_entries = floppy->data_clusters + 2;
   floppy->fat_clusters = DIV_ROUND_UP (floppy->fat_entries * 4, CLUSTER_SIZE);
 
   nbdkit_debug ("floppy: %" PRIu64 " FAT entries", floppy->fat_entries);
 
   /* We can now decide where we will place the FATs and data region on disk. */
   floppy->fat2_start_sector =
     2080 + floppy->fat_clusters * SECTORS_PER_CLUSTER;
   floppy->data_start_sector =
     floppy->fat2_start_sector + floppy->fat_clusters * SECTORS_PER_CLUSTER;
   floppy->data_last_sector =
     floppy->data_start_sector + floppy->data_clusters * SECTORS_PER_CLUSTER - 1;
 
   /* We now have to go back and update the cluster numbers in the
    * directory entries (which we didn't have available during
    * create_directory above).
    */
   for (i = 0; i < floppy->dirs.len; ++i) {
     if (update_directory_first_cluster (i, floppy) == -1)
       return -1;
   }
 
   /* Create MBR. */
   if (create_mbr (floppy) == -1)
     return -1;
 
   /* Create partition first sector. */
   if (create_partition_boot_sector (label, floppy) == -1)
     return -1;
 
   /* Create filesystem information sector. */
   if (create_fsinfo (floppy) == -1)
     return -1;
 
   /* Allocate and populate FAT. */
   if (create_fat (floppy) == -1)
     return -1;
 
   /* Now we know how large everything is we can create the virtual
    * disk regions.
    */
   if (create_regions (floppy) == -1)
     return -1;
 
   /* Check that if a size was specified, we ended up with it. */
   if (size > 0)
     assert (virtual_size (&floppy->regions) == size);
 
   return 0;
 }



More information about the Libguestfs mailing list