[monitoring-plugins] adapted to style, using header file shims instead ...
Sven Nierlein
git at monitoring-plugins.org
Wed Mar 15 09:20:13 CET 2017
Module: monitoring-plugins
Branch: feature_check_curl
Commit: 58bcaeb137f5725c6fa22aba28b129aae848fa1b
Author: Andreas Baumann <mail at andreasbaumann.cc>
Committer: Sven Nierlein <sven at nierlein.de>
Date: Fri Jan 20 10:18:24 2017 +0100
URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=58bcaeb
adapted to style, using header file shims instead of HAVE_XXX by hand
---
plugins/check_curl.c | 1162 +++++++++++++++++++++++++-------------------------
1 file changed, 574 insertions(+), 588 deletions(-)
diff --git a/plugins/check_curl.c b/plugins/check_curl.c
index 8ef48d0..8ed1aee 100644
--- a/plugins/check_curl.c
+++ b/plugins/check_curl.c
@@ -13,7 +13,7 @@
* normal (http) and secure (https) servers, follow redirects, search for
* strings and regular expressions, check connection times, and report on
* certificate expiration times.
-*
+*
* This plugin uses functions from the curl library, see
* http://curl.haxx.se
*
@@ -40,20 +40,6 @@ const char *email = "devel at monitoring-plugins.org";
#include "common.h"
#include "utils.h"
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#else
-#define unsigned int size_t
-#endif
-
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
#ifndef LIBCURL_PROTOCOL_HTTP
#error libcurl compiled without HTTP support, compiling check_curl plugin makes not much sense
#endif
@@ -69,21 +55,21 @@ const char *email = "devel at monitoring-plugins.org";
/* for buffers for header and body */
typedef struct {
- char *buf;
- size_t buflen;
- size_t bufsize;
+ char *buf;
+ size_t buflen;
+ size_t bufsize;
} curlhelp_curlbuf;
/* for parsing the HTTP status line */
typedef struct {
- int http_major; /* major version of the protocol, always 1 (HTTP/0.9
- * never reached the big internet most likely) */
- int http_minor; /* minor version of the protocol, usually 0 or 1 */
- int http_code; /* HTTP return code as in RFC 2145 */
- int http_subcode; /* Microsoft IIS extension, HTTP subcodes, see
- * http://support.microsoft.com/kb/318380/en-us */
- char *msg; /* the human readable message */
- char *first_line; /* a copy of the first line */
+ int http_major; /* major version of the protocol, always 1 (HTTP/0.9
+ * never reached the big internet most likely) */
+ int http_minor; /* minor version of the protocol, usually 0 or 1 */
+ int http_code; /* HTTP return code as in RFC 2145 */
+ int http_subcode; /* Microsoft IIS extension, HTTP subcodes, see
+ * http://support.microsoft.com/kb/318380/en-us */
+ char *msg; /* the human readable message */
+ char *first_line; /* a copy of the first line */
} curlhelp_statusline;
char *server_address;
@@ -137,587 +123,587 @@ void test_file (char *);
int
main (int argc, char **argv)
{
- int result = STATE_OK;
-
- setlocale (LC_ALL, "");
- bindtextdomain (PACKAGE, LOCALEDIR);
- textdomain (PACKAGE);
-
- /* Parse extra opts if any */
- argv = np_extra_opts (&argc, argv, progname);
-
- /* set defaults */
- snprintf( user_agent, DEFAULT_BUFFER_SIZE, "%s/v%s (monitoring-plugins %s)",
- progname, NP_VERSION, VERSION);
-
- /* parse arguments */
- if (process_arguments (argc, argv) == ERROR)
- usage4 (_("Could not parse arguments"));
-
- /* initialize curl */
- if (curl_global_init (CURL_GLOBAL_DEFAULT) != CURLE_OK)
- die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_global_init failed\n");
-
- if ((curl = curl_easy_init()) == NULL)
- die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_easy_init failed\n");
-
- if (verbose >= 3)
- curl_easy_setopt (curl, CURLOPT_VERBOSE, TRUE);
-
- /* initialize buffer for body of the answer */
- if (curlhelp_initbuffer(&body_buf) < 0)
- die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for body\n");
- curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, curlhelp_buffer_callback);
- curl_easy_setopt (curl, CURLOPT_WRITEDATA, (void *)&body_buf);
-
- /* initialize buffer for header of the answer */
- if (curlhelp_initbuffer( &header_buf ) < 0)
- die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for header\n" );
- curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, curlhelp_buffer_callback);
- curl_easy_setopt (curl, CURLOPT_WRITEHEADER, (void *)&header_buf);
-
- /* set the error buffer */
- curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, errbuf);
-
- /* set timeouts */
- curl_easy_setopt (curl, CURLOPT_CONNECTTIMEOUT, socket_timeout);
- curl_easy_setopt (curl, CURLOPT_TIMEOUT, socket_timeout);
-
- /* compose URL */
- snprintf (url, DEFAULT_BUFFER_SIZE, "%s://%s%s", use_ssl ? "https" : "http",
- server_address, server_url);
- curl_easy_setopt (curl, CURLOPT_URL, url);
-
- /* set port */
- curl_easy_setopt (curl, CURLOPT_PORT, server_port);
-
- /* compose HTTP headers */
- snprintf (http_header, DEFAULT_BUFFER_SIZE, "Host: %s", host_name);
- header_list = curl_slist_append (header_list, http_header);
- curl_easy_setopt( curl, CURLOPT_HTTPHEADER, header_list );
-
- /* set SSL version, warn about unsecure or unsupported versions */
- if (use_ssl) {
- curl_easy_setopt (curl, CURLOPT_SSLVERSION, ssl_version);
- }
-
- /* client certificate and key to present to server (SSL) */
- if (client_cert)
- curl_easy_setopt (curl, CURLOPT_SSLCERT, client_cert);
- if (client_privkey)
- curl_easy_setopt (curl, CURLOPT_SSLKEY, client_privkey);
-
- /* per default if we have a CA verify both the peer and the
- * hostname in the certificate, can be switched off later */
- curl_easy_setopt( curl, CURLOPT_SSL_VERIFYPEER, 2);
- curl_easy_setopt( curl, CURLOPT_SSL_VERIFYHOST, 2);
-
- /* backward-compatible behaviour, be tolerant in checks */
- if (!check_cert) {
- //TODO: depending on more options have aspects we want
- //to be tolerant about
- //curl_easy_setopt( curl, CURLOPT_SSL_VERIFYPEER, 1 );
- curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0);
- curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0);
- }
-
- /* set default or user-given user agent identification */
- curl_easy_setopt (curl, CURLOPT_USERAGENT, user_agent);
-
- /* authentication */
- if (strcmp(user_auth, ""))
- curl_easy_setopt (curl, CURLOPT_USERPWD, user_auth);
-
- /* TODO: parameter auth method, bitfield of following methods:
- * CURLAUTH_BASIC (default)
- * CURLAUTH_DIGEST
- * CURLAUTH_DIGEST_IE
- * CURLAUTH_NEGOTIATE
- * CURLAUTH_NTLM
- * CURLAUTH_NTLM_WB
- *
- * convenience tokens for typical sets of methods:
- * CURLAUTH_ANYSAFE: most secure, without BASIC
- * or CURLAUTH_ANY: most secure, even BASIC if necessary
- *
- * curl_easy_setopt( curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_DIGEST );
- */
-
- /* TODO: --cacert: CA certificate file to verify SSL connection against (SSL) */
- //~ if( args_info.cacert_given ) {
- //~ curl_easy_setopt( curl, CURLOPT_CAINFO, args_info.cacert_arg );
- //~ }
-
- /* handle redirections */
- if (onredirect == STATE_DEPENDENT) {
- curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1);
- /* TODO: handle the following aspects of redirection
- CURLOPT_POSTREDIR: method switch
- CURLINFO_REDIRECT_URL: custom redirect option
- CURLOPT_REDIRECT_PROTOCOLS
- CURLINFO_REDIRECT_COUNT
- */
- }
-
- /* do the request */
- res = curl_easy_perform(curl);
-
- /* free header list, we don't need it anymore */
- curl_slist_free_all (header_list);
-
- /* Curl errors, result in critical Nagios state */
- if (res != CURLE_OK) {
- remove_newlines (errbuf);
- snprintf (msg, DEFAULT_BUFFER_SIZE, _("Invalid HTTP response received from host on port %d: cURL returned %d - %s\n"),
- server_port, res, curl_easy_strerror(res));
- die (STATE_CRITICAL, "HTTP CRITICAL - %s\n", msg);
- }
-
- /* we got the data and we executed the request in a given time, so we can append
- * performance data to the answer always
- */
- curl_easy_getinfo (curl, CURLINFO_TOTAL_TIME, &total_time);
- snprintf (perfstring, DEFAULT_BUFFER_SIZE, "time=%.6gs;%.6g;%.6g;%.6g size=%dB;;;0",
- total_time,
- 0.0, 0.0,
- //~ args_info.warning_given ? args_info.warning_arg : 0.0,
- //~ args_info.critical_given ? args_info.critical_arg : 0.0,
- 0.0,
- (int)body_buf.buflen);
-
- /* return a CRITICAL status if we couldn't read any data */
- if (strlen(header_buf.buf) == 0 && strlen(body_buf.buf) == 0)
- die (STATE_CRITICAL, _("HTTP CRITICAL - No header received from host\n"));
-
- /* get status line of answer, check sanity of HTTP code */
- if (curlhelp_parse_statusline (header_buf.buf, &status_line) < 0) {
- snprintf (msg, DEFAULT_BUFFER_SIZE, "Unparseable status line in %.3g seconds response time|%s\n",
- code, total_time, perfstring);
- die (STATE_CRITICAL, "HTTP CRITICAL HTTP/1.x %d unknown - %s", code, msg);
- }
-
- /* get result code from cURL */
- curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &code);
- if (verbose>=2)
- printf ("* curl CURLINFO_RESPONSE_CODE is %d\n", code);
-
- /* print status line, header, body if verbose */
- if (verbose >= 2) {
- puts ("--- HEADER ---");
- puts (header_buf.buf);
- puts ("--- BODY ---");
- puts (body_buf.buf);
- }
-
- /* illegal return codes result in a critical state */
- if (code >= 600 || code < 100) {
- die (STATE_CRITICAL, _("HTTP CRITICAL: Invalid Status (%d, %.40s)\n"), status_line.http_code, status_line.msg);
- /* server errors result in a critical state */
- } else if (code >= 500) {
- result = STATE_CRITICAL;
- /* client errors result in a warning state */
- } else if (code >= 400) {
- result = STATE_WARNING;
- /* check redirected page if specified */
- } else if (code >= 300) {
- if (onredirect == STATE_DEPENDENT) {
- code = status_line.http_code;
- }
- result = max_state_alt (onredirect, result);
- /* TODO: make sure the last status line has been
- parsed into the status_line structure
- */
- /* all other codes are considered ok */
- } else {
- result = STATE_OK;
- }
-
- /* check status codes, set exit status accordingly */
- if( status_line.http_code != code ) {
- die (STATE_CRITICAL, _("HTTP CRITICAL HTTP/%d.%d %d %s - different HTTP codes (cUrl has %ld)\n"),
- status_line.http_major, status_line.http_minor,
- status_line.http_code, status_line.msg, code);
- }
-
- /* Page and Header content checks go here */
- if (strlen (string_expect)) {
- if (!strstr (body_buf.buf, string_expect)) {
- strncpy(&output_string_search[0],string_expect,sizeof(output_string_search));
- if(output_string_search[sizeof(output_string_search)-1]!='\0') {
- bcopy("...",&output_string_search[sizeof(output_string_search)-4],4);
- }
- snprintf (msg, DEFAULT_BUFFER_SIZE, _("%sstring '%s' not found on '%s://%s:%d%s', "), msg, output_string_search, use_ssl ? "https" : "http", host_name ? host_name : server_address, server_port, server_url);
- result = STATE_CRITICAL;
- }
- }
-
- /* -w, -c: check warning and critical level */
- result = max_state_alt(get_status(total_time, thlds), result);
-
- //~ die (result, "HTTP %s: %s\n", state_text(result), msg);
- die (result, "HTTP %s HTTP/%d.%d %d %s - %s - %.3g seconds response time|%s\n",
- state_text(result), status_line.http_major, status_line.http_minor,
- status_line.http_code, status_line.msg, msg,
- total_time, perfstring);
-
- /* proper cleanup after die? */
- curlhelp_free_statusline(&status_line);
- curl_easy_cleanup (curl);
- curl_global_cleanup ();
- curlhelp_freebuffer(&body_buf);
- curlhelp_freebuffer(&header_buf);
-
- return result;
+ int result = STATE_OK;
+
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+ /* Parse extra opts if any */
+ argv = np_extra_opts (&argc, argv, progname);
+
+ /* set defaults */
+ snprintf( user_agent, DEFAULT_BUFFER_SIZE, "%s/v%s (monitoring-plugins %s)",
+ progname, NP_VERSION, VERSION);
+
+ /* parse arguments */
+ if (process_arguments (argc, argv) == ERROR)
+ usage4 (_("Could not parse arguments"));
+
+ /* initialize curl */
+ if (curl_global_init (CURL_GLOBAL_DEFAULT) != CURLE_OK)
+ die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_global_init failed\n");
+
+ if ((curl = curl_easy_init()) == NULL)
+ die (STATE_UNKNOWN, "HTTP UNKNOWN - curl_easy_init failed\n");
+
+ if (verbose >= 3)
+ curl_easy_setopt (curl, CURLOPT_VERBOSE, TRUE);
+
+ /* initialize buffer for body of the answer */
+ if (curlhelp_initbuffer(&body_buf) < 0)
+ die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for body\n");
+ curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, curlhelp_buffer_callback);
+ curl_easy_setopt (curl, CURLOPT_WRITEDATA, (void *)&body_buf);
+
+ /* initialize buffer for header of the answer */
+ if (curlhelp_initbuffer( &header_buf ) < 0)
+ die (STATE_UNKNOWN, "HTTP CRITICAL - out of memory allocating buffer for header\n" );
+ curl_easy_setopt (curl, CURLOPT_HEADERFUNCTION, curlhelp_buffer_callback);
+ curl_easy_setopt (curl, CURLOPT_WRITEHEADER, (void *)&header_buf);
+
+ /* set the error buffer */
+ curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, errbuf);
+
+ /* set timeouts */
+ curl_easy_setopt (curl, CURLOPT_CONNECTTIMEOUT, socket_timeout);
+ curl_easy_setopt (curl, CURLOPT_TIMEOUT, socket_timeout);
+
+ /* compose URL */
+ snprintf (url, DEFAULT_BUFFER_SIZE, "%s://%s%s", use_ssl ? "https" : "http",
+ server_address, server_url);
+ curl_easy_setopt (curl, CURLOPT_URL, url);
+
+ /* set port */
+ curl_easy_setopt (curl, CURLOPT_PORT, server_port);
+
+ /* compose HTTP headers */
+ snprintf (http_header, DEFAULT_BUFFER_SIZE, "Host: %s", host_name);
+ header_list = curl_slist_append (header_list, http_header);
+ curl_easy_setopt( curl, CURLOPT_HTTPHEADER, header_list );
+
+ /* set SSL version, warn about unsecure or unsupported versions */
+ if (use_ssl) {
+ curl_easy_setopt (curl, CURLOPT_SSLVERSION, ssl_version);
+ }
+
+ /* client certificate and key to present to server (SSL) */
+ if (client_cert)
+ curl_easy_setopt (curl, CURLOPT_SSLCERT, client_cert);
+ if (client_privkey)
+ curl_easy_setopt (curl, CURLOPT_SSLKEY, client_privkey);
+
+ /* per default if we have a CA verify both the peer and the
+ * hostname in the certificate, can be switched off later */
+ curl_easy_setopt( curl, CURLOPT_SSL_VERIFYPEER, 2);
+ curl_easy_setopt( curl, CURLOPT_SSL_VERIFYHOST, 2);
+
+ /* backward-compatible behaviour, be tolerant in checks */
+ if (!check_cert) {
+ //TODO: depending on more options have aspects we want
+ //to be tolerant about
+ //curl_easy_setopt( curl, CURLOPT_SSL_VERIFYPEER, 1 );
+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0);
+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0);
+ }
+
+ /* set default or user-given user agent identification */
+ curl_easy_setopt (curl, CURLOPT_USERAGENT, user_agent);
+
+ /* authentication */
+ if (strcmp(user_auth, ""))
+ curl_easy_setopt (curl, CURLOPT_USERPWD, user_auth);
+
+ /* TODO: parameter auth method, bitfield of following methods:
+ * CURLAUTH_BASIC (default)
+ * CURLAUTH_DIGEST
+ * CURLAUTH_DIGEST_IE
+ * CURLAUTH_NEGOTIATE
+ * CURLAUTH_NTLM
+ * CURLAUTH_NTLM_WB
+ *
+ * convenience tokens for typical sets of methods:
+ * CURLAUTH_ANYSAFE: most secure, without BASIC
+ * or CURLAUTH_ANY: most secure, even BASIC if necessary
+ *
+ * curl_easy_setopt( curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_DIGEST );
+ */
+
+ /* TODO: --cacert: CA certificate file to verify SSL connection against (SSL) */
+ //~ if( args_info.cacert_given ) {
+ //~ curl_easy_setopt( curl, CURLOPT_CAINFO, args_info.cacert_arg );
+ //~ }
+
+ /* handle redirections */
+ if (onredirect == STATE_DEPENDENT) {
+ curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1);
+ /* TODO: handle the following aspects of redirection
+ CURLOPT_POSTREDIR: method switch
+ CURLINFO_REDIRECT_URL: custom redirect option
+ CURLOPT_REDIRECT_PROTOCOLS
+ CURLINFO_REDIRECT_COUNT
+ */
+ }
+
+ /* do the request */
+ res = curl_easy_perform(curl);
+
+ /* free header list, we don't need it anymore */
+ curl_slist_free_all (header_list);
+
+ /* Curl errors, result in critical Nagios state */
+ if (res != CURLE_OK) {
+ remove_newlines (errbuf);
+ snprintf (msg, DEFAULT_BUFFER_SIZE, _("Invalid HTTP response received from host on port %d: cURL returned %d - %s\n"),
+ server_port, res, curl_easy_strerror(res));
+ die (STATE_CRITICAL, "HTTP CRITICAL - %s\n", msg);
+ }
+
+ /* we got the data and we executed the request in a given time, so we can append
+ * performance data to the answer always
+ */
+ curl_easy_getinfo (curl, CURLINFO_TOTAL_TIME, &total_time);
+ snprintf (perfstring, DEFAULT_BUFFER_SIZE, "time=%.6gs;%.6g;%.6g;%.6g size=%dB;;;0",
+ total_time,
+ 0.0, 0.0,
+ //~ args_info.warning_given ? args_info.warning_arg : 0.0,
+ //~ args_info.critical_given ? args_info.critical_arg : 0.0,
+ 0.0,
+ (int)body_buf.buflen);
+
+ /* return a CRITICAL status if we couldn't read any data */
+ if (strlen(header_buf.buf) == 0 && strlen(body_buf.buf) == 0)
+ die (STATE_CRITICAL, _("HTTP CRITICAL - No header received from host\n"));
+
+ /* get status line of answer, check sanity of HTTP code */
+ if (curlhelp_parse_statusline (header_buf.buf, &status_line) < 0) {
+ snprintf (msg, DEFAULT_BUFFER_SIZE, "Unparseable status line in %.3g seconds response time|%s\n",
+ code, total_time, perfstring);
+ die (STATE_CRITICAL, "HTTP CRITICAL HTTP/1.x %d unknown - %s", code, msg);
+ }
+
+ /* get result code from cURL */
+ curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &code);
+ if (verbose>=2)
+ printf ("* curl CURLINFO_RESPONSE_CODE is %d\n", code);
+
+ /* print status line, header, body if verbose */
+ if (verbose >= 2) {
+ puts ("--- HEADER ---");
+ puts (header_buf.buf);
+ puts ("--- BODY ---");
+ puts (body_buf.buf);
+ }
+
+ /* illegal return codes result in a critical state */
+ if (code >= 600 || code < 100) {
+ die (STATE_CRITICAL, _("HTTP CRITICAL: Invalid Status (%d, %.40s)\n"), status_line.http_code, status_line.msg);
+ /* server errors result in a critical state */
+ } else if (code >= 500) {
+ result = STATE_CRITICAL;
+ /* client errors result in a warning state */
+ } else if (code >= 400) {
+ result = STATE_WARNING;
+ /* check redirected page if specified */
+ } else if (code >= 300) {
+ if (onredirect == STATE_DEPENDENT) {
+ code = status_line.http_code;
+ }
+ result = max_state_alt (onredirect, result);
+ /* TODO: make sure the last status line has been
+ parsed into the status_line structure
+ */
+ /* all other codes are considered ok */
+ } else {
+ result = STATE_OK;
+ }
+
+ /* check status codes, set exit status accordingly */
+ if( status_line.http_code != code ) {
+ die (STATE_CRITICAL, _("HTTP CRITICAL HTTP/%d.%d %d %s - different HTTP codes (cUrl has %ld)\n"),
+ status_line.http_major, status_line.http_minor,
+ status_line.http_code, status_line.msg, code);
+ }
+
+ /* Page and Header content checks go here */
+ if (strlen (string_expect)) {
+ if (!strstr (body_buf.buf, string_expect)) {
+ strncpy(&output_string_search[0],string_expect,sizeof(output_string_search));
+ if(output_string_search[sizeof(output_string_search)-1]!='\0') {
+ bcopy("...",&output_string_search[sizeof(output_string_search)-4],4);
+ }
+ snprintf (msg, DEFAULT_BUFFER_SIZE, _("%sstring '%s' not found on '%s://%s:%d%s', "), msg, output_string_search, use_ssl ? "https" : "http", host_name ? host_name : server_address, server_port, server_url);
+ result = STATE_CRITICAL;
+ }
+ }
+
+ /* -w, -c: check warning and critical level */
+ result = max_state_alt(get_status(total_time, thlds), result);
+
+ //~ die (result, "HTTP %s: %s\n", state_text(result), msg);
+ die (result, "HTTP %s HTTP/%d.%d %d %s - %s - %.3g seconds response time|%s\n",
+ state_text(result), status_line.http_major, status_line.http_minor,
+ status_line.http_code, status_line.msg, msg,
+ total_time, perfstring);
+
+ /* proper cleanup after die? */
+ curlhelp_free_statusline(&status_line);
+ curl_easy_cleanup (curl);
+ curl_global_cleanup ();
+ curlhelp_freebuffer(&body_buf);
+ curlhelp_freebuffer(&header_buf);
+
+ return result;
}
/* check whether a file exists */
void
test_file (char *path)
{
- if (access(path, R_OK) == 0)
- return;
- usage2 (_("file does not exist or is not readable"), path);
+ if (access(path, R_OK) == 0)
+ return;
+ usage2 (_("file does not exist or is not readable"), path);
}
int
process_arguments (int argc, char **argv)
{
- int c;
-
- enum {
- SNI_OPTION
- };
-
- int option=0;
- static struct option longopts[] = {
- {"ssl", optional_argument, 0, 'S'},
- {"sni", no_argument, 0, SNI_OPTION},
- {"IP-address", required_argument, 0, 'I'},
- {"url", required_argument, 0, 'u'},
- {"port", required_argument, 0, 'p'},
- {"authorization", required_argument, 0, 'a'},
- {"string", required_argument, 0, 's'},
- {"onredirect", required_argument, 0, 'f'},
- {"client-cert", required_argument, 0, 'J'},
- {"private-key", required_argument, 0, 'K'},
- {"useragent", required_argument, 0, 'A'},
- {"certificate", required_argument, 0, 'C'},
- {0, 0, 0, 0}
- };
-
- if (argc < 2)
- usage ("\n");
-
- while (1) {
- c = getopt_long (argc, argv, "Vvht:c:w:A:H:I:a:p:s:u:f:C:J:K:S::", longopts, &option);
- if (c == -1 || c == EOF || c == 1)
- break;
-
- switch (c) {
- case 'h':
- print_help();
- exit(STATE_UNKNOWN);
- break;
- case 'V':
- print_revision(progname, NP_VERSION);
- print_curl_version();
- exit(STATE_UNKNOWN);
- break;
- case 'v':
- verbose++;
- break;
- case 't': /* timeout period */
- if (!is_intnonneg (optarg))
- usage2 (_("Timeout interval must be a positive integer"), optarg);
- else
- socket_timeout = (int)strtol (optarg, NULL, 10);
- break;
- case 'c': /* critical time threshold */
- critical_thresholds = optarg;
- break;
- case 'w': /* warning time threshold */
- warning_thresholds = optarg;
- break;
- case 'H': /* virtual host */
- host_name = strdup (optarg);
- break;
- case 'I': /* internet address */
- server_address = strdup (optarg);
- break;
- case 'u': /* URL path */
- server_url = strdup (optarg);
- break;
- case 'p': /* Server port */
- if (!is_intnonneg (optarg))
- usage2 (_("Invalid port number, expecting a non-negative number"), optarg);
- else {
- if( strtol(optarg, NULL, 10) > MAX_PORT)
- usage2 (_("Invalid port number, supplied port number is too big"), optarg);
- server_port = (unsigned short)strtol(optarg, NULL, 10);
- }
- break;
- case 'a': /* authorization info */
- strncpy (user_auth, optarg, MAX_INPUT_BUFFER - 1);
- user_auth[MAX_INPUT_BUFFER - 1] = 0;
- break;
- case 'A': /* useragent */
- snprintf (user_agent, DEFAULT_BUFFER_SIZE, optarg);
- break;
- case 'C': /* Check SSL cert validity */
+ int c;
+
+ enum {
+ SNI_OPTION
+ };
+
+ int option=0;
+ static struct option longopts[] = {
+ {"ssl", optional_argument, 0, 'S'},
+ {"sni", no_argument, 0, SNI_OPTION},
+ {"IP-address", required_argument, 0, 'I'},
+ {"url", required_argument, 0, 'u'},
+ {"port", required_argument, 0, 'p'},
+ {"authorization", required_argument, 0, 'a'},
+ {"string", required_argument, 0, 's'},
+ {"onredirect", required_argument, 0, 'f'},
+ {"client-cert", required_argument, 0, 'J'},
+ {"private-key", required_argument, 0, 'K'},
+ {"useragent", required_argument, 0, 'A'},
+ {"certificate", required_argument, 0, 'C'},
+ {0, 0, 0, 0}
+ };
+
+ if (argc < 2)
+ usage ("\n");
+
+ while (1) {
+ c = getopt_long (argc, argv, "Vvht:c:w:A:H:I:a:p:s:u:f:C:J:K:S::", longopts, &option);
+ if (c == -1 || c == EOF || c == 1)
+ break;
+
+ switch (c) {
+ case 'h':
+ print_help();
+ exit(STATE_UNKNOWN);
+ break;
+ case 'V':
+ print_revision(progname, NP_VERSION);
+ print_curl_version();
+ exit(STATE_UNKNOWN);
+ break;
+ case 'v':
+ verbose++;
+ break;
+ case 't': /* timeout period */
+ if (!is_intnonneg (optarg))
+ usage2 (_("Timeout interval must be a positive integer"), optarg);
+ else
+ socket_timeout = (int)strtol (optarg, NULL, 10);
+ break;
+ case 'c': /* critical time threshold */
+ critical_thresholds = optarg;
+ break;
+ case 'w': /* warning time threshold */
+ warning_thresholds = optarg;
+ break;
+ case 'H': /* virtual host */
+ host_name = strdup (optarg);
+ break;
+ case 'I': /* internet address */
+ server_address = strdup (optarg);
+ break;
+ case 'u': /* URL path */
+ server_url = strdup (optarg);
+ break;
+ case 'p': /* Server port */
+ if (!is_intnonneg (optarg))
+ usage2 (_("Invalid port number, expecting a non-negative number"), optarg);
+ else {
+ if( strtol(optarg, NULL, 10) > MAX_PORT)
+ usage2 (_("Invalid port number, supplied port number is too big"), optarg);
+ server_port = (unsigned short)strtol(optarg, NULL, 10);
+ }
+ break;
+ case 'a': /* authorization info */
+ strncpy (user_auth, optarg, MAX_INPUT_BUFFER - 1);
+ user_auth[MAX_INPUT_BUFFER - 1] = 0;
+ break;
+ case 'A': /* useragent */
+ snprintf (user_agent, DEFAULT_BUFFER_SIZE, optarg);
+ break;
+ case 'C': /* Check SSL cert validity */
#ifdef LIBCURL_FEATURE_SSL
- /* TODO: C:, check age of certificate for backward compatible
- * behaviour, but we would later add more check conditions */
- check_cert = TRUE;
- goto enable_ssl;
+ /* TODO: C:, check age of certificate for backward compatible
+ * behaviour, but we would later add more check conditions */
+ check_cert = TRUE;
+ goto enable_ssl;
#endif
- case 'J': /* use client certificate */
+ case 'J': /* use client certificate */
#ifdef LIBCURL_FEATURE_SSL
- test_file(optarg);
- client_cert = optarg;
- goto enable_ssl;
+ test_file(optarg);
+ client_cert = optarg;
+ goto enable_ssl;
#endif
- case 'K': /* use client private key */
+ case 'K': /* use client private key */
#ifdef LIBCURL_FEATURE_SSL
- test_file(optarg);
- client_privkey = optarg;
- goto enable_ssl;
+ test_file(optarg);
+ client_privkey = optarg;
+ goto enable_ssl;
#endif
- case 'S': /* use SSL */
+ case 'S': /* use SSL */
#ifdef LIBCURL_FEATURE_SSL
- enable_ssl:
- use_ssl = TRUE;
- /* ssl_version initialized to CURL_SSLVERSION_TLSv1_0 as a default. Only set if it's non-zero. This helps when we include multiple
- parameters, like -S and -C combinations */
- ssl_version = CURL_SSLVERSION_TLSv1_0;
- if (c=='S' && optarg != NULL) {
- int got_plus = strchr(optarg, '+') != NULL;
-
- if (!strncmp (optarg, "1.2", 3))
- ssl_version = CURL_SSLVERSION_TLSv1_2;
- else if (!strncmp (optarg, "1.1", 3))
- ssl_version = CURL_SSLVERSION_TLSv1_1;
- else if (optarg[0] == '1')
- ssl_version = CURL_SSLVERSION_TLSv1_0;
- else if (optarg[0] == '3')
- ssl_version = CURL_SSLVERSION_SSLv3;
- else if (optarg[0] == '2')
- ssl_version = CURL_SSLVERSION_SSLv2;
- else
- usage4 (_("Invalid option - Valid SSL/TLS versions: 2, 3, 1, 1.1, 1.2 (with optional '+' suffix)"));
- }
- if (server_port == DEFAULT_HTTP_PORT)
- server_port = DEFAULT_HTTPS_PORT;
+ enable_ssl:
+ use_ssl = TRUE;
+ /* ssl_version initialized to CURL_SSLVERSION_TLSv1_0 as a default. Only set if it's non-zero. This helps when we include multiple
+ parameters, like -S and -C combinations */
+ ssl_version = CURL_SSLVERSION_TLSv1_0;
+ if (c=='S' && optarg != NULL) {
+ int got_plus = strchr(optarg, '+') != NULL;
+
+ if (!strncmp (optarg, "1.2", 3))
+ ssl_version = CURL_SSLVERSION_TLSv1_2;
+ else if (!strncmp (optarg, "1.1", 3))
+ ssl_version = CURL_SSLVERSION_TLSv1_1;
+ else if (optarg[0] == '1')
+ ssl_version = CURL_SSLVERSION_TLSv1_0;
+ else if (optarg[0] == '3')
+ ssl_version = CURL_SSLVERSION_SSLv3;
+ else if (optarg[0] == '2')
+ ssl_version = CURL_SSLVERSION_SSLv2;
+ else
+ usage4 (_("Invalid option - Valid SSL/TLS versions: 2, 3, 1, 1.1, 1.2 (with optional '+' suffix)"));
+ }
+ if (server_port == DEFAULT_HTTP_PORT)
+ server_port = DEFAULT_HTTPS_PORT;
#else
- /* -C -J and -K fall through to here without SSL */
- usage4 (_("Invalid option - SSL is not available"));
+ /* -C -J and -K fall through to here without SSL */
+ usage4 (_("Invalid option - SSL is not available"));
#endif
- break;
- case SNI_OPTION: /* --sni is parsed, but ignored, the default is TRUE with libcurl */
- use_sni = TRUE;
- break;
- case 'f': /* onredirect */
- if (!strcmp (optarg, "ok"))
- onredirect = STATE_OK;
- else if (!strcmp (optarg, "warning"))
- onredirect = STATE_WARNING;
- else if (!strcmp (optarg, "critical"))
- onredirect = STATE_CRITICAL;
- else if (!strcmp (optarg, "unknown"))
- onredirect = STATE_UNKNOWN;
- else if (!strcmp (optarg, "follow"))
- onredirect = STATE_DEPENDENT;
- else usage2 (_("Invalid onredirect option"), optarg);
- //~ if (!strcmp (optarg, "stickyport"))
- //~ onredirect = STATE_DEPENDENT, followsticky = STICKY_HOST|STICKY_PORT;
- //~ else if (!strcmp (optarg, "sticky"))
- //~ onredirect = STATE_DEPENDENT, followsticky = STICKY_HOST;
- //~ else if (!strcmp (optarg, "follow"))
- //~ onredirect = STATE_DEPENDENT, followsticky = STICKY_NONE;
- if (verbose >= 2)
- printf(_("* Following redirects set to %s\n"), state_text(onredirect));
- break;
- case 's': /* string or substring */
- strncpy (string_expect, optarg, MAX_INPUT_BUFFER - 1);
- string_expect[MAX_INPUT_BUFFER - 1] = 0;
- break;
- case '?':
- /* print short usage statement if args not parsable */
- usage5 ();
- break;
- }
- }
-
- c = optind;
-
- if (server_address == NULL && c < argc)
- server_address = strdup (argv[c++]);
-
- if (host_name == NULL && c < argc)
- host_name = strdup (argv[c++]);
-
- if (server_address == NULL) {
- if (host_name == NULL)
- usage4 (_("You must specify a server address or host name"));
- else
- server_address = strdup (host_name);
- }
-
- set_thresholds(&thlds, warning_thresholds, critical_thresholds);
-
- if (critical_thresholds && thlds->critical->end>(double)socket_timeout)
- socket_timeout = (int)thlds->critical->end + 1;
- if (verbose >= 2)
- printf ("* Socket timeout set to %d seconds\n", socket_timeout);
+ break;
+ case SNI_OPTION: /* --sni is parsed, but ignored, the default is TRUE with libcurl */
+ use_sni = TRUE;
+ break;
+ case 'f': /* onredirect */
+ if (!strcmp (optarg, "ok"))
+ onredirect = STATE_OK;
+ else if (!strcmp (optarg, "warning"))
+ onredirect = STATE_WARNING;
+ else if (!strcmp (optarg, "critical"))
+ onredirect = STATE_CRITICAL;
+ else if (!strcmp (optarg, "unknown"))
+ onredirect = STATE_UNKNOWN;
+ else if (!strcmp (optarg, "follow"))
+ onredirect = STATE_DEPENDENT;
+ else usage2 (_("Invalid onredirect option"), optarg);
+ //~ if (!strcmp (optarg, "stickyport"))
+ //~ onredirect = STATE_DEPENDENT, followsticky = STICKY_HOST|STICKY_PORT;
+ //~ else if (!strcmp (optarg, "sticky"))
+ //~ onredirect = STATE_DEPENDENT, followsticky = STICKY_HOST;
+ //~ else if (!strcmp (optarg, "follow"))
+ //~ onredirect = STATE_DEPENDENT, followsticky = STICKY_NONE;
+ if (verbose >= 2)
+ printf(_("* Following redirects set to %s\n"), state_text(onredirect));
+ break;
+ case 's': /* string or substring */
+ strncpy (string_expect, optarg, MAX_INPUT_BUFFER - 1);
+ string_expect[MAX_INPUT_BUFFER - 1] = 0;
+ break;
+ case '?':
+ /* print short usage statement if args not parsable */
+ usage5 ();
+ break;
+ }
+ }
+
+ c = optind;
+
+ if (server_address == NULL && c < argc)
+ server_address = strdup (argv[c++]);
+
+ if (host_name == NULL && c < argc)
+ host_name = strdup (argv[c++]);
+
+ if (server_address == NULL) {
+ if (host_name == NULL)
+ usage4 (_("You must specify a server address or host name"));
+ else
+ server_address = strdup (host_name);
+ }
+
+ set_thresholds(&thlds, warning_thresholds, critical_thresholds);
+
+ if (critical_thresholds && thlds->critical->end>(double)socket_timeout)
+ socket_timeout = (int)thlds->critical->end + 1;
+ if (verbose >= 2)
+ printf ("* Socket timeout set to %d seconds\n", socket_timeout);
//~ if (http_method == NULL)
//~ http_method = strdup ("GET");
- if (client_cert && !client_privkey)
- usage4 (_("If you use a client certificate you must also specify a private key file"));
+ if (client_cert && !client_privkey)
+ usage4 (_("If you use a client certificate you must also specify a private key file"));
//~ if (virtual_port == 0)
//~ virtual_port = server_port;
- return TRUE;
+ return TRUE;
}
void
print_help (void)
{
- print_revision(progname, NP_VERSION);
+ print_revision(progname, NP_VERSION);
+
+ printf ("Copyright (c) 1999 Ethan Galstad <nagios at nagios.org>\n");
+ printf ("Copyright (c) 2017 Andreas Baumann <abaumann at yahoo.com>\n");
+ printf (COPYRIGHT, copyright, email);
- printf ("Copyright (c) 1999 Ethan Galstad <nagios at nagios.org>\n");
- printf ("Copyright (c) 2017 Andreas Baumann <abaumann at yahoo.com>\n");
- printf (COPYRIGHT, copyright, email);
+ printf ("%s\n", _("This plugin tests the HTTP service on the specified host. It can test"));
+ printf ("%s\n", _("normal (http) and secure (https) servers, follow redirects, search for"));
+ printf ("%s\n", _("strings and regular expressions, check connection times, and report on"));
+ printf ("%s\n", _("certificate expiration times."));
+ printf ("\n");
+ printf ("%s\n", _("It makes use of libcurl to do so. It tries to be as compatible to check_http"));
+ printf ("%s\n", _("as possible."));
- printf ("%s\n", _("This plugin tests the HTTP service on the specified host. It can test"));
- printf ("%s\n", _("normal (http) and secure (https) servers, follow redirects, search for"));
- printf ("%s\n", _("strings and regular expressions, check connection times, and report on"));
- printf ("%s\n", _("certificate expiration times."));
- printf ("\n");
- printf ("%s\n", _("It makes use of libcurl to do so. It tries to be as compatible to check_http"));
- printf ("%s\n", _("as possible."));
+ printf ("\n\n");
- printf ("\n\n");
+ print_usage();
- print_usage();
-
- printf (_("NOTE: One or both of -H and -I must be specified"));
+ printf (_("NOTE: One or both of -H and -I must be specified"));
- printf ("\n");
+ printf ("\n");
- printf (UT_HELP_VRSN);
- printf (UT_EXTRA_OPTS);
+ printf (UT_HELP_VRSN);
+ printf (UT_EXTRA_OPTS);
- printf (" %s\n", "-H, --hostname=ADDRESS");
- printf (" %s\n", _("Host name argument for servers using host headers (virtual host)"));
- printf (" %s\n", _("Append a port to include it in the header (eg: example.com:5000)"));
- printf (" %s\n", "-I, --IP-address=ADDRESS");
- printf (" %s\n", _("IP address or name (use numeric address if possible to bypass DNS lookup)."));
- printf (" %s\n", "-p, --port=INTEGER");
- printf (" %s", _("Port number (default: "));
- printf ("%d)\n", DEFAULT_HTTP_PORT);
+ printf (" %s\n", "-H, --hostname=ADDRESS");
+ printf (" %s\n", _("Host name argument for servers using host headers (virtual host)"));
+ printf (" %s\n", _("Append a port to include it in the header (eg: example.com:5000)"));
+ printf (" %s\n", "-I, --IP-address=ADDRESS");
+ printf (" %s\n", _("IP address or name (use numeric address if possible to bypass DNS lookup)."));
+ printf (" %s\n", "-p, --port=INTEGER");
+ printf (" %s", _("Port number (default: "));
+ printf ("%d)\n", DEFAULT_HTTP_PORT);
#ifdef LIBCURL_FEATURE_SSL
- printf (" %s\n", "-S, --ssl=VERSION[+]");
- printf (" %s\n", _("Connect via SSL. Port defaults to 443. VERSION is optional, and prevents"));
- printf (" %s\n", _("auto-negotiation (2 = SSLv2, 3 = SSLv3, 1 = TLSv1, 1.1 = TLSv1.1,"));
- printf (" %s\n", _("1.2 = TLSv1.2). With a '+' suffix, newer versions are also accepted."));
- printf (" %s\n", _("Note: SSLv2 and SSLv3 are deprecated and are usually disabled in libcurl"));
- printf (" %s\n", "--sni");
- printf (" %s\n", _("Enable SSL/TLS hostname extension support (SNI)"));
+ printf (" %s\n", "-S, --ssl=VERSION[+]");
+ printf (" %s\n", _("Connect via SSL. Port defaults to 443. VERSION is optional, and prevents"));
+ printf (" %s\n", _("auto-negotiation (2 = SSLv2, 3 = SSLv3, 1 = TLSv1, 1.1 = TLSv1.1,"));
+ printf (" %s\n", _("1.2 = TLSv1.2). With a '+' suffix, newer versions are also accepted."));
+ printf (" %s\n", _("Note: SSLv2 and SSLv3 are deprecated and are usually disabled in libcurl"));
+ printf (" %s\n", "--sni");
+ printf (" %s\n", _("Enable SSL/TLS hostname extension support (SNI)"));
#if LIBCURL_VERSION_NUM >= 0x071801
- printf (" %s\n", _("Note: --sni is the default in libcurl as SSLv2 and SSLV3 are deprecated and"));
- printf (" %s\n", _(" SNI only really works since TLSv1.0"));
+ printf (" %s\n", _("Note: --sni is the default in libcurl as SSLv2 and SSLV3 are deprecated and"));
+ printf (" %s\n", _(" SNI only really works since TLSv1.0"));
#else
- printf (" %s\n", _("Note: SNI is not supported in libcurl before 7.18.1"));
+ printf (" %s\n", _("Note: SNI is not supported in libcurl before 7.18.1"));
#endif
- printf (" %s\n", "-C, --certificate");
- printf (" %s\n", _("Check validity of certificate"));
- printf (" %s\n", "-J, --client-cert=FILE");
- printf (" %s\n", _("Name of file that contains the client certificate (PEM format)"));
- printf (" %s\n", _("to be used in establishing the SSL session"));
- printf (" %s\n", "-K, --private-key=FILE");
- printf (" %s\n", _("Name of file containing the private key (PEM format)"));
- printf (" %s\n", _("matching the client certificate"));
+ printf (" %s\n", "-C, --certificate");
+ printf (" %s\n", _("Check validity of certificate"));
+ printf (" %s\n", "-J, --client-cert=FILE");
+ printf (" %s\n", _("Name of file that contains the client certificate (PEM format)"));
+ printf (" %s\n", _("to be used in establishing the SSL session"));
+ printf (" %s\n", "-K, --private-key=FILE");
+ printf (" %s\n", _("Name of file containing the private key (PEM format)"));
+ printf (" %s\n", _("matching the client certificate"));
#endif
- printf (" %s\n", "-s, --string=STRING");
- printf (" %s\n", _("String to expect in the content"));
- printf (" %s\n", "-u, --url=PATH");
- printf (" %s\n", _("URL to GET or POST (default: /)"));
+ printf (" %s\n", "-s, --string=STRING");
+ printf (" %s\n", _("String to expect in the content"));
+ printf (" %s\n", "-u, --url=PATH");
+ printf (" %s\n", _("URL to GET or POST (default: /)"));
- printf (" %s\n", "-a, --authorization=AUTH_PAIR");
- printf (" %s\n", _("Username:password on sites with basic authentication"));
- printf (" %s\n", "-A, --useragent=STRING");
- printf (" %s\n", _("String to be sent in http header as \"User Agent\""));
- printf (" %s\n", "-f, --onredirect=<ok|warning|critical|follow|sticky|stickyport>");
- printf (" %s\n", _("How to handle redirected pages. sticky is like follow but stick to the"));
- printf (" %s\n", _("specified IP address. stickyport also ensures port stays the same."));
+ printf (" %s\n", "-a, --authorization=AUTH_PAIR");
+ printf (" %s\n", _("Username:password on sites with basic authentication"));
+ printf (" %s\n", "-A, --useragent=STRING");
+ printf (" %s\n", _("String to be sent in http header as \"User Agent\""));
+ printf (" %s\n", "-f, --onredirect=<ok|warning|critical|follow|sticky|stickyport>");
+ printf (" %s\n", _("How to handle redirected pages. sticky is like follow but stick to the"));
+ printf (" %s\n", _("specified IP address. stickyport also ensures port stays the same."));
- printf (UT_WARN_CRIT);
+ printf (UT_WARN_CRIT);
- printf (UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
+ printf (UT_CONN_TIMEOUT, DEFAULT_SOCKET_TIMEOUT);
- printf (UT_VERBOSE);
+ printf (UT_VERBOSE);
- printf (UT_SUPPORT);
+ printf (UT_SUPPORT);
}
void
print_usage (void)
{
- printf ("%s\n", _("Usage:"));
- printf (" %s -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>]\n",progname);
- printf (" [-J <client certificate file>] [-K <private key>]\n");
- printf (" [-w <warn time>] [-c <critical time>] [-t <timeout>] [-a auth]\n");
- printf (" [-f <ok|warning|critcal|follow>]\n");
- printf (" [-A string] [-S <version>] [-C]\n");
- printf (" [-v verbose]\n", progname);
- printf ("\n");
- printf ("%s\n", _("WARNING: check_curl is experimental. Please use"));
- printf ("%s\n\n", _("check_http if you need a stable version."));
+ printf ("%s\n", _("Usage:"));
+ printf (" %s -H <vhost> | -I <IP-address> [-u <uri>] [-p <port>]\n",progname);
+ printf (" [-J <client certificate file>] [-K <private key>]\n");
+ printf (" [-w <warn time>] [-c <critical time>] [-t <timeout>] [-a auth]\n");
+ printf (" [-f <ok|warning|critcal|follow>]\n");
+ printf (" [-A string] [-S <version>] [-C]\n");
+ printf (" [-v verbose]\n", progname);
+ printf ("\n");
+ printf ("%s\n", _("WARNING: check_curl is experimental. Please use"));
+ printf ("%s\n\n", _("check_http if you need a stable version."));
}
void
print_curl_version (void)
{
- printf( "%s\n", curl_version());
+ printf( "%s\n", curl_version());
}
int
curlhelp_initbuffer (curlhelp_curlbuf *buf)
{
- buf->bufsize = DEFAULT_BUFFER_SIZE;
- buf->buflen = 0;
- buf->buf = (char *)malloc ((size_t)buf->bufsize);
- if (buf->buf == NULL) return -1;
- return 0;
+ buf->bufsize = DEFAULT_BUFFER_SIZE;
+ buf->buflen = 0;
+ buf->buf = (char *)malloc ((size_t)buf->bufsize);
+ if (buf->buf == NULL) return -1;
+ return 0;
}
int
curlhelp_buffer_callback (void *buffer, size_t size, size_t nmemb, void *stream)
{
- curlhelp_curlbuf *buf = (curlhelp_curlbuf *)stream;
+ curlhelp_curlbuf *buf = (curlhelp_curlbuf *)stream;
- while (buf->bufsize < buf->buflen + size * nmemb + 1) {
- buf->bufsize *= buf->bufsize * 2;
- buf->buf = (char *)realloc (buf->buf, buf->bufsize);
- if (buf->buf == NULL) return -1;
- }
+ while (buf->bufsize < buf->buflen + size * nmemb + 1) {
+ buf->bufsize *= buf->bufsize * 2;
+ buf->buf = (char *)realloc (buf->buf, buf->bufsize);
+ if (buf->buf == NULL) return -1;
+ }
- memcpy (buf->buf + buf->buflen, buffer, size * nmemb);
- buf->buflen += size * nmemb;
- buf->buf[buf->buflen] = '\0';
+ memcpy (buf->buf + buf->buflen, buffer, size * nmemb);
+ buf->buflen += size * nmemb;
+ buf->buf[buf->buflen] = '\0';
- return (int)(size * nmemb);
+ return (int)(size * nmemb);
}
void
curlhelp_freebuffer (curlhelp_curlbuf *buf)
{
- free (buf->buf);
- buf->buf = NULL;
+ free (buf->buf);
+ buf->buf = NULL;
}
/* TODO: when redirecting we get more than one HTTP header, make sure
@@ -726,76 +712,76 @@ curlhelp_freebuffer (curlhelp_curlbuf *buf)
int
curlhelp_parse_statusline (char *buf, curlhelp_statusline *status_line)
{
- char *first_line_end;
- char *p;
- size_t first_line_len;
- char *pp;
-
- first_line_end = strstr(buf, "\r\n");
- if (first_line_end == NULL) return -1;
-
- first_line_len = (size_t)(first_line_end - buf);
- status_line->first_line = (char *)malloc (first_line_len + 1);
- if (status_line->first_line == NULL) return -1;
- memcpy (status_line->first_line, buf, first_line_len);
- status_line->first_line[first_line_len] = '\0';
-
- /* protocol and version: "HTTP/x.x" SP */
-
- p = strtok(status_line->first_line, "/");
- if( p == NULL ) { free( status_line->first_line ); return -1; }
- if( strcmp( p, "HTTP" ) != 0 ) { free( status_line->first_line ); return -1; }
-
- p = strtok( NULL, "." );
- if( p == NULL ) { free( status_line->first_line ); return -1; }
- status_line->http_major = (int)strtol( p, &pp, 10 );
- if( *pp != '\0' ) { free( status_line->first_line ); return -1; }
-
- p = strtok( NULL, " " );
- if( p == NULL ) { free( status_line->first_line ); return -1; }
- status_line->http_minor = (int)strtol( p, &pp, 10 );
- if( *pp != '\0' ) { free( status_line->first_line ); return -1; }
-
- /* status code: "404" or "404.1", then SP */
-
- p = strtok( NULL, " ." );
- if( p == NULL ) { free( status_line->first_line ); return -1; }
- if( strchr( p, '.' ) != NULL ) {
- char *ppp;
- ppp = strtok( p, "." );
- status_line->http_code = (int)strtol( ppp, &pp, 10 );
- if( *pp != '\0' ) { free( status_line->first_line ); return -1; }
-
- ppp = strtok( NULL, "" );
- status_line->http_subcode = (int)strtol( ppp, &pp, 10 );
- if( *pp != '\0' ) { free( status_line->first_line ); return -1; }
- } else {
- status_line->http_code = (int)strtol( p, &pp, 10 );
- status_line->http_subcode = -1;
- if( *pp != '\0' ) { free( status_line->first_line ); return -1; }
- }
-
- /* Human readable message: "Not Found" CRLF */
-
- p = strtok( NULL, "" );
- if( p == NULL ) { free( status_line->first_line ); return -1; }
- status_line->msg = p;
-
- return 0;
+ char *first_line_end;
+ char *p;
+ size_t first_line_len;
+ char *pp;
+
+ first_line_end = strstr(buf, "\r\n");
+ if (first_line_end == NULL) return -1;
+
+ first_line_len = (size_t)(first_line_end - buf);
+ status_line->first_line = (char *)malloc (first_line_len + 1);
+ if (status_line->first_line == NULL) return -1;
+ memcpy (status_line->first_line, buf, first_line_len);
+ status_line->first_line[first_line_len] = '\0';
+
+ /* protocol and version: "HTTP/x.x" SP */
+
+ p = strtok(status_line->first_line, "/");
+ if( p == NULL ) { free( status_line->first_line ); return -1; }
+ if( strcmp( p, "HTTP" ) != 0 ) { free( status_line->first_line ); return -1; }
+
+ p = strtok( NULL, "." );
+ if( p == NULL ) { free( status_line->first_line ); return -1; }
+ status_line->http_major = (int)strtol( p, &pp, 10 );
+ if( *pp != '\0' ) { free( status_line->first_line ); return -1; }
+
+ p = strtok( NULL, " " );
+ if( p == NULL ) { free( status_line->first_line ); return -1; }
+ status_line->http_minor = (int)strtol( p, &pp, 10 );
+ if( *pp != '\0' ) { free( status_line->first_line ); return -1; }
+
+ /* status code: "404" or "404.1", then SP */
+
+ p = strtok( NULL, " ." );
+ if( p == NULL ) { free( status_line->first_line ); return -1; }
+ if( strchr( p, '.' ) != NULL ) {
+ char *ppp;
+ ppp = strtok( p, "." );
+ status_line->http_code = (int)strtol( ppp, &pp, 10 );
+ if( *pp != '\0' ) { free( status_line->first_line ); return -1; }
+
+ ppp = strtok( NULL, "" );
+ status_line->http_subcode = (int)strtol( ppp, &pp, 10 );
+ if( *pp != '\0' ) { free( status_line->first_line ); return -1; }
+ } else {
+ status_line->http_code = (int)strtol( p, &pp, 10 );
+ status_line->http_subcode = -1;
+ if( *pp != '\0' ) { free( status_line->first_line ); return -1; }
+ }
+
+ /* Human readable message: "Not Found" CRLF */
+
+ p = strtok( NULL, "" );
+ if( p == NULL ) { free( status_line->first_line ); return -1; }
+ status_line->msg = p;
+
+ return 0;
}
void
curlhelp_free_statusline (curlhelp_statusline *status_line)
{
- free (status_line->first_line);
+ free (status_line->first_line);
}
void
remove_newlines (char *s)
{
- char *p;
+ char *p;
- for (p = s; *p != '\0'; p++)
- if (*p == '\r' || *p == '\n')
- *p = ' ';
+ for (p = s; *p != '\0'; p++)
+ if (*p == '\r' || *p == '\n')
+ *p = ' ';
}
More information about the Commits
mailing list