filter = (struct connection_filter *)calloc(1, sizeof(*filter));
if(!filter)
- exit(1);
+ return 1;
- if(curl_global_init(CURL_GLOBAL_DEFAULT))
- exit(1);
+ if(curl_global_init(CURL_GLOBAL_DEFAULT)) {
+ free(filter);
+ return 1;
+ }
curl = curl_easy_init();
- if(!curl)
- exit(1);
+ if(!curl) {
+ curl_global_cleanup();
+ free(filter);
+ return 1;
+ }
/* Set the target URL */
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost");
fprintf(stderr,
"\rUsage: %s [-m=1|2|5|10|20|50|100] [-t] [-x] [url]\n",
appname);
- exit(1);
+ return 1;
case 'v':
case 'V':
fprintf(stderr, "\r%s %s - %s\n",
appname, CHKSPEED_VERSION, curl_version());
- exit(1);
+ return 1;
case 'a':
case 'A':
prtall = 1;
#include <curl/curl.h>
#include <curl/mprintf.h>
-static void
-print_cookies(CURL *curl)
+static int print_cookies(CURL *curl)
{
CURLcode res;
struct curl_slist *cookies;
if(res != CURLE_OK) {
fprintf(stderr, "Curl curl_easy_getinfo failed: %s\n",
curl_easy_strerror(res));
- exit(1);
+ return 1;
}
nc = cookies;
i = 1;
printf("(none)\n");
}
curl_slist_free_all(cookies);
+
+ return 0;
}
int
if(conn == NULL) {
fprintf(stderr, "Failed to create CURL connection\n");
- exit(EXIT_FAILURE);
+ return false;
}
code = curl_easy_setopt(conn, CURLOPT_ERRORBUFFER, errorBuffer);
if(argc != 2) {
fprintf(stderr, "Usage: %s <url>\n", argv[0]);
- exit(EXIT_FAILURE);
+ return EXIT_FAILURE;
}
curl_global_init(CURL_GLOBAL_DEFAULT);
if(!init(conn, argv[1])) {
fprintf(stderr, "Connection initialization failed\n");
- exit(EXIT_FAILURE);
+ return EXIT_FAILURE;
}
// Retrieve content for the URL
if(code != CURLE_OK) {
fprintf(stderr, "Failed to get '%s' [%s]\n", argv[1], errorBuffer);
- exit(EXIT_FAILURE);
+ return EXIT_FAILURE;
}
// Parse the (assumed) HTML code
return 0;
}
-static void setup(struct transfer *t, int num)
+static int setup(struct transfer *t, int num)
{
char filename[128];
CURL *hnd;
if(!t->out) {
fprintf(stderr, "error: could not open file %s for writing: %s\n",
filename, strerror(errno));
- exit(1);
+ return 1;
}
/* write to this file */
/* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
#endif
+ return 0;
}
/*
multi_handle = curl_multi_init();
for(i = 0; i < num_transfers; i++) {
- setup(&trans[i], i);
+ if(setup(&trans[i], i))
+ return 1;
/* add the individual transfer */
curl_multi_add_handle(multi_handle, trans[i].easy);
return retcode;
}
-static void setup(struct input *i, int num, const char *upload)
+static int setup(struct input *i, int num, const char *upload)
{
FILE *out;
char url[256];
curl_off_t uploadsize;
CURL *hnd;
- hnd = i->hnd = curl_easy_init();
+ hnd = i->hnd = NULL;
+
i->num = num;
curl_msnprintf(filename, 128, "dl-%d", num);
out = fopen(filename, "wb");
if(!out) {
fprintf(stderr, "error: could not open file %s for writing: %s\n", upload,
strerror(errno));
- exit(1);
+ return 1;
}
curl_msnprintf(url, 256, "https://localhost:8443/upload-%d", num);
if(stat(upload, &file_info)) {
fprintf(stderr, "error: could not stat file %s: %s\n", upload,
strerror(errno));
- exit(1);
+ fclose(out);
+ return 1;
}
uploadsize = file_info.st_size;
if(!i->in) {
fprintf(stderr, "error: could not open file %s for reading: %s\n", upload,
strerror(errno));
- exit(1);
+ fclose(out);
+ return 1;
}
+ hnd = i->hnd = curl_easy_init();
+
/* write to this file */
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
/* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
#endif
+ return 0;
}
/*
multi_handle = curl_multi_init();
for(i = 0; i < num_transfers; i++) {
- setup(&trans[i], i, filename);
+ if(setup(&trans[i], i, filename))
+ return 1;
/* add the individual transfer */
curl_multi_add_handle(multi_handle, trans[i].hnd);
#endif
]],[[
int i = 0;
- exit(i);
+ return i;
]])
],[
tmp_compiler_works="yes"
struct addrinfo hints;
struct addrinfo *ai = 0;
int error;
+ int exitcode;
#ifdef _WIN32
WSADATA wsa;
if(WSAStartup(MAKEWORD(2, 2), &wsa))
- exit(2);
+ return 2;
#endif
memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo("127.0.0.1", 0, &hints, &ai);
if(error || !ai)
- exit(1); /* fail */
- else
- exit(0);
+ exitcode = 1; /* fail */
+ else {
+ freeaddrinfo(ai);
+ exitcode = 0;
+ }
+ #ifdef _WIN32
+ WSACleanup();
+ #endif
+ return exitcode;
]])
],[
AC_MSG_RESULT([yes])
error = getifaddrs(&ifa);
if(error || !ifa)
- exit(1); /* fail */
- else
- exit(0);
+ return 1; /* fail */
+ else {
+ freeifaddrs(ifa);
+ return 0;
+ }
]])
],[
AC_MSG_RESULT([yes])
gmt = gmtime_r(&local, &result);
(void)result;
if(gmt)
- exit(0);
+ return 0;
else
- exit(1);
+ return 1;
]])
],[
AC_MSG_RESULT([yes])
/* - */
ipv4ptr = inet_ntop(AF_INET, ipv4a, ipv4res, sizeof(ipv4res));
if(!ipv4ptr)
- exit(1); /* fail */
+ return 1; /* fail */
if(ipv4ptr != ipv4res)
- exit(1); /* fail */
+ return 1; /* fail */
if(!ipv4ptr[0])
- exit(1); /* fail */
+ return 1; /* fail */
if(memcmp(ipv4res, "192.168.100.1", 13) != 0)
- exit(1); /* fail */
+ return 1; /* fail */
/* - */
ipv6res[0] = '\0';
memset(ipv6a, 0, sizeof(ipv6a));
/* - */
ipv6ptr = inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res));
if(!ipv6ptr)
- exit(1); /* fail */
+ return 1; /* fail */
if(ipv6ptr != ipv6res)
- exit(1); /* fail */
+ return 1; /* fail */
if(!ipv6ptr[0])
- exit(1); /* fail */
+ return 1; /* fail */
if(memcmp(ipv6res, "fe80::214:4fff:fe0b:76c8", 24) != 0)
- exit(1); /* fail */
+ return 1; /* fail */
/* - */
- exit(0);
+ return 0;
]])
],[
AC_MSG_RESULT([yes])
/* - */
memset(ipv4a, 1, sizeof(ipv4a));
if(1 != inet_pton(AF_INET, ipv4src, ipv4a))
- exit(1); /* fail */
+ return 1; /* fail */
/* - */
if( (ipv4a[0] != 0xc0) ||
(ipv4a[1] != 0xa8) ||
(ipv4a[2] != 0x64) ||
(ipv4a[3] != 0x01) ||
(ipv4a[4] != 0x01) )
- exit(1); /* fail */
+ return 1; /* fail */
/* - */
memset(ipv6a, 1, sizeof(ipv6a));
if(1 != inet_pton(AF_INET6, ipv6src, ipv6a))
- exit(1); /* fail */
+ return 1; /* fail */
/* - */
if( (ipv6a[0] != 0xfe) ||
(ipv6a[1] != 0x80) ||
(ipv6a[14] != 0x76) ||
(ipv6a[15] != 0xc8) ||
(ipv6a[16] != 0x01) )
- exit(1); /* fail */
+ return 1; /* fail */
/* - */
if( (ipv6a[2] != 0x0) ||
(ipv6a[3] != 0x0) ||
(ipv6a[5] != 0x0) ||
(ipv6a[6] != 0x0) ||
(ipv6a[7] != 0x0) )
- exit(1); /* fail */
+ return 1; /* fail */
/* - */
- exit(0);
+ return 0;
]])
],[
AC_MSG_RESULT([yes])
buffer[0] = '\0';
string = strerror_r(EACCES, buffer, sizeof(buffer));
if(!string)
- exit(1); /* fail */
+ return 1; /* fail */
if(!string[0])
- exit(1); /* fail */
+ return 1; /* fail */
else
- exit(0);
+ return 0;
]])
],[
AC_MSG_RESULT([yes])
buffer[0] = '\0';
error = strerror_r(EACCES, buffer, sizeof(buffer));
if(error)
- exit(1); /* fail */
+ return 1; /* fail */
if(buffer[0] == '\0')
- exit(1); /* fail */
+ return 1; /* fail */
else
- exit(0);
+ return 0;
]])
],[
AC_MSG_RESULT([yes])
if(argc < 1) {
puts("report_openssl_version filename");
- exit(1);
+ return 1;
}
libptr = dlopen(argv[1], 0);
if(!ssl_version) {
puts("Unable to lookup version of OpenSSL");
- exit(1);
+ return 1;
}
version = ssl_version(SSLEAY_VERSION);
status = LIB$SET_SYMBOL(&symbol_dsc, &value_dsc, &table_type);
if(!$VMS_STATUS_SUCCESS(status)) {
- exit(status);
+ return status;
}
}
- exit(0);
+ return 0;
}
return 0;
}
-#define ERR() \
- do { \
- fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
- exit(2); \
- } while(0)
-
static void usage(const char *msg)
{
if(msg)
handle->idx, (long)realsize);
return realsize;
}
+
+#define ERR() \
+ do { \
+ fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
+ return 2; \
+ } while(0)
+
#endif /* !_MSC_VER */
int main(int argc, char *argv[])
cu = curl_url();
if(!cu) {
fprintf(stderr, "out of memory\n");
- exit(1);
+ return 1;
}
if(curl_url_set(cu, CURLUPART_URL, url, 0)) {
fprintf(stderr, "not a URL: '%s'\n", url);
- exit(1);
+ return 1;
}
if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) {
fprintf(stderr, "could not get host of '%s'\n", url);
- exit(1);
+ return 1;
}
if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) {
fprintf(stderr, "could not get port of '%s'\n", url);
- exit(1);
+ return 1;
}
memset(&resolve, 0, sizeof(resolve));
curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1",
int main(int argc, char *argv[])
{
const char *url;
- CURLM *multi;
+ CURLM *multi = NULL;
CURL *easy;
CURLMcode mc;
int running_handles = 0, start_count, numfds;
CURLMsg *msg;
int msgs_in_queue;
char range[128];
+ int exitcode = 1;
if(argc != 2) {
fprintf(stderr, "%s URL\n", argv[0]);
- exit(2);
+ return 2;
}
url = argv[1];
multi = curl_multi_init();
if(!multi) {
fprintf(stderr, "curl_multi_init failed\n");
- exit(1);
+ goto cleanup;
}
start_count = 200;
easy = curl_easy_init();
if(!easy) {
fprintf(stderr, "curl_easy_init failed\n");
- exit(1);
+ goto cleanup;
}
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb);
mc = curl_multi_add_handle(multi, easy);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_add_handle: %s\n",
- curl_multi_strerror(mc));
- exit(1);
+ curl_multi_strerror(mc));
+ curl_easy_cleanup(easy);
+ goto cleanup;
}
--start_count;
}
mc = curl_multi_perform(multi, &running_handles);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_perform: %s\n",
- curl_multi_strerror(mc));
- exit(1);
+ curl_multi_strerror(mc));
+ goto cleanup;
}
if(running_handles) {
mc = curl_multi_poll(multi, NULL, 0, 1000000, &numfds);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_poll: %s\n",
- curl_multi_strerror(mc));
- exit(1);
+ curl_multi_strerror(mc));
+ goto cleanup;
}
}
else if(msg->data.result) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": failed with %d\n", xfer_id, msg->data.result);
- exit(1);
+ goto cleanup;
}
else if(status != 206) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": wrong http status %ld (expected 206)\n", xfer_id, status);
- exit(1);
+ goto cleanup;
}
curl_multi_remove_handle(multi, msg->easy_handle);
curl_easy_cleanup(msg->easy_handle);
} while(running_handles > 0 || start_count);
fprintf(stderr, "exiting\n");
- exit(EXIT_SUCCESS);
+ exitcode = EXIT_SUCCESS;
+
+cleanup:
+
+ if(multi) {
+ CURL **list = curl_multi_get_handles(multi);
+ if(list) {
+ int i;
+ for(i = 0; list[i]; i++) {
+ curl_multi_remove_handle(multi, list[i]);
+ curl_easy_cleanup(list[i]);
+ }
+ curl_free(list);
+ }
+ curl_multi_cleanup(multi);
+ }
+
+ return exitcode;
}
return size * nmemb;
}
-static void add_transfer(CURLM *multi, CURLSH *share,
- struct curl_slist *resolve,
- const char *url, int http_version)
+static int add_transfer(CURLM *multi, CURLSH *share,
+ struct curl_slist *resolve,
+ const char *url, int http_version)
{
CURL *easy;
CURLMcode mc;
easy = curl_easy_init();
if(!easy) {
fprintf(stderr, "curl_easy_init failed\n");
- exit(1);
+ return 1;
}
curl_easy_setopt(easy, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easy, CURLOPT_DEBUGFUNCTION, debug_cb);
mc = curl_multi_add_handle(multi, easy);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_add_handle: %s\n",
- curl_multi_strerror(mc));
- exit(1);
+ curl_multi_strerror(mc));
+ curl_easy_cleanup(easy);
+ return 1;
}
+ return 0;
}
int main(int argc, char *argv[])
{
const char *url;
- CURLM *multi;
+ CURLM *multi = NULL;
CURLMcode mc;
int running_handles = 0, numfds;
CURLMsg *msg;
- CURLSH *share;
+ CURLSH *share = NULL;
CURLU *cu;
- struct curl_slist resolve;
+ struct curl_slist *resolve = NULL;
char resolve_buf[1024];
int msgs_in_queue;
int add_more, waits, ongoing = 0;
- char *host, *port;
+ char *host = NULL, *port = NULL;
int http_version = CURL_HTTP_VERSION_1_1;
+ int exitcode = 1;
if(argc != 3) {
fprintf(stderr, "%s proto URL\n", argv[0]);
- exit(2);
+ return 2;
}
if(!strcmp("h2", argv[1]))
cu = curl_url();
if(!cu) {
fprintf(stderr, "out of memory\n");
- exit(1);
+ return 1;
}
if(curl_url_set(cu, CURLUPART_URL, url, 0)) {
fprintf(stderr, "not a URL: '%s'\n", url);
- exit(1);
+ goto cleanup;
}
if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) {
fprintf(stderr, "could not get host of '%s'\n", url);
- exit(1);
+ goto cleanup;
}
if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) {
fprintf(stderr, "could not get port of '%s'\n", url);
- exit(1);
+ goto cleanup;
}
- memset(&resolve, 0, sizeof(resolve));
curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1",
host, port);
- curl_slist_append(&resolve, resolve_buf);
+ resolve = curl_slist_append(resolve, resolve_buf);
multi = curl_multi_init();
if(!multi) {
fprintf(stderr, "curl_multi_init failed\n");
- exit(1);
+ goto cleanup;
}
share = curl_share_init();
if(!share) {
fprintf(stderr, "curl_share_init failed\n");
- exit(1);
+ goto cleanup;
}
curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
- add_transfer(multi, share, &resolve, url, http_version);
+ if(add_transfer(multi, share, resolve, url, http_version))
+ goto cleanup;
++ongoing;
add_more = 6;
waits = 3;
mc = curl_multi_perform(multi, &running_handles);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_perform: %s\n",
- curl_multi_strerror(mc));
- exit(1);
+ curl_multi_strerror(mc));
+ goto cleanup;
}
if(running_handles) {
mc = curl_multi_poll(multi, NULL, 0, 1000000, &numfds);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_poll: %s\n",
- curl_multi_strerror(mc));
- exit(1);
+ curl_multi_strerror(mc));
+ goto cleanup;
}
}
}
else {
while(add_more) {
- add_transfer(multi, share, &resolve, url, http_version);
+ if(add_transfer(multi, share, resolve, url, http_version))
+ goto cleanup;
++ongoing;
--add_more;
}
else if(msg->data.result) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": failed with %d\n", xfer_id, msg->data.result);
- exit(1);
+ goto cleanup;
}
else if(status != 200) {
fprintf(stderr, "transfer #%" CURL_FORMAT_CURL_OFF_T
": wrong http status %ld (expected 200)\n", xfer_id, status);
- exit(1);
+ goto cleanup;
}
curl_multi_remove_handle(multi, msg->easy_handle);
curl_easy_cleanup(msg->easy_handle);
} while(ongoing || add_more);
fprintf(stderr, "exiting\n");
- exit(EXIT_SUCCESS);
+ exitcode = EXIT_SUCCESS;
+
+cleanup:
+
+ if(multi) {
+ CURL **list = curl_multi_get_handles(multi);
+ if(list) {
+ int i;
+ for(i = 0; list[i]; i++) {
+ curl_multi_remove_handle(multi, list[i]);
+ curl_easy_cleanup(list[i]);
+ }
+ curl_free(list);
+ }
+ curl_multi_cleanup(multi);
+ }
+ curl_share_cleanup(share);
+ curl_slist_free_all(resolve);
+ curl_free(host);
+ curl_free(port);
+ curl_url_cleanup(cu);
+
+ return exitcode;
}
return 0;
}
-#define ERR() \
- do { \
- fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
- exit(2); \
- } while(0)
-
static void usage(const char *msg)
{
if(msg)
" -V http_version (http/1.1, h2, h3) http version to use\n"
);
}
+
+#define ERR() \
+ do { \
+ fprintf(stderr, "something unexpected went wrong - bailing out!\n"); \
+ return 2; \
+ } while(0)
+
#endif /* !_MSC_VER */
int main(int argc, char *argv[])
cu = curl_url();
if(!cu) {
fprintf(stderr, "out of memory\n");
- exit(1);
+ return 1;
}
if(curl_url_set(cu, CURLUPART_URL, url, 0)) {
fprintf(stderr, "not a URL: '%s'\n", url);
- exit(1);
+ return 1;
}
if(curl_url_get(cu, CURLUPART_HOST, &host, 0)) {
fprintf(stderr, "could not get host of '%s'\n", url);
- exit(1);
+ return 1;
}
if(curl_url_get(cu, CURLUPART_PORT, &port, 0)) {
fprintf(stderr, "could not get port of '%s'\n", url);
- exit(1);
+ return 1;
}
memset(&resolve, 0, sizeof(resolve));
curl_msnprintf(resolve_buf, sizeof(resolve_buf)-1, "%s:%s:127.0.0.1",
curl = curl_easy_init();
if(!curl) {
fprintf(stderr, "out of memory\n");
- exit(1);
+ return 1;
}
/* We want to use our own read function. */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
logdir, SERVERLOGS_LOCKDIR, ipv_inuse);
#ifdef _WIN32
- win32_init();
- atexit(win32_cleanup);
+ if(win32_init())
+ return 2;
#endif
CURL_SET_BINMODE(stdin);
}
#ifdef _WIN32
- win32_init();
- atexit(win32_cleanup);
+ if(win32_init())
+ return 2;
#endif
#if defined(CURLRES_IPV6)
logdir, SERVERLOGS_LOCKDIR, ipv_inuse);
#ifdef _WIN32
- win32_init();
- atexit(win32_cleanup);
+ if(win32_init())
+ return 2;
#endif
install_signal_handlers(false);
}
#ifdef _WIN32
- win32_init();
- atexit(win32_cleanup);
+ if(win32_init())
+ return 2;
#endif
CURL_SET_BINMODE(stdin);
}
#ifdef _WIN32
- win32_init();
- atexit(win32_cleanup);
+ if(win32_init())
+ return 2;
#endif
CURL_SET_BINMODE(stdin);
if(!req2) {
req2 = malloc(sizeof(*req2));
if(!req2)
- exit(1);
+ goto http_connect_cleanup; /* fail */
}
memset(req2, 0, sizeof(*req2));
logmsg("====> Client connect DATA");
is_proxy ? "-proxy" : "", socket_type);
#ifdef _WIN32
- win32_init();
- atexit(win32_cleanup);
+ if(win32_init())
+ return 2;
#endif
install_signal_handlers(false);
logdir, SERVERLOGS_LOCKDIR, ipv_inuse);
#ifdef _WIN32
- win32_init();
- atexit(win32_cleanup);
+ if(win32_init())
+ return 2;
#endif
install_signal_handlers(true);
fprintf(stderr, "%s\n", buf);
}
-void win32_init(void)
+static void win32_cleanup(void)
+{
+#ifdef USE_WINSOCK
+ WSACleanup();
+#endif /* USE_WINSOCK */
+
+ /* flush buffers of all streams regardless of their mode */
+ _flushall();
+}
+
+int win32_init(void)
{
#ifdef USE_WINSOCK
WORD wVersionRequested;
if(err) {
perror("Winsock init failed");
logmsg("Error initialising Winsock -- aborting");
- exit(1);
+ return 1;
}
if(LOBYTE(wsaData.wVersion) != LOBYTE(wVersionRequested) ||
WSACleanup();
perror("Winsock init failed");
logmsg("No suitable winsock.dll found -- aborting");
- exit(1);
+ return 1;
}
#endif /* USE_WINSOCK */
-}
-
-void win32_cleanup(void)
-{
-#ifdef USE_WINSOCK
- WSACleanup();
-#endif /* USE_WINSOCK */
-
- /* flush buffers of all streams regardless of their mode */
- _flushall();
+ atexit(win32_cleanup);
+ return 0;
}
/* socket-safe strerror (works on Winsock errors, too) */
#define perror(m) win32_perror(m)
void win32_perror(const char *msg);
-void win32_init(void);
-void win32_cleanup(void);
+int win32_init(void);
const char *sstrerror(int err);
#else /* _WIN32 */