test82: share support functions in common.[ch] for test83

Change-Id: I3dfeacc3c2c143d3b696efa39a6f257d38281742
This commit is contained in:
Erik van der Kouwe 2015-07-22 21:33:28 +02:00
parent da32b6c32e
commit 17fbdaf514
3 changed files with 44 additions and 48 deletions

View file

@ -7,6 +7,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <sys/statvfs.h> #include <sys/statvfs.h>
#include <sys/syslimits.h> #include <sys/syslimits.h>
@ -126,6 +127,24 @@ void cleanup()
if (chdir("..") == 0 && common_test_nr != -1) rm_rf_dir(common_test_nr); if (chdir("..") == 0 && common_test_nr != -1) rm_rf_dir(common_test_nr);
} }
void fail_printf(const char *file, const char *func, int line,
const char *fmt, ...) {
va_list ap;
char buf[1024];
size_t len;
len = snprintf(buf, sizeof(buf), "[%s:%s:%d] ", file, func, line);
va_start(ap, fmt);
len += vsnprintf(buf + len, sizeof(buf) - len, fmt, ap);
va_end(ap);
snprintf(buf + len, sizeof(buf) - len, " errno=%d error=%s",
errno, strerror(errno));
em(line, buf);
}
void quit() void quit()
{ {
cleanup(); cleanup();

View file

@ -10,6 +10,7 @@
#define e(errn) e_f(__FILE__, __LINE__, (errn)) #define e(errn) e_f(__FILE__, __LINE__, (errn))
#define em(errn,msg) do { fprintf(stderr, "%s\n", msg); e(errn); } while(0) #define em(errn,msg) do { fprintf(stderr, "%s\n", msg); e(errn); } while(0)
#define efmt(...) fail_printf(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
#define BIGVARNAME "BIGTEST" #define BIGVARNAME "BIGTEST"
@ -17,6 +18,8 @@ void printprogress(char *msg, int i, int max);
void cleanup(void); void cleanup(void);
int does_fs_truncate(void); int does_fs_truncate(void);
void e_f(char *file, int lineno, int n); void e_f(char *file, int lineno, int n);
void fail_printf(const char *file, const char *func, int line,
const char *fmt, ...) __attribute__ ((format(printf, 4, 5)));
int name_max(char *path); int name_max(char *path);
void quit(void); void quit(void);
void rm_rf_dir(int test_nr); void rm_rf_dir(int test_nr);

View file

@ -29,9 +29,8 @@
#include "common.h" #include "common.h"
#define FAIL(...) fail(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__) #define CLOSE(fd) do { assert(fd >= 0); if (close((fd)) != 0) efmt("close failed"); } while (0);
#define CLOSE(fd) do { assert(fd >= 0); if (close((fd)) != 0) FAIL("close failed"); } while (0); #define REALLOC(p, size) do { p = realloc(p, size); if (!p) efmt("realloc of %zu bytes failed", size); } while (0);
#define REALLOC(p, size) do { p = realloc(p, size); if (!p) FAIL("realloc of %zu bytes failed", size); } while (0);
#define HOST "test82.minix3.org" #define HOST "test82.minix3.org"
#define PORT 80 #define PORT 80
@ -56,31 +55,6 @@ static const struct url urls[URL_COUNT] = {
{ HOST, PORT, PATH2, callback_verify_path2 }, { HOST, PORT, PATH2, callback_verify_path2 },
}; };
static void fail(const char *file, const char *func, int line,
const char *fmt, ...) __attribute__ ((format(printf, 4, 5)));
static void fail(const char *file, const char *func, int line,
const char *fmt, ...) {
va_list ap;
char buf[1024];
size_t len;
assert(file);
assert(func);
assert(fmt);
len = snprintf(buf, sizeof(buf), "[%s:%s:%d] ", file, func, line);
va_start(ap, fmt);
len += vsnprintf(buf + len, sizeof(buf) - len, fmt, ap);
va_end(ap);
snprintf(buf + len, sizeof(buf) - len, " errno=%d error=%s",
errno, strerror(errno));
em(line, buf);
}
static int http_connect(const char *host, int port) { static int http_connect(const char *host, int port) {
struct addrinfo *addr = NULL; struct addrinfo *addr = NULL;
int fd = -1; int fd = -1;
@ -96,18 +70,18 @@ static int http_connect(const char *host, int port) {
errno = 0; errno = 0;
if (getaddrinfo(host, serv, &hints, &addr) != 0 || !addr) { if (getaddrinfo(host, serv, &hints, &addr) != 0 || !addr) {
FAIL("host %s not found", host); efmt("host %s not found", host);
goto failure; goto failure;
} }
fd = socket(AF_INET, SOCK_STREAM, 0); fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) { if (fd < 0) {
FAIL("cannot create socket"); efmt("cannot create socket");
goto failure; goto failure;
} }
if (connect(fd, addr->ai_addr, addr->ai_addrlen) != 0) { if (connect(fd, addr->ai_addr, addr->ai_addrlen) != 0) {
FAIL("cannot connect to %s:%d", host, port); efmt("cannot connect to %s:%d", host, port);
goto failure; goto failure;
} }
@ -140,7 +114,7 @@ static void write_chunked(
r = write(fd, data, s); r = write(fd, data, s);
if (r <= 0 || (size_t) r > s) { if (r <= 0 || (size_t) r > s) {
errno = 0; errno = 0;
FAIL("write of %zu bytes failed with result %zd", s, r); efmt("write of %zu bytes failed with result %zd", s, r);
break; break;
} }
@ -270,7 +244,7 @@ static int http_get_status_line(
if (index >= len) goto notfound; if (index >= len) goto notfound;
if (!is_numeric(data[index])) { if (!is_numeric(data[index])) {
errno = 0; errno = 0;
FAIL("HTTP error: bad status line: \"%.*s\"", efmt("HTTP error: bad status line: \"%.*s\"",
(int) (index - *index_p), data + *index_p); (int) (index - *index_p), data + *index_p);
*error_p = 1; *error_p = 1;
goto notfound; goto notfound;
@ -350,7 +324,7 @@ static int http_parse_int_header(
if (index < index_end) { if (index < index_end) {
errno = 0; errno = 0;
FAIL("HTTP error: bad numeric header value: \"%.*s\"", efmt("HTTP error: bad numeric header value: \"%.*s\"",
(int) (index_end - index), data + index); (int) (index_end - index), data + index);
*error_p = 1; *error_p = 1;
return 0; return 0;
@ -402,7 +376,7 @@ static int http_response_complete(
/* do we know how long the response will be? */ /* do we know how long the response will be? */
if (content_length < 0) { if (content_length < 0) {
errno = 0; errno = 0;
FAIL("HTTP error: missing Content-Length header " efmt("HTTP error: missing Content-Length header "
"(maybe Transfer-Encoding is specified instead " "(maybe Transfer-Encoding is specified instead "
"but this is currently unsupported)"); "but this is currently unsupported)");
goto error; goto error;
@ -411,7 +385,7 @@ static int http_response_complete(
/* check whether the amount of data is correct */ /* check whether the amount of data is correct */
if (len > index + content_length) { if (len > index + content_length) {
errno = 0; errno = 0;
FAIL("HTTP error: more data received than expected"); efmt("HTTP error: more data received than expected");
goto error; goto error;
} }
@ -452,7 +426,7 @@ static void http_recv_response(
errno = 0; errno = 0;
r = read(fd, data + datalen, chunksize); r = read(fd, data + datalen, chunksize);
if (r < 0 || (size_t) r > chunksize) { if (r < 0 || (size_t) r > chunksize) {
FAIL("read of %zu bytes failed with result %zd", efmt("read of %zu bytes failed with result %zd",
chunksize, r); chunksize, r);
goto cleanup; goto cleanup;
} }
@ -468,7 +442,7 @@ static void http_recv_response(
/* check for premature disconnection */ /* check for premature disconnection */
if (r == 0) { if (r == 0) {
errno = 0; errno = 0;
FAIL("server disconnected even though the response " efmt("server disconnected even though the response "
"seems to be incomplete"); "seems to be incomplete");
goto cleanup; goto cleanup;
} }
@ -481,7 +455,7 @@ static void http_recv_response(
callback_verify(data + index_body, datalen - index_body); callback_verify(data + index_body, datalen - index_body);
} else { } else {
errno = 0; errno = 0;
FAIL("unexpected HTTP status code %d", code); efmt("unexpected HTTP status code %d", code);
} }
cleanup: cleanup:
@ -511,7 +485,7 @@ static void http_test(
errno = 0; errno = 0;
if (withshutdown && shutdown(fd, SHUT_WR) != 0) { if (withshutdown && shutdown(fd, SHUT_WR) != 0) {
FAIL("shutdown failed"); efmt("shutdown failed");
} }
if (delay) sleep(1); if (delay) sleep(1);
@ -539,7 +513,7 @@ static void http_test_fork(
errno = 0; errno = 0;
pid = fork(); pid = fork();
if (pid < 0) { if (pid < 0) {
FAIL("fork failed"); efmt("fork failed");
return; return;
} }
@ -567,7 +541,7 @@ static void wait_all(void) {
errno = 0; errno = 0;
pid = waitpid(-1, &status, 0); pid = waitpid(-1, &status, 0);
if (pid <= 0) { if (pid <= 0) {
FAIL("waitpid failed"); efmt("waitpid failed");
return; return;
} }
if (WIFEXITED(status)) { if (WIFEXITED(status)) {
@ -577,24 +551,24 @@ static void wait_all(void) {
if (exitcode >= 0) { if (exitcode >= 0) {
errct += exitcode; errct += exitcode;
} else { } else {
FAIL("child has negative exit code %d", efmt("child has negative exit code %d",
exitcode); exitcode);
} }
} else if (WIFSIGNALED(status)) { } else if (WIFSIGNALED(status)) {
dbgprintf("child %d killed by signal %d\n", dbgprintf("child %d killed by signal %d\n",
(int) pid, WTERMSIG(status)); (int) pid, WTERMSIG(status));
FAIL("child killed by signal %d", WTERMSIG(status)); efmt("child killed by signal %d", WTERMSIG(status));
} else { } else {
dbgprintf("child %d gone with status 0x%x\n", dbgprintf("child %d gone with status 0x%x\n",
(int) pid, status); (int) pid, status);
FAIL("child gone, but neither exit nor signal"); efmt("child gone, but neither exit nor signal");
} }
child_count--; child_count--;
} }
errno = 0; errno = 0;
if (waitpid(-1, &status, 0) != -1 || errno != ECHILD) { if (waitpid(-1, &status, 0) != -1 || errno != ECHILD) {
FAIL("waitpid should have returned ECHILD"); efmt("waitpid should have returned ECHILD");
} }
} }
@ -644,12 +618,12 @@ static void verify_data(
if (httpsize != refsize) { if (httpsize != refsize) {
errno = 0; errno = 0;
FAIL("download from http://%s:%d%s returned wrong number " efmt("download from http://%s:%d%s returned wrong number "
"of bytes: %zd (expected %zd)", "of bytes: %zd (expected %zd)",
HOST, PORT, path, httpsize, refsize); HOST, PORT, path, httpsize, refsize);
} else if (memcmp(httpdata, refdata, refsize) != 0) { } else if (memcmp(httpdata, refdata, refsize) != 0) {
errno = 0; errno = 0;
FAIL("download from http://%s:%d%s returned wrong data", efmt("download from http://%s:%d%s returned wrong data",
HOST, PORT, path); HOST, PORT, path);
} }
} }