Skip to content

Commit bb09b59

Browse files
authored
Merge pull request #844 from greenbone/GEA-635_Use_compression_in_feed_updates
Add: Added a function that opens a gzip file for reading via a file descriptor.
2 parents 3c5fb2a + 79d6d3d commit bb09b59

File tree

3 files changed

+62
-1
lines changed

3 files changed

+62
-1
lines changed

util/compressutils.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,3 +304,35 @@ gvm_gzip_open_file_reader (const char *path)
304304
FILE *file = fopencookie (gz_file, "r", io_functions);
305305
return file;
306306
}
307+
308+
/**
309+
* @brief Opens a gzip file as a FILE* stream for reading and decompression.
310+
*
311+
* @param[in] fd File descriptor of the gzip file to open.
312+
*
313+
* @return The FILE* on success, NULL otherwise.
314+
*/
315+
FILE *
316+
gvm_gzip_open_file_reader_fd (int fd)
317+
{
318+
static cookie_io_functions_t io_functions = {
319+
.read = gz_file_read,
320+
.write = NULL,
321+
.seek = NULL,
322+
.close = gz_file_close,
323+
};
324+
325+
if (fd < 0)
326+
{
327+
return NULL;
328+
}
329+
330+
gzFile gz_file = gzdopen (fd, "r");
331+
if (gz_file == NULL)
332+
{
333+
return NULL;
334+
}
335+
336+
FILE *file = fopencookie (gz_file, "r", io_functions);
337+
return file;
338+
}

util/compressutils.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,7 @@ gvm_uncompress (const void *, unsigned long, unsigned long *);
2525
FILE *
2626
gvm_gzip_open_file_reader (const char *);
2727

28+
FILE *
29+
gvm_gzip_open_file_reader_fd (int);
30+
2831
#endif /* not _GVM_COMPRESSUTILS_H */

util/compressutils_tests.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <cgreen/cgreen.h>
99
#include <cgreen/mocks.h>
10+
#include <fcntl.h>
1011

1112
Describe (compressutils);
1213
BeforeEach (compressutils)
@@ -79,6 +80,30 @@ Ensure (compressutils, can_uncompress_using_reader)
7980
assert_that (fclose (stream), is_equal_to (0));
8081
}
8182

83+
Ensure (compressutils, can_uncompress_using_fd_reader)
84+
{
85+
const char *testdata = "TEST-12345-12345-TEST";
86+
size_t compressed_len;
87+
char *compressed =
88+
gvm_compress_gzipheader (testdata, strlen (testdata) + 1, &compressed_len);
89+
90+
char compressed_filename[35] = "/tmp/gvm_gzip_test_XXXXXX";
91+
int compressed_fd = mkstemp (compressed_filename);
92+
write (compressed_fd, compressed, compressed_len);
93+
close (compressed_fd);
94+
95+
compressed_fd = open (compressed_filename, O_RDONLY);
96+
97+
FILE *stream = gvm_gzip_open_file_reader_fd (compressed_fd);
98+
assert_that (stream, is_not_null);
99+
100+
gchar *uncompressed = g_malloc0 (30);
101+
fread (uncompressed, 1, 30, stream);
102+
assert_that (uncompressed, is_equal_to_string (testdata));
103+
104+
assert_that (fclose (stream), is_equal_to (0));
105+
}
106+
82107
/* Test suite. */
83108
int
84109
main (int argc, char **argv)
@@ -92,9 +117,10 @@ main (int argc, char **argv)
92117
add_test_with_context (suite, compressutils,
93118
can_compress_and_uncompress_with_header);
94119
add_test_with_context (suite, compressutils, can_uncompress_using_reader);
120+
add_test_with_context (suite, compressutils, can_uncompress_using_fd_reader);
95121

96122
if (argc > 1)
97123
return run_single_test (suite, argv[1], create_text_reporter ());
98124

99125
return run_test_suite (suite, create_text_reporter ());
100-
}
126+
}

0 commit comments

Comments
 (0)