[Libguestfs] [supermin PATCH] build: ignore empty files

Martin Kletzander mkletzan at redhat.com
Mon Dec 3 16:09:57 UTC 2018


On Mon, Dec 03, 2018 at 04:32:19PM +0100, Pino Toscano wrote:
>Do not error out on empty files, just ignore them.
>---
> src/mode_build.ml | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
>diff --git a/src/mode_build.ml b/src/mode_build.ml
>index b5f5fa6..9cd0a21 100644
>--- a/src/mode_build.ml
>+++ b/src/mode_build.ml
>@@ -46,6 +46,7 @@ and file_content =
> | Packages
> | Hostfiles
> | Excludefiles
>+| Empty
>
> let rec string_of_file_type = function
>   | GZip c -> sprintf "gzip %s" (string_of_file_content c)
>@@ -56,6 +57,7 @@ and string_of_file_content = function
>   | Packages -> "packages"
>   | Hostfiles -> "hostfiles"
>   | Excludefiles -> "excludefiles"
>+  | Empty -> "(empty)"
>
> let rec build debug
>     (copy_kernel, format, host_cpu,
>@@ -250,6 +252,8 @@ and read_appliance debug basedir appliance = function
>     (* Depending on the file type, read or unpack the file. *)
>     let appliance =
>       match file_type with
>+      | Uncompressed Empty | GZip Empty | XZ Empty ->
>+        appliance
>       | Uncompressed ((Packages|Hostfiles|Excludefiles) as t) ->
>         let chan = open_in file in
>         let lines = input_all_lines chan in
>@@ -294,7 +298,7 @@ and update_appliance appliance lines = function
>         String.sub path 1 (n-1)
>     ) lines in
>     { appliance with excludefiles = appliance.excludefiles @ lines }
>-  | Base_image -> assert false
>+  | Base_image | Empty -> assert false
>
> (* Determine the [file_type] of [file], or exit with an error. *)
> and get_file_type file =
>@@ -331,6 +335,7 @@ and get_file_content file buf len =
>   else if len >= 2 && buf.[0] = '/' then Hostfiles
>   else if len >= 2 && buf.[0] = '-' then Excludefiles
>   else if len >= 1 && isalnum buf.[0] then Packages
>+  else if len = 0 then Empty

For me `zcat` outputs 10 KB of zeroes when ran with the empty base.tar.gz so
this is not enough.  The following works for me, but is probably not the right
way to approach it:

diff --git i/src/mode_build.ml w/src/mode_build.ml
index 9cd0a21d4c44..9fdfe7fb3729 100644
--- i/src/mode_build.ml
+++ w/src/mode_build.ml
@@ -336,6 +336,7 @@ and get_file_content file buf len =
   else if len >= 2 && buf.[0] = '-' then Excludefiles
   else if len >= 1 && isalnum buf.[0] then Packages
   else if len = 0 then Empty
+  else if buf = String.make len '\000' then Empty
   else error "%s: unknown file type in supermin directory" file

 and get_compressed_file_content zcat file =
--

>   else error "%s: unknown file type in supermin directory" file
>
> and get_compressed_file_content zcat file =
>-- 
>2.17.2
>
>_______________________________________________
>Libguestfs mailing list
>Libguestfs at redhat.com
>https://www.redhat.com/mailman/listinfo/libguestfs
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20181203/5c6f4acf/attachment.sig>


More information about the Libguestfs mailing list