From: Florian Forster Date: Mon, 8 May 2017 14:23:52 +0000 (+0200) Subject: Merge remote-tracking branch 'github/pr/20' X-Git-Url: https://git.octo.it/?p=liboping.git;a=commitdiff_plain;h=1e43ebd101e03b69931c82606635ddfd82496e24;hp=2645b3e8439abd58bc17d14f39d822c52c13d7be Merge remote-tracking branch 'github/pr/20' --- diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..755a873 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,11 @@ +dist: trusty +sudo: false + +language: c +compiler: + - clang + - gcc +script: + - autoreconf -fi + - ./configure + - make all diff --git a/configure.ac b/configure.ac index aea4efb..fcafad1 100644 --- a/configure.ac +++ b/configure.ac @@ -50,7 +50,8 @@ AC_ARG_VAR(PERL, [Perl interpreter command]) LT_INIT([dlopen]) # pkg-config interface -PKG_INSTALLDIR +# PKG_INSTALLDIR is only available for pkg-config >= 0.27 +m4_ifdef([PKG_INSTALLDIR], [PKG_INSTALLDIR], []) AC_ARG_WITH(pkgconfigdir, AC_HELP_STRING([--with-pkgconfigdir], [Use the specified pkgconfig dir (default is libdir/pkgconfig)]), @@ -201,30 +202,31 @@ AC_SUBST(LIBOPING_PC_LIBS_PRIVATE) AC_SEARCH_LIBS([nanosleep],[rt],[], [AC_MSG_ERROR([cannot find nanosleep])]) -AC_SEARCH_LIBS([clock_gettime],[rt],[], - [AC_MSG_ERROR([cannot find clock_gettime])]) -with_ncurses="no" -AC_CHECK_HEADERS(ncursesw/ncurses.h ncurses.h, [with_ncurses="yes"], []) -if test "x$with_ncurses" = "xyes" -then - have_ncursesw="no" - have_ncurses="no" - NCURSES_LIB="" +AC_ARG_WITH(ncurses, AS_HELP_STRING([--with-ncurses], [Build oping CLI tool with ncurses support])) +AS_IF([test "x$with_ncurses" != "xno"], [ + can_build_with_ncurses="no" + PKG_CHECK_MODULES([NCURSES], [ncursesw], [can_build_with_ncurses=yes], [ + PKG_CHECK_MODULES([NCURSES], [ncurses], [can_build_with_ncurses=yes], [ + AC_CHECK_LIB(ncursesw, mvwprintw, [NCURSES_LIBS="-lncursesw"; can_build_with_ncurses=yes], [ + AC_CHECK_LIB(ncurses, mvwprintw, [NCURSES_LIBS="-lncurses"; can_build_with_ncurses=yes]) + ]) + ]) + ]) - AC_CHECK_LIB(ncursesw, mvwprintw, [have_ncursesw="yes"], [have_ncursesw="no"]) - AC_CHECK_LIB(ncurses, mvwprintw, [have_ncurses="yes"], [have_ncurses="no"]) + AS_IF([test "x$can_build_with_ncurses" = "xyes"], [ + AC_CHECK_HEADERS([ncursesw/curses.h ncursesw.h ncurses/curses.h ncurses.h], [can_build_with_ncurses=yes; break;], [can_build_with_ncurses=no]) + ]) - if test "x$have_ncursesw" = "xyes"; then - NCURSES_LIB="-lncursesw" - else if test "x$have_ncurses" = "xyes"; then - NCURSES_LIB="-lncurses" - else - with_ncurses="no" - fi; fi - AC_SUBST(NCURSES_LIB) -fi -AM_CONDITIONAL(BUILD_WITH_LIBNCURSES, test "x$with_ncurses" = "xyes") + AS_IF([test "x$can_build_with_ncurses" = "xno" && test "x$with_ncurses" = "xyes"], [ + AC_MSG_ERROR([ncurses not found but explicit enabled]) + ], + [test "x$can_build_with_ncurses" = "xno"], [ + AC_MSG_WARN([Will not build oping with ncurses support -- no suiteable ncurses installation found]) + ]) +]) + +AM_CONDITIONAL(BUILD_WITH_LIBNCURSES, test "x$with_ncurses" != "xno" && test "x$can_build_with_ncurses" = "xyes") AC_FUNC_STRERROR_R diff --git a/src/Makefile.am b/src/Makefile.am index 090d1b2..b8571aa 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -40,8 +40,8 @@ if BUILD_WITH_LIBNCURSES bin_PROGRAMS += noping noping_SOURCES = oping.c -noping_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_NCURSES=1 -noping_LDADD = liboping.la -lm $(NCURSES_LIB) +noping_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_NCURSES=1 $(NCURSES_CFLAGS) +noping_LDADD = liboping.la -lm $(NCURSES_LIBS) endif # BUILD_WITH_LIBNCURSES install-exec-hook: diff --git a/src/liboping.c b/src/liboping.c index f8c5bfb..fc9ed65 100644 --- a/src/liboping.c +++ b/src/liboping.c @@ -694,6 +694,7 @@ static int ping_receive_all (pingobj_t *obj) if (!timerisset (ptr->timer)) continue; + assert (ptr->fd < FD_SETSIZE); FD_SET (ptr->fd, &read_fds); FD_SET (ptr->fd, &err_fds); num_fds++; @@ -1481,6 +1482,16 @@ int ping_host_add (pingobj_t *obj, const char *host) ping_set_errno (obj, errno); continue; } + else if (ph->fd >= FD_SETSIZE) + { + dprintf("socket(2) returned file descriptor %d, which is above the file " + "descriptor limit for select(2) (FD_SETSIZE = %d)\n", + ph->fd, FD_SETSIZE); + close(ph->fd); + ph->fd = -1; + ping_set_errno(obj, EMFILE); + continue; + } if (obj->srcaddr != NULL) { diff --git a/src/oping.c b/src/oping.c index e3cb696..f48309a 100644 --- a/src/oping.c +++ b/src/oping.c @@ -82,11 +82,17 @@ /* http://newsgroups.derkeiler.com/Archive/Rec/rec.games.roguelike.development/2010-09/msg00050.html */ # define _X_OPEN_SOURCE_EXTENDED -# if HAVE_NCURSESW_NCURSES_H -# include -# elif HAVE_NCURSES_H +#if defined HAVE_NCURSESW_CURSES_H +# include +#elif defined HAVE_NCURSESW_H +# include +#elif defined HAVE_NCURSES_CURSES_H +# include +#elif defined HAVE_NCURSES_H # include -# endif +#else +# error "SysV or X/Open-compatible Curses header file required" +#endif # define OPING_GREEN 1 # define OPING_YELLOW 2 @@ -172,7 +178,7 @@ typedef struct ping_context * and HISTORY_SIZE_MAX. */ size_t history_size; - /* Number "received" entries in the history, i.e. non-NAN entries. */ + /* Total number of reponses received. */ size_t history_received; /* Index of the next RTT to be written to history_by_time. This wraps @@ -226,22 +232,17 @@ static void sigint_handler (int signal) /* {{{ */ opt_count = 0; } /* }}} void sigint_handler */ -static ping_context_t *context_create (void) /* {{{ */ +static ping_context_t *context_create () /* {{{ */ { - ping_context_t *ret; - - if ((ret = malloc (sizeof (ping_context_t))) == NULL) + ping_context_t *ctx = calloc (1, sizeof (*ctx)); + if (ctx == NULL) return (NULL); - memset (ret, '\0', sizeof (ping_context_t)); - - ret->latency_total = 0.0; - #if USE_NCURSES - ret->window = NULL; + ctx->window = NULL; #endif - return (ret); + return (ctx); } /* }}} ping_context_t *context_create */ static void context_destroy (ping_context_t *context) /* {{{ */ @@ -1405,10 +1406,11 @@ static int pre_loop_hook (pingobj_t *ping) /* {{{ */ if (has_colors () == TRUE) { start_color (); - init_pair (OPING_GREEN, COLOR_GREEN, /* default = */ 0); - init_pair (OPING_YELLOW, COLOR_YELLOW, /* default = */ 0); - init_pair (OPING_RED, COLOR_RED, /* default = */ 0); - init_pair (OPING_GREEN_HIST, COLOR_GREEN, COLOR_BLACK); + use_default_colors (); + init_pair (OPING_GREEN, COLOR_GREEN, /* default = */ -1); + init_pair (OPING_YELLOW, COLOR_YELLOW, /* default = */ -1); + init_pair (OPING_RED, COLOR_RED, /* default = */ -1); + init_pair (OPING_GREEN_HIST, COLOR_GREEN, -1); init_pair (OPING_YELLOW_HIST, COLOR_YELLOW, COLOR_GREEN); init_pair (OPING_RED_HIST, COLOR_RED, COLOR_YELLOW); } @@ -1659,11 +1661,10 @@ static void update_host_hook (pingobj_iter_t *iter, /* {{{ */ if (outfile != NULL) { - struct timespec ts = { 0, 0 }; - - if (clock_gettime (CLOCK_REALTIME, &ts) == 0) + struct timeval tv = {0}; + if (gettimeofday (&tv, NULL) == 0) { - double t = ((double) ts.tv_sec) + (((double) ts.tv_nsec) / 1000000000.0); + double t = ((double) tv.tv_sec) + (((double) tv.tv_usec) / 1000000.0); if ((sequence % 32) == 0) fprintf (outfile, "#time,host,latency[ms]\n");