--- /dev/null
+--- a/main.c
++++ b/main.c
+@@ -51,25 +51,40 @@ volatile int stop = 0;
+
+ int quiet = 0;
+ char machine_readable = 0;
++#ifdef ENABLE_JSON
+ char json_output = 0;
++#else
++#define json_output 0
++#endif
+ char show_ts = 0;
+
++#ifdef ENABLE_HELP_FORMAT
+ int max_x = 80, max_y = 24;
++#endif
+
++#ifdef ENABLE_NAGIOS
+ char nagios_mode = 0;
++#else
++#define nagios_mode 0
++#endif
++#ifdef NC
+ char ncurses_mode = 0;
++#else
++#define ncurses_mode 0
++#endif
+
+ int fd = -1;
+
+ volatile char got_sigquit = 0;
+
+-void handler_quit(int s)
++void handler_quit()
+ {
+ signal(SIGQUIT, handler_quit);
+
+ got_sigquit = 1;
+ }
+
++#ifdef ENABLE_HELP_FORMAT
+ void determine_terminal_size(int *max_y, int *max_x)
+ {
+ struct winsize size;
+@@ -104,6 +119,7 @@ void determine_terminal_size(int *max_y,
+ *max_y = 24;
+ }
+ }
++#endif
+
+ void emit_statuslines(double run_time)
+ {
+@@ -159,6 +175,7 @@ void emit_headers(char *in)
+ #endif
+ }
+
++#ifdef ENABLE_JSON
+ void emit_json(char ok, int seq, double start_ts, stats_t *t_resolve, stats_t *t_connect, stats_t *t_request, int http_code, const char *msg, int header_size, int data_size, double Bps, const char *host, const char *ssl_fp, double toff_diff_ts, char tfo_success, stats_t *t_ssl, stats_t *t_write, stats_t *t_close, int n_cookies, stats_t *stats_to, stats_t *tcp_rtt_stats, int re_tx, int pmtu, int recv_tos, stats_t *t_total)
+ {
+ if (seq > 1)
+@@ -203,6 +220,7 @@ void emit_json(char ok, int seq, double
+ printf("\"tos\" : \"%02x\" ", recv_tos);
+ printf("}");
+ }
++#endif
+
+ char *get_ts_str(int verbose)
+ {
+@@ -240,8 +258,13 @@ void emit_error(int verbose, int seq, do
+ if (!quiet && !machine_readable && !nagios_mode && !json_output)
+ printf("%s%s%s%s\n", ts ? ts : "", c_error, get_error(), c_normal);
+
++#ifdef ENABLE_JSON
+ if (json_output)
+ emit_json(0, seq, start_ts, NULL, NULL, NULL, -1, get_error(), -1, -1, -1, "", "", -1, 0, NULL, NULL, NULL, 0, NULL, NULL, 0, 0, 0, NULL);
++#else
++ (void) seq;
++ (void) start_ts;
++#endif
+
+ clear_error();
+
+@@ -590,6 +613,7 @@ void fetch_proxy_settings(char **proxy_u
+ }
+ }
+
++#ifdef ENABLE_NAGIOS
+ void parse_nagios_settings(const char *in, double *nagios_warn, double *nagios_crit)
+ {
+ char *dummy = strchr(in, ',');
+@@ -600,6 +624,7 @@ void parse_nagios_settings(const char *i
+
+ *nagios_crit = atof(dummy + 1);
+ }
++#endif
+
+ void parse_bind_to(const char *in, struct sockaddr_in *bind_to_4, struct sockaddr_in6 *bind_to_6, struct sockaddr_in **bind_to)
+ {
+@@ -722,6 +747,7 @@ char check_compressed(const char *reply)
+ return 0;
+ }
+
++#ifdef ENABLE_NAGIOS
+ int nagios_result(int ok, int nagios_mode, int nagios_exit_code, double avg_httping_time, double nagios_warn, double nagios_crit)
+ {
+ if (nagios_mode == 1)
+@@ -762,6 +788,7 @@ int nagios_result(int ok, int nagios_mod
+
+ return -1;
+ }
++#endif
+
+ void proxy_to_host_and_port(char *in, char **proxy_host, int *proxy_port)
+ {
+@@ -896,8 +923,10 @@ int main(int argc, char *argv[])
+ int n_static_cookies = 0, n_dynamic_cookies = 0;
+ char resolve_once = 0;
+ char have_resolved = 0;
++#ifdef ENABLE_NAGIOS
+ double nagios_warn=0.0, nagios_crit=0.0;
+ int nagios_exit_code = 2;
++#endif
+ double avg_httping_time = -1.0;
+ int get_instead_of_head = 0;
+ char show_Bps = 0, ask_compression = 0;
+@@ -928,9 +957,17 @@ int main(int argc, char *argv[])
+ stats_t t_connect, t_request, t_total, t_resolve, t_write, t_ssl, t_close, stats_to, tcp_rtt_stats, stats_header_size;
+ char first_resolve = 1;
+ double graph_limit = MY_DOUBLE_INF;
++#ifdef NC
++#ifdef FW
+ char nc_graph = 1;
++#else
++ #define nc_graph 1
++#endif
++#endif
+ char adaptive_interval = 0;
++#ifdef NC
+ double show_slow_log = MY_DOUBLE_INF;
++#endif
+ char use_tcp_nodelay = 1;
+ int max_mtu = -1;
+ int write_sleep = 500; /* in us (microseconds), determines resolution of transmit time determination */
+@@ -980,8 +1017,10 @@ int main(int argc, char *argv[])
+ {"user-agent", 1, NULL, 'I' },
+ {"referer", 1, NULL, 'S' },
+ {"resolve-once",0, NULL, 'r' },
++#ifdef ENABLE_NAGIOS
+ {"nagios-mode-1", 1, NULL, 'n' },
+ {"nagios-mode-2", 1, NULL, 'n' },
++#endif
+ {"bind-to", 1, NULL, 'y' },
+ {"quiet", 0, NULL, 'q' },
+ {"username", 1, NULL, 'U' },
+@@ -1052,7 +1091,9 @@ int main(int argc, char *argv[])
+ #endif
+ init_statst(&stats_header_size);
+
++#ifdef ENABLE_HELP_FORMAT
+ determine_terminal_size(&max_y, &max_x);
++#endif
+
+ signal(SIGPIPE, SIG_IGN);
+
+@@ -1108,11 +1149,11 @@ int main(int argc, char *argv[])
+ case 14:
+ draw_phase = 1;
+ break;
+-#endif
+
+ case 13:
+ show_slow_log = atof(optarg);
+ break;
++#endif
+
+ case 12:
+ adaptive_interval = 1;
+@@ -1144,9 +1185,11 @@ int main(int argc, char *argv[])
+ fprintf(stderr, gettext("\n *** -A is no longer required ***\n\n"));
+ break;
+
++#ifdef ENABLE_JSON
+ case 'M':
+ json_output = 1;
+ break;
++#endif
+
+ case 'v':
+ verbose++;
+@@ -1338,6 +1381,7 @@ int main(int argc, char *argv[])
+ version();
+ return 0;
+
++#ifdef ENABLE_NAGIOS
+ case 'n':
+ if (nagios_mode)
+ error_exit(gettext("-n and -N are mutual exclusive\n"));
+@@ -1352,6 +1396,7 @@ int main(int argc, char *argv[])
+ nagios_mode = 2;
+ nagios_exit_code = atoi(optarg);
+ break;
++#endif
+
+ case 'P':
+ auth_password = optarg;
+@@ -1497,8 +1542,10 @@ int main(int argc, char *argv[])
+ printf("PING %s%s:%s%d%s (%s):\n", c_green, hostname, c_bright, portnr, c_normal, get);
+ }
+
++#ifdef ENABLE_JSON
+ if (json_output)
+ printf("[\n");
++#endif
+
+ if (adaptive_interval && wait <= 0.0)
+ error_exit(gettext("Interval must be > 0 when using adaptive interval"));
+@@ -1593,7 +1640,10 @@ int main(int argc, char *argv[])
+ int age = -1;
+ char *sc = NULL, *scdummy = NULL;
+ char *fp = NULL;
+- int re_tx = 0, pmtu = 0, recv_tos = 0;
++ int recv_tos = 0;
++#if defined(NC) || defined(ENABLE_JSON)
++ int re_tx = 0, pmtu = 0;
++#endif
+ socklen_t recv_tos_len = sizeof recv_tos;
+
+ dstart = get_ts();
+@@ -1607,7 +1657,9 @@ int main(int argc, char *argv[])
+ char req_sent = 0;
+ double dummy_ms = 0.0;
+ double their_est_ts = -1.0, toff_diff_ts = -1.0;
++#if defined(ENABLE_JSON) || defined(TCP_TFO)
+ char tfo_success = 0;
++#endif
+ double ssl_handshake = 0.0;
+ char cur_have_resolved = 0;
+ #if defined(linux) || defined(__FreeBSD__)
+@@ -2114,7 +2166,7 @@ persistent_loop:
+
+ update_statst(&tcp_rtt_stats, (double)info.tcpi_rtt / 1000.0);
+
+-#ifdef linux
++#if defined(linux) && (defined(NC) || defined(ENABLE_JSON))
+ re_tx = info.tcpi_retransmits;
+ pmtu = info.tcpi_pmtu;
+ #endif
+@@ -2134,6 +2186,7 @@ persistent_loop:
+ toff_diff_ts = ((double)their_ts - their_est_ts) * 1000.0;
+ update_statst(&stats_to, toff_diff_ts);
+
++#ifdef ENABLE_JSON
+ if (json_output)
+ {
+ char current_host[4096] = { 0 };
+@@ -2145,7 +2198,9 @@ persistent_loop:
+
+ emit_json(1, curncount, dstart, &t_resolve, &t_connect, &t_request, atoi(sc ? sc : "-1"), sc ? sc : "?", headers_len, len, Bps, current_host, fp, toff_diff_ts, tfo_success, &t_ssl, &t_write, &t_close, n_dynamic_cookies, &stats_to, &tcp_rtt_stats, re_tx, pmtu, recv_tos, &t_total);
+ }
+- else if (machine_readable)
++ else
++#endif
++ if (machine_readable)
+ {
+ if (sc)
+ {
+@@ -2404,14 +2459,18 @@ persistent_loop:
+ stats_line(1, complete_url, count, curncount, err, ok, started_at, verbose, &t_total, avg_httping_time, show_Bps ? &bps : NULL);
+
+ error_exit:
++#ifdef ENABLE_NAGIOS
+ if (nagios_mode)
+ return nagios_result(ok, nagios_mode, nagios_exit_code, avg_httping_time, nagios_warn, nagios_crit);
++#endif
+
+ if (!json_output && !machine_readable)
+ printf("%s", c_very_normal);
+
++#ifdef ENABLE_JSON
+ if (json_output)
+ printf("\n]\n");
++#endif
+
+ free_cookies(static_cookies, n_static_cookies);
+ free_cookies(dynamic_cookies, n_dynamic_cookies);
+--- a/help.c
++++ b/help.c
+@@ -93,6 +93,8 @@ void version(void)
+ fprintf(stderr, gettext("\n"));
+ }
+
++#ifdef ENABLE_HELP
++#ifdef ENABLE_HELP_FORMAT
+ void format_help(const char *short_str, const char *long_str, const char *descr)
+ {
+ int par_width = SWITCHES_COLUMN_WIDTH, max_wrap_width = par_width / 2, cur_par_width = 0;
+@@ -167,9 +169,30 @@ void format_help(const char *short_str,
+ p = n;
+ }
+ }
++#else
++void format_help(const char *short_str, const char *long_str, const char *descr)
++{
++ if (short_str)
++ {
++ fputs(short_str, stderr);
++ fputc(' ', stderr);
++ }
++
++ if (long_str)
++ {
++ fputs(long_str, stderr);
++ fputc(' ', stderr);
++ }
++
++ fputs(descr, stderr);
++ fputc('\n', stderr);
++}
++#endif
++#endif
+
+ void usage(const char *me)
+ {
++#ifdef ENABLE_HELP
+ char *dummy = NULL, has_color = 0;
+ char host[256] = { 0 };
+
+@@ -270,11 +293,15 @@ void usage(const char *me)
+ fprintf(stderr, gettext(" *** output mode settings ***\n"));
+ format_help("-q", "--quiet", gettext("quiet, only returncode"));
+ format_help("-m", "--parseable-output", gettext("give machine parseable output (see also -o and -e)"));
++#ifdef ENABLE_JSON
+ format_help("-M", NULL, gettext("json output, cannot be combined with -m"));
++#endif
+ format_help("-o rc,rc,...", "--ok-result-codes", gettext("what http results codes indicate 'ok' comma separated WITHOUT spaces inbetween default is 200, use with -e"));
+ format_help("-e x", "--result-string", gettext("string to display when http result code doesn't match"));
++#ifdef ENABLE_NAGIOS
+ format_help("-n warn,crit", "--nagios-mode-1 / --nagios-mode-2", gettext("Nagios-mode: return 1 when avg. response time >= warn, 2 if >= crit, otherwhise return 0"));
+ format_help("-N x", NULL, gettext("Nagios mode 2: return 0 when all fine, 'x' when anything failes"));
++#endif
+ format_help("-C cookie=value", "--cookie", gettext("add a cookie to the request"));
+ format_help("-Y", "--colors", gettext("add colors"));
+ format_help("-a", "--audible-ping", gettext("audible ping"));
+@@ -309,5 +336,6 @@ void usage(const char *me)
+ fprintf(stderr, gettext("Example:\n"));
+ fprintf(stderr, "\t%s %s%s -s -Z\n\n", me, host, has_color ? " -Y" : "");
+
++#endif
+ new_version_alert();
+ }
+--- a/Makefile
++++ b/Makefile
+@@ -88,6 +88,22 @@ OBJS+=fft.o
+ LDFLAGS+=-lfftw3
+ endif
+
++ifeq ($(JSON),yes)
++CFLAGS+=-DENABLE_JSON
++endif
++
++ifeq ($(NAGIOS),yes)
++CFLAGS+=-DENABLE_NAGIOS
++endif
++
++ifeq ($(HELP),yes)
++CFLAGS+=-DENABLE_HELP
++endif
++
++ifeq ($(HELPFORMAT),yes)
++CFLAGS+=-DENABLE_HELP_FORMAT
++endif
++
+ ifeq ($(DEBUG),yes)
+ CFLAGS+=-D_DEBUG -ggdb
+ LDFLAGS+=-g