1 #define _XOPEN_SOURCE 500
19 /* Global variables for each test unit */
20 char *unit_name
= NULL
;
22 unsigned int passed
, failed
, skipped
;
23 void (*test_destructor_function
)(void *) = NULL
;
24 void *test_destructor_argument
= NULL
;
26 /* Print formated string into automtically reallocated @uffer.
27 * @buffer automatically reallocated buffer. Must be &NULL or preallocated
29 * @format format string as for printf(3)
30 * @ap list of variadic arguments, after call will be in udefined state
31 * @Returns number of bytes printed. In case of errror, -1 and NULL @buffer */
32 int test_vasprintf(char **buffer
, const char *format
, va_list ap
) {
34 int length
, new_length
;
37 if (!buffer
|| !format
) {
46 length
= vsnprintf(NULL
, 0, format
, aq
) + 1;
54 new_buffer
= realloc(*buffer
, length
);
62 new_length
= vsnprintf(*buffer
, length
, format
, ap
);
63 if (new_length
>= length
) {
73 /* Print formated string into automtically reallocated @uffer.
74 * @buffer automatically reallocated buffer. Must be &NULL or preallocated
76 * @format format string as for printf(3)
77 * @... variadic arguments
78 * @Returns number of bytes printed. In case of errror, -1 and NULL @buffer */
79 int test_asprintf(char **buffer
, const char *format
, ...) {
83 ret
= test_vasprintf(buffer
, format
, ap
);
90 int test_mmap_file(const char *file
, int *fd
, void **buffer
, size_t *length
) {
91 struct stat file_info
;
94 if (!file
|| !fd
|| !buffer
|| !length
) return -1;
96 *fd
= open(file
, O_RDONLY
);
98 fprintf(stderr
, "%s: Could not open file: %s\n", file
, strerror(errno
));
102 if (-1 == fstat(*fd
, &file_info
)) {
103 fprintf(stderr
, "%s: Could not get file size: %s\n", file
,
108 if (file_info
.st_size
< 0) {
109 fprintf(stderr
, "File `%s' has negative size: %" PRIdMAX
"\n", file
,
110 (intmax_t) file_info
.st_size
);
114 *length
= file_info
.st_size
;
115 *buffer
= malloc(*length
);
118 fprintf(stderr
, "%s: Could not allocate memory for file mapping: %s\n",
119 file
, strerror(errno
));
125 ret
= read(*fd
, *buffer
+ pos
, *length
- pos
);
130 } while ((ret
< 0 && errno
== EINTR
) || (ret
> 0 && pos
< *length
));
133 fprintf(stderr
, "%s: Could not map file to memory: %s\n", file
,
144 int test_munmap_file(int fd
, void *buffer
, size_t length
) {
150 fprintf(stderr
, "Could close file descriptor %d: %s\n", fd
,
157 int test_mmap_file(const char *file
, int *fd
, void **buffer
, size_t *length
) {
158 struct stat file_info
;
160 if (!file
|| !fd
|| !buffer
|| !length
) return -1;
163 *fd
= open(file
, O_RDONLY
);
165 fprintf(stderr
, "%s: Could not open file: %s\n", file
, strerror(errno
));
169 if (-1 == fstat(*fd
, &file_info
)) {
170 fprintf(stderr
, "%s: Could not get file size: %s\n", file
,
175 if (file_info
.st_size
< 0) {
176 fprintf(stderr
, "File `%s' has negative size: %" PRIdMAX
"\n", file
,
177 (intmax_t) file_info
.st_size
);
181 *length
= file_info
.st_size
;
183 *buffer
= mmap(NULL
, *length
, PROT_READ
, MAP_PRIVATE
, *fd
, 0);
184 if (*buffer
== MAP_FAILED
) {
185 fprintf(stderr
, "%s: Could not map file to memory: %s\n", file
,
195 int test_munmap_file(int fd
, void *buffer
, size_t length
) {
197 long int page_size
= sysconf(_SC_PAGE_SIZE
);
198 size_t pages
= (length
% page_size
) ?
199 ((length
/ page_size
) + 1) * page_size
:
202 err
= munmap(buffer
, pages
);
204 fprintf(stderr
, "Could not unmap memory at %p and length %zu: %s\n",
205 buffer
, pages
, strerror(errno
));
210 fprintf(stderr
, "Could close file descriptor %d: %s\n", fd
,